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