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