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);
|
---|