link.h 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. #ifndef _IPYML_LINK_H
  2. #define _IPYML_LINK_H
  3. #include "hardware_address.h"
  4. #include "yaml.h"
  5. #include <libmnl/libmnl.h>
  6. #include <linux/if_link.h>
  7. #include <ostream>
  8. #include <string>
  9. // https://netfilter.org/projects/libmnl/doxygen/html/group__attr.html
  10. class Link : public YamlObject {
  11. public:
  12. std::string ifname;
  13. HardwareAddress hwaddr, broadcast;
  14. // typedef int (*mnl_attr_cb_t)(const struct nlattr *attr, void *data);
  15. static int mnl_attr_cb(const nlattr *attr, void *data) {
  16. Link *link = (Link *)data;
  17. switch (mnl_attr_get_type(attr)) {
  18. case IFLA_ADDRESS:
  19. link->hwaddr = attr;
  20. break;
  21. case IFLA_BROADCAST:
  22. link->broadcast = attr;
  23. break;
  24. case IFLA_IFNAME:
  25. link->ifname = mnl_attr_get_str(attr);
  26. break;
  27. }
  28. return MNL_CB_OK;
  29. }
  30. void write_yaml(std::ostream &stream,
  31. const yaml_indent_level_t indent_level = 0) const {
  32. const std::string indent(indent_level, ' ');
  33. stream << "ifname: " + ifname + "\n";
  34. stream << indent + "hwaddr: ";
  35. hwaddr.write_yaml(stream);
  36. stream << "\n";
  37. stream << indent + "broadcast: ";
  38. broadcast.write_yaml(stream);
  39. stream << "\n";
  40. }
  41. };
  42. #endif