link.cpp 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  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. // /usr/include/linux/if_link.h
  9. switch (mnl_attr_get_type(attr)) {
  10. case IFLA_ADDRESS:
  11. link->address = attr;
  12. break;
  13. case IFLA_BROADCAST:
  14. link->broadcast = attr;
  15. break;
  16. case IFLA_IFNAME:
  17. assert(mnl_attr_validate(attr, MNL_TYPE_STRING) == 0);
  18. link->ifname = mnl_attr_get_str(attr);
  19. break;
  20. case IFLA_MTU:
  21. assert(mnl_attr_validate(attr, MNL_TYPE_U32) == 0);
  22. link->mtu = mnl_attr_get_u32(attr);
  23. break;
  24. case IFLA_OPERSTATE:
  25. link->operstate = attr;
  26. break;
  27. }
  28. return MNL_CB_OK;
  29. }
  30. void Link::write_yaml(std::ostream &stream,
  31. const yaml_indent_level_t indent_level) const {
  32. const std::string indent(indent_level, ' ');
  33. stream << "ifname: " + ifname + "\n";
  34. stream << indent << "address: ";
  35. address.write_yaml(stream);
  36. stream << "\n";
  37. stream << indent << "broadcast: ";
  38. broadcast.write_yaml(stream);
  39. stream << "\n";
  40. stream << indent << "mtu: " << mtu << "\n";
  41. stream << indent << "operstate: ";
  42. operstate.write_yaml(stream);
  43. }