-
Notifications
You must be signed in to change notification settings - Fork 142
/
libnetlink.hh
130 lines (110 loc) · 4.19 KB
/
libnetlink.hh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/*
* libnetlink.hh
* =============
* Sources adapted for C++ linkage from libnetlink.h, available through iproute-20100519.
* CODE AS-IS. Any licensing applied to iproute-20100519 also applies here.
*
* Created on: Feb 14, 2011
* Author: bill <carlos.nilton@gmail.com>
*/
#ifndef LIBNETLINK_HH_
#define LIBNETLINK_HH_
#include <asm/types.h>
#include <linux/if_link.h>
#include <linux/if_addr.h>
#include <linux/neighbour.h>
#include <linux/rtnetlink.h>
#include <linux/netlink.h>
struct rtnl_handle {
int fd;
struct sockaddr_nl local;
struct sockaddr_nl peer;
__u32 seq;
__u32 dump;
};
extern "C" int rcvbuf;
extern "C" int rtnl_open(struct rtnl_handle *rth, unsigned subscriptions);
extern "C" int rtnl_open_byproto(struct rtnl_handle *rth,
unsigned subscriptions, int protocol);
extern "C" void rtnl_close(struct rtnl_handle *rth);
extern "C" int
rtnl_wilddump_request(struct rtnl_handle *rth, int fam, int type);
extern "C" int rtnl_dump_request(struct rtnl_handle *rth, int type, void *req,
int len);
typedef int (*rtnl_filter_t)(const struct sockaddr_nl *, struct nlmsghdr *n,
void *);
struct rtnl_dump_filter_arg {
rtnl_filter_t filter;
void *arg1;
rtnl_filter_t junk;
void *arg2;
};
extern "C" int rtnl_dump_filter_l(struct rtnl_handle *rth,
const struct rtnl_dump_filter_arg *arg);
extern "C" int rtnl_dump_filter(struct rtnl_handle *rth, rtnl_filter_t filter,
void *arg1, rtnl_filter_t junk, void *arg2);
extern "C" int rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n,
pid_t peer, unsigned groups, struct nlmsghdr *answer,
rtnl_filter_t junk, void *jarg);
extern "C" int rtnl_send(struct rtnl_handle *rth, const char *buf, int);
extern "C" int rtnl_send_check(struct rtnl_handle *rth, const char *buf, int);
extern "C" int addattr32(struct nlmsghdr *n, int maxlen, int type, __u32 data);
extern "C" int addattr_l(struct nlmsghdr *n, int maxlen, int type,
const void *data, int alen);
extern "C" int addraw_l(struct nlmsghdr *n, int maxlen, const void *data,
int len);
extern "C" struct rtattr
*addattr_nest(struct nlmsghdr *n, int maxlen, int type);
extern "C" int addattr_nest_end(struct nlmsghdr *n, struct rtattr *nest);
extern "C" struct rtattr *addattr_nest_compat(struct nlmsghdr *n, int maxlen,
int type, const void *data, int len);
extern "C" int addattr_nest_compat_end(struct nlmsghdr *n, struct rtattr *nest);
extern "C" int rta_addattr32(struct rtattr *rta, int maxlen, int type,
__u32 data);
extern "C" int rta_addattr_l(struct rtattr *rta, int maxlen, int type,
const void *data, int alen);
extern "C" int parse_rtattr(struct rtattr *tb[], int max, struct rtattr *rta,
int len);
extern "C" int parse_rtattr_byindex(struct rtattr *tb[], int max,
struct rtattr *rta, int len);
extern "C" int __parse_rtattr_nested_compat(struct rtattr *tb[], int max,
struct rtattr *rta, int len);
#define parse_rtattr_nested(tb, max, rta) \
(parse_rtattr((tb), (max), RTA_DATA(rta), RTA_PAYLOAD(rta)))
#define parse_rtattr_nested_compat(tb, max, rta, data, len) \
({ data = RTA_PAYLOAD(rta) >= len ? RTA_DATA(rta) : NULL; \
__parse_rtattr_nested_compat(tb, max, rta, len); })
extern "C" int rtnl_listen(struct rtnl_handle *, rtnl_filter_t handler,
void *jarg);
extern "C" int rtnl_from_file(FILE *, rtnl_filter_t handler, void *jarg);
#define NLMSG_TAIL(nmsg) \
((struct rtattr *) (((void *) (nmsg)) + NLMSG_ALIGN((nmsg)->nlmsg_len)))
#ifndef IFA_RTA
#define IFA_RTA(r) \
((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ifaddrmsg))))
#endif
#ifndef IFA_PAYLOAD
#define IFA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ifaddrmsg))
#endif
#ifndef IFLA_RTA
#define IFLA_RTA(r) \
((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ifinfomsg))))
#endif
#ifndef IFLA_PAYLOAD
#define IFLA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ifinfomsg))
#endif
#ifndef NDA_RTA
#define NDA_RTA(r) \
((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ndmsg))))
#endif
#ifndef NDA_PAYLOAD
#define NDA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ndmsg))
#endif
#ifndef NDTA_RTA
#define NDTA_RTA(r) \
((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ndtmsg))))
#endif
#ifndef NDTA_PAYLOAD
#define NDTA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ndtmsg))
#endif
#endif /* LIBNETLINK_HH_ */