[398] | 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(nlh,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 | int __rtnetlink_enumerate(int link_af, int addr_af, int (*cb)(void *ctx, struct nlmsghdr *h), void *ctx);
|
---|