+} /* void check_ignorelist_and_submit */
+
+static int link_filter_cb (const struct nlmsghdr *nlh,
+ void *args __attribute__((unused)))
+{
+ struct ifinfomsg *ifm = mnl_nlmsg_get_payload (nlh);
+ struct nlattr *attr;
+ struct rtnl_link_stats *stats = NULL;
+ const char *dev = NULL;
+
+ if (nlh->nlmsg_type != RTM_NEWLINK)
+ {
+ ERROR ("netlink plugin: link_filter_cb: Don't know how to handle type %i.",
+ nlh->nlmsg_type);
+ return MNL_CB_ERROR;
+ }
+
+ /* Scan attribute list for device name. */
+ mnl_attr_for_each (attr, nlh, sizeof (*ifm))
+ {
+ if (mnl_attr_get_type (attr) != IFLA_IFNAME)
+ continue;
+
+ if (mnl_attr_validate (attr, MNL_TYPE_STRING) < 0)
+ {
+ ERROR ("netlink plugin: link_filter_cb: IFLA_IFNAME mnl_attr_validate failed.");
+ return MNL_CB_ERROR;
+ }
+
+ dev = mnl_attr_get_str (attr);
+ if (update_iflist (ifm, dev) < 0)
+ return MNL_CB_ERROR;
+ break;
+ }
+
+ if (dev == NULL)
+ {
+ ERROR ("netlink plugin: link_filter_cb: dev == NULL");
+ return MNL_CB_ERROR;
+ }
+
+ mnl_attr_for_each (attr, nlh, sizeof (*ifm))
+ {
+ if (mnl_attr_get_type (attr) != IFLA_STATS)
+ continue;
+
+ if (mnl_attr_validate2 (attr, MNL_TYPE_UNSPEC, sizeof (*stats)) < 0)
+ {
+ ERROR ("netlink plugin: link_filter_cb: IFLA_STATS mnl_attr_validate2 failed.");
+ return MNL_CB_ERROR;
+ }
+ stats = mnl_attr_get_payload (attr);
+
+ check_ignorelist_and_submit (dev, stats);
+ break;
+ }
+
+ if (stats == NULL)
+ {
+ DEBUG ("netlink plugin: link_filter: No statistics for interface %s.", dev);
+ return MNL_CB_OK;
+ }