1*de1e4e89SAndroid Build Coastguard Worker #ifndef __LIBNETLINK_H__
2*de1e4e89SAndroid Build Coastguard Worker #define __LIBNETLINK_H__ 1
3*de1e4e89SAndroid Build Coastguard Worker
4*de1e4e89SAndroid Build Coastguard Worker #include <stdio.h>
5*de1e4e89SAndroid Build Coastguard Worker #include <string.h>
6*de1e4e89SAndroid Build Coastguard Worker #include <asm/types.h>
7*de1e4e89SAndroid Build Coastguard Worker #include <linux/netlink.h>
8*de1e4e89SAndroid Build Coastguard Worker #include <linux/rtnetlink.h>
9*de1e4e89SAndroid Build Coastguard Worker #include <linux/if_link.h>
10*de1e4e89SAndroid Build Coastguard Worker #include <linux/if_addr.h>
11*de1e4e89SAndroid Build Coastguard Worker #include <linux/neighbour.h>
12*de1e4e89SAndroid Build Coastguard Worker #include <linux/netconf.h>
13*de1e4e89SAndroid Build Coastguard Worker #include <arpa/inet.h>
14*de1e4e89SAndroid Build Coastguard Worker
15*de1e4e89SAndroid Build Coastguard Worker struct rtnl_handle {
16*de1e4e89SAndroid Build Coastguard Worker int fd;
17*de1e4e89SAndroid Build Coastguard Worker struct sockaddr_nl local;
18*de1e4e89SAndroid Build Coastguard Worker struct sockaddr_nl peer;
19*de1e4e89SAndroid Build Coastguard Worker __u32 seq;
20*de1e4e89SAndroid Build Coastguard Worker __u32 dump;
21*de1e4e89SAndroid Build Coastguard Worker int proto;
22*de1e4e89SAndroid Build Coastguard Worker FILE *dump_fp;
23*de1e4e89SAndroid Build Coastguard Worker #define RTNL_HANDLE_F_LISTEN_ALL_NSID 0x01
24*de1e4e89SAndroid Build Coastguard Worker #define RTNL_HANDLE_F_SUPPRESS_NLERR 0x02
25*de1e4e89SAndroid Build Coastguard Worker int flags;
26*de1e4e89SAndroid Build Coastguard Worker };
27*de1e4e89SAndroid Build Coastguard Worker
28*de1e4e89SAndroid Build Coastguard Worker struct nlmsg_list {
29*de1e4e89SAndroid Build Coastguard Worker struct nlmsg_list *next;
30*de1e4e89SAndroid Build Coastguard Worker struct nlmsghdr h;
31*de1e4e89SAndroid Build Coastguard Worker };
32*de1e4e89SAndroid Build Coastguard Worker
33*de1e4e89SAndroid Build Coastguard Worker struct nlmsg_chain {
34*de1e4e89SAndroid Build Coastguard Worker struct nlmsg_list *head;
35*de1e4e89SAndroid Build Coastguard Worker struct nlmsg_list *tail;
36*de1e4e89SAndroid Build Coastguard Worker };
37*de1e4e89SAndroid Build Coastguard Worker
38*de1e4e89SAndroid Build Coastguard Worker extern int rcvbuf;
39*de1e4e89SAndroid Build Coastguard Worker
40*de1e4e89SAndroid Build Coastguard Worker int rtnl_open(struct rtnl_handle *rth, unsigned int subscriptions)
41*de1e4e89SAndroid Build Coastguard Worker __attribute__((warn_unused_result));
42*de1e4e89SAndroid Build Coastguard Worker
43*de1e4e89SAndroid Build Coastguard Worker int rtnl_open_byproto(struct rtnl_handle *rth, unsigned int subscriptions,
44*de1e4e89SAndroid Build Coastguard Worker int protocol)
45*de1e4e89SAndroid Build Coastguard Worker __attribute__((warn_unused_result));
46*de1e4e89SAndroid Build Coastguard Worker
47*de1e4e89SAndroid Build Coastguard Worker void rtnl_close(struct rtnl_handle *rth);
48*de1e4e89SAndroid Build Coastguard Worker int rtnl_wilddump_request(struct rtnl_handle *rth, int fam, int type)
49*de1e4e89SAndroid Build Coastguard Worker __attribute__((warn_unused_result));
50*de1e4e89SAndroid Build Coastguard Worker int rtnl_wilddump_req_filter(struct rtnl_handle *rth, int fam, int type,
51*de1e4e89SAndroid Build Coastguard Worker __u32 filt_mask)
52*de1e4e89SAndroid Build Coastguard Worker __attribute__((warn_unused_result));
53*de1e4e89SAndroid Build Coastguard Worker
54*de1e4e89SAndroid Build Coastguard Worker typedef int (*req_filter_fn_t)(struct nlmsghdr *nlh, int reqlen);
55*de1e4e89SAndroid Build Coastguard Worker
56*de1e4e89SAndroid Build Coastguard Worker int rtnl_wilddump_req_filter_fn(struct rtnl_handle *rth, int fam, int type,
57*de1e4e89SAndroid Build Coastguard Worker req_filter_fn_t fn)
58*de1e4e89SAndroid Build Coastguard Worker __attribute__((warn_unused_result));
59*de1e4e89SAndroid Build Coastguard Worker int rtnl_wilddump_stats_req_filter(struct rtnl_handle *rth, int fam, int type,
60*de1e4e89SAndroid Build Coastguard Worker __u32 filt_mask)
61*de1e4e89SAndroid Build Coastguard Worker __attribute__((warn_unused_result));
62*de1e4e89SAndroid Build Coastguard Worker int rtnl_dump_request(struct rtnl_handle *rth, int type, void *req,
63*de1e4e89SAndroid Build Coastguard Worker int len)
64*de1e4e89SAndroid Build Coastguard Worker __attribute__((warn_unused_result));
65*de1e4e89SAndroid Build Coastguard Worker int rtnl_dump_request_n(struct rtnl_handle *rth, struct nlmsghdr *n)
66*de1e4e89SAndroid Build Coastguard Worker __attribute__((warn_unused_result));
67*de1e4e89SAndroid Build Coastguard Worker
68*de1e4e89SAndroid Build Coastguard Worker struct rtnl_ctrl_data {
69*de1e4e89SAndroid Build Coastguard Worker int nsid;
70*de1e4e89SAndroid Build Coastguard Worker };
71*de1e4e89SAndroid Build Coastguard Worker
72*de1e4e89SAndroid Build Coastguard Worker typedef int (*rtnl_filter_t)(const struct sockaddr_nl *,
73*de1e4e89SAndroid Build Coastguard Worker struct nlmsghdr *n, void *);
74*de1e4e89SAndroid Build Coastguard Worker
75*de1e4e89SAndroid Build Coastguard Worker typedef int (*rtnl_listen_filter_t)(const struct sockaddr_nl *,
76*de1e4e89SAndroid Build Coastguard Worker struct rtnl_ctrl_data *,
77*de1e4e89SAndroid Build Coastguard Worker struct nlmsghdr *n, void *);
78*de1e4e89SAndroid Build Coastguard Worker
79*de1e4e89SAndroid Build Coastguard Worker typedef int (*nl_ext_ack_fn_t)(const char *errmsg, uint32_t off,
80*de1e4e89SAndroid Build Coastguard Worker const struct nlmsghdr *inner_nlh);
81*de1e4e89SAndroid Build Coastguard Worker
82*de1e4e89SAndroid Build Coastguard Worker struct rtnl_dump_filter_arg {
83*de1e4e89SAndroid Build Coastguard Worker rtnl_filter_t filter;
84*de1e4e89SAndroid Build Coastguard Worker void *arg1;
85*de1e4e89SAndroid Build Coastguard Worker __u16 nc_flags;
86*de1e4e89SAndroid Build Coastguard Worker };
87*de1e4e89SAndroid Build Coastguard Worker
88*de1e4e89SAndroid Build Coastguard Worker int rtnl_dump_filter_l(struct rtnl_handle *rth,
89*de1e4e89SAndroid Build Coastguard Worker const struct rtnl_dump_filter_arg *arg);
90*de1e4e89SAndroid Build Coastguard Worker int rtnl_dump_filter_nc(struct rtnl_handle *rth,
91*de1e4e89SAndroid Build Coastguard Worker rtnl_filter_t filter,
92*de1e4e89SAndroid Build Coastguard Worker void *arg, __u16 nc_flags);
93*de1e4e89SAndroid Build Coastguard Worker #define rtnl_dump_filter(rth, filter, arg) \
94*de1e4e89SAndroid Build Coastguard Worker rtnl_dump_filter_nc(rth, filter, arg, 0)
95*de1e4e89SAndroid Build Coastguard Worker int rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n,
96*de1e4e89SAndroid Build Coastguard Worker struct nlmsghdr *answer, size_t len)
97*de1e4e89SAndroid Build Coastguard Worker __attribute__((warn_unused_result));
98*de1e4e89SAndroid Build Coastguard Worker int rtnl_talk_extack(struct rtnl_handle *rtnl, struct nlmsghdr *n,
99*de1e4e89SAndroid Build Coastguard Worker struct nlmsghdr *answer, size_t len, nl_ext_ack_fn_t errfn)
100*de1e4e89SAndroid Build Coastguard Worker __attribute__((warn_unused_result));
101*de1e4e89SAndroid Build Coastguard Worker int rtnl_talk_suppress_rtnl_errmsg(struct rtnl_handle *rtnl, struct nlmsghdr *n,
102*de1e4e89SAndroid Build Coastguard Worker struct nlmsghdr *answer, size_t len)
103*de1e4e89SAndroid Build Coastguard Worker __attribute__((warn_unused_result));
104*de1e4e89SAndroid Build Coastguard Worker int rtnl_send(struct rtnl_handle *rth, const void *buf, int)
105*de1e4e89SAndroid Build Coastguard Worker __attribute__((warn_unused_result));
106*de1e4e89SAndroid Build Coastguard Worker int rtnl_send_check(struct rtnl_handle *rth, const void *buf, int)
107*de1e4e89SAndroid Build Coastguard Worker __attribute__((warn_unused_result));
108*de1e4e89SAndroid Build Coastguard Worker
109*de1e4e89SAndroid Build Coastguard Worker int addattr(struct nlmsghdr *n, int maxlen, int type);
110*de1e4e89SAndroid Build Coastguard Worker int addattr8(struct nlmsghdr *n, int maxlen, int type, __u8 data);
111*de1e4e89SAndroid Build Coastguard Worker int addattr16(struct nlmsghdr *n, int maxlen, int type, __u16 data);
112*de1e4e89SAndroid Build Coastguard Worker int addattr32(struct nlmsghdr *n, int maxlen, int type, __u32 data);
113*de1e4e89SAndroid Build Coastguard Worker int addattr64(struct nlmsghdr *n, int maxlen, int type, __u64 data);
114*de1e4e89SAndroid Build Coastguard Worker int addattrstrz(struct nlmsghdr *n, int maxlen, int type, const char *data);
115*de1e4e89SAndroid Build Coastguard Worker
116*de1e4e89SAndroid Build Coastguard Worker int addattr_l(struct nlmsghdr *n, int maxlen, int type,
117*de1e4e89SAndroid Build Coastguard Worker const void *data, int alen);
118*de1e4e89SAndroid Build Coastguard Worker int addraw_l(struct nlmsghdr *n, int maxlen, const void *data, int len);
119*de1e4e89SAndroid Build Coastguard Worker struct rtattr *addattr_nest(struct nlmsghdr *n, int maxlen, int type);
120*de1e4e89SAndroid Build Coastguard Worker int addattr_nest_end(struct nlmsghdr *n, struct rtattr *nest);
121*de1e4e89SAndroid Build Coastguard Worker struct rtattr *addattr_nest_compat(struct nlmsghdr *n, int maxlen, int type,
122*de1e4e89SAndroid Build Coastguard Worker const void *data, int len);
123*de1e4e89SAndroid Build Coastguard Worker int addattr_nest_compat_end(struct nlmsghdr *n, struct rtattr *nest);
124*de1e4e89SAndroid Build Coastguard Worker int rta_addattr8(struct rtattr *rta, int maxlen, int type, __u8 data);
125*de1e4e89SAndroid Build Coastguard Worker int rta_addattr16(struct rtattr *rta, int maxlen, int type, __u16 data);
126*de1e4e89SAndroid Build Coastguard Worker int rta_addattr32(struct rtattr *rta, int maxlen, int type, __u32 data);
127*de1e4e89SAndroid Build Coastguard Worker int rta_addattr64(struct rtattr *rta, int maxlen, int type, __u64 data);
128*de1e4e89SAndroid Build Coastguard Worker int rta_addattr_l(struct rtattr *rta, int maxlen, int type,
129*de1e4e89SAndroid Build Coastguard Worker const void *data, int alen);
130*de1e4e89SAndroid Build Coastguard Worker
131*de1e4e89SAndroid Build Coastguard Worker int parse_rtattr(struct rtattr *tb[], int max, struct rtattr *rta, int len);
132*de1e4e89SAndroid Build Coastguard Worker int parse_rtattr_flags(struct rtattr *tb[], int max, struct rtattr *rta,
133*de1e4e89SAndroid Build Coastguard Worker int len, unsigned short flags);
134*de1e4e89SAndroid Build Coastguard Worker int parse_rtattr_byindex(struct rtattr *tb[], int max,
135*de1e4e89SAndroid Build Coastguard Worker struct rtattr *rta, int len);
136*de1e4e89SAndroid Build Coastguard Worker struct rtattr *parse_rtattr_one(int type, struct rtattr *rta, int len);
137*de1e4e89SAndroid Build Coastguard Worker int __parse_rtattr_nested_compat(struct rtattr *tb[], int max, struct rtattr *rta, int len);
138*de1e4e89SAndroid Build Coastguard Worker
139*de1e4e89SAndroid Build Coastguard Worker struct rtattr *rta_nest(struct rtattr *rta, int maxlen, int type);
140*de1e4e89SAndroid Build Coastguard Worker int rta_nest_end(struct rtattr *rta, struct rtattr *nest);
141*de1e4e89SAndroid Build Coastguard Worker
142*de1e4e89SAndroid Build Coastguard Worker #define RTA_TAIL(rta) \
143*de1e4e89SAndroid Build Coastguard Worker ((struct rtattr *) (((void *) (rta)) + \
144*de1e4e89SAndroid Build Coastguard Worker RTA_ALIGN((rta)->rta_len)))
145*de1e4e89SAndroid Build Coastguard Worker
146*de1e4e89SAndroid Build Coastguard Worker #define parse_rtattr_nested(tb, max, rta) \
147*de1e4e89SAndroid Build Coastguard Worker (parse_rtattr((tb), (max), RTA_DATA(rta), RTA_PAYLOAD(rta)))
148*de1e4e89SAndroid Build Coastguard Worker
149*de1e4e89SAndroid Build Coastguard Worker #define parse_rtattr_one_nested(type, rta) \
150*de1e4e89SAndroid Build Coastguard Worker (parse_rtattr_one(type, RTA_DATA(rta), RTA_PAYLOAD(rta)))
151*de1e4e89SAndroid Build Coastguard Worker
152*de1e4e89SAndroid Build Coastguard Worker #define parse_rtattr_nested_compat(tb, max, rta, data, len) \
153*de1e4e89SAndroid Build Coastguard Worker ({ data = RTA_PAYLOAD(rta) >= len ? RTA_DATA(rta) : NULL; \
154*de1e4e89SAndroid Build Coastguard Worker __parse_rtattr_nested_compat(tb, max, rta, len); })
155*de1e4e89SAndroid Build Coastguard Worker
rta_getattr_u8(const struct rtattr * rta)156*de1e4e89SAndroid Build Coastguard Worker static inline __u8 rta_getattr_u8(const struct rtattr *rta)
157*de1e4e89SAndroid Build Coastguard Worker {
158*de1e4e89SAndroid Build Coastguard Worker return *(__u8 *)RTA_DATA(rta);
159*de1e4e89SAndroid Build Coastguard Worker }
rta_getattr_u16(const struct rtattr * rta)160*de1e4e89SAndroid Build Coastguard Worker static inline __u16 rta_getattr_u16(const struct rtattr *rta)
161*de1e4e89SAndroid Build Coastguard Worker {
162*de1e4e89SAndroid Build Coastguard Worker return *(__u16 *)RTA_DATA(rta);
163*de1e4e89SAndroid Build Coastguard Worker }
rta_getattr_be16(const struct rtattr * rta)164*de1e4e89SAndroid Build Coastguard Worker static inline __be16 rta_getattr_be16(const struct rtattr *rta)
165*de1e4e89SAndroid Build Coastguard Worker {
166*de1e4e89SAndroid Build Coastguard Worker return ntohs(rta_getattr_u16(rta));
167*de1e4e89SAndroid Build Coastguard Worker }
rta_getattr_u32(const struct rtattr * rta)168*de1e4e89SAndroid Build Coastguard Worker static inline __u32 rta_getattr_u32(const struct rtattr *rta)
169*de1e4e89SAndroid Build Coastguard Worker {
170*de1e4e89SAndroid Build Coastguard Worker return *(__u32 *)RTA_DATA(rta);
171*de1e4e89SAndroid Build Coastguard Worker }
rta_getattr_be32(const struct rtattr * rta)172*de1e4e89SAndroid Build Coastguard Worker static inline __be32 rta_getattr_be32(const struct rtattr *rta)
173*de1e4e89SAndroid Build Coastguard Worker {
174*de1e4e89SAndroid Build Coastguard Worker return ntohl(rta_getattr_u32(rta));
175*de1e4e89SAndroid Build Coastguard Worker }
rta_getattr_u64(const struct rtattr * rta)176*de1e4e89SAndroid Build Coastguard Worker static inline __u64 rta_getattr_u64(const struct rtattr *rta)
177*de1e4e89SAndroid Build Coastguard Worker {
178*de1e4e89SAndroid Build Coastguard Worker __u64 tmp;
179*de1e4e89SAndroid Build Coastguard Worker
180*de1e4e89SAndroid Build Coastguard Worker memcpy(&tmp, RTA_DATA(rta), sizeof(__u64));
181*de1e4e89SAndroid Build Coastguard Worker return tmp;
182*de1e4e89SAndroid Build Coastguard Worker }
rta_getattr_str(const struct rtattr * rta)183*de1e4e89SAndroid Build Coastguard Worker static inline const char *rta_getattr_str(const struct rtattr *rta)
184*de1e4e89SAndroid Build Coastguard Worker {
185*de1e4e89SAndroid Build Coastguard Worker return (const char *)RTA_DATA(rta);
186*de1e4e89SAndroid Build Coastguard Worker }
187*de1e4e89SAndroid Build Coastguard Worker
188*de1e4e89SAndroid Build Coastguard Worker int rtnl_listen_all_nsid(struct rtnl_handle *);
189*de1e4e89SAndroid Build Coastguard Worker int rtnl_listen(struct rtnl_handle *, rtnl_listen_filter_t handler,
190*de1e4e89SAndroid Build Coastguard Worker void *jarg);
191*de1e4e89SAndroid Build Coastguard Worker int rtnl_from_file(FILE *, rtnl_listen_filter_t handler,
192*de1e4e89SAndroid Build Coastguard Worker void *jarg);
193*de1e4e89SAndroid Build Coastguard Worker
194*de1e4e89SAndroid Build Coastguard Worker #define NLMSG_TAIL(nmsg) \
195*de1e4e89SAndroid Build Coastguard Worker ((struct rtattr *) (((void *) (nmsg)) + NLMSG_ALIGN((nmsg)->nlmsg_len)))
196*de1e4e89SAndroid Build Coastguard Worker
197*de1e4e89SAndroid Build Coastguard Worker #ifndef IFA_RTA
198*de1e4e89SAndroid Build Coastguard Worker #define IFA_RTA(r) \
199*de1e4e89SAndroid Build Coastguard Worker ((struct rtattr *)(((char *)(r)) + NLMSG_ALIGN(sizeof(struct ifaddrmsg))))
200*de1e4e89SAndroid Build Coastguard Worker #endif
201*de1e4e89SAndroid Build Coastguard Worker #ifndef IFA_PAYLOAD
202*de1e4e89SAndroid Build Coastguard Worker #define IFA_PAYLOAD(n) NLMSG_PAYLOAD(n, sizeof(struct ifaddrmsg))
203*de1e4e89SAndroid Build Coastguard Worker #endif
204*de1e4e89SAndroid Build Coastguard Worker
205*de1e4e89SAndroid Build Coastguard Worker #ifndef IFLA_RTA
206*de1e4e89SAndroid Build Coastguard Worker #define IFLA_RTA(r) \
207*de1e4e89SAndroid Build Coastguard Worker ((struct rtattr *)(((char *)(r)) + NLMSG_ALIGN(sizeof(struct ifinfomsg))))
208*de1e4e89SAndroid Build Coastguard Worker #endif
209*de1e4e89SAndroid Build Coastguard Worker #ifndef IFLA_PAYLOAD
210*de1e4e89SAndroid Build Coastguard Worker #define IFLA_PAYLOAD(n) NLMSG_PAYLOAD(n, sizeof(struct ifinfomsg))
211*de1e4e89SAndroid Build Coastguard Worker #endif
212*de1e4e89SAndroid Build Coastguard Worker
213*de1e4e89SAndroid Build Coastguard Worker #ifndef NDA_RTA
214*de1e4e89SAndroid Build Coastguard Worker #define NDA_RTA(r) \
215*de1e4e89SAndroid Build Coastguard Worker ((struct rtattr *)(((char *)(r)) + NLMSG_ALIGN(sizeof(struct ndmsg))))
216*de1e4e89SAndroid Build Coastguard Worker #endif
217*de1e4e89SAndroid Build Coastguard Worker #ifndef NDA_PAYLOAD
218*de1e4e89SAndroid Build Coastguard Worker #define NDA_PAYLOAD(n) NLMSG_PAYLOAD(n, sizeof(struct ndmsg))
219*de1e4e89SAndroid Build Coastguard Worker #endif
220*de1e4e89SAndroid Build Coastguard Worker
221*de1e4e89SAndroid Build Coastguard Worker #ifndef NDTA_RTA
222*de1e4e89SAndroid Build Coastguard Worker #define NDTA_RTA(r) \
223*de1e4e89SAndroid Build Coastguard Worker ((struct rtattr *)(((char *)(r)) + NLMSG_ALIGN(sizeof(struct ndtmsg))))
224*de1e4e89SAndroid Build Coastguard Worker #endif
225*de1e4e89SAndroid Build Coastguard Worker #ifndef NDTA_PAYLOAD
226*de1e4e89SAndroid Build Coastguard Worker #define NDTA_PAYLOAD(n) NLMSG_PAYLOAD(n, sizeof(struct ndtmsg))
227*de1e4e89SAndroid Build Coastguard Worker #endif
228*de1e4e89SAndroid Build Coastguard Worker
229*de1e4e89SAndroid Build Coastguard Worker #ifndef NETNS_RTA
230*de1e4e89SAndroid Build Coastguard Worker #define NETNS_RTA(r) \
231*de1e4e89SAndroid Build Coastguard Worker ((struct rtattr *)(((char *)(r)) + NLMSG_ALIGN(sizeof(struct rtgenmsg))))
232*de1e4e89SAndroid Build Coastguard Worker #endif
233*de1e4e89SAndroid Build Coastguard Worker #ifndef NETNS_PAYLOAD
234*de1e4e89SAndroid Build Coastguard Worker #define NETNS_PAYLOAD(n) NLMSG_PAYLOAD(n, sizeof(struct rtgenmsg))
235*de1e4e89SAndroid Build Coastguard Worker #endif
236*de1e4e89SAndroid Build Coastguard Worker
237*de1e4e89SAndroid Build Coastguard Worker #ifndef IFLA_STATS_RTA
238*de1e4e89SAndroid Build Coastguard Worker #define IFLA_STATS_RTA(r) \
239*de1e4e89SAndroid Build Coastguard Worker ((struct rtattr *)(((char *)(r)) + NLMSG_ALIGN(sizeof(struct if_stats_msg))))
240*de1e4e89SAndroid Build Coastguard Worker #endif
241*de1e4e89SAndroid Build Coastguard Worker
242*de1e4e89SAndroid Build Coastguard Worker /* User defined nlmsg_type which is used mostly for logging netlink
243*de1e4e89SAndroid Build Coastguard Worker * messages from dump file */
244*de1e4e89SAndroid Build Coastguard Worker #define NLMSG_TSTAMP 15
245*de1e4e89SAndroid Build Coastguard Worker
246*de1e4e89SAndroid Build Coastguard Worker #endif /* __LIBNETLINK_H__ */
247