]> git.proxmox.com Git - mirror_iproute2.git/blame - include/libnetlink.h
libnetlink: add size argument to rtnl_talk
[mirror_iproute2.git] / include / libnetlink.h
CommitLineData
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
SH
13
14struct rtnl_handle
15{
16 int fd;
17 struct sockaddr_nl local;
18 struct sockaddr_nl peer;
19 __u32 seq;
20 __u32 dump;
8a4025f6 21 int proto;
486ccd99 22 FILE *dump_fp;
aba5acdf
SH
23};
24
7f03191f
PM
25extern int rcvbuf;
26
d2468da0
SH
27extern int rtnl_open(struct rtnl_handle *rth, unsigned subscriptions)
28 __attribute__((warn_unused_result));
29
30extern int rtnl_open_byproto(struct rtnl_handle *rth, unsigned subscriptions,
31 int protocol)
32 __attribute__((warn_unused_result));
33
aba5acdf 34extern void rtnl_close(struct rtnl_handle *rth);
d2468da0
SH
35extern int rtnl_wilddump_request(struct rtnl_handle *rth, int fam, int type)
36 __attribute__((warn_unused_result));
9eff0e5c 37extern int rtnl_wilddump_req_filter(struct rtnl_handle *rth, int fam, int type,
d2468da0
SH
38 __u32 filt_mask)
39 __attribute__((warn_unused_result));
40extern int rtnl_dump_request(struct rtnl_handle *rth, int type, void *req,
41 int len)
42 __attribute__((warn_unused_result));
6dc9f016 43
ae665a52 44typedef int (*rtnl_filter_t)(const struct sockaddr_nl *,
50772dc5 45 struct nlmsghdr *n, void *);
b49240ec
SH
46
47struct rtnl_dump_filter_arg
48{
49 rtnl_filter_t filter;
50 void *arg1;
b49240ec
SH
51};
52
53extern int rtnl_dump_filter_l(struct rtnl_handle *rth,
54 const struct rtnl_dump_filter_arg *arg);
6dc9f016 55extern int rtnl_dump_filter(struct rtnl_handle *rth, rtnl_filter_t filter,
cd70f3f5 56 void *arg);
c079e121
SH
57extern int rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n,
58 struct nlmsghdr *answer, size_t len)
d2468da0
SH
59 __attribute__((warn_unused_result));
60extern int rtnl_send(struct rtnl_handle *rth, const void *buf, int)
61 __attribute__((warn_unused_result));
62extern int rtnl_send_check(struct rtnl_handle *rth, const void *buf, int)
63 __attribute__((warn_unused_result));
aba5acdf 64
2aa3dd29
SH
65extern int addattr(struct nlmsghdr *n, int maxlen, int type);
66extern int addattr8(struct nlmsghdr *n, int maxlen, int type, __u8 data);
67extern int addattr16(struct nlmsghdr *n, int maxlen, int type, __u16 data);
aba5acdf 68extern int addattr32(struct nlmsghdr *n, int maxlen, int type, __u32 data);
2aa3dd29
SH
69extern int addattr64(struct nlmsghdr *n, int maxlen, int type, __u64 data);
70extern int addattrstrz(struct nlmsghdr *n, int maxlen, int type, const char *data);
71
6dc9f016 72extern int addattr_l(struct nlmsghdr *n, int maxlen, int type, const void *data, int alen);
a10ab08b 73extern int addraw_l(struct nlmsghdr *n, int maxlen, const void *data, int len);
2f90c9c0
PM
74extern struct rtattr *addattr_nest(struct nlmsghdr *n, int maxlen, int type);
75extern int addattr_nest_end(struct nlmsghdr *n, struct rtattr *nest);
76extern struct rtattr *addattr_nest_compat(struct nlmsghdr *n, int maxlen, int type, const void *data, int len);
77extern int addattr_nest_compat_end(struct nlmsghdr *n, struct rtattr *nest);
aba5acdf 78extern int rta_addattr32(struct rtattr *rta, int maxlen, int type, __u32 data);
6dc9f016 79extern int rta_addattr_l(struct rtattr *rta, int maxlen, int type, const void *data, int alen);
aba5acdf
SH
80
81extern int parse_rtattr(struct rtattr *tb[], int max, struct rtattr *rta, int len);
b1b7ce0f
VY
82extern int parse_rtattr_flags(struct rtattr *tb[], int max, struct rtattr *rta,
83 int len, unsigned short flags);
c7699875 84extern int parse_rtattr_byindex(struct rtattr *tb[], int max, struct rtattr *rta, int len);
decbb437 85extern struct rtattr *parse_rtattr_one(int type, struct rtattr *rta, int len);
2f90c9c0 86extern int __parse_rtattr_nested_compat(struct rtattr *tb[], int max, struct rtattr *rta, int len);
aba5acdf 87
753fca4f 88#define parse_rtattr_nested(tb, max, rta) \
89 (parse_rtattr((tb), (max), RTA_DATA(rta), RTA_PAYLOAD(rta)))
90
decbb437
JP
91#define parse_rtattr_one_nested(type, rta) \
92 (parse_rtattr_one(type, RTA_DATA(rta), RTA_PAYLOAD(rta)))
93
2f90c9c0 94#define parse_rtattr_nested_compat(tb, max, rta, data, len) \
cd70f3f5
SH
95 ({ data = RTA_PAYLOAD(rta) >= len ? RTA_DATA(rta) : NULL; \
96 __parse_rtattr_nested_compat(tb, max, rta, len); })
2f90c9c0 97
7dd03712
SH
98static inline __u8 rta_getattr_u8(const struct rtattr *rta)
99{
100 return *(__u8 *)RTA_DATA(rta);
101}
46c5d64d
SH
102static inline __u16 rta_getattr_u16(const struct rtattr *rta)
103{
104 return *(__u16 *)RTA_DATA(rta);
105}
7dd03712 106static inline __u32 rta_getattr_u32(const struct rtattr *rta)
46c5d64d
SH
107{
108 return *(__u32 *)RTA_DATA(rta);
109}
110static inline __u64 rta_getattr_u64(const struct rtattr *rta)
111{
112 __u64 tmp;
113 memcpy(&tmp, RTA_DATA(rta), sizeof(__u64));
114 return tmp;
115}
116static inline const char *rta_getattr_str(const struct rtattr *rta)
117{
cfd2cbd1 118 return (const char *)RTA_DATA(rta);
46c5d64d
SH
119}
120
ae665a52 121extern int rtnl_listen(struct rtnl_handle *, rtnl_filter_t handler,
aba5acdf 122 void *jarg);
6dc9f016 123extern int rtnl_from_file(FILE *, rtnl_filter_t handler,
aba5acdf
SH
124 void *jarg);
125
370d67ba 126#define NLMSG_TAIL(nmsg) \
127 ((struct rtattr *) (((void *) (nmsg)) + NLMSG_ALIGN((nmsg)->nlmsg_len)))
128
ead2ba70
SH
129#ifndef IFA_RTA
130#define IFA_RTA(r) \
131 ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ifaddrmsg))))
132#endif
133#ifndef IFA_PAYLOAD
134#define IFA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ifaddrmsg))
135#endif
136
137#ifndef IFLA_RTA
138#define IFLA_RTA(r) \
139 ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ifinfomsg))))
140#endif
141#ifndef IFLA_PAYLOAD
142#define IFLA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ifinfomsg))
143#endif
144
145#ifndef NDA_RTA
146#define NDA_RTA(r) \
147 ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ndmsg))))
148#endif
149#ifndef NDA_PAYLOAD
150#define NDA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ndmsg))
151#endif
152
153#ifndef NDTA_RTA
154#define NDTA_RTA(r) \
155 ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ndtmsg))))
156#endif
157#ifndef NDTA_PAYLOAD
158#define NDTA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ndtmsg))
159#endif
160
d182ee13
ND
161#ifndef NETNS_RTA
162#define NETNS_RTA(r) \
163 ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct rtgenmsg))))
164#endif
165#ifndef NETNS_PAYLOAD
166#define NETNS_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct rtgenmsg))
167#endif
168
27b14f2e
VK
169/* User defined nlmsg_type which is used mostly for logging netlink
170 * messages from dump file */
171#define NLMSG_TSTAMP 15
172
aba5acdf
SH
173#endif /* __LIBNETLINK_H__ */
174