link.cpp 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. #include "link.h"
  2. #include <libmnl/libmnl.h> // mnl_attr_*
  3. #include <linux/if_link.h> // IFLA_*
  4. #include <string> // std::string
  5. Link::Link(const ifinfomsg *msg) {
  6. /*
  7. struct ifinfomsg {
  8. unsigned char ifi_family; // AF_UNSPEC
  9. unsigned short ifi_type; // Device type
  10. int ifi_index; // Interface index
  11. unsigned int ifi_flags; // Device flags
  12. unsigned int ifi_change; // change mask
  13. };
  14. */
  15. index = msg->ifi_index;
  16. }
  17. int Link::mnl_attr_cb(const nlattr *attr, void *data) {
  18. Link *link = (Link *)data;
  19. // https://netfilter.org/projects/libmnl/doxygen/html/group__attr.html
  20. // /usr/include/linux/if_link.h
  21. switch (mnl_attr_get_type(attr)) {
  22. case IFLA_ADDRESS:
  23. link->address = attr;
  24. break;
  25. case IFLA_BROADCAST:
  26. link->broadcast = attr;
  27. break;
  28. case IFLA_IFNAME:
  29. assert(mnl_attr_validate(attr, MNL_TYPE_STRING) == 0);
  30. link->ifname = mnl_attr_get_str(attr);
  31. break;
  32. case IFLA_MTU:
  33. assert(mnl_attr_validate(attr, MNL_TYPE_U32) == 0);
  34. link->mtu = mnl_attr_get_u32(attr);
  35. break;
  36. case IFLA_OPERSTATE:
  37. link->operstate = attr;
  38. break;
  39. }
  40. return MNL_CB_OK;
  41. }
  42. void Link::write_yaml(std::ostream &stream,
  43. const yaml_indent_level_t indent_level) const {
  44. const std::string indent(indent_level, ' ');
  45. stream << "ifname: " + ifname + "\n";
  46. // stream << indent << "index: " << index << "\n";
  47. if (address.specified()) {
  48. stream << indent << "address: ";
  49. address.write_yaml(stream);
  50. }
  51. if (broadcast.specified()) {
  52. stream << indent << "broadcast: ";
  53. broadcast.write_yaml(stream);
  54. }
  55. stream << indent << "mtu: " << mtu << "\n";
  56. stream << indent << "operstate: ";
  57. operstate.write_yaml(stream);
  58. stream << indent << "addresses: ";
  59. addresses.write_yaml(stream, indent_level + 2);
  60. }