blob: f7b85dccef36f160872828891c06b46138b36e0d [file] [log] [blame]
osdl.org!shemmingeraba5acd2004-04-15 20:56:59 +00001#ifndef __LIBNETLINK_H__
2#define __LIBNETLINK_H__ 1
3
Strake5bd9dd42012-12-23 08:46:04 -05004#include <stdio.h>
Jan Engelhardtf5b830d2011-12-31 23:16:27 +01005#include <string.h>
osdl.org!shemmingeraba5acd2004-04-15 20:56:59 +00006#include <asm/types.h>
7#include <linux/netlink.h>
8#include <linux/rtnetlink.h>
Stephen Hemmingeread2ba72006-12-05 09:54:48 -08009#include <linux/if_link.h>
10#include <linux/if_addr.h>
11#include <linux/neighbour.h>
Nicolas Dichtel9d0efc12012-12-12 09:09:23 -080012#include <linux/netconf.h>
osdl.org!shemmingeraba5acd2004-04-15 20:56:59 +000013
Stephen Hemmingere9e93652016-03-27 10:47:46 -070014struct rtnl_handle {
osdl.org!shemmingeraba5acd2004-04-15 20:56:59 +000015 int fd;
16 struct sockaddr_nl local;
17 struct sockaddr_nl peer;
18 __u32 seq;
19 __u32 dump;
vadimk8a4025f2014-12-04 12:32:58 +020020 int proto;
Vadim Kochan486ccd92014-12-26 04:26:27 +020021 FILE *dump_fp;
Nicolas Dichtel449b8242015-05-20 16:20:00 +020022#define RTNL_HANDLE_F_LISTEN_ALL_NSID 0x01
23 int flags;
osdl.org!shemmingeraba5acd2004-04-15 20:56:59 +000024};
25
Patrick McHardy7f031912009-10-28 20:50:48 +010026extern int rcvbuf;
27
Stephen Hemmingere9e93652016-03-27 10:47:46 -070028int rtnl_open(struct rtnl_handle *rth, unsigned int subscriptions)
Stephen Hemmingerd2468da2013-12-20 08:15:02 -080029 __attribute__((warn_unused_result));
30
Stephen Hemmingere9e93652016-03-27 10:47:46 -070031int rtnl_open_byproto(struct rtnl_handle *rth, unsigned int subscriptions,
Stephen Hemmingerd2468da2013-12-20 08:15:02 -080032 int protocol)
33 __attribute__((warn_unused_result));
34
Stephen Hemminger892e2122015-08-13 14:09:58 -070035void rtnl_close(struct rtnl_handle *rth);
36int rtnl_wilddump_request(struct rtnl_handle *rth, int fam, int type)
Stephen Hemmingerd2468da2013-12-20 08:15:02 -080037 __attribute__((warn_unused_result));
Stephen Hemminger892e2122015-08-13 14:09:58 -070038int rtnl_wilddump_req_filter(struct rtnl_handle *rth, int fam, int type,
Stephen Hemmingerd2468da2013-12-20 08:15:02 -080039 __u32 filt_mask)
40 __attribute__((warn_unused_result));
David Ahernb0a4ce62016-05-11 06:51:58 -070041
42typedef int (*req_filter_fn_t)(struct nlmsghdr *nlh, int reqlen);
43
44int rtnl_wilddump_req_filter_fn(struct rtnl_handle *rth, int fam, int type,
45 req_filter_fn_t fn)
46 __attribute__((warn_unused_result));
Stephen Hemminger892e2122015-08-13 14:09:58 -070047int rtnl_dump_request(struct rtnl_handle *rth, int type, void *req,
Stephen Hemmingerd2468da2013-12-20 08:15:02 -080048 int len)
49 __attribute__((warn_unused_result));
David Ahern0d238ca2015-10-02 09:42:27 -070050int rtnl_dump_request_n(struct rtnl_handle *rth, struct nlmsghdr *n)
51 __attribute__((warn_unused_result));
osdl.net!shemminger6dc9f012004-08-31 17:45:21 +000052
Nicolas Dichtel0628cdd2015-05-20 16:19:58 +020053struct rtnl_ctrl_data {
Nicolas Dichtel449b8242015-05-20 16:20:00 +020054 int nsid;
Nicolas Dichtel0628cdd2015-05-20 16:19:58 +020055};
56
Stephen Hemmingerae665a52006-12-05 10:10:22 -080057typedef int (*rtnl_filter_t)(const struct sockaddr_nl *,
osdl.net!shemminger50772dc2004-12-07 21:48:29 +000058 struct nlmsghdr *n, void *);
Simon Hormanb49240e2009-12-03 12:08:27 +110059
Nicolas Dichtel0628cdd2015-05-20 16:19:58 +020060typedef int (*rtnl_listen_filter_t)(const struct sockaddr_nl *,
61 struct rtnl_ctrl_data *,
62 struct nlmsghdr *n, void *);
63
Stephen Hemmingere9e93652016-03-27 10:47:46 -070064struct rtnl_dump_filter_arg {
Simon Hormanb49240e2009-12-03 12:08:27 +110065 rtnl_filter_t filter;
66 void *arg1;
Phil Sutter8e728802015-11-24 15:31:01 +010067 __u16 nc_flags;
Simon Hormanb49240e2009-12-03 12:08:27 +110068};
69
Stephen Hemminger892e2122015-08-13 14:09:58 -070070int rtnl_dump_filter_l(struct rtnl_handle *rth,
Simon Hormanb49240e2009-12-03 12:08:27 +110071 const struct rtnl_dump_filter_arg *arg);
Phil Sutter8e728802015-11-24 15:31:01 +010072int rtnl_dump_filter_nc(struct rtnl_handle *rth,
73 rtnl_filter_t filter,
74 void *arg, __u16 nc_flags);
75#define rtnl_dump_filter(rth, filter, arg) \
76 rtnl_dump_filter_nc(rth, filter, arg, 0)
Stephen Hemminger892e2122015-08-13 14:09:58 -070077int rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n,
78 struct nlmsghdr *answer, size_t len)
Stephen Hemmingerd2468da2013-12-20 08:15:02 -080079 __attribute__((warn_unused_result));
Stephen Hemminger892e2122015-08-13 14:09:58 -070080int rtnl_send(struct rtnl_handle *rth, const void *buf, int)
Stephen Hemmingerd2468da2013-12-20 08:15:02 -080081 __attribute__((warn_unused_result));
Stephen Hemminger892e2122015-08-13 14:09:58 -070082int rtnl_send_check(struct rtnl_handle *rth, const void *buf, int)
Stephen Hemmingerd2468da2013-12-20 08:15:02 -080083 __attribute__((warn_unused_result));
osdl.org!shemmingeraba5acd2004-04-15 20:56:59 +000084
Stephen Hemminger892e2122015-08-13 14:09:58 -070085int addattr(struct nlmsghdr *n, int maxlen, int type);
86int addattr8(struct nlmsghdr *n, int maxlen, int type, __u8 data);
87int addattr16(struct nlmsghdr *n, int maxlen, int type, __u16 data);
88int addattr32(struct nlmsghdr *n, int maxlen, int type, __u32 data);
89int addattr64(struct nlmsghdr *n, int maxlen, int type, __u64 data);
90int addattrstrz(struct nlmsghdr *n, int maxlen, int type, const char *data);
Stephen Hemminger2aa3dd22011-12-23 10:43:54 -080091
Stephen Hemminger892e2122015-08-13 14:09:58 -070092int addattr_l(struct nlmsghdr *n, int maxlen, int type,
93 const void *data, int alen);
94int addraw_l(struct nlmsghdr *n, int maxlen, const void *data, int len);
95struct rtattr *addattr_nest(struct nlmsghdr *n, int maxlen, int type);
96int addattr_nest_end(struct nlmsghdr *n, struct rtattr *nest);
97struct rtattr *addattr_nest_compat(struct nlmsghdr *n, int maxlen, int type,
98 const void *data, int len);
99int addattr_nest_compat_end(struct nlmsghdr *n, struct rtattr *nest);
Roopa Prabhu303cc9c2015-10-15 13:13:38 +0200100int rta_addattr8(struct rtattr *rta, int maxlen, int type, __u8 data);
101int rta_addattr16(struct rtattr *rta, int maxlen, int type, __u16 data);
Stephen Hemminger892e2122015-08-13 14:09:58 -0700102int rta_addattr32(struct rtattr *rta, int maxlen, int type, __u32 data);
Roopa Prabhu303cc9c2015-10-15 13:13:38 +0200103int rta_addattr64(struct rtattr *rta, int maxlen, int type, __u64 data);
Stephen Hemminger892e2122015-08-13 14:09:58 -0700104int rta_addattr_l(struct rtattr *rta, int maxlen, int type,
105 const void *data, int alen);
osdl.org!shemmingeraba5acd2004-04-15 20:56:59 +0000106
Stephen Hemminger892e2122015-08-13 14:09:58 -0700107int parse_rtattr(struct rtattr *tb[], int max, struct rtattr *rta, int len);
108int parse_rtattr_flags(struct rtattr *tb[], int max, struct rtattr *rta,
Vlad Yasevichb1b7ce02013-03-15 10:01:28 -0700109 int len, unsigned short flags);
Stephen Hemminger892e2122015-08-13 14:09:58 -0700110int parse_rtattr_byindex(struct rtattr *tb[], int max,
111 struct rtattr *rta, int len);
112struct rtattr *parse_rtattr_one(int type, struct rtattr *rta, int len);
113int __parse_rtattr_nested_compat(struct rtattr *tb[], int max, struct rtattr *rta, int len);
osdl.org!shemmingeraba5acd2004-04-15 20:56:59 +0000114
Roopa Prabhu303cc9c2015-10-15 13:13:38 +0200115struct rtattr *rta_nest(struct rtattr *rta, int maxlen, int type);
116int rta_nest_end(struct rtattr *rta, struct rtattr *nest);
117
118#define RTA_TAIL(rta) \
119 ((struct rtattr *) (((void *) (rta)) + \
120 RTA_ALIGN((rta)->rta_len)))
121
5!tgraf753fca42005-01-18 22:11:58 +0000122#define parse_rtattr_nested(tb, max, rta) \
123 (parse_rtattr((tb), (max), RTA_DATA(rta), RTA_PAYLOAD(rta)))
124
Jiri Pirkodecbb432015-01-06 17:23:45 +0100125#define parse_rtattr_one_nested(type, rta) \
126 (parse_rtattr_one(type, RTA_DATA(rta), RTA_PAYLOAD(rta)))
127
Patrick McHardy2f90c9c2007-08-14 11:21:19 -0700128#define parse_rtattr_nested_compat(tb, max, rta, data, len) \
Stephen Hemmingercd70f3f2011-12-28 10:37:12 -0800129 ({ data = RTA_PAYLOAD(rta) >= len ? RTA_DATA(rta) : NULL; \
130 __parse_rtattr_nested_compat(tb, max, rta, len); })
Patrick McHardy2f90c9c2007-08-14 11:21:19 -0700131
Stephen Hemminger7dd03712012-03-15 17:47:51 -0700132static inline __u8 rta_getattr_u8(const struct rtattr *rta)
133{
134 return *(__u8 *)RTA_DATA(rta);
135}
Stephen Hemminger46c5d642011-12-29 09:29:33 -0800136static inline __u16 rta_getattr_u16(const struct rtattr *rta)
137{
138 return *(__u16 *)RTA_DATA(rta);
139}
Stephen Hemminger7dd03712012-03-15 17:47:51 -0700140static inline __u32 rta_getattr_u32(const struct rtattr *rta)
Stephen Hemminger46c5d642011-12-29 09:29:33 -0800141{
142 return *(__u32 *)RTA_DATA(rta);
143}
144static inline __u64 rta_getattr_u64(const struct rtattr *rta)
145{
146 __u64 tmp;
Stephen Hemmingere9e93652016-03-27 10:47:46 -0700147
Stephen Hemminger46c5d642011-12-29 09:29:33 -0800148 memcpy(&tmp, RTA_DATA(rta), sizeof(__u64));
149 return tmp;
150}
151static inline const char *rta_getattr_str(const struct rtattr *rta)
152{
Stephen Hemmingercfd2cbd2012-02-06 09:35:27 -0800153 return (const char *)RTA_DATA(rta);
Stephen Hemminger46c5d642011-12-29 09:29:33 -0800154}
155
Stephen Hemminger892e2122015-08-13 14:09:58 -0700156int rtnl_listen_all_nsid(struct rtnl_handle *);
157int rtnl_listen(struct rtnl_handle *, rtnl_listen_filter_t handler,
158 void *jarg);
159int rtnl_from_file(FILE *, rtnl_listen_filter_t handler,
160 void *jarg);
osdl.org!shemmingeraba5acd2004-04-15 20:56:59 +0000161
5!tgraf370d67b2005-01-18 01:24:18 +0000162#define NLMSG_TAIL(nmsg) \
163 ((struct rtattr *) (((void *) (nmsg)) + NLMSG_ALIGN((nmsg)->nlmsg_len)))
164
Stephen Hemmingeread2ba72006-12-05 09:54:48 -0800165#ifndef IFA_RTA
166#define IFA_RTA(r) \
Stephen Hemmingere9e93652016-03-27 10:47:46 -0700167 ((struct rtattr *)(((char *)(r)) + NLMSG_ALIGN(sizeof(struct ifaddrmsg))))
Stephen Hemmingeread2ba72006-12-05 09:54:48 -0800168#endif
169#ifndef IFA_PAYLOAD
Stephen Hemmingere9e93652016-03-27 10:47:46 -0700170#define IFA_PAYLOAD(n) NLMSG_PAYLOAD(n, sizeof(struct ifaddrmsg))
Stephen Hemmingeread2ba72006-12-05 09:54:48 -0800171#endif
172
173#ifndef IFLA_RTA
174#define IFLA_RTA(r) \
Stephen Hemmingere9e93652016-03-27 10:47:46 -0700175 ((struct rtattr *)(((char *)(r)) + NLMSG_ALIGN(sizeof(struct ifinfomsg))))
Stephen Hemmingeread2ba72006-12-05 09:54:48 -0800176#endif
177#ifndef IFLA_PAYLOAD
Stephen Hemmingere9e93652016-03-27 10:47:46 -0700178#define IFLA_PAYLOAD(n) NLMSG_PAYLOAD(n, sizeof(struct ifinfomsg))
Stephen Hemmingeread2ba72006-12-05 09:54:48 -0800179#endif
180
181#ifndef NDA_RTA
182#define NDA_RTA(r) \
Stephen Hemmingere9e93652016-03-27 10:47:46 -0700183 ((struct rtattr *)(((char *)(r)) + NLMSG_ALIGN(sizeof(struct ndmsg))))
Stephen Hemmingeread2ba72006-12-05 09:54:48 -0800184#endif
185#ifndef NDA_PAYLOAD
Stephen Hemmingere9e93652016-03-27 10:47:46 -0700186#define NDA_PAYLOAD(n) NLMSG_PAYLOAD(n, sizeof(struct ndmsg))
Stephen Hemmingeread2ba72006-12-05 09:54:48 -0800187#endif
188
189#ifndef NDTA_RTA
190#define NDTA_RTA(r) \
Stephen Hemmingere9e93652016-03-27 10:47:46 -0700191 ((struct rtattr *)(((char *)(r)) + NLMSG_ALIGN(sizeof(struct ndtmsg))))
Stephen Hemmingeread2ba72006-12-05 09:54:48 -0800192#endif
193#ifndef NDTA_PAYLOAD
Stephen Hemmingere9e93652016-03-27 10:47:46 -0700194#define NDTA_PAYLOAD(n) NLMSG_PAYLOAD(n, sizeof(struct ndtmsg))
Stephen Hemmingeread2ba72006-12-05 09:54:48 -0800195#endif
196
Nicolas Dichteld182ee12015-02-17 17:30:37 +0100197#ifndef NETNS_RTA
198#define NETNS_RTA(r) \
Stephen Hemmingere9e93652016-03-27 10:47:46 -0700199 ((struct rtattr *)(((char *)(r)) + NLMSG_ALIGN(sizeof(struct rtgenmsg))))
Nicolas Dichteld182ee12015-02-17 17:30:37 +0100200#endif
201#ifndef NETNS_PAYLOAD
Stephen Hemmingere9e93652016-03-27 10:47:46 -0700202#define NETNS_PAYLOAD(n) NLMSG_PAYLOAD(n, sizeof(struct rtgenmsg))
Nicolas Dichteld182ee12015-02-17 17:30:37 +0100203#endif
204
Vadim Kochan27b14f22015-01-13 20:14:23 +0200205/* User defined nlmsg_type which is used mostly for logging netlink
206 * messages from dump file */
207#define NLMSG_TSTAMP 15
208
osdl.org!shemmingeraba5acd2004-04-15 20:56:59 +0000209#endif /* __LIBNETLINK_H__ */