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