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 hidden int __rtnetlink_enumerate(int link_af, int addr_af, int (*cb)(void *ctx, struct nlmsghdr *h), void *ctx);
95