link.cpp 1005 B

12345678910111213141516171819202122232425262728293031323334353637383940
  1. #include "link.h"
  2. #include <libmnl/libmnl.h>
  3. #include <linux/if_link.h>
  4. #include <string>
  5. // https://netfilter.org/projects/libmnl/doxygen/html/group__attr.html
  6. int Link::mnl_attr_cb(const nlattr *attr, void *data) {
  7. Link *link = (Link *)data;
  8. switch (mnl_attr_get_type(attr)) {
  9. case IFLA_ADDRESS:
  10. link->hwaddr = attr;
  11. break;
  12. case IFLA_BROADCAST:
  13. link->broadcast = attr;
  14. break;
  15. case IFLA_IFNAME:
  16. link->ifname = mnl_attr_get_str(attr);
  17. break;
  18. case IFLA_OPERSTATE:
  19. link->operstate = attr;
  20. break;
  21. }
  22. return MNL_CB_OK;
  23. }
  24. void Link::write_yaml(std::ostream &stream,
  25. const yaml_indent_level_t indent_level) const {
  26. const std::string indent(indent_level, ' ');
  27. stream << "ifname: " + ifname + "\n";
  28. stream << indent + "hwaddr: ";
  29. hwaddr.write_yaml(stream);
  30. stream << "\n";
  31. stream << indent + "broadcast: ";
  32. broadcast.write_yaml(stream);
  33. stream << "\n";
  34. stream << indent + "operstate: ";
  35. operstate.write_yaml(stream);
  36. }