]> git.ipfire.org Git - thirdparty/collectd.git/commitdiff
Rewrite to use only one config array
authorMarco van Tol <marco@tols.org>
Thu, 21 Nov 2019 20:39:47 +0000 (21:39 +0100)
committerMarco van Tol <marco@tols.org>
Thu, 21 Nov 2019 20:39:47 +0000 (21:39 +0100)
src/collectd.conf.pod
src/ipstats.c

index 8bad7e73b9cdc04c96672c57e3aa12aae28df476..1030fa011a6216d3687832f828ba691640b319fb 100644 (file)
@@ -3720,11 +3720,83 @@ Defaults to B<false>.
 
 =head2 Plugin C<ipstats>
 
-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).
+  <Plugin ipstats>
+    ip4fragment true
+    ip6fragment true
+  </Plugin>
 
 =head2 Plugin C<iptables>
 
index dfa04bfc958cad5d3c0ea41b825547edb9e176ed..46d72394f0ca715b85f592ecf4e1d04b8b99a20f 100644 (file)
 #include <netinet6/ip6_var.h>
 #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);
 }