]>
Commit | Line | Data |
---|---|---|
4d9ad5dc MS |
1 | /* |
2 | * libnetlink.c RTnetlink service routines. | |
3 | * | |
4 | * This program is free software; you can redistribute it and/or | |
5 | * modify it under the terms of the GNU General Public License | |
6 | * as published by the Free Software Foundation; either version | |
7 | * 2 of the License, or (at your option) any later version. | |
8 | * | |
9 | * Authors: Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru> | |
10 | * | |
11 | */ | |
12 | ||
13 | #ifdef __linux__ | |
14 | ||
15 | #ifndef __LIBNETLINK_H__ | |
16 | #define __LIBNETLINK_H__ 1 | |
17 | ||
18 | #include <asm/types.h> | |
19 | #include <linux/netlink.h> | |
20 | #include <linux/rtnetlink.h> | |
21 | #include <linux/if_link.h> | |
22 | #include <linux/if_addr.h> | |
23 | #include <linux/neighbour.h> | |
24 | ||
996c9314 LB |
25 | struct rtnl_handle { |
26 | int fd; | |
27 | struct sockaddr_nl local; | |
28 | struct sockaddr_nl peer; | |
29 | __u32 seq; | |
30 | __u32 dump; | |
4d9ad5dc MS |
31 | }; |
32 | ||
33 | extern int rcvbuf; | |
34 | ||
35 | extern int rtnl_open(struct rtnl_handle *rth, unsigned subscriptions); | |
996c9314 LB |
36 | extern int rtnl_open_byproto(struct rtnl_handle *rth, unsigned subscriptions, |
37 | int protocol); | |
4d9ad5dc MS |
38 | extern void rtnl_close(struct rtnl_handle *rth); |
39 | extern int rtnl_wilddump_request(struct rtnl_handle *rth, int fam, int type); | |
996c9314 LB |
40 | extern int rtnl_dump_request(struct rtnl_handle *rth, int type, void *req, |
41 | int len); | |
4d9ad5dc | 42 | |
996c9314 LB |
43 | typedef int (*rtnl_filter_t)(const struct sockaddr_nl *, struct nlmsghdr *n, |
44 | void *); | |
4d9ad5dc | 45 | |
996c9314 | 46 | struct rtnl_dump_filter_arg { |
4d9ad5dc MS |
47 | rtnl_filter_t filter; |
48 | void *arg1; | |
49 | rtnl_filter_t junk; | |
50 | void *arg2; | |
51 | }; | |
52 | ||
53 | extern int rtnl_dump_filter_l(struct rtnl_handle *rth, | |
54 | const struct rtnl_dump_filter_arg *arg); | |
55 | extern int rtnl_dump_filter(struct rtnl_handle *rth, rtnl_filter_t filter, | |
996c9314 | 56 | void *arg1, rtnl_filter_t junk, void *arg2); |
4d9ad5dc MS |
57 | |
58 | extern int rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n, pid_t peer, | |
59 | unsigned groups, struct nlmsghdr *answer, | |
996c9314 | 60 | rtnl_filter_t junk, void *jarg); |
4d9ad5dc MS |
61 | extern int rtnl_send(struct rtnl_handle *rth, const char *buf, int); |
62 | extern int rtnl_send_check(struct rtnl_handle *rth, const char *buf, int); | |
63 | ||
64 | extern int addattr32(struct nlmsghdr *n, int maxlen, int type, __u32 data); | |
996c9314 LB |
65 | extern int addattr_l(struct nlmsghdr *n, int maxlen, int type, const void *data, |
66 | int alen); | |
4d9ad5dc MS |
67 | extern int addraw_l(struct nlmsghdr *n, int maxlen, const void *data, int len); |
68 | extern struct rtattr *addattr_nest(struct nlmsghdr *n, int maxlen, int type); | |
69 | extern int addattr_nest_end(struct nlmsghdr *n, struct rtattr *nest); | |
996c9314 LB |
70 | extern struct rtattr *addattr_nest_compat(struct nlmsghdr *n, int maxlen, |
71 | int type, const void *data, int len); | |
4d9ad5dc MS |
72 | extern int addattr_nest_compat_end(struct nlmsghdr *n, struct rtattr *nest); |
73 | extern int rta_addattr32(struct rtattr *rta, int maxlen, int type, __u32 data); | |
996c9314 LB |
74 | extern int rta_addattr_l(struct rtattr *rta, int maxlen, int type, |
75 | const void *data, int alen); | |
4d9ad5dc | 76 | |
996c9314 LB |
77 | extern int parse_rtattr(struct rtattr *tb[], int max, struct rtattr *rta, |
78 | int len); | |
79 | extern int parse_rtattr_byindex(struct rtattr *tb[], int max, | |
80 | struct rtattr *rta, int len); | |
81 | extern int __parse_rtattr_nested_compat(struct rtattr *tb[], int max, | |
82 | struct rtattr *rta, int len); | |
4d9ad5dc | 83 | |
996c9314 | 84 | #define parse_rtattr_nested(tb, max, rta) \ |
4d9ad5dc MS |
85 | (parse_rtattr((tb), (max), RTA_DATA(rta), RTA_PAYLOAD(rta))) |
86 | ||
996c9314 LB |
87 | #define parse_rtattr_nested_compat(tb, max, rta, data, len) \ |
88 | ({ \ | |
89 | data = RTA_PAYLOAD(rta) >= len ? RTA_DATA(rta) : NULL; \ | |
90 | __parse_rtattr_nested_compat(tb, max, rta, len); \ | |
91 | }) | |
4d9ad5dc | 92 | |
996c9314 LB |
93 | extern int rtnl_listen(struct rtnl_handle *, rtnl_filter_t handler, void *jarg); |
94 | extern int rtnl_from_file(FILE *, rtnl_filter_t handler, void *jarg); | |
4d9ad5dc | 95 | |
996c9314 LB |
96 | #define NLMSG_TAIL(nmsg) \ |
97 | ((struct rtattr *)(((uint8_t *)(nmsg)) \ | |
98 | + NLMSG_ALIGN((nmsg)->nlmsg_len))) | |
4d9ad5dc MS |
99 | |
100 | #ifndef IFA_RTA | |
996c9314 LB |
101 | #define IFA_RTA(r) \ |
102 | ((struct rtattr *)(((char *)(r)) \ | |
103 | + NLMSG_ALIGN(sizeof(struct ifaddrmsg)))) | |
4d9ad5dc MS |
104 | #endif |
105 | #ifndef IFA_PAYLOAD | |
106 | #define IFA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ifaddrmsg)) | |
107 | #endif | |
108 | ||
109 | #ifndef IFLA_RTA | |
996c9314 LB |
110 | #define IFLA_RTA(r) \ |
111 | ((struct rtattr *)(((char *)(r)) \ | |
112 | + NLMSG_ALIGN(sizeof(struct ifinfomsg)))) | |
4d9ad5dc MS |
113 | #endif |
114 | #ifndef IFLA_PAYLOAD | |
115 | #define IFLA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ifinfomsg)) | |
116 | #endif | |
117 | ||
118 | #ifndef NDA_RTA | |
996c9314 LB |
119 | #define NDA_RTA(r) \ |
120 | ((struct rtattr *)(((char *)(r)) + NLMSG_ALIGN(sizeof(struct ndmsg)))) | |
4d9ad5dc MS |
121 | #endif |
122 | #ifndef NDA_PAYLOAD | |
123 | #define NDA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ndmsg)) | |
124 | #endif | |
125 | ||
126 | #ifndef NDTA_RTA | |
996c9314 LB |
127 | #define NDTA_RTA(r) \ |
128 | ((struct rtattr *)(((char *)(r)) + NLMSG_ALIGN(sizeof(struct ndtmsg)))) | |
4d9ad5dc MS |
129 | #endif |
130 | #ifndef NDTA_PAYLOAD | |
131 | #define NDTA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ndtmsg)) | |
132 | #endif | |
133 | ||
134 | #endif /* __LIBNETLINK_H__ */ | |
135 | ||
136 | #endif /* __linux__ */ |