From d6fe462ac16b73d5a449ab8bcdadb893e398ace1 Mon Sep 17 00:00:00 2001 From: Alexander Motin Date: Wed, 1 Aug 2007 20:49:35 +0000 Subject: [PATCH] Add 64bit statistic counters to the ng_ppp node. 64bit counters are needed to simplify traffic accounting and reduce system load at the big PPP concentrators. Approved by: re (rwatson), glebius (mentor) --- share/man/man4/ng_ppp.4 | 8 ++++++ sys/netgraph/ng_ppp.c | 61 +++++++++++++++++++++++++++++++++++++---- sys/netgraph/ng_ppp.h | 30 ++++++++++++++++++++ 3 files changed, 93 insertions(+), 6 deletions(-) diff --git a/share/man/man4/ng_ppp.4 b/share/man/man4/ng_ppp.4 index f441c0b7e6cc..9fd72cad17c8 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 fe63f61ccbbb..8b81dc83e48b 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_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); - bcopy(stats, resp->data, sizeof(*stats)); + 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 c1a3c68d254e..c081f2874f26 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_ */