summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--share/man/man4/ng_ppp.48
-rw-r--r--sys/netgraph/ng_ppp.c61
-rw-r--r--sys/netgraph/ng_ppp.h30
3 files changed, 93 insertions, 6 deletions
diff --git a/share/man/man4/ng_ppp.4 b/share/man/man4/ng_ppp.4
index f441c0b..9fd72ca 100644
--- a/share/man/man4/ng_ppp.4
+++ b/share/man/man4/ng_ppp.4
@@ -395,6 +395,10 @@ containing statistics for the corresponding link.
Here
.Dv NG_PPP_BUNDLE_LINKNUM
is a valid link number corresponding to the multi-link bundle.
+.It Dv NGM_PPP_GET_LINK_STATS64
+Same as NGM_PPP_GET_LINK_STATS but returns
+.Dv "struct ng_ppp_link_stat64"
+containing 64bit counters.
.It Dv NGM_PPP_CLR_LINK_STATS
This command takes a two byte link number as an argument and
clears the statistics for that link.
@@ -402,6 +406,10 @@ clears the statistics for that link.
Same as
.Dv NGM_PPP_GET_LINK_STATS ,
but also atomically clears the statistics as well.
+.It Dv NGM_PPP_GETCLR_LINK_STATS64
+Same as NGM_PPP_GETCLR_LINK_STATS but returns
+.Dv "struct ng_ppp_link_stat64"
+containing 64bit counters.
.El
.Pp
This node type also accepts the control messages accepted by the
diff --git a/sys/netgraph/ng_ppp.c b/sys/netgraph/ng_ppp.c
index fe63f61..8b81dc8 100644
--- a/sys/netgraph/ng_ppp.c
+++ b/sys/netgraph/ng_ppp.c
@@ -196,7 +196,7 @@ struct ng_ppp_frag {
/* Per-link private information */
struct ng_ppp_link {
struct ng_ppp_link_conf conf; /* link configuration */
- struct ng_ppp_link_stat stats; /* link stats */
+ struct ng_ppp_link_stat64 stats; /* link stats */
hook_p hook; /* connection to link data */
int32_t seq; /* highest rec'd seq# - MSEQ */
uint32_t latency; /* calculated link latency */
@@ -207,7 +207,7 @@ struct ng_ppp_link {
/* Total per-node private information */
struct ng_ppp_private {
struct ng_ppp_bund_conf conf; /* bundle config */
- struct ng_ppp_link_stat bundleStats; /* bundle stats */
+ struct ng_ppp_link_stat64 bundleStats; /* bundle stats */
struct ng_ppp_link links[NG_PPP_MAX_LINKS];/* per-link info */
int32_t xseq; /* next out MP seq # */
int32_t mseq; /* min links[i].seq */
@@ -383,6 +383,14 @@ static const struct ng_parse_type ng_ppp_stats_type = {
&ng_ppp_stats_type_fields
};
+/* Parse type for struct ng_ppp_link_stat64 */
+static const struct ng_parse_struct_field ng_ppp_stats64_type_fields[]
+ = NG_PPP_STATS64_TYPE_INFO;
+static const struct ng_parse_type ng_ppp_stats64_type = {
+ &ng_parse_struct_type,
+ &ng_ppp_stats64_type_fields
+};
+
/* List of commands and how to convert arguments to/from ASCII */
static const struct ng_cmdlist ng_ppp_cmds[] = {
{
@@ -427,6 +435,20 @@ static const struct ng_cmdlist ng_ppp_cmds[] = {
&ng_parse_int16_type,
&ng_ppp_stats_type
},
+ {
+ NGM_PPP_COOKIE,
+ NGM_PPP_GET_LINK_STATS64,
+ "getstats64",
+ &ng_parse_int16_type,
+ &ng_ppp_stats64_type
+ },
+ {
+ NGM_PPP_COOKIE,
+ NGM_PPP_GETCLR_LINK_STATS64,
+ "getclrstats64",
+ &ng_parse_int16_type,
+ &ng_ppp_stats64_type
+ },
{ 0 }
};
@@ -617,10 +639,13 @@ ng_ppp_rcvmsg(node_p node, item_p item, hook_p lasthook)
case NGM_PPP_GET_LINK_STATS:
case NGM_PPP_CLR_LINK_STATS:
case NGM_PPP_GETCLR_LINK_STATS:
+ case NGM_PPP_GET_LINK_STATS64:
+ case NGM_PPP_GETCLR_LINK_STATS64:
{
- struct ng_ppp_link_stat *stats;
+ struct ng_ppp_link_stat64 *stats;
uint16_t linkNum;
+ /* Process request. */
if (msg->header.arglen != sizeof(uint16_t))
ERROUT(EINVAL);
linkNum = *((uint16_t *) msg->data);
@@ -629,14 +654,38 @@ ng_ppp_rcvmsg(node_p node, item_p item, hook_p lasthook)
ERROUT(EINVAL);
stats = (linkNum == NG_PPP_BUNDLE_LINKNUM) ?
&priv->bundleStats : &priv->links[linkNum].stats;
- if (msg->header.cmd != NGM_PPP_CLR_LINK_STATS) {
+
+ /* Make 64bit reply. */
+ if (msg->header.cmd == NGM_PPP_GET_LINK_STATS64 ||
+ msg->header.cmd == NGM_PPP_GETCLR_LINK_STATS64) {
NG_MKRESPONSE(resp, msg,
- sizeof(struct ng_ppp_link_stat), M_NOWAIT);
+ sizeof(struct ng_ppp_link_stat64), M_NOWAIT);
if (resp == NULL)
ERROUT(ENOMEM);
bcopy(stats, resp->data, sizeof(*stats));
+ } else
+ /* Make 32bit reply. */
+ if (msg->header.cmd == NGM_PPP_GET_LINK_STATS ||
+ msg->header.cmd == NGM_PPP_GETCLR_LINK_STATS) {
+ struct ng_ppp_link_stat *rs;
+ NG_MKRESPONSE(resp, msg,
+ sizeof(struct ng_ppp_link_stat), M_NOWAIT);
+ if (resp == NULL)
+ ERROUT(ENOMEM);
+ rs = (struct ng_ppp_link_stat *)resp->data;
+ /* Truncate 64->32 bits. */
+ rs->xmitFrames = stats->xmitFrames;
+ rs->xmitOctets = stats->xmitOctets;
+ rs->recvFrames = stats->recvFrames;
+ rs->recvOctets = stats->recvOctets;
+ rs->badProtos = stats->badProtos;
+ rs->runts = stats->runts;
+ rs->dupFragments = stats->dupFragments;
+ rs->dropFragments = stats->dropFragments;
}
- if (msg->header.cmd != NGM_PPP_GET_LINK_STATS)
+ /* Clear stats. */
+ if (msg->header.cmd != NGM_PPP_GET_LINK_STATS &&
+ msg->header.cmd != NGM_PPP_GET_LINK_STATS64)
bzero(stats, sizeof(*stats));
break;
}
diff --git a/sys/netgraph/ng_ppp.h b/sys/netgraph/ng_ppp.h
index c1a3c68..c081f28 100644
--- a/sys/netgraph/ng_ppp.h
+++ b/sys/netgraph/ng_ppp.h
@@ -48,6 +48,9 @@
#define NG_PPP_NODE_TYPE "ppp"
#define NGM_PPP_COOKIE 940897795
+/* 64bit stats presence flag */
+#define NG_PPP_STATS64
+
/* Maximum number of supported links */
#define NG_PPP_MAX_LINKS 16
@@ -97,6 +100,8 @@ enum {
NGM_PPP_GET_LINK_STATS, /* takes link #, returns stats struct */
NGM_PPP_CLR_LINK_STATS, /* takes link #, clears link stats */
NGM_PPP_GETCLR_LINK_STATS, /* takes link #, returns & clrs stats */
+ NGM_PPP_GET_LINK_STATS64, /* takes link #, returns stats64 struct */
+ NGM_PPP_GETCLR_LINK_STATS64, /* takes link #, returns stats64 & clrs */
};
/* Multi-link sequence number state (for debugging) */
@@ -212,4 +217,29 @@ struct ng_ppp_link_stat {
{ NULL } \
}
+/* Statistics struct for a link (or the bundle if NG_PPP_BUNDLE_LINKNUM) */
+struct ng_ppp_link_stat64 {
+ u_int64_t xmitFrames; /* xmit frames on link */
+ u_int64_t xmitOctets; /* xmit octets on link */
+ u_int64_t recvFrames; /* recv frames on link */
+ u_int64_t recvOctets; /* recv octets on link */
+ u_int64_t badProtos; /* frames rec'd with bogus protocol */
+ u_int64_t runts; /* Too short MP fragments */
+ u_int64_t dupFragments; /* MP frames with duplicate seq # */
+ u_int64_t dropFragments; /* MP fragments we had to drop */
+};
+
+/* Keep this in sync with the above structure definition */
+#define NG_PPP_STATS64_TYPE_INFO { \
+ { "xmitFrames", &ng_parse_uint64_type }, \
+ { "xmitOctets", &ng_parse_uint64_type }, \
+ { "recvFrames", &ng_parse_uint64_type }, \
+ { "recvOctets", &ng_parse_uint64_type }, \
+ { "badProtos", &ng_parse_uint64_type }, \
+ { "runts", &ng_parse_uint64_type }, \
+ { "dupFragments", &ng_parse_uint64_type }, \
+ { "dropFragments", &ng_parse_uint64_type }, \
+ { NULL } \
+}
+
#endif /* _NETGRAPH_NG_PPP_H_ */
OpenPOWER on IntegriCloud