X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fnetlink.c;h=22afdc77f9a1701e8763207efe8bf1391c2c683e;hb=c7495cc1cada2553050e1b5b8dae8335f34ce867;hp=073efe9e9358bdff54c0f6706f41ef499ea73760;hpb=549e1f3857209db73e5e254be7aa1782c5face0c;p=collectd.git diff --git a/src/netlink.c b/src/netlink.c index 073efe9e..22afdc77 100644 --- a/src/netlink.c +++ b/src/netlink.c @@ -25,9 +25,15 @@ #include #include + #include #include -#include +#if HAVE_LINUX_GEN_STATS_H +# include +#endif +#if HAVE_LINUX_PKT_SCHED_H +# include +#endif #if HAVE_LIBNETLINK_H # include @@ -198,8 +204,8 @@ static void submit_two (const char *dev, const char *type, plugin_dispatch_values (type, &vl); } /* void submit_two */ -static int link_filter (const struct sockaddr_nl *sa, struct nlmsghdr *nmh, - void *args) +static int link_filter (const struct sockaddr_nl *sa, + const struct nlmsghdr *nmh, void *args) { struct ifinfomsg *msg; int msg_len; @@ -231,10 +237,6 @@ static int link_filter (const struct sockaddr_nl *sa, struct nlmsghdr *nmh, return (-1); } - if (attrs[IFLA_STATS] == NULL) - return (-1); - stats = RTA_DATA (attrs[IFLA_STATS]); - if (attrs[IFLA_IFNAME] == NULL) { ERROR ("netlink plugin: link_filter: attrs[IFLA_IFNAME] == NULL"); @@ -267,6 +269,13 @@ static int link_filter (const struct sockaddr_nl *sa, struct nlmsghdr *nmh, iflist[msg->ifi_index] = strdup (dev); } + if (attrs[IFLA_STATS] == NULL) + { + DEBUG ("netlink plugin: link_filter: No statistics for interface %s.", dev); + return (0); + } + stats = RTA_DATA (attrs[IFLA_STATS]); + if (check_ignorelist (dev, "interface", NULL) == 0) { submit_two (dev, "if_octets", NULL, stats->rx_bytes, stats->tx_bytes); @@ -305,8 +314,8 @@ static int link_filter (const struct sockaddr_nl *sa, struct nlmsghdr *nmh, return (0); } /* int link_filter */ -static int qos_filter (const struct sockaddr_nl *sa, struct nlmsghdr *nmh, - void *args) +static int qos_filter (const struct sockaddr_nl *sa, + const struct nlmsghdr *nmh, void *args) { struct tcmsg *msg; int msg_len; @@ -399,6 +408,7 @@ static int qos_filter (const struct sockaddr_nl *sa, struct nlmsghdr *nmh, if (check_ignorelist (dev, tc_type, tc_inst)) return (0); +#if HAVE_TCA_STATS2 if (attrs[TCA_STATS2]) { struct rtattr *attrs_stats[TCA_STATS_MAX + 1]; @@ -423,6 +433,35 @@ static int qos_filter (const struct sockaddr_nl *sa, struct nlmsghdr *nmh, submit_one (dev, "ipt_packets", type_instance, bs.packets); } } +#endif /* TCA_STATS2 */ +#if HAVE_TCA_STATS && HAVE_TCA_STATS2 + else +#endif +#if HAVE_TCA_STATS + if (attrs[TCA_STATS] != NULL) + { + struct tc_stats ts; + char type_instance[DATA_MAX_NAME_LEN]; + + snprintf (type_instance, sizeof (type_instance), "%s-%s", + tc_type, tc_inst); + type_instance[sizeof (type_instance) - 1] = '\0'; + + memset(&ts, '\0', sizeof (ts)); + memcpy(&ts, RTA_DATA (attrs[TCA_STATS]), + MIN (RTA_PAYLOAD (attrs[TCA_STATS]), sizeof (ts))); + + submit_one (dev, "ipt_bytes", type_instance, ts.bytes); + submit_one (dev, "ipt_packets", type_instance, ts.packets); + } +#endif /* TCA_STATS */ +#if HAVE_TCA_STATS || HAVE_TCA_STATS2 + else +#endif + { + DEBUG ("netlink plugin: qos_filter: Have neither TCA_STATS2 nor " + "TCA_STATS."); + } return (0); } /* int qos_filter */