Browse Source

move definition of link_attr_cb to Link::mnl_attr_cb

Fabian Peter Hammerle 7 years ago
parent
commit
f8b4a4df09
2 changed files with 22 additions and 19 deletions
  1. 21 0
      link.h
  2. 1 19
      main.cpp

+ 21 - 0
link.h

@@ -4,14 +4,35 @@
 #include "hardware_address.h"
 #include "yaml.h"
 
+#include <libmnl/libmnl.h>
+#include <linux/if_link.h>
 #include <ostream>
 #include <string>
 
+// https://netfilter.org/projects/libmnl/doxygen/html/group__attr.html
+
 class Link : public YamlObject {
 public:
   std::string ifname;
   HardwareAddress hwaddr, broadcast;
 
+  // typedef int (*mnl_attr_cb_t)(const struct nlattr *attr, void *data);
+  static int mnl_attr_cb(const nlattr *attr, void *data) {
+    Link *link = (Link *)data;
+    switch (mnl_attr_get_type(attr)) {
+    case IFLA_ADDRESS:
+      link->hwaddr = attr;
+      break;
+    case IFLA_BROADCAST:
+      link->broadcast = attr;
+      break;
+    case IFLA_IFNAME:
+      link->ifname = mnl_attr_get_str(attr);
+      break;
+    }
+    return MNL_CB_OK;
+  }
+
   void write_yaml(std::ostream &stream,
                   const yaml_indent_level_t indent_level = 0) const {
     const std::string indent(indent_level, ' ');

+ 1 - 19
main.cpp

@@ -5,34 +5,16 @@
 #include <assert.h>
 #include <iostream>
 #include <libmnl/libmnl.h>
-#include <linux/if_link.h>
 #include <linux/netlink.h>
 #include <linux/rtnetlink.h>
 #include <string>
 
 // https://netfilter.org/projects/libmnl/doxygen/html/modules.html
 
-static int link_attr_cb(const nlattr *attr, void *data) {
-  Link *link = (Link *)data;
-  // /usr/include/linux/if_link.h
-  switch (mnl_attr_get_type(attr)) {
-  case IFLA_ADDRESS:
-    link->hwaddr = attr;
-    break;
-  case IFLA_BROADCAST:
-    link->broadcast = attr;
-    break;
-  case IFLA_IFNAME:
-    link->ifname = mnl_attr_get_str(attr);
-    break;
-  }
-  return MNL_CB_OK;
-}
-
 static int link_cb(const nlmsghdr *nlh, void *data) {
   vector<Link> *links = (vector<Link> *)data;
   links->emplace_back();
-  mnl_attr_parse(nlh, sizeof(ifinfomsg), link_attr_cb, &links->back());
+  mnl_attr_parse(nlh, sizeof(ifinfomsg), Link::mnl_attr_cb, &links->back());
   return MNL_CB_OK;
 }