]>
Commit | Line | Data |
---|---|---|
aba5acdf SH |
1 | #ifndef __LIBNETLINK_H__ |
2 | #define __LIBNETLINK_H__ 1 | |
3 | ||
4 | #include <asm/types.h> | |
5 | #include <linux/netlink.h> | |
6 | #include <linux/rtnetlink.h> | |
ead2ba70 SH |
7 | #include <linux/if_link.h> |
8 | #include <linux/if_addr.h> | |
9 | #include <linux/neighbour.h> | |
aba5acdf SH |
10 | |
11 | struct rtnl_handle | |
12 | { | |
13 | int fd; | |
14 | struct sockaddr_nl local; | |
15 | struct sockaddr_nl peer; | |
16 | __u32 seq; | |
17 | __u32 dump; | |
18 | }; | |
19 | ||
7f03191f PM |
20 | extern int rcvbuf; |
21 | ||
aba5acdf | 22 | extern int rtnl_open(struct rtnl_handle *rth, unsigned subscriptions); |
c7699875 | 23 | extern int rtnl_open_byproto(struct rtnl_handle *rth, unsigned subscriptions, int protocol); |
aba5acdf SH |
24 | extern void rtnl_close(struct rtnl_handle *rth); |
25 | extern int rtnl_wilddump_request(struct rtnl_handle *rth, int fam, int type); | |
26 | extern int rtnl_dump_request(struct rtnl_handle *rth, int type, void *req, int len); | |
6dc9f016 | 27 | |
ae665a52 | 28 | typedef int (*rtnl_filter_t)(const struct sockaddr_nl *, |
50772dc5 | 29 | struct nlmsghdr *n, void *); |
b49240ec SH |
30 | |
31 | struct rtnl_dump_filter_arg | |
32 | { | |
33 | rtnl_filter_t filter; | |
34 | void *arg1; | |
b49240ec SH |
35 | }; |
36 | ||
37 | extern int rtnl_dump_filter_l(struct rtnl_handle *rth, | |
38 | const struct rtnl_dump_filter_arg *arg); | |
6dc9f016 | 39 | extern int rtnl_dump_filter(struct rtnl_handle *rth, rtnl_filter_t filter, |
cd70f3f5 | 40 | void *arg); |
aba5acdf | 41 | extern int rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n, pid_t peer, |
cd70f3f5 | 42 | unsigned groups, struct nlmsghdr *answer); |
6cf8398f SH |
43 | extern int rtnl_send(struct rtnl_handle *rth, const void *buf, int); |
44 | extern int rtnl_send_check(struct rtnl_handle *rth, const void *buf, int); | |
aba5acdf | 45 | |
2aa3dd29 SH |
46 | extern int addattr(struct nlmsghdr *n, int maxlen, int type); |
47 | extern int addattr8(struct nlmsghdr *n, int maxlen, int type, __u8 data); | |
48 | extern int addattr16(struct nlmsghdr *n, int maxlen, int type, __u16 data); | |
aba5acdf | 49 | extern int addattr32(struct nlmsghdr *n, int maxlen, int type, __u32 data); |
2aa3dd29 SH |
50 | extern int addattr64(struct nlmsghdr *n, int maxlen, int type, __u64 data); |
51 | extern int addattrstrz(struct nlmsghdr *n, int maxlen, int type, const char *data); | |
52 | ||
6dc9f016 | 53 | extern int addattr_l(struct nlmsghdr *n, int maxlen, int type, const void *data, int alen); |
a10ab08b | 54 | extern int addraw_l(struct nlmsghdr *n, int maxlen, const void *data, int len); |
2f90c9c0 PM |
55 | extern struct rtattr *addattr_nest(struct nlmsghdr *n, int maxlen, int type); |
56 | extern int addattr_nest_end(struct nlmsghdr *n, struct rtattr *nest); | |
57 | extern struct rtattr *addattr_nest_compat(struct nlmsghdr *n, int maxlen, int type, const void *data, int len); | |
58 | extern int addattr_nest_compat_end(struct nlmsghdr *n, struct rtattr *nest); | |
aba5acdf | 59 | extern int rta_addattr32(struct rtattr *rta, int maxlen, int type, __u32 data); |
6dc9f016 | 60 | extern int rta_addattr_l(struct rtattr *rta, int maxlen, int type, const void *data, int alen); |
aba5acdf SH |
61 | |
62 | extern int parse_rtattr(struct rtattr *tb[], int max, struct rtattr *rta, int len); | |
c7699875 | 63 | extern int parse_rtattr_byindex(struct rtattr *tb[], int max, struct rtattr *rta, int len); |
2f90c9c0 | 64 | extern int __parse_rtattr_nested_compat(struct rtattr *tb[], int max, struct rtattr *rta, int len); |
aba5acdf | 65 | |
753fca4f | 66 | #define parse_rtattr_nested(tb, max, rta) \ |
67 | (parse_rtattr((tb), (max), RTA_DATA(rta), RTA_PAYLOAD(rta))) | |
68 | ||
2f90c9c0 | 69 | #define parse_rtattr_nested_compat(tb, max, rta, data, len) \ |
cd70f3f5 SH |
70 | ({ data = RTA_PAYLOAD(rta) >= len ? RTA_DATA(rta) : NULL; \ |
71 | __parse_rtattr_nested_compat(tb, max, rta, len); }) | |
2f90c9c0 | 72 | |
46c5d64d SH |
73 | static inline __u16 rta_getattr_u16(const struct rtattr *rta) |
74 | { | |
75 | return *(__u16 *)RTA_DATA(rta); | |
76 | } | |
77 | static inline __u16 rta_getattr_u32(const struct rtattr *rta) | |
78 | { | |
79 | return *(__u32 *)RTA_DATA(rta); | |
80 | } | |
81 | static inline __u64 rta_getattr_u64(const struct rtattr *rta) | |
82 | { | |
83 | __u64 tmp; | |
84 | memcpy(&tmp, RTA_DATA(rta), sizeof(__u64)); | |
85 | return tmp; | |
86 | } | |
87 | static inline const char *rta_getattr_str(const struct rtattr *rta) | |
88 | { | |
89 | return RTA_DATA(rta); | |
90 | } | |
91 | ||
ae665a52 | 92 | extern int rtnl_listen(struct rtnl_handle *, rtnl_filter_t handler, |
aba5acdf | 93 | void *jarg); |
6dc9f016 | 94 | extern int rtnl_from_file(FILE *, rtnl_filter_t handler, |
aba5acdf SH |
95 | void *jarg); |
96 | ||
370d67ba | 97 | #define NLMSG_TAIL(nmsg) \ |
98 | ((struct rtattr *) (((void *) (nmsg)) + NLMSG_ALIGN((nmsg)->nlmsg_len))) | |
99 | ||
ead2ba70 SH |
100 | #ifndef IFA_RTA |
101 | #define IFA_RTA(r) \ | |
102 | ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ifaddrmsg)))) | |
103 | #endif | |
104 | #ifndef IFA_PAYLOAD | |
105 | #define IFA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ifaddrmsg)) | |
106 | #endif | |
107 | ||
108 | #ifndef IFLA_RTA | |
109 | #define IFLA_RTA(r) \ | |
110 | ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ifinfomsg)))) | |
111 | #endif | |
112 | #ifndef IFLA_PAYLOAD | |
113 | #define IFLA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ifinfomsg)) | |
114 | #endif | |
115 | ||
116 | #ifndef NDA_RTA | |
117 | #define NDA_RTA(r) \ | |
118 | ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ndmsg)))) | |
119 | #endif | |
120 | #ifndef NDA_PAYLOAD | |
121 | #define NDA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ndmsg)) | |
122 | #endif | |
123 | ||
124 | #ifndef NDTA_RTA | |
125 | #define NDTA_RTA(r) \ | |
126 | ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ndtmsg)))) | |
127 | #endif | |
128 | #ifndef NDTA_PAYLOAD | |
129 | #define NDTA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ndtmsg)) | |
130 | #endif | |
131 | ||
aba5acdf SH |
132 | #endif /* __LIBNETLINK_H__ */ |
133 |