1 #include <stdint.h> 2 3 /* linux/netlink.h */ 4 5 #define NETLINK_ROUTE 0 6 7 struct nlmsghdr { 8 uint32_t nlmsg_len; 9 uint16_t nlmsg_type; 10 uint16_t nlmsg_flags; 11 uint32_t nlmsg_seq; 12 uint32_t nlmsg_pid; 13 }; 14 15 #define NLM_F_REQUEST 1 16 #define NLM_F_MULTI 2 17 #define NLM_F_ACK 4 18 19 #define NLM_F_ROOT 0x100 20 #define NLM_F_MATCH 0x200 21 #define NLM_F_ATOMIC 0x400 22 #define NLM_F_DUMP (NLM_F_ROOT|NLM_F_MATCH) 23 24 #define NLMSG_NOOP 0x1 25 #define NLMSG_ERROR 0x2 26 #define NLMSG_DONE 0x3 27 #define NLMSG_OVERRUN 0x4 28 29 /* linux/rtnetlink.h */ 30 31 #define RTM_NEWLINK 16 32 #define RTM_GETLINK 18 33 #define RTM_NEWADDR 20 34 #define RTM_GETADDR 22 35 36 struct rtattr { 37 unsigned short rta_len; 38 unsigned short rta_type; 39 }; 40 41 struct rtgenmsg { 42 unsigned char rtgen_family; 43 }; 44 45 struct ifinfomsg { 46 unsigned char ifi_family; 47 unsigned char __ifi_pad; 48 unsigned short ifi_type; 49 int ifi_index; 50 unsigned ifi_flags; 51 unsigned ifi_change; 52 }; 53 54 /* linux/if_link.h */ 55 56 #define IFLA_ADDRESS 1 57 #define IFLA_BROADCAST 2 58 #define IFLA_IFNAME 3 59 #define IFLA_STATS 7 60 61 /* linux/if_addr.h */ 62 63 struct ifaddrmsg { 64 uint8_t ifa_family; 65 uint8_t ifa_prefixlen; 66 uint8_t ifa_flags; 67 uint8_t ifa_scope; 68 uint32_t ifa_index; 69 }; 70 71 #define IFA_ADDRESS 1 72 #define IFA_LOCAL 2 73 #define IFA_LABEL 3 74 #define IFA_BROADCAST 4 75 76 /* musl */ 77 78 #define NETLINK_ALIGN(len) (((len)+3) & ~3) 79 #define NLMSG_DATA(nlh) ((void*)((char*)(nlh)+sizeof(struct nlmsghdr))) 80 #define NLMSG_DATALEN(nlh) ((nlh)->nlmsg_len-sizeof(struct nlmsghdr)) 81 #define NLMSG_DATAEND(nlh) ((char*)(nlh)+(nlh)->nlmsg_len) 82 #define NLMSG_NEXT(nlh) (struct nlmsghdr*)((char*)(nlh)+NETLINK_ALIGN((nlh)->nlmsg_len)) 83 #define NLMSG_OK(nlh,end) ((char*)(end)-(char*)(nlh) >= sizeof(struct nlmsghdr)) 84 85 #define RTA_DATA(rta) ((void*)((char*)(rta)+sizeof(struct rtattr))) 86 #define RTA_DATALEN(rta) ((rta)->rta_len-sizeof(struct rtattr)) 87 #define RTA_DATAEND(rta) ((char*)(rta)+(rta)->rta_len) 88 #define RTA_NEXT(rta) (struct rtattr*)((char*)(rta)+NETLINK_ALIGN((rta)->rta_len)) 89 #define RTA_OK(rta,end) ((char*)(end)-(char*)(rta) >= sizeof(struct rtattr)) 90 91 #define NLMSG_RTA(nlh,len) ((void*)((char*)(nlh)+sizeof(struct nlmsghdr)+NETLINK_ALIGN(len))) 92 #define NLMSG_RTAOK(rta,nlh) RTA_OK(rta,NLMSG_DATAEND(nlh)) 93 94 hidden int __rtnetlink_enumerate(int link_af, int addr_af, int (*cb)(void *ctx, struct nlmsghdr *h), void *ctx); 95