]>
Commit | Line | Data |
---|---|---|
aba5acdf SH |
1 | #ifndef __LIBNETLINK_H__ |
2 | #define __LIBNETLINK_H__ 1 | |
3 | ||
5bd9dd49 | 4 | #include <stdio.h> |
f5b830dc | 5 | #include <string.h> |
aba5acdf SH |
6 | #include <asm/types.h> |
7 | #include <linux/netlink.h> | |
8 | #include <linux/rtnetlink.h> | |
ead2ba70 SH |
9 | #include <linux/if_link.h> |
10 | #include <linux/if_addr.h> | |
11 | #include <linux/neighbour.h> | |
9d0efc10 | 12 | #include <linux/netconf.h> |
aba5acdf | 13 | |
e9e9365b | 14 | struct rtnl_handle { |
aba5acdf SH |
15 | int fd; |
16 | struct sockaddr_nl local; | |
17 | struct sockaddr_nl peer; | |
18 | __u32 seq; | |
19 | __u32 dump; | |
8a4025f6 | 20 | int proto; |
486ccd99 | 21 | FILE *dump_fp; |
449b824a ND |
22 | #define RTNL_HANDLE_F_LISTEN_ALL_NSID 0x01 |
23 | int flags; | |
aba5acdf SH |
24 | }; |
25 | ||
7f03191f PM |
26 | extern int rcvbuf; |
27 | ||
e9e9365b | 28 | int rtnl_open(struct rtnl_handle *rth, unsigned int subscriptions) |
d2468da0 SH |
29 | __attribute__((warn_unused_result)); |
30 | ||
e9e9365b | 31 | int rtnl_open_byproto(struct rtnl_handle *rth, unsigned int subscriptions, |
d2468da0 SH |
32 | int protocol) |
33 | __attribute__((warn_unused_result)); | |
34 | ||
892e2124 SH |
35 | void rtnl_close(struct rtnl_handle *rth); |
36 | int rtnl_wilddump_request(struct rtnl_handle *rth, int fam, int type) | |
d2468da0 | 37 | __attribute__((warn_unused_result)); |
892e2124 | 38 | int rtnl_wilddump_req_filter(struct rtnl_handle *rth, int fam, int type, |
d2468da0 SH |
39 | __u32 filt_mask) |
40 | __attribute__((warn_unused_result)); | |
892e2124 | 41 | int rtnl_dump_request(struct rtnl_handle *rth, int type, void *req, |
d2468da0 SH |
42 | int len) |
43 | __attribute__((warn_unused_result)); | |
0d238ca2 DA |
44 | int rtnl_dump_request_n(struct rtnl_handle *rth, struct nlmsghdr *n) |
45 | __attribute__((warn_unused_result)); | |
6dc9f016 | 46 | |
0628cddd | 47 | struct rtnl_ctrl_data { |
449b824a | 48 | int nsid; |
0628cddd ND |
49 | }; |
50 | ||
ae665a52 | 51 | typedef int (*rtnl_filter_t)(const struct sockaddr_nl *, |
50772dc5 | 52 | struct nlmsghdr *n, void *); |
b49240ec | 53 | |
0628cddd ND |
54 | typedef int (*rtnl_listen_filter_t)(const struct sockaddr_nl *, |
55 | struct rtnl_ctrl_data *, | |
56 | struct nlmsghdr *n, void *); | |
57 | ||
e9e9365b | 58 | struct rtnl_dump_filter_arg { |
b49240ec SH |
59 | rtnl_filter_t filter; |
60 | void *arg1; | |
8e72880f | 61 | __u16 nc_flags; |
b49240ec SH |
62 | }; |
63 | ||
892e2124 | 64 | int rtnl_dump_filter_l(struct rtnl_handle *rth, |
b49240ec | 65 | const struct rtnl_dump_filter_arg *arg); |
8e72880f PS |
66 | int rtnl_dump_filter_nc(struct rtnl_handle *rth, |
67 | rtnl_filter_t filter, | |
68 | void *arg, __u16 nc_flags); | |
69 | #define rtnl_dump_filter(rth, filter, arg) \ | |
70 | rtnl_dump_filter_nc(rth, filter, arg, 0) | |
892e2124 SH |
71 | int rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n, |
72 | struct nlmsghdr *answer, size_t len) | |
d2468da0 | 73 | __attribute__((warn_unused_result)); |
892e2124 | 74 | int rtnl_send(struct rtnl_handle *rth, const void *buf, int) |
d2468da0 | 75 | __attribute__((warn_unused_result)); |
892e2124 | 76 | int rtnl_send_check(struct rtnl_handle *rth, const void *buf, int) |
d2468da0 | 77 | __attribute__((warn_unused_result)); |
aba5acdf | 78 | |
892e2124 SH |
79 | int addattr(struct nlmsghdr *n, int maxlen, int type); |
80 | int addattr8(struct nlmsghdr *n, int maxlen, int type, __u8 data); | |
81 | int addattr16(struct nlmsghdr *n, int maxlen, int type, __u16 data); | |
82 | int addattr32(struct nlmsghdr *n, int maxlen, int type, __u32 data); | |
83 | int addattr64(struct nlmsghdr *n, int maxlen, int type, __u64 data); | |
84 | int addattrstrz(struct nlmsghdr *n, int maxlen, int type, const char *data); | |
85 | ||
86 | int addattr_l(struct nlmsghdr *n, int maxlen, int type, | |
87 | const void *data, int alen); | |
88 | int addraw_l(struct nlmsghdr *n, int maxlen, const void *data, int len); | |
89 | struct rtattr *addattr_nest(struct nlmsghdr *n, int maxlen, int type); | |
90 | int addattr_nest_end(struct nlmsghdr *n, struct rtattr *nest); | |
91 | struct rtattr *addattr_nest_compat(struct nlmsghdr *n, int maxlen, int type, | |
92 | const void *data, int len); | |
93 | int addattr_nest_compat_end(struct nlmsghdr *n, struct rtattr *nest); | |
303cc9cb RP |
94 | int rta_addattr8(struct rtattr *rta, int maxlen, int type, __u8 data); |
95 | int rta_addattr16(struct rtattr *rta, int maxlen, int type, __u16 data); | |
892e2124 | 96 | int rta_addattr32(struct rtattr *rta, int maxlen, int type, __u32 data); |
303cc9cb | 97 | int rta_addattr64(struct rtattr *rta, int maxlen, int type, __u64 data); |
892e2124 SH |
98 | int rta_addattr_l(struct rtattr *rta, int maxlen, int type, |
99 | const void *data, int alen); | |
100 | ||
101 | int parse_rtattr(struct rtattr *tb[], int max, struct rtattr *rta, int len); | |
102 | int parse_rtattr_flags(struct rtattr *tb[], int max, struct rtattr *rta, | |
b1b7ce0f | 103 | int len, unsigned short flags); |
892e2124 SH |
104 | int parse_rtattr_byindex(struct rtattr *tb[], int max, |
105 | struct rtattr *rta, int len); | |
106 | struct rtattr *parse_rtattr_one(int type, struct rtattr *rta, int len); | |
107 | int __parse_rtattr_nested_compat(struct rtattr *tb[], int max, struct rtattr *rta, int len); | |
aba5acdf | 108 | |
303cc9cb RP |
109 | struct rtattr *rta_nest(struct rtattr *rta, int maxlen, int type); |
110 | int rta_nest_end(struct rtattr *rta, struct rtattr *nest); | |
111 | ||
112 | #define RTA_TAIL(rta) \ | |
113 | ((struct rtattr *) (((void *) (rta)) + \ | |
114 | RTA_ALIGN((rta)->rta_len))) | |
115 | ||
753fca4f | 116 | #define parse_rtattr_nested(tb, max, rta) \ |
117 | (parse_rtattr((tb), (max), RTA_DATA(rta), RTA_PAYLOAD(rta))) | |
118 | ||
decbb437 JP |
119 | #define parse_rtattr_one_nested(type, rta) \ |
120 | (parse_rtattr_one(type, RTA_DATA(rta), RTA_PAYLOAD(rta))) | |
121 | ||
2f90c9c0 | 122 | #define parse_rtattr_nested_compat(tb, max, rta, data, len) \ |
cd70f3f5 SH |
123 | ({ data = RTA_PAYLOAD(rta) >= len ? RTA_DATA(rta) : NULL; \ |
124 | __parse_rtattr_nested_compat(tb, max, rta, len); }) | |
2f90c9c0 | 125 | |
7dd03712 SH |
126 | static inline __u8 rta_getattr_u8(const struct rtattr *rta) |
127 | { | |
128 | return *(__u8 *)RTA_DATA(rta); | |
129 | } | |
46c5d64d SH |
130 | static inline __u16 rta_getattr_u16(const struct rtattr *rta) |
131 | { | |
132 | return *(__u16 *)RTA_DATA(rta); | |
133 | } | |
7dd03712 | 134 | static inline __u32 rta_getattr_u32(const struct rtattr *rta) |
46c5d64d SH |
135 | { |
136 | return *(__u32 *)RTA_DATA(rta); | |
137 | } | |
138 | static inline __u64 rta_getattr_u64(const struct rtattr *rta) | |
139 | { | |
140 | __u64 tmp; | |
e9e9365b | 141 | |
46c5d64d SH |
142 | memcpy(&tmp, RTA_DATA(rta), sizeof(__u64)); |
143 | return tmp; | |
144 | } | |
145 | static inline const char *rta_getattr_str(const struct rtattr *rta) | |
146 | { | |
cfd2cbd1 | 147 | return (const char *)RTA_DATA(rta); |
46c5d64d SH |
148 | } |
149 | ||
892e2124 SH |
150 | int rtnl_listen_all_nsid(struct rtnl_handle *); |
151 | int rtnl_listen(struct rtnl_handle *, rtnl_listen_filter_t handler, | |
152 | void *jarg); | |
153 | int rtnl_from_file(FILE *, rtnl_listen_filter_t handler, | |
154 | void *jarg); | |
aba5acdf | 155 | |
370d67ba | 156 | #define NLMSG_TAIL(nmsg) \ |
157 | ((struct rtattr *) (((void *) (nmsg)) + NLMSG_ALIGN((nmsg)->nlmsg_len))) | |
158 | ||
ead2ba70 SH |
159 | #ifndef IFA_RTA |
160 | #define IFA_RTA(r) \ | |
e9e9365b | 161 | ((struct rtattr *)(((char *)(r)) + NLMSG_ALIGN(sizeof(struct ifaddrmsg)))) |
ead2ba70 SH |
162 | #endif |
163 | #ifndef IFA_PAYLOAD | |
e9e9365b | 164 | #define IFA_PAYLOAD(n) NLMSG_PAYLOAD(n, sizeof(struct ifaddrmsg)) |
ead2ba70 SH |
165 | #endif |
166 | ||
167 | #ifndef IFLA_RTA | |
168 | #define IFLA_RTA(r) \ | |
e9e9365b | 169 | ((struct rtattr *)(((char *)(r)) + NLMSG_ALIGN(sizeof(struct ifinfomsg)))) |
ead2ba70 SH |
170 | #endif |
171 | #ifndef IFLA_PAYLOAD | |
e9e9365b | 172 | #define IFLA_PAYLOAD(n) NLMSG_PAYLOAD(n, sizeof(struct ifinfomsg)) |
ead2ba70 SH |
173 | #endif |
174 | ||
175 | #ifndef NDA_RTA | |
176 | #define NDA_RTA(r) \ | |
e9e9365b | 177 | ((struct rtattr *)(((char *)(r)) + NLMSG_ALIGN(sizeof(struct ndmsg)))) |
ead2ba70 SH |
178 | #endif |
179 | #ifndef NDA_PAYLOAD | |
e9e9365b | 180 | #define NDA_PAYLOAD(n) NLMSG_PAYLOAD(n, sizeof(struct ndmsg)) |
ead2ba70 SH |
181 | #endif |
182 | ||
183 | #ifndef NDTA_RTA | |
184 | #define NDTA_RTA(r) \ | |
e9e9365b | 185 | ((struct rtattr *)(((char *)(r)) + NLMSG_ALIGN(sizeof(struct ndtmsg)))) |
ead2ba70 SH |
186 | #endif |
187 | #ifndef NDTA_PAYLOAD | |
e9e9365b | 188 | #define NDTA_PAYLOAD(n) NLMSG_PAYLOAD(n, sizeof(struct ndtmsg)) |
ead2ba70 SH |
189 | #endif |
190 | ||
d182ee13 ND |
191 | #ifndef NETNS_RTA |
192 | #define NETNS_RTA(r) \ | |
e9e9365b | 193 | ((struct rtattr *)(((char *)(r)) + NLMSG_ALIGN(sizeof(struct rtgenmsg)))) |
d182ee13 ND |
194 | #endif |
195 | #ifndef NETNS_PAYLOAD | |
e9e9365b | 196 | #define NETNS_PAYLOAD(n) NLMSG_PAYLOAD(n, sizeof(struct rtgenmsg)) |
d182ee13 ND |
197 | #endif |
198 | ||
27b14f2e VK |
199 | /* User defined nlmsg_type which is used mostly for logging netlink |
200 | * messages from dump file */ | |
201 | #define NLMSG_TSTAMP 15 | |
202 | ||
aba5acdf | 203 | #endif /* __LIBNETLINK_H__ */ |