Link Here
|
1 |
--- /dev/null 2024-03-22 15:39:07.538356000 +0100 |
2 |
+++ sysdep/bsd-netlink/netlink-route.h 2024-03-22 15:39:02.226088000 +0100 |
3 |
@@ -0,0 +1,367 @@ |
4 |
+/*- |
5 |
+ * SPDX-License-Identifier: BSD-2-Clause |
6 |
+ * |
7 |
+ * Copyright (c) 2022 Alexander V. Chernikov <melifaro@FreeBSD.org> |
8 |
+ * |
9 |
+ * Redistribution and use in source and binary forms, with or without |
10 |
+ * modification, are permitted provided that the following conditions |
11 |
+ * are met: |
12 |
+ * 1. Redistributions of source code must retain the above copyright |
13 |
+ * notice, this list of conditions and the following disclaimer. |
14 |
+ * 2. Redistributions in binary form must reproduce the above copyright |
15 |
+ * notice, this list of conditions and the following disclaimer in the |
16 |
+ * documentation and/or other materials provided with the distribution. |
17 |
+ * |
18 |
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND |
19 |
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
20 |
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
21 |
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE |
22 |
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
23 |
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
24 |
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
25 |
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
26 |
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
27 |
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
28 |
+ * SUCH DAMAGE. |
29 |
+ */ |
30 |
+ |
31 |
+/* |
32 |
+ * Route-related (RTM_<NEW|DEL|GET>ROUTE) message header and attributes. |
33 |
+ */ |
34 |
+ |
35 |
+#ifndef _NETLINK_ROUTE_ROUTE_H_ |
36 |
+#define _NETLINK_ROUTE_ROUTE_H_ |
37 |
+ |
38 |
+/* Base header for all of the relevant messages */ |
39 |
+struct rtmsg { |
40 |
+ unsigned char rtm_family; /* address family */ |
41 |
+ unsigned char rtm_dst_len; /* Prefix length */ |
42 |
+ unsigned char rtm_src_len; /* Source prefix length (not used) */ |
43 |
+ unsigned char rtm_tos; /* Type of service (not used) */ |
44 |
+ unsigned char rtm_table; /* rtable id */ |
45 |
+ unsigned char rtm_protocol; /* Routing protocol id (RTPROT_) */ |
46 |
+ unsigned char rtm_scope; /* Route distance (RT_SCOPE_) */ |
47 |
+ unsigned char rtm_type; /* Route type (RTN_) */ |
48 |
+ unsigned rtm_flags; /* Route flags (RTM_F_) */ |
49 |
+}; |
50 |
+ |
51 |
+/* |
52 |
+ * RFC 3549, 3.1.1, route type (rtm_type field). |
53 |
+ */ |
54 |
+enum { |
55 |
+ RTN_UNSPEC, |
56 |
+ RTN_UNICAST, /* Unicast route */ |
57 |
+ RTN_LOCAL, /* Accept locally (not supported) */ |
58 |
+ RTN_BROADCAST, /* Accept locally as broadcast, send as broadcast */ |
59 |
+ RTN_ANYCAST, /* Accept locally as broadcast, but send as unicast */ |
60 |
+ RTN_MULTICAST, /* Multicast route */ |
61 |
+ RTN_BLACKHOLE, /* Drop traffic towards destination */ |
62 |
+ RTN_UNREACHABLE, /* Destination is unreachable */ |
63 |
+ RTN_PROHIBIT, /* Administratively prohibited */ |
64 |
+ RTN_THROW, /* Not in this table (not supported) */ |
65 |
+ RTN_NAT, /* Translate this address (not supported) */ |
66 |
+ RTN_XRESOLVE, /* Use external resolver (not supported) */ |
67 |
+ __RTN_MAX, |
68 |
+}; |
69 |
+#define RTN_MAX (__RTN_MAX - 1) |
70 |
+ |
71 |
+/* |
72 |
+ * RFC 3549, 3.1.1, protocol (Identifies what/who added the route). |
73 |
+ * Values larger than RTPROT_STATIC(4) are not interpreted by the |
74 |
+ * kernel, they are just for user information. |
75 |
+ */ |
76 |
+#define RTPROT_UNSPEC 0 |
77 |
+#define RTPROT_REDIRECT 1 /* Route installed by ICMP redirect */ |
78 |
+#define RTPROT_KERNEL 2 /* Route installed by kernel */ |
79 |
+#define RTPROT_BOOT 3 /* Route installed during boot */ |
80 |
+#define RTPROT_STATIC 4 /* Route installed by administrator */ |
81 |
+ |
82 |
+#define RTPROT_GATED 8 |
83 |
+#define RTPROT_RA 9 |
84 |
+#define RTPROT_MRT 1 |
85 |
+#define RTPROT_ZEBRA 11 |
86 |
+#define RTPROT_BIRD 12 |
87 |
+#define RTPROT_DNROUTED 13 |
88 |
+#define RTPROT_XORP 14 |
89 |
+#define RTPROT_NTK 15 |
90 |
+#define RTPROT_DHCP 16 |
91 |
+#define RTPROT_MROUTED 17 |
92 |
+#define RTPROT_KEEPALIVED 18 |
93 |
+#define RTPROT_BABEL 42 |
94 |
+#define RTPROT_OPENR 99 |
95 |
+#define RTPROT_BGP 186 |
96 |
+#define RTPROT_ISIS 187 |
97 |
+#define RTPROT_OSPF 188 |
98 |
+#define RTPROT_RIP 189 |
99 |
+#define RTPROT_EIGRP 192 |
100 |
+ |
101 |
+/* |
102 |
+ * RFC 3549 3.1.1 Route scope (valid distance to destination). |
103 |
+ * |
104 |
+ * The values between RT_SCOPE_UNIVERSE(0) and RT_SCOPE_SITE(200) |
105 |
+ * are available to the user. |
106 |
+ */ |
107 |
+enum rt_scope_t { |
108 |
+ RT_SCOPE_UNIVERSE = 0, |
109 |
+ /* User defined values */ |
110 |
+ RT_SCOPE_SITE = 200, |
111 |
+ RT_SCOPE_LINK = 253, |
112 |
+ RT_SCOPE_HOST = 254, |
113 |
+ RT_SCOPE_NOWHERE = 255 |
114 |
+}; |
115 |
+ |
116 |
+/* |
117 |
+ * RFC 3549 3.1.1 Route flags (rtm_flags). |
118 |
+ * Is a composition of RTNH_F flags (0x1..0x40 range), RTM_F flags (below) |
119 |
+ * and per-protocol (IPv4/IPv6) flags. |
120 |
+ */ |
121 |
+#define RTM_F_NOTIFY 0x00000100 /* not supported */ |
122 |
+#define RTM_F_CLONED 0x00000200 /* not supported */ |
123 |
+#define RTM_F_EQUALIZE 0x00000400 /* not supported */ |
124 |
+#define RTM_F_PREFIX 0x00000800 /* not supported */ |
125 |
+#define RTM_F_LOOKUP_TABLE 0x00001000 /* not supported */ |
126 |
+#define RTM_F_FIB_MATCH 0x00002000 /* not supported */ |
127 |
+#define RTM_F_OFFLOAD 0x00004000 /* not supported */ |
128 |
+#define RTM_F_TRAP 0x00008000 /* not supported */ |
129 |
+#define RTM_F_OFFLOAD_FAILED 0x20000000 /* not supported */ |
130 |
+ |
131 |
+/* Compatibility handling helpers */ |
132 |
+#ifndef _KERNEL |
133 |
+#define NL_RTM_HDRLEN ((int)sizeof(struct rtmsg)) |
134 |
+#define RTM_RTA(_rtm) ((struct rtattr *)((char *)(_rtm) + NL_RTM_HDRLEN)) |
135 |
+#define RTM_PAYLOAD(_hdr) NLMSG_PAYLOAD((_hdr), NL_RTM_HDRLEN) |
136 |
+#endif |
137 |
+ |
138 |
+/* |
139 |
+ * Routing table identifiers. |
140 |
+ * FreeBSD route table numbering starts from 0, where 0 is a valid default routing table. |
141 |
+ * Indicating "all tables" via netlink can be done by not including RTA_TABLE attribute |
142 |
+ * and keeping rtm_table=0 (compatibility) or setting RTA_TABLE value to RT_TABLE_UNSPEC. |
143 |
+ */ |
144 |
+#define RT_TABLE_MAIN 0 /* RT_DEFAULT_FIB */ |
145 |
+#define RT_TABLE_UNSPEC 0xFFFFFFFF /* RT_ALL_FIBS */ |
146 |
+ |
147 |
+enum rtattr_type_t { |
148 |
+ NL_RTA_UNSPEC, |
149 |
+ NL_RTA_DST = 1, /* binary, IPv4/IPv6 destination */ |
150 |
+ NL_RTA_SRC = 2, /* binary, preferred source address */ |
151 |
+ NL_RTA_IIF = 3, /* not supported */ |
152 |
+ NL_RTA_OIF = 4, /* u32, transmit ifindex */ |
153 |
+ NL_RTA_GATEWAY = 5, /* binary: IPv4/IPv6 gateway */ |
154 |
+ NL_RTA_PRIORITY = 6, /* not supported */ |
155 |
+ NL_RTA_PREFSRC = 7, /* not supported */ |
156 |
+ NL_RTA_METRICS = 8, /* nested, list of NL_RTAX* attrs */ |
157 |
+ NL_RTA_MULTIPATH = 9, /* binary, array of struct rtnexthop */ |
158 |
+ NL_RTA_PROTOINFO = 10, /* not supported / deprecated */ |
159 |
+ NL_RTA_KNH_ID = 10, /* u32, FreeBSD specific, kernel nexthop index */ |
160 |
+ NL_RTA_FLOW = 11, /* not supported */ |
161 |
+ NL_RTA_CACHEINFO = 12, /* not supported */ |
162 |
+ NL_RTA_SESSION = 13, /* not supported / deprecated */ |
163 |
+ NL_RTA_WEIGHT = 13, /* u32, FreeBSD specific, path weight */ |
164 |
+ NL_RTA_MP_ALGO = 14, /* not supported / deprecated */ |
165 |
+ NL_RTA_RTFLAGS = 14, /* u32, FreeBSD specific, path flags (RTF_)*/ |
166 |
+ NL_RTA_TABLE = 15, /* u32, fibnum */ |
167 |
+ NL_RTA_MARK = 16, /* not supported */ |
168 |
+ NL_RTA_MFC_STATS = 17, /* not supported */ |
169 |
+ NL_RTA_VIA = 18, /* binary, struct rtvia */ |
170 |
+ NL_RTA_NEWDST = 19, /* not supported */ |
171 |
+ NL_RTA_PREF = 20, /* not supported */ |
172 |
+ NL_RTA_ENCAP_TYPE = 21, /* not supported */ |
173 |
+ NL_RTA_ENCAP = 22, /* not supported */ |
174 |
+ NL_RTA_EXPIRES = 23, /* u32, seconds till expiration */ |
175 |
+ NL_RTA_PAD = 24, /* not supported */ |
176 |
+ NL_RTA_UID = 25, /* not supported */ |
177 |
+ NL_RTA_TTL_PROPAGATE = 26, /* not supported */ |
178 |
+ NL_RTA_IP_PROTO = 27, /* not supported */ |
179 |
+ NL_RTA_SPORT = 28, /* not supported */ |
180 |
+ NL_RTA_DPORT = 29, /* not supported */ |
181 |
+ NL_RTA_NH_ID = 30, /* u32, nexthop/nexthop group index */ |
182 |
+ __RTA_MAX |
183 |
+}; |
184 |
+#define NL_RTA_MAX (__RTA_MAX - 1) |
185 |
+ |
186 |
+/* |
187 |
+ * Attributes that can be used as filters: |
188 |
+ * |
189 |
+ */ |
190 |
+ |
191 |
+#ifndef _KERNEL |
192 |
+/* |
193 |
+ * RTA_* space has clashes with rtsock namespace. |
194 |
+ * Use NL_RTA_ prefix in the kernel and map to |
195 |
+ * RTA_ for userland. |
196 |
+ */ |
197 |
+#define RTA_UNSPEC NL_RTA_UNSPEC |
198 |
+#define RTA_DST NL_RTA_DST |
199 |
+#define RTA_SRC NL_RTA_SRC |
200 |
+#define RTA_IIF NL_RTA_IIF |
201 |
+#define RTA_OIF NL_RTA_OIF |
202 |
+#define RTA_GATEWAY NL_RTA_GATEWAY |
203 |
+#define RTA_PRIORITY NL_RTA_PRIORITY |
204 |
+#define RTA_PREFSRC NL_RTA_PREFSRC |
205 |
+#define RTA_METRICS NL_RTA_METRICS |
206 |
+#define RTA_MULTIPATH NL_RTA_MULTIPATH |
207 |
+#define RTA_PROTOINFO NL_RTA_PROTOINFO |
208 |
+#define RTA_KNH_ID NL_RTA_KNH_ID |
209 |
+#define RTA_FLOW NL_RTA_FLOW |
210 |
+#define RTA_CACHEINFO NL_RTA_CACHEINFO |
211 |
+#define RTA_SESSION NL_RTA_SESSION |
212 |
+#define RTA_MP_ALGO NL_RTA_MP_ALGO |
213 |
+#define RTA_TABLE NL_RTA_TABLE |
214 |
+#define RTA_MARK NL_RTA_MARK |
215 |
+#define RTA_MFC_STATS NL_RTA_MFC_STATS |
216 |
+#define RTA_VIA NL_RTA_VIA |
217 |
+#define RTA_NEWDST NL_RTA_NEWDST |
218 |
+#define RTA_PREF NL_RTA_PREF |
219 |
+#define RTA_ENCAP_TYPE NL_RTA_ENCAP_TYPE |
220 |
+#define RTA_ENCAP NL_RTA_ENCAP |
221 |
+#define RTA_EXPIRES NL_RTA_EXPIRES |
222 |
+#define RTA_PAD NL_RTA_PAD |
223 |
+#define RTA_UID NL_RTA_UID |
224 |
+#define RTA_TTL_PROPAGATE NL_RTA_TTL_PROPAGATE |
225 |
+#define RTA_IP_PROTO NL_RTA_IP_PROTO |
226 |
+#define RTA_SPORT NL_RTA_SPORT |
227 |
+#define RTA_DPORT NL_RTA_DPORT |
228 |
+#define RTA_NH_ID NL_RTA_NH_ID |
229 |
+#define RTA_MAX NL_RTA_MAX |
230 |
+#endif |
231 |
+ |
232 |
+/* route attribute header */ |
233 |
+struct rtattr { |
234 |
+ unsigned short rta_len; |
235 |
+ unsigned short rta_type; |
236 |
+}; |
237 |
+ |
238 |
+#define NL_RTA_ALIGN_SIZE NL_ITEM_ALIGN_SIZE |
239 |
+#define NL_RTA_ALIGN NL_ITEM_ALIGN |
240 |
+#define NL_RTA_HDRLEN ((int)sizeof(struct rtattr)) |
241 |
+#define NL_RTA_DATA_LEN(_rta) ((int)((_rta)->rta_len - NL_RTA_HDRLEN)) |
242 |
+#define NL_RTA_DATA(_rta) NL_ITEM_DATA(_rta, NL_RTA_HDRLEN) |
243 |
+#define NL_RTA_DATA_CONST(_rta) NL_ITEM_DATA_CONST(_rta, NL_RTA_HDRLEN) |
244 |
+ |
245 |
+/* Compatibility attribute handling helpers */ |
246 |
+#ifndef _KERNEL |
247 |
+#define RTA_ALIGNTO NL_RTA_ALIGN_SIZE |
248 |
+#define RTA_ALIGN(_len) NL_RTA_ALIGN(_len) |
249 |
+#define _RTA_LEN(_rta) ((int)(_rta)->rta_len) |
250 |
+#define _RTA_ALIGNED_LEN(_rta) RTA_ALIGN(_RTA_LEN(_rta)) |
251 |
+#define RTA_OK(_rta, _len) NL_ITEM_OK(_rta, _len, NL_RTA_HDRLEN, _RTA_LEN) |
252 |
+#define RTA_NEXT(_rta, _len) NL_ITEM_ITER(_rta, _len, _RTA_ALIGNED_LEN) |
253 |
+#define RTA_LENGTH(_len) (NL_RTA_HDRLEN + (_len)) |
254 |
+#define RTA_SPACE(_len) RTA_ALIGN(RTA_LENGTH(_len)) |
255 |
+#define RTA_DATA(_rta) NL_RTA_DATA(_rta) |
256 |
+#define RTA_PAYLOAD(_rta) ((int)(_RTA_LEN(_rta) - NL_RTA_HDRLEN)) |
257 |
+#endif |
258 |
+ |
259 |
+/* RTA attribute headers */ |
260 |
+ |
261 |
+/* RTA_VIA */ |
262 |
+struct rtvia { |
263 |
+ sa_family_t rtvia_family; |
264 |
+ uint8_t rtvia_addr[0]; |
265 |
+}; |
266 |
+ |
267 |
+/* |
268 |
+ * RTA_METRICS is a nested attribute, consisting of a list of |
269 |
+ * TLVs with types defined below. |
270 |
+ */ |
271 |
+ enum { |
272 |
+ NL_RTAX_UNSPEC, |
273 |
+ NL_RTAX_LOCK = 1, /* not supported */ |
274 |
+ NL_RTAX_MTU = 2, /* desired path MTU */ |
275 |
+ NL_RTAX_WINDOW = 3, /* not supported */ |
276 |
+ NL_RTAX_RTT = 4, /* not supported */ |
277 |
+ NL_RTAX_RTTVAR = 5, /* not supported */ |
278 |
+ NL_RTAX_SSTHRESH = 6, /* not supported */ |
279 |
+ NL_RTAX_CWND = 7, /* not supported */ |
280 |
+ NL_RTAX_ADVMSS = 8, /* not supported */ |
281 |
+ NL_RTAX_REORDERING = 9, /* not supported */ |
282 |
+ NL_RTAX_HOPLIMIT = 10, /* not supported */ |
283 |
+ NL_RTAX_INITCWND = 11, /* not supporrted */ |
284 |
+ NL_RTAX_FEATURES = 12, /* not supported */ |
285 |
+ NL_RTAX_RTO_MIN = 13, /* not supported */ |
286 |
+ NL_RTAX_INITRWND = 14, /* not supported */ |
287 |
+ NL_RTAX_QUICKACK = 15, /* not supported */ |
288 |
+ NL_RTAX_CC_ALGO = 16, /* not supported */ |
289 |
+ NL_RTAX_FASTOPEN_NO_COOKIE = 17, /* not supported */ |
290 |
+ __NL_RTAX_MAX |
291 |
+}; |
292 |
+#define NL_RTAX_MAX (__NL_RTAX_MAX - 1) |
293 |
+ |
294 |
+#define RTAX_FEATURE_ECN (1 << 0) |
295 |
+#define RTAX_FEATURE_SACK (1 << 1) |
296 |
+#define RTAX_FEATURE_TIMESTAMP (1 << 2) |
297 |
+#define RTAX_FEATURE_ALLFRAG (1 << 3) |
298 |
+ |
299 |
+#define RTAX_FEATURE_MASK \ |
300 |
+ (RTAX_FEATURE_ECN | RTAX_FEATURE_SACK | RTAX_FEATURE_TIMESTAMP | \ |
301 |
+ RTAX_FEATURE_ALLFRAG) |
302 |
+ |
303 |
+#ifndef _KERNEL |
304 |
+ |
305 |
+/* |
306 |
+ * RTAX_* space clashes with rtsock namespace. |
307 |
+ * Use NL_RTAX_ prefix in the kernel and map to |
308 |
+ * RTAX_ for userland. |
309 |
+ */ |
310 |
+#define RTAX_UNSPEC NL_RTAX_UNSPEC |
311 |
+#define RTAX_LOCK NL_RTAX_LOCK |
312 |
+#define RTAX_MTU NL_RTAX_MTU |
313 |
+#define RTAX_WINDOW NL_RTAX_WINDOW |
314 |
+#define RTAX_RTT NL_RTAX_RTT |
315 |
+#define RTAX_RTTVAR NL_RTAX_RTTVAR |
316 |
+#define RTAX_SSTHRESH NL_RTAX_SSTHRESH |
317 |
+#define RTAX_CWND NL_RTAX_CWND |
318 |
+#define RTAX_ADVMSS NL_RTAX_ADVMSS |
319 |
+#define RTAX_REORDERING NL_RTAX_REORDERING |
320 |
+#define RTAX_HOPLIMIT NL_RTAX_HOPLIMIT |
321 |
+#define RTAX_INITCWND NL_RTAX_INITCWND |
322 |
+#define RTAX_FEATURES NL_RTAX_FEATURES |
323 |
+#define RTAX_RTO_MIN NL_RTAX_RTO_MIN |
324 |
+#define RTAX_INITRWND NL_RTAX_INITRWND |
325 |
+#define RTAX_QUICKACK NL_RTAX_QUICKACK |
326 |
+#define RTAX_CC_ALGO NL_RTAX_CC_ALGO |
327 |
+#define RTAX_FASTOPEN_NO_COOKIE NL_RTAX_FASTOPEN_NO_COOKIE |
328 |
+#endif |
329 |
+ |
330 |
+/* |
331 |
+ * RTA_MULTIPATH consists of an array of rtnexthop structures. |
332 |
+ * Each rtnexthop structure contains RTA_GATEWAY or RTA_VIA |
333 |
+ * attribute following the header. |
334 |
+ */ |
335 |
+struct rtnexthop { |
336 |
+ unsigned short rtnh_len; |
337 |
+ unsigned char rtnh_flags; |
338 |
+ unsigned char rtnh_hops; /* nexthop weight */ |
339 |
+ int rtnh_ifindex; |
340 |
+}; |
341 |
+ |
342 |
+/* rtnh_flags */ |
343 |
+#define RTNH_F_DEAD 0x01 /* not supported */ |
344 |
+#define RTNH_F_PERVASIVE 0x02 /* not supported */ |
345 |
+#define RTNH_F_ONLINK 0x04 /* not supported */ |
346 |
+#define RTNH_F_OFFLOAD 0x08 /* not supported */ |
347 |
+#define RTNH_F_LINKDOWN 0x10 /* not supported */ |
348 |
+#define RTNH_F_UNRESOLVED 0x20 /* not supported */ |
349 |
+#define RTNH_F_TRAP 0x40 /* not supported */ |
350 |
+ |
351 |
+#define RTNH_COMPARE_MASK (RTNH_F_DEAD | RTNH_F_LINKDOWN | \ |
352 |
+ RTNH_F_OFFLOAD | RTNH_F_TRAP) |
353 |
+ |
354 |
+/* Macros to handle hexthops */ |
355 |
+#define RTNH_ALIGNTO NL_ITEM_ALIGN_SIZE |
356 |
+#define RTNH_ALIGN(_len) NL_ITEM_ALIGN(_len) |
357 |
+#define RTNH_HDRLEN ((int)sizeof(struct rtnexthop)) |
358 |
+#define _RTNH_LEN(_nh) ((int)(_nh)->rtnh_len) |
359 |
+#define _RTNH_ALIGNED_LEN(_nh) RTNH_ALIGN(_RTNH_LEN(_nh)) |
360 |
+#define RTNH_OK(_nh, _len) NL_ITEM_OK(_nh, _len, RTNH_HDRLEN, _RTNH_LEN) |
361 |
+#define RTNH_NEXT(_nh) ((struct rtnexthop *)((char *)(_nh) + _RTNH_ALIGNED_LEN(_nh))) |
362 |
+#define RTNH_LENGTH(_len) (RTNH_HDRLEN + (_len)) |
363 |
+#define RTNH_SPACE(_len) RTNH_ALIGN(RTNH_LENGTH(_len)) |
364 |
+#define RTNH_DATA(_nh) ((struct rtattr *)NL_ITEM_DATA(_nh, RTNH_HDRLEN)) |
365 |
+ |
366 |
+struct rtgenmsg { |
367 |
+ unsigned char rtgen_family; |
368 |
+}; |
369 |
+ |
370 |
+#endif |