From: Marco van Tol Date: Thu, 21 Nov 2019 20:39:47 +0000 (+0100) Subject: Rewrite to use only one config array X-Git-Tag: collectd-5.11.0~35^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e20f9084fd80b757a91cff52fa246e9d87633394;p=thirdparty%2Fcollectd.git Rewrite to use only one config array --- diff --git a/src/collectd.conf.pod b/src/collectd.conf.pod index 8bad7e73b..1030fa011 100644 --- a/src/collectd.conf.pod +++ b/src/collectd.conf.pod @@ -3720,11 +3720,83 @@ Defaults to B. =head2 Plugin C -This plugin collects counts for ipv4 and ipv6 packets received, transmitted -and forwarded on all interfaces combined. At the moment it's only supported -on FreeBSD. +This plugin collects counts for ipv4 and ipv6 various types of packets passing +through the system in total. At the moment it's only supported on FreeBSD. + +The full list of options available to include in the counted statistics is: + ip4receive IPv4 total packets received + ip4badsum IPv4 checksum bad + ip4tooshort IPv4 packet too short + ip4toosmall IPv4 not enough data + ip4badhlen IPv4 ip header length < data size + ip4badlen IPv4 ip length < ip header length + ip4fragment IPv4 fragments received + ip4fragdrop IPv4 frags dropped (dups, out of space) + ip4fragtimeout IPv4 fragments timed out + ip4forward IPv4 packets forwarded + ip4fastforward IPv4 packets fast forwarded + ip4cantforward IPv4 packets rcvd for unreachable dest + ip4redirectsent IPv4 packets forwarded on same net + ip4noproto IPv4 unknown or unsupported protocol + ip4deliver IPv4 datagrams delivered to upper level + ip4transmit IPv4 total ip packets generated here + ip4odrop IPv4 lost packets due to nobufs, etc. + ip4reassemble IPv4 total packets reassembled ok + ip4fragmented IPv4 datagrams successfully fragmented + ip4ofragment IPv4 output fragments created + ip4cantfrag IPv4 don't fragment flag was set, etc. + ip4badoptions IPv4 error in option processing + ip4noroute IPv4 packets discarded due to no route + ip4badvers IPv4 ip version != 4 + ip4rawout IPv4 total raw ip packets generated + ip4toolong IPv4 ip length > max ip packet size + ip4notmember IPv4 multicasts for unregistered grps + ip4nogif IPv4 no match gif found + ip4badaddr IPv4 invalid address on header + + ip6receive IPv6 total packets received + ip6tooshort IPv6 packet too short + ip6toosmall IPv6 not enough data + ip6fragment IPv6 fragments received + ip6fragdrop IPv6 frags dropped(dups, out of space) + ip6fragtimeout IPv6 fragments timed out + ip6fragoverflow IPv6 fragments that exceeded limit + ip6forward IPv6 packets forwarded + ip6cantforward IPv6 packets rcvd for unreachable dest + ip6redirectsent IPv6 packets forwarded on same net + ip6deliver IPv6 datagrams delivered to upper level + ip6transmit IPv6 total ip packets generated here + ip6odrop IPv6 lost packets due to nobufs, etc. + ip6reassemble IPv6 total packets reassembled ok + ip6fragmented IPv6 datagrams successfully fragmented + ip6ofragment IPv6 output fragments created + ip6cantfrag IPv6 don't fragment flag was set, etc. + ip6badoptions IPv6 error in option processing + ip6noroute IPv6 packets discarded due to no route + ip6badvers IPv6 ip6 version != 6 + ip6rawout IPv6 total raw ip packets generated + ip6badscope IPv6 scope error + ip6notmember IPv6 don't join this multicast group + ip6nogif IPv6 no match gif found + ip6toomanyhdr IPv6 discarded due to too many headers + +By default the following options are included in the counted packets: + +- ip4receive +- ip4forward +- ip4transmit + +- ip6receive +- ip6forward +- ip6transmit + +For example to also count IPv4 and IPv6 fragments received, include the +following configuration: -This plugin doesn't have any options (yet). + + ip4fragment true + ip6fragment true + =head2 Plugin C diff --git a/src/ipstats.c b/src/ipstats.c index dfa04bfc9..46d72394f 100644 --- a/src/ipstats.c +++ b/src/ipstats.c @@ -37,111 +37,87 @@ #include #endif -static const char *config_keys_v4[] = { - "ip4receive", "ip4badsum", "ip4tooshort", "ip4toosmall", - "ip4badhlen", "ip4badlen", "ip4fragment", "ip4fragdrop", - "ip4fragtimeout", "ip4forward", "ip4fastforward", "ip4cantforward", - "ip4redirectsent", "ip4noproto", "ip4deliver", "ip4transmit", - "ip4odrop", "ip4reassemble", "ip4fragmented", "ip4ofragment", - "ip4cantfrag", "ip4badoptions", "ip4noroute", "ip4badvers", - "ip4rawout", "ip4toolong", "ip4notmember", "ip4nogif", - "ip4badaddr"}; -static int config_keys_v4_num = STATIC_ARRAY_SIZE(config_keys_v4); - -static bool config_vals_v4[] = { - true, false, false, false, false, false, false, false, false, true, - false, false, false, false, false, true, false, false, false, false, - false, false, false, false, false, false, false, false, false}; -static int config_vals_v4_num = STATIC_ARRAY_SIZE(config_vals_v4); - -static const char *value_keys_v4[] = { - "receive", "badsum", "tooshort", "toosmall", "badhlen", - "badlen", "fragment", "fragdrop", "fragtimeout", "forward", - "fastforward", "cantforward", "redirectsent", "noproto", "deliver", - "transmit", "odrop", "reassemble", "fragmented", "ofragment", - "cantfrag", "badoptions", "noroute", "badvers", "rawout", - "toolong", "notmember", "nogif", "badaddr"}; -static int value_keys_v4_num = STATIC_ARRAY_SIZE(value_keys_v4); - -static uint64_t value_vals_v4[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static int value_vals_v4_num = STATIC_ARRAY_SIZE(value_vals_v4); - -static const char *config_keys_v6[] = { - "ip6receive", "ip6tooshort", "ip6toosmall", "ip6fragment", - "ip6fragdrop", "ip6fragtimeout", "ip6fragoverflow", "ip6forward", - "ip6cantforward", "ip6redirectsent", "ip6deliver", "ip6transmit", - "ip6odrop", "ip6reassemble", "ip6fragmented", "ip6ofragment", - "ip6cantfrag", "ip6badoptions", "ip6noroute", "ip6badvers", - "ip6rawout", "ip6badscope", "ip6notmember", "ip6nogif", - "ip6toomanyhdr"}; -static int config_keys_v6_num = STATIC_ARRAY_SIZE(config_keys_v6); - -static bool config_vals_v6[] = {true, false, false, false, false, false, false, - true, false, false, false, true, false, false, - false, false, false, false, false, false, false, - false, false, false, false}; -static int config_vals_v6_num = STATIC_ARRAY_SIZE(config_vals_v6); - -static const char *value_keys_v6[] = { - "receive", "tooshort", "toosmall", "fragment", "fragdrop", - "fragtimeout", "fragoverflow", "forward", "cantforward", "redirectsent", - "deliver", "transmit", "odrop", "reassemble", "fragmented", - "ofragment", "cantfrag", "badoptions", "noroute", "badvers", - "rawout", "badscope", "notmember", "nogif", "toomanyhdr"}; -static int value_keys_v6_num = STATIC_ARRAY_SIZE(value_keys_v6); - -static uint64_t value_vals_v6[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -static int value_vals_v6_num = STATIC_ARRAY_SIZE(value_vals_v6); +/** + * Offset at which IPv6 values start in: + * - config_keys + * - config_vals + * - value_keys + * - value_vals + **/ +static const int v6_config_offset = 29; + +static const char *config_keys[] = { + "ip4receive", "ip4badsum", "ip4tooshort", "ip4toosmall", + "ip4badhlen", "ip4badlen", "ip4fragment", "ip4fragdrop", + "ip4fragtimeout", "ip4forward", "ip4fastforward", "ip4cantforward", + "ip4redirectsent", "ip4noproto", "ip4deliver", "ip4transmit", + "ip4odrop", "ip4reassemble", "ip4fragmented", "ip4ofragment", + "ip4cantfrag", "ip4badoptions", "ip4noroute", "ip4badvers", + "ip4rawout", "ip4toolong", "ip4notmember", "ip4nogif", + "ip4badaddr", "ip6receive", "ip6tooshort", "ip6toosmall", + "ip6fragment", "ip6fragdrop", "ip6fragtimeout", "ip6fragoverflow", + "ip6forward", "ip6cantforward", "ip6redirectsent", "ip6deliver", + "ip6transmit", "ip6odrop", "ip6reassemble", "ip6fragmented", + "ip6ofragment", "ip6cantfrag", "ip6badoptions", "ip6noroute", + "ip6badvers", "ip6rawout", "ip6badscope", "ip6notmember", + "ip6nogif", "ip6toomanyhdr"}; +static int config_keys_num = STATIC_ARRAY_SIZE(config_keys); + +static bool config_vals[] = { + true, false, false, false, false, false, false, false, false, true, false, + false, false, false, false, true, false, false, false, false, false, false, + false, false, false, false, false, false, false, true, false, false, false, + false, false, false, true, false, false, false, true, false, false, false, + false, false, false, false, false, false, false, false, false, false}; +static int config_vals_num = STATIC_ARRAY_SIZE(config_vals); + +static const char *value_keys[] = { + "receive", "badsum", "tooshort", "toosmall", + "badhlen", "badlen", "fragment", "fragdrop", + "fragtimeout", "forward", "fastforward", "cantforward", + "redirectsent", "noproto", "deliver", "transmit", + "odrop", "reassemble", "fragmented", "ofragment", + "cantfrag", "badoptions", "noroute", "badvers", + "rawout", "toolong", "notmember", "nogif", + "badaddr", "receive", "tooshort", "toosmall", + "fragment", "fragdrop", "fragtimeout", "fragoverflow", + "forward", "cantforward", "redirectsent", "deliver", + "transmit", "odrop", "reassemble", "fragmented", + "ofragment", "cantfrag", "badoptions", "noroute", + "badvers", "rawout", "badscope", "notmember", + "nogif", "toomanyhdr"}; +static int value_keys_num = STATIC_ARRAY_SIZE(value_keys); + +static uint64_t value_vals[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; +static int value_vals_num = STATIC_ARRAY_SIZE(value_vals); static int ipstats_init(void) { - /* IPv4 */ - if (config_keys_v4_num != config_vals_v4_num) { - ERROR("config_keys_v4 must be same size as config_vals_v4"); - return (-1); - } - - if (value_keys_v4_num != config_keys_v4_num) { - ERROR("value_keys_v4 must be same size as config_keys_v4"); - return (-1); - } - - if (value_keys_v4_num != value_vals_v4_num) { - ERROR("value_keys_v4 must be same size as value_vals_v4"); - return (-1); - } - - /* IPv6 */ - if (config_keys_v6_num != config_vals_v6_num) { - ERROR("config_keys_v6 must be same size as config_vals_v6"); - return (-1); + if (config_keys_num != config_vals_num) { + ERROR("config_keys must be same size as config_vals"); + return -1; } - if (value_keys_v6_num != config_keys_v6_num) { - ERROR("value_keys_v6 must be same size as config_keys_v6"); - return (-1); + if (value_keys_num != config_keys_num) { + ERROR("value_keys must be same size as config_keys"); + return -1; } - if (value_keys_v6_num != value_vals_v6_num) { - ERROR("value_keys_v6 must be same size as value_vals_v6"); - return (-1); + if (value_keys_num != value_vals_num) { + ERROR("value_keys must be same size as value_vals"); + return -1; } - return (0); + return 0; } static int ipstats_config(char const *key, char const *value) { - for (int i = 0; i < config_keys_v4_num; i++) - if (strcasecmp(key, config_keys_v4[i]) == 0) { - config_vals_v4[i] = true; - return (0); - } - - for (int i = 0; i < config_keys_v6_num; i++) - if (strcasecmp(key, config_keys_v6[i]) == 0) { - config_vals_v6[i] = true; - return (0); + for (int i = 0; i < config_keys_num; i++) + if (strcasecmp(key, config_keys[i]) == 0) { + config_vals[i] = true; + return 0; } WARNING("ipstats plugin: invalid config key: %s", key); @@ -149,118 +125,107 @@ static int ipstats_config(char const *key, char const *value) { } /* int ipstats_config */ #if KERNEL_FREEBSD -static void ipstats_submit_v4(const struct ipstat *ipstat_p) { +static void ipstats_submit(const struct ipstat *ipstat_p, + const struct ip6stat *ip6stat_p) { value_list_t vl = VALUE_LIST_INIT; vl.values_len = 1; int i = 0; - value_vals_v4[i++] = ipstat_p->ips_total; - value_vals_v4[i++] = ipstat_p->ips_badsum; - value_vals_v4[i++] = ipstat_p->ips_tooshort; - value_vals_v4[i++] = ipstat_p->ips_toosmall; - value_vals_v4[i++] = ipstat_p->ips_badhlen; - value_vals_v4[i++] = ipstat_p->ips_badlen; - value_vals_v4[i++] = ipstat_p->ips_fragments; - value_vals_v4[i++] = ipstat_p->ips_fragdropped; - value_vals_v4[i++] = ipstat_p->ips_fragtimeout; - value_vals_v4[i++] = ipstat_p->ips_forward; - value_vals_v4[i++] = ipstat_p->ips_fastforward; - value_vals_v4[i++] = ipstat_p->ips_cantforward; - value_vals_v4[i++] = ipstat_p->ips_redirectsent; - value_vals_v4[i++] = ipstat_p->ips_noproto; - value_vals_v4[i++] = ipstat_p->ips_delivered; - value_vals_v4[i++] = ipstat_p->ips_localout; - value_vals_v4[i++] = ipstat_p->ips_odropped; - value_vals_v4[i++] = ipstat_p->ips_reassembled; - value_vals_v4[i++] = ipstat_p->ips_fragmented; - value_vals_v4[i++] = ipstat_p->ips_ofragments; - value_vals_v4[i++] = ipstat_p->ips_cantfrag; - value_vals_v4[i++] = ipstat_p->ips_badoptions; - value_vals_v4[i++] = ipstat_p->ips_noroute; - value_vals_v4[i++] = ipstat_p->ips_badvers; - value_vals_v4[i++] = ipstat_p->ips_rawout; - value_vals_v4[i++] = ipstat_p->ips_toolong; - value_vals_v4[i++] = ipstat_p->ips_notmember; - value_vals_v4[i++] = ipstat_p->ips_nogif; - value_vals_v4[i++] = ipstat_p->ips_badaddr; + value_vals[i++] = ipstat_p->ips_total; + value_vals[i++] = ipstat_p->ips_badsum; + value_vals[i++] = ipstat_p->ips_tooshort; + value_vals[i++] = ipstat_p->ips_toosmall; + value_vals[i++] = ipstat_p->ips_badhlen; + value_vals[i++] = ipstat_p->ips_badlen; + value_vals[i++] = ipstat_p->ips_fragments; + value_vals[i++] = ipstat_p->ips_fragdropped; + value_vals[i++] = ipstat_p->ips_fragtimeout; + value_vals[i++] = ipstat_p->ips_forward; + value_vals[i++] = ipstat_p->ips_fastforward; + value_vals[i++] = ipstat_p->ips_cantforward; + value_vals[i++] = ipstat_p->ips_redirectsent; + value_vals[i++] = ipstat_p->ips_noproto; + value_vals[i++] = ipstat_p->ips_delivered; + value_vals[i++] = ipstat_p->ips_localout; + value_vals[i++] = ipstat_p->ips_odropped; + value_vals[i++] = ipstat_p->ips_reassembled; + value_vals[i++] = ipstat_p->ips_fragmented; + value_vals[i++] = ipstat_p->ips_ofragments; + value_vals[i++] = ipstat_p->ips_cantfrag; + value_vals[i++] = ipstat_p->ips_badoptions; + value_vals[i++] = ipstat_p->ips_noroute; + value_vals[i++] = ipstat_p->ips_badvers; + value_vals[i++] = ipstat_p->ips_rawout; + value_vals[i++] = ipstat_p->ips_toolong; + value_vals[i++] = ipstat_p->ips_notmember; + value_vals[i++] = ipstat_p->ips_nogif; + value_vals[i++] = ipstat_p->ips_badaddr; + + value_vals[i++] = ip6stat_p->ip6s_total; + value_vals[i++] = ip6stat_p->ip6s_tooshort; + value_vals[i++] = ip6stat_p->ip6s_toosmall; + value_vals[i++] = ip6stat_p->ip6s_fragments; + value_vals[i++] = ip6stat_p->ip6s_fragdropped; + value_vals[i++] = ip6stat_p->ip6s_fragtimeout; + value_vals[i++] = ip6stat_p->ip6s_fragoverflow; + value_vals[i++] = ip6stat_p->ip6s_forward; + value_vals[i++] = ip6stat_p->ip6s_cantforward; + value_vals[i++] = ip6stat_p->ip6s_redirectsent; + value_vals[i++] = ip6stat_p->ip6s_delivered; + value_vals[i++] = ip6stat_p->ip6s_localout; + value_vals[i++] = ip6stat_p->ip6s_odropped; + value_vals[i++] = ip6stat_p->ip6s_reassembled; + value_vals[i++] = ip6stat_p->ip6s_fragmented; + value_vals[i++] = ip6stat_p->ip6s_ofragments; + value_vals[i++] = ip6stat_p->ip6s_cantfrag; + value_vals[i++] = ip6stat_p->ip6s_badoptions; + value_vals[i++] = ip6stat_p->ip6s_noroute; + value_vals[i++] = ip6stat_p->ip6s_badvers; + value_vals[i++] = ip6stat_p->ip6s_rawout; + value_vals[i++] = ip6stat_p->ip6s_badscope; + value_vals[i++] = ip6stat_p->ip6s_notmember; + value_vals[i++] = ip6stat_p->ip6s_nogif; + value_vals[i++] = ip6stat_p->ip6s_toomanyhdr; sstrncpy(vl.plugin, "ipstats", sizeof(vl.plugin)); sstrncpy(vl.plugin_instance, "ipv4", sizeof(vl.plugin_instance)); sstrncpy(vl.type, "packets", sizeof(vl.type)); - for (int i = 0; i < config_vals_v4_num; i++) - if (config_vals_v4[i] == true) { - sstrncpy(vl.type_instance, value_keys_v4[i], sizeof(vl.type_instance)); - vl.values = &(value_t){.derive = value_vals_v4[i]}; - plugin_dispatch_values(&vl); - } -} /* void ipstats_submit_v4 */ - -static void ipstats_submit_v6(const struct ip6stat *ip6stat_p) { - value_list_t vl = VALUE_LIST_INIT; - vl.values_len = 1; - - int i = 0; - value_vals_v6[i++] = ip6stat_p->ip6s_total; - value_vals_v6[i++] = ip6stat_p->ip6s_tooshort; - value_vals_v6[i++] = ip6stat_p->ip6s_toosmall; - value_vals_v6[i++] = ip6stat_p->ip6s_fragments; - value_vals_v6[i++] = ip6stat_p->ip6s_fragdropped; - value_vals_v6[i++] = ip6stat_p->ip6s_fragtimeout; - value_vals_v6[i++] = ip6stat_p->ip6s_fragoverflow; - value_vals_v6[i++] = ip6stat_p->ip6s_forward; - value_vals_v6[i++] = ip6stat_p->ip6s_cantforward; - value_vals_v6[i++] = ip6stat_p->ip6s_redirectsent; - value_vals_v6[i++] = ip6stat_p->ip6s_delivered; - value_vals_v6[i++] = ip6stat_p->ip6s_localout; - value_vals_v6[i++] = ip6stat_p->ip6s_odropped; - value_vals_v6[i++] = ip6stat_p->ip6s_reassembled; - value_vals_v6[i++] = ip6stat_p->ip6s_fragmented; - value_vals_v6[i++] = ip6stat_p->ip6s_ofragments; - value_vals_v6[i++] = ip6stat_p->ip6s_cantfrag; - value_vals_v6[i++] = ip6stat_p->ip6s_badoptions; - value_vals_v6[i++] = ip6stat_p->ip6s_noroute; - value_vals_v6[i++] = ip6stat_p->ip6s_badvers; - value_vals_v6[i++] = ip6stat_p->ip6s_rawout; - value_vals_v6[i++] = ip6stat_p->ip6s_badscope; - value_vals_v6[i++] = ip6stat_p->ip6s_notmember; - value_vals_v6[i++] = ip6stat_p->ip6s_nogif; - value_vals_v6[i++] = ip6stat_p->ip6s_toomanyhdr; - - sstrncpy(vl.plugin, "ipstats", sizeof(vl.plugin)); - sstrncpy(vl.plugin_instance, "ipv6", sizeof(vl.plugin_instance)); - sstrncpy(vl.type, "packets", sizeof(vl.type)); + for (int i = 0; i < config_vals_num; i++) { + if (i == v6_config_offset) + sstrncpy(vl.plugin_instance, "ipv6", sizeof(vl.plugin_instance)); - for (int i = 0; i < config_vals_v6_num; i++) - if (config_vals_v6[i] == true) { - sstrncpy(vl.type_instance, value_keys_v6[i], sizeof(vl.type_instance)); - vl.values = &(value_t){.derive = value_vals_v6[i]}; + if (config_vals[i] == true) { + sstrncpy(vl.type_instance, value_keys[i], sizeof(vl.type_instance)); + vl.values = &(value_t){.derive = value_vals[i]}; plugin_dispatch_values(&vl); } -} /* void ipstats_submit_v6 */ + } +} /* void ipstats_submit */ #endif static int ipstats_read(void) { #if KERNEL_FREEBSD - /* IPv4 */ struct ipstat ipstat; size_t ipslen = sizeof(ipstat); char mib[] = "net.inet.ip.stats"; - if (sysctlbyname(mib, &ipstat, &ipslen, NULL, 0) != 0) + if (sysctlbyname(mib, &ipstat, &ipslen, NULL, 0) != 0) { WARNING("ipstats plugin: sysctl \"%s\" failed.", mib); - else - ipstats_submit_v4(&ipstat); + return -1; + } - /* IPv6 */ struct ip6stat ip6stat; size_t ip6slen = sizeof(ip6stat); char mib6[] = "net.inet6.ip6.stats"; - if (sysctlbyname(mib6, &ip6stat, &ip6slen, NULL, 0) != 0) + if (sysctlbyname(mib6, &ip6stat, &ip6slen, NULL, 0) != 0) { WARNING("ipstats plugin: sysctl \"%s\" failed.", mib6); - else - ipstats_submit_v6(&ip6stat); + return -1; + } + + WARNING("ipstats plugin submitting values"); + ipstats_submit(&ipstat, &ip6stat); #endif return 0; @@ -269,6 +234,6 @@ static int ipstats_read(void) { void module_register(void) { plugin_register_init("ipstats", ipstats_init); plugin_register_read("ipstats", ipstats_read); - plugin_register_config("ipstats", ipstats_config, config_keys_v4, - config_keys_v4_num); + plugin_register_config("ipstats", ipstats_config, config_keys, + config_keys_num); }