Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wirel...
[deliverable/linux.git] / include / linux / rtnetlink.h
1 #ifndef __LINUX_RTNETLINK_H
2 #define __LINUX_RTNETLINK_H
3
4 #include <linux/types.h>
5 #include <linux/netlink.h>
6 #include <linux/if_link.h>
7 #include <linux/if_addr.h>
8 #include <linux/neighbour.h>
9
10 /****
11 * Routing/neighbour discovery messages.
12 ****/
13
14 /* Types of messages */
15
16 enum {
17 RTM_BASE = 16,
18 #define RTM_BASE RTM_BASE
19
20 RTM_NEWLINK = 16,
21 #define RTM_NEWLINK RTM_NEWLINK
22 RTM_DELLINK,
23 #define RTM_DELLINK RTM_DELLINK
24 RTM_GETLINK,
25 #define RTM_GETLINK RTM_GETLINK
26 RTM_SETLINK,
27 #define RTM_SETLINK RTM_SETLINK
28
29 RTM_NEWADDR = 20,
30 #define RTM_NEWADDR RTM_NEWADDR
31 RTM_DELADDR,
32 #define RTM_DELADDR RTM_DELADDR
33 RTM_GETADDR,
34 #define RTM_GETADDR RTM_GETADDR
35
36 RTM_NEWROUTE = 24,
37 #define RTM_NEWROUTE RTM_NEWROUTE
38 RTM_DELROUTE,
39 #define RTM_DELROUTE RTM_DELROUTE
40 RTM_GETROUTE,
41 #define RTM_GETROUTE RTM_GETROUTE
42
43 RTM_NEWNEIGH = 28,
44 #define RTM_NEWNEIGH RTM_NEWNEIGH
45 RTM_DELNEIGH,
46 #define RTM_DELNEIGH RTM_DELNEIGH
47 RTM_GETNEIGH,
48 #define RTM_GETNEIGH RTM_GETNEIGH
49
50 RTM_NEWRULE = 32,
51 #define RTM_NEWRULE RTM_NEWRULE
52 RTM_DELRULE,
53 #define RTM_DELRULE RTM_DELRULE
54 RTM_GETRULE,
55 #define RTM_GETRULE RTM_GETRULE
56
57 RTM_NEWQDISC = 36,
58 #define RTM_NEWQDISC RTM_NEWQDISC
59 RTM_DELQDISC,
60 #define RTM_DELQDISC RTM_DELQDISC
61 RTM_GETQDISC,
62 #define RTM_GETQDISC RTM_GETQDISC
63
64 RTM_NEWTCLASS = 40,
65 #define RTM_NEWTCLASS RTM_NEWTCLASS
66 RTM_DELTCLASS,
67 #define RTM_DELTCLASS RTM_DELTCLASS
68 RTM_GETTCLASS,
69 #define RTM_GETTCLASS RTM_GETTCLASS
70
71 RTM_NEWTFILTER = 44,
72 #define RTM_NEWTFILTER RTM_NEWTFILTER
73 RTM_DELTFILTER,
74 #define RTM_DELTFILTER RTM_DELTFILTER
75 RTM_GETTFILTER,
76 #define RTM_GETTFILTER RTM_GETTFILTER
77
78 RTM_NEWACTION = 48,
79 #define RTM_NEWACTION RTM_NEWACTION
80 RTM_DELACTION,
81 #define RTM_DELACTION RTM_DELACTION
82 RTM_GETACTION,
83 #define RTM_GETACTION RTM_GETACTION
84
85 RTM_NEWPREFIX = 52,
86 #define RTM_NEWPREFIX RTM_NEWPREFIX
87
88 RTM_GETMULTICAST = 58,
89 #define RTM_GETMULTICAST RTM_GETMULTICAST
90
91 RTM_GETANYCAST = 62,
92 #define RTM_GETANYCAST RTM_GETANYCAST
93
94 RTM_NEWNEIGHTBL = 64,
95 #define RTM_NEWNEIGHTBL RTM_NEWNEIGHTBL
96 RTM_GETNEIGHTBL = 66,
97 #define RTM_GETNEIGHTBL RTM_GETNEIGHTBL
98 RTM_SETNEIGHTBL,
99 #define RTM_SETNEIGHTBL RTM_SETNEIGHTBL
100
101 RTM_NEWNDUSEROPT = 68,
102 #define RTM_NEWNDUSEROPT RTM_NEWNDUSEROPT
103
104 RTM_NEWADDRLABEL = 72,
105 #define RTM_NEWADDRLABEL RTM_NEWADDRLABEL
106 RTM_DELADDRLABEL,
107 #define RTM_DELADDRLABEL RTM_DELADDRLABEL
108 RTM_GETADDRLABEL,
109 #define RTM_GETADDRLABEL RTM_GETADDRLABEL
110
111 RTM_GETDCB = 78,
112 #define RTM_GETDCB RTM_GETDCB
113 RTM_SETDCB,
114 #define RTM_SETDCB RTM_SETDCB
115
116 __RTM_MAX,
117 #define RTM_MAX (((__RTM_MAX + 3) & ~3) - 1)
118 };
119
120 #define RTM_NR_MSGTYPES (RTM_MAX + 1 - RTM_BASE)
121 #define RTM_NR_FAMILIES (RTM_NR_MSGTYPES >> 2)
122 #define RTM_FAM(cmd) (((cmd) - RTM_BASE) >> 2)
123
124 /*
125 Generic structure for encapsulation of optional route information.
126 It is reminiscent of sockaddr, but with sa_family replaced
127 with attribute type.
128 */
129
130 struct rtattr
131 {
132 unsigned short rta_len;
133 unsigned short rta_type;
134 };
135
136 /* Macros to handle rtattributes */
137
138 #define RTA_ALIGNTO 4
139 #define RTA_ALIGN(len) ( ((len)+RTA_ALIGNTO-1) & ~(RTA_ALIGNTO-1) )
140 #define RTA_OK(rta,len) ((len) >= (int)sizeof(struct rtattr) && \
141 (rta)->rta_len >= sizeof(struct rtattr) && \
142 (rta)->rta_len <= (len))
143 #define RTA_NEXT(rta,attrlen) ((attrlen) -= RTA_ALIGN((rta)->rta_len), \
144 (struct rtattr*)(((char*)(rta)) + RTA_ALIGN((rta)->rta_len)))
145 #define RTA_LENGTH(len) (RTA_ALIGN(sizeof(struct rtattr)) + (len))
146 #define RTA_SPACE(len) RTA_ALIGN(RTA_LENGTH(len))
147 #define RTA_DATA(rta) ((void*)(((char*)(rta)) + RTA_LENGTH(0)))
148 #define RTA_PAYLOAD(rta) ((int)((rta)->rta_len) - RTA_LENGTH(0))
149
150
151
152
153 /******************************************************************************
154 * Definitions used in routing table administration.
155 ****/
156
157 struct rtmsg
158 {
159 unsigned char rtm_family;
160 unsigned char rtm_dst_len;
161 unsigned char rtm_src_len;
162 unsigned char rtm_tos;
163
164 unsigned char rtm_table; /* Routing table id */
165 unsigned char rtm_protocol; /* Routing protocol; see below */
166 unsigned char rtm_scope; /* See below */
167 unsigned char rtm_type; /* See below */
168
169 unsigned rtm_flags;
170 };
171
172 /* rtm_type */
173
174 enum
175 {
176 RTN_UNSPEC,
177 RTN_UNICAST, /* Gateway or direct route */
178 RTN_LOCAL, /* Accept locally */
179 RTN_BROADCAST, /* Accept locally as broadcast,
180 send as broadcast */
181 RTN_ANYCAST, /* Accept locally as broadcast,
182 but send as unicast */
183 RTN_MULTICAST, /* Multicast route */
184 RTN_BLACKHOLE, /* Drop */
185 RTN_UNREACHABLE, /* Destination is unreachable */
186 RTN_PROHIBIT, /* Administratively prohibited */
187 RTN_THROW, /* Not in this table */
188 RTN_NAT, /* Translate this address */
189 RTN_XRESOLVE, /* Use external resolver */
190 __RTN_MAX
191 };
192
193 #define RTN_MAX (__RTN_MAX - 1)
194
195
196 /* rtm_protocol */
197
198 #define RTPROT_UNSPEC 0
199 #define RTPROT_REDIRECT 1 /* Route installed by ICMP redirects;
200 not used by current IPv4 */
201 #define RTPROT_KERNEL 2 /* Route installed by kernel */
202 #define RTPROT_BOOT 3 /* Route installed during boot */
203 #define RTPROT_STATIC 4 /* Route installed by administrator */
204
205 /* Values of protocol >= RTPROT_STATIC are not interpreted by kernel;
206 they are just passed from user and back as is.
207 It will be used by hypothetical multiple routing daemons.
208 Note that protocol values should be standardized in order to
209 avoid conflicts.
210 */
211
212 #define RTPROT_GATED 8 /* Apparently, GateD */
213 #define RTPROT_RA 9 /* RDISC/ND router advertisements */
214 #define RTPROT_MRT 10 /* Merit MRT */
215 #define RTPROT_ZEBRA 11 /* Zebra */
216 #define RTPROT_BIRD 12 /* BIRD */
217 #define RTPROT_DNROUTED 13 /* DECnet routing daemon */
218 #define RTPROT_XORP 14 /* XORP */
219 #define RTPROT_NTK 15 /* Netsukuku */
220 #define RTPROT_DHCP 16 /* DHCP client */
221
222 /* rtm_scope
223
224 Really it is not scope, but sort of distance to the destination.
225 NOWHERE are reserved for not existing destinations, HOST is our
226 local addresses, LINK are destinations, located on directly attached
227 link and UNIVERSE is everywhere in the Universe.
228
229 Intermediate values are also possible f.e. interior routes
230 could be assigned a value between UNIVERSE and LINK.
231 */
232
233 enum rt_scope_t
234 {
235 RT_SCOPE_UNIVERSE=0,
236 /* User defined values */
237 RT_SCOPE_SITE=200,
238 RT_SCOPE_LINK=253,
239 RT_SCOPE_HOST=254,
240 RT_SCOPE_NOWHERE=255
241 };
242
243 /* rtm_flags */
244
245 #define RTM_F_NOTIFY 0x100 /* Notify user of route change */
246 #define RTM_F_CLONED 0x200 /* This route is cloned */
247 #define RTM_F_EQUALIZE 0x400 /* Multipath equalizer: NI */
248 #define RTM_F_PREFIX 0x800 /* Prefix addresses */
249
250 /* Reserved table identifiers */
251
252 enum rt_class_t
253 {
254 RT_TABLE_UNSPEC=0,
255 /* User defined values */
256 RT_TABLE_COMPAT=252,
257 RT_TABLE_DEFAULT=253,
258 RT_TABLE_MAIN=254,
259 RT_TABLE_LOCAL=255,
260 RT_TABLE_MAX=0xFFFFFFFF
261 };
262
263
264 /* Routing message attributes */
265
266 enum rtattr_type_t
267 {
268 RTA_UNSPEC,
269 RTA_DST,
270 RTA_SRC,
271 RTA_IIF,
272 RTA_OIF,
273 RTA_GATEWAY,
274 RTA_PRIORITY,
275 RTA_PREFSRC,
276 RTA_METRICS,
277 RTA_MULTIPATH,
278 RTA_PROTOINFO, /* no longer used */
279 RTA_FLOW,
280 RTA_CACHEINFO,
281 RTA_SESSION, /* no longer used */
282 RTA_MP_ALGO, /* no longer used */
283 RTA_TABLE,
284 __RTA_MAX
285 };
286
287 #define RTA_MAX (__RTA_MAX - 1)
288
289 #define RTM_RTA(r) ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct rtmsg))))
290 #define RTM_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct rtmsg))
291
292 /* RTM_MULTIPATH --- array of struct rtnexthop.
293 *
294 * "struct rtnexthop" describes all necessary nexthop information,
295 * i.e. parameters of path to a destination via this nexthop.
296 *
297 * At the moment it is impossible to set different prefsrc, mtu, window
298 * and rtt for different paths from multipath.
299 */
300
301 struct rtnexthop
302 {
303 unsigned short rtnh_len;
304 unsigned char rtnh_flags;
305 unsigned char rtnh_hops;
306 int rtnh_ifindex;
307 };
308
309 /* rtnh_flags */
310
311 #define RTNH_F_DEAD 1 /* Nexthop is dead (used by multipath) */
312 #define RTNH_F_PERVASIVE 2 /* Do recursive gateway lookup */
313 #define RTNH_F_ONLINK 4 /* Gateway is forced on link */
314
315 /* Macros to handle hexthops */
316
317 #define RTNH_ALIGNTO 4
318 #define RTNH_ALIGN(len) ( ((len)+RTNH_ALIGNTO-1) & ~(RTNH_ALIGNTO-1) )
319 #define RTNH_OK(rtnh,len) ((rtnh)->rtnh_len >= sizeof(struct rtnexthop) && \
320 ((int)(rtnh)->rtnh_len) <= (len))
321 #define RTNH_NEXT(rtnh) ((struct rtnexthop*)(((char*)(rtnh)) + RTNH_ALIGN((rtnh)->rtnh_len)))
322 #define RTNH_LENGTH(len) (RTNH_ALIGN(sizeof(struct rtnexthop)) + (len))
323 #define RTNH_SPACE(len) RTNH_ALIGN(RTNH_LENGTH(len))
324 #define RTNH_DATA(rtnh) ((struct rtattr*)(((char*)(rtnh)) + RTNH_LENGTH(0)))
325
326 /* RTM_CACHEINFO */
327
328 struct rta_cacheinfo
329 {
330 __u32 rta_clntref;
331 __u32 rta_lastuse;
332 __s32 rta_expires;
333 __u32 rta_error;
334 __u32 rta_used;
335
336 #define RTNETLINK_HAVE_PEERINFO 1
337 __u32 rta_id;
338 __u32 rta_ts;
339 __u32 rta_tsage;
340 };
341
342 /* RTM_METRICS --- array of struct rtattr with types of RTAX_* */
343
344 enum
345 {
346 RTAX_UNSPEC,
347 #define RTAX_UNSPEC RTAX_UNSPEC
348 RTAX_LOCK,
349 #define RTAX_LOCK RTAX_LOCK
350 RTAX_MTU,
351 #define RTAX_MTU RTAX_MTU
352 RTAX_WINDOW,
353 #define RTAX_WINDOW RTAX_WINDOW
354 RTAX_RTT,
355 #define RTAX_RTT RTAX_RTT
356 RTAX_RTTVAR,
357 #define RTAX_RTTVAR RTAX_RTTVAR
358 RTAX_SSTHRESH,
359 #define RTAX_SSTHRESH RTAX_SSTHRESH
360 RTAX_CWND,
361 #define RTAX_CWND RTAX_CWND
362 RTAX_ADVMSS,
363 #define RTAX_ADVMSS RTAX_ADVMSS
364 RTAX_REORDERING,
365 #define RTAX_REORDERING RTAX_REORDERING
366 RTAX_HOPLIMIT,
367 #define RTAX_HOPLIMIT RTAX_HOPLIMIT
368 RTAX_INITCWND,
369 #define RTAX_INITCWND RTAX_INITCWND
370 RTAX_FEATURES,
371 #define RTAX_FEATURES RTAX_FEATURES
372 RTAX_RTO_MIN,
373 #define RTAX_RTO_MIN RTAX_RTO_MIN
374 __RTAX_MAX
375 };
376
377 #define RTAX_MAX (__RTAX_MAX - 1)
378
379 #define RTAX_FEATURE_ECN 0x00000001
380 #define RTAX_FEATURE_NO_SACK 0x00000002
381 #define RTAX_FEATURE_NO_TSTAMP 0x00000004
382 #define RTAX_FEATURE_ALLFRAG 0x00000008
383 #define RTAX_FEATURE_NO_WSCALE 0x00000010
384 #define RTAX_FEATURE_NO_DSACK 0x00000020
385
386 struct rta_session
387 {
388 __u8 proto;
389 __u8 pad1;
390 __u16 pad2;
391
392 union {
393 struct {
394 __u16 sport;
395 __u16 dport;
396 } ports;
397
398 struct {
399 __u8 type;
400 __u8 code;
401 __u16 ident;
402 } icmpt;
403
404 __u32 spi;
405 } u;
406 };
407
408 /****
409 * General form of address family dependent message.
410 ****/
411
412 struct rtgenmsg
413 {
414 unsigned char rtgen_family;
415 };
416
417 /*****************************************************************
418 * Link layer specific messages.
419 ****/
420
421 /* struct ifinfomsg
422 * passes link level specific information, not dependent
423 * on network protocol.
424 */
425
426 struct ifinfomsg
427 {
428 unsigned char ifi_family;
429 unsigned char __ifi_pad;
430 unsigned short ifi_type; /* ARPHRD_* */
431 int ifi_index; /* Link index */
432 unsigned ifi_flags; /* IFF_* flags */
433 unsigned ifi_change; /* IFF_* change mask */
434 };
435
436 /********************************************************************
437 * prefix information
438 ****/
439
440 struct prefixmsg
441 {
442 unsigned char prefix_family;
443 unsigned char prefix_pad1;
444 unsigned short prefix_pad2;
445 int prefix_ifindex;
446 unsigned char prefix_type;
447 unsigned char prefix_len;
448 unsigned char prefix_flags;
449 unsigned char prefix_pad3;
450 };
451
452 enum
453 {
454 PREFIX_UNSPEC,
455 PREFIX_ADDRESS,
456 PREFIX_CACHEINFO,
457 __PREFIX_MAX
458 };
459
460 #define PREFIX_MAX (__PREFIX_MAX - 1)
461
462 struct prefix_cacheinfo
463 {
464 __u32 preferred_time;
465 __u32 valid_time;
466 };
467
468
469 /*****************************************************************
470 * Traffic control messages.
471 ****/
472
473 struct tcmsg
474 {
475 unsigned char tcm_family;
476 unsigned char tcm__pad1;
477 unsigned short tcm__pad2;
478 int tcm_ifindex;
479 __u32 tcm_handle;
480 __u32 tcm_parent;
481 __u32 tcm_info;
482 };
483
484 enum
485 {
486 TCA_UNSPEC,
487 TCA_KIND,
488 TCA_OPTIONS,
489 TCA_STATS,
490 TCA_XSTATS,
491 TCA_RATE,
492 TCA_FCNT,
493 TCA_STATS2,
494 TCA_STAB,
495 __TCA_MAX
496 };
497
498 #define TCA_MAX (__TCA_MAX - 1)
499
500 #define TCA_RTA(r) ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct tcmsg))))
501 #define TCA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct tcmsg))
502
503 /********************************************************************
504 * Neighbor Discovery userland options
505 ****/
506
507 struct nduseroptmsg
508 {
509 unsigned char nduseropt_family;
510 unsigned char nduseropt_pad1;
511 unsigned short nduseropt_opts_len; /* Total length of options */
512 int nduseropt_ifindex;
513 __u8 nduseropt_icmp_type;
514 __u8 nduseropt_icmp_code;
515 unsigned short nduseropt_pad2;
516 unsigned int nduseropt_pad3;
517 /* Followed by one or more ND options */
518 };
519
520 enum
521 {
522 NDUSEROPT_UNSPEC,
523 NDUSEROPT_SRCADDR,
524 __NDUSEROPT_MAX
525 };
526
527 #define NDUSEROPT_MAX (__NDUSEROPT_MAX - 1)
528
529 #ifndef __KERNEL__
530 /* RTnetlink multicast groups - backwards compatibility for userspace */
531 #define RTMGRP_LINK 1
532 #define RTMGRP_NOTIFY 2
533 #define RTMGRP_NEIGH 4
534 #define RTMGRP_TC 8
535
536 #define RTMGRP_IPV4_IFADDR 0x10
537 #define RTMGRP_IPV4_MROUTE 0x20
538 #define RTMGRP_IPV4_ROUTE 0x40
539 #define RTMGRP_IPV4_RULE 0x80
540
541 #define RTMGRP_IPV6_IFADDR 0x100
542 #define RTMGRP_IPV6_MROUTE 0x200
543 #define RTMGRP_IPV6_ROUTE 0x400
544 #define RTMGRP_IPV6_IFINFO 0x800
545
546 #define RTMGRP_DECnet_IFADDR 0x1000
547 #define RTMGRP_DECnet_ROUTE 0x4000
548
549 #define RTMGRP_IPV6_PREFIX 0x20000
550 #endif
551
552 /* RTnetlink multicast groups */
553 enum rtnetlink_groups {
554 RTNLGRP_NONE,
555 #define RTNLGRP_NONE RTNLGRP_NONE
556 RTNLGRP_LINK,
557 #define RTNLGRP_LINK RTNLGRP_LINK
558 RTNLGRP_NOTIFY,
559 #define RTNLGRP_NOTIFY RTNLGRP_NOTIFY
560 RTNLGRP_NEIGH,
561 #define RTNLGRP_NEIGH RTNLGRP_NEIGH
562 RTNLGRP_TC,
563 #define RTNLGRP_TC RTNLGRP_TC
564 RTNLGRP_IPV4_IFADDR,
565 #define RTNLGRP_IPV4_IFADDR RTNLGRP_IPV4_IFADDR
566 RTNLGRP_IPV4_MROUTE,
567 #define RTNLGRP_IPV4_MROUTE RTNLGRP_IPV4_MROUTE
568 RTNLGRP_IPV4_ROUTE,
569 #define RTNLGRP_IPV4_ROUTE RTNLGRP_IPV4_ROUTE
570 RTNLGRP_IPV4_RULE,
571 #define RTNLGRP_IPV4_RULE RTNLGRP_IPV4_RULE
572 RTNLGRP_IPV6_IFADDR,
573 #define RTNLGRP_IPV6_IFADDR RTNLGRP_IPV6_IFADDR
574 RTNLGRP_IPV6_MROUTE,
575 #define RTNLGRP_IPV6_MROUTE RTNLGRP_IPV6_MROUTE
576 RTNLGRP_IPV6_ROUTE,
577 #define RTNLGRP_IPV6_ROUTE RTNLGRP_IPV6_ROUTE
578 RTNLGRP_IPV6_IFINFO,
579 #define RTNLGRP_IPV6_IFINFO RTNLGRP_IPV6_IFINFO
580 RTNLGRP_DECnet_IFADDR,
581 #define RTNLGRP_DECnet_IFADDR RTNLGRP_DECnet_IFADDR
582 RTNLGRP_NOP2,
583 RTNLGRP_DECnet_ROUTE,
584 #define RTNLGRP_DECnet_ROUTE RTNLGRP_DECnet_ROUTE
585 RTNLGRP_DECnet_RULE,
586 #define RTNLGRP_DECnet_RULE RTNLGRP_DECnet_RULE
587 RTNLGRP_NOP4,
588 RTNLGRP_IPV6_PREFIX,
589 #define RTNLGRP_IPV6_PREFIX RTNLGRP_IPV6_PREFIX
590 RTNLGRP_IPV6_RULE,
591 #define RTNLGRP_IPV6_RULE RTNLGRP_IPV6_RULE
592 RTNLGRP_ND_USEROPT,
593 #define RTNLGRP_ND_USEROPT RTNLGRP_ND_USEROPT
594 RTNLGRP_PHONET_IFADDR,
595 #define RTNLGRP_PHONET_IFADDR RTNLGRP_PHONET_IFADDR
596 RTNLGRP_PHONET_ROUTE,
597 #define RTNLGRP_PHONET_ROUTE RTNLGRP_PHONET_ROUTE
598 __RTNLGRP_MAX
599 };
600 #define RTNLGRP_MAX (__RTNLGRP_MAX - 1)
601
602 /* TC action piece */
603 struct tcamsg
604 {
605 unsigned char tca_family;
606 unsigned char tca__pad1;
607 unsigned short tca__pad2;
608 };
609 #define TA_RTA(r) ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct tcamsg))))
610 #define TA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct tcamsg))
611 #define TCA_ACT_TAB 1 /* attr type must be >=1 */
612 #define TCAA_MAX 1
613
614 /* End of information exported to user level */
615
616 #ifdef __KERNEL__
617
618 #include <linux/mutex.h>
619
620 static __inline__ int rtattr_strcmp(const struct rtattr *rta, const char *str)
621 {
622 int len = strlen(str) + 1;
623 return len > rta->rta_len || memcmp(RTA_DATA(rta), str, len);
624 }
625
626 extern int rtnetlink_send(struct sk_buff *skb, struct net *net, u32 pid, u32 group, int echo);
627 extern int rtnl_unicast(struct sk_buff *skb, struct net *net, u32 pid);
628 extern void rtnl_notify(struct sk_buff *skb, struct net *net, u32 pid,
629 u32 group, struct nlmsghdr *nlh, gfp_t flags);
630 extern void rtnl_set_sk_err(struct net *net, u32 group, int error);
631 extern int rtnetlink_put_metrics(struct sk_buff *skb, u32 *metrics);
632 extern int rtnl_put_cacheinfo(struct sk_buff *skb, struct dst_entry *dst,
633 u32 id, u32 ts, u32 tsage, long expires,
634 u32 error);
635
636 extern void __rta_fill(struct sk_buff *skb, int attrtype, int attrlen, const void *data);
637
638 #define RTA_PUT(skb, attrtype, attrlen, data) \
639 ({ if (unlikely(skb_tailroom(skb) < (int)RTA_SPACE(attrlen))) \
640 goto rtattr_failure; \
641 __rta_fill(skb, attrtype, attrlen, data); })
642
643 #define RTA_APPEND(skb, attrlen, data) \
644 ({ if (unlikely(skb_tailroom(skb) < (int)(attrlen))) \
645 goto rtattr_failure; \
646 memcpy(skb_put(skb, attrlen), data, attrlen); })
647
648 #define RTA_PUT_NOHDR(skb, attrlen, data) \
649 ({ RTA_APPEND(skb, RTA_ALIGN(attrlen), data); \
650 memset(skb_tail_pointer(skb) - (RTA_ALIGN(attrlen) - attrlen), 0, \
651 RTA_ALIGN(attrlen) - attrlen); })
652
653 #define RTA_PUT_U8(skb, attrtype, value) \
654 ({ u8 _tmp = (value); \
655 RTA_PUT(skb, attrtype, sizeof(u8), &_tmp); })
656
657 #define RTA_PUT_U16(skb, attrtype, value) \
658 ({ u16 _tmp = (value); \
659 RTA_PUT(skb, attrtype, sizeof(u16), &_tmp); })
660
661 #define RTA_PUT_U32(skb, attrtype, value) \
662 ({ u32 _tmp = (value); \
663 RTA_PUT(skb, attrtype, sizeof(u32), &_tmp); })
664
665 #define RTA_PUT_U64(skb, attrtype, value) \
666 ({ u64 _tmp = (value); \
667 RTA_PUT(skb, attrtype, sizeof(u64), &_tmp); })
668
669 #define RTA_PUT_SECS(skb, attrtype, value) \
670 RTA_PUT_U64(skb, attrtype, (value) / HZ)
671
672 #define RTA_PUT_MSECS(skb, attrtype, value) \
673 RTA_PUT_U64(skb, attrtype, jiffies_to_msecs(value))
674
675 #define RTA_PUT_STRING(skb, attrtype, value) \
676 RTA_PUT(skb, attrtype, strlen(value) + 1, value)
677
678 #define RTA_PUT_FLAG(skb, attrtype) \
679 RTA_PUT(skb, attrtype, 0, NULL);
680
681 #define RTA_NEST(skb, type) \
682 ({ struct rtattr *__start = (struct rtattr *)skb_tail_pointer(skb); \
683 RTA_PUT(skb, type, 0, NULL); \
684 __start; })
685
686 #define RTA_NEST_END(skb, start) \
687 ({ (start)->rta_len = skb_tail_pointer(skb) - (unsigned char *)(start); \
688 (skb)->len; })
689
690 #define RTA_NEST_COMPAT(skb, type, attrlen, data) \
691 ({ struct rtattr *__start = (struct rtattr *)skb_tail_pointer(skb); \
692 RTA_PUT(skb, type, attrlen, data); \
693 RTA_NEST(skb, type); \
694 __start; })
695
696 #define RTA_NEST_COMPAT_END(skb, start) \
697 ({ struct rtattr *__nest = (void *)(start) + NLMSG_ALIGN((start)->rta_len); \
698 (start)->rta_len = skb_tail_pointer(skb) - (unsigned char *)(start); \
699 RTA_NEST_END(skb, __nest); \
700 (skb)->len; })
701
702 #define RTA_NEST_CANCEL(skb, start) \
703 ({ if (start) \
704 skb_trim(skb, (unsigned char *) (start) - (skb)->data); \
705 -1; })
706
707 #define RTA_GET_U8(rta) \
708 ({ if (!rta || RTA_PAYLOAD(rta) < sizeof(u8)) \
709 goto rtattr_failure; \
710 *(u8 *) RTA_DATA(rta); })
711
712 #define RTA_GET_U16(rta) \
713 ({ if (!rta || RTA_PAYLOAD(rta) < sizeof(u16)) \
714 goto rtattr_failure; \
715 *(u16 *) RTA_DATA(rta); })
716
717 #define RTA_GET_U32(rta) \
718 ({ if (!rta || RTA_PAYLOAD(rta) < sizeof(u32)) \
719 goto rtattr_failure; \
720 *(u32 *) RTA_DATA(rta); })
721
722 #define RTA_GET_U64(rta) \
723 ({ u64 _tmp; \
724 if (!rta || RTA_PAYLOAD(rta) < sizeof(u64)) \
725 goto rtattr_failure; \
726 memcpy(&_tmp, RTA_DATA(rta), sizeof(_tmp)); \
727 _tmp; })
728
729 #define RTA_GET_FLAG(rta) (!!(rta))
730
731 #define RTA_GET_SECS(rta) ((unsigned long) RTA_GET_U64(rta) * HZ)
732 #define RTA_GET_MSECS(rta) (msecs_to_jiffies((unsigned long) RTA_GET_U64(rta)))
733
734 static inline struct rtattr *
735 __rta_reserve(struct sk_buff *skb, int attrtype, int attrlen)
736 {
737 struct rtattr *rta;
738 int size = RTA_LENGTH(attrlen);
739
740 rta = (struct rtattr*)skb_put(skb, RTA_ALIGN(size));
741 rta->rta_type = attrtype;
742 rta->rta_len = size;
743 memset(RTA_DATA(rta) + attrlen, 0, RTA_ALIGN(size) - size);
744 return rta;
745 }
746
747 #define __RTA_PUT(skb, attrtype, attrlen) \
748 ({ if (unlikely(skb_tailroom(skb) < (int)RTA_SPACE(attrlen))) \
749 goto rtattr_failure; \
750 __rta_reserve(skb, attrtype, attrlen); })
751
752 extern void rtmsg_ifinfo(int type, struct net_device *dev, unsigned change);
753
754 /* RTNL is used as a global lock for all changes to network configuration */
755 extern void rtnl_lock(void);
756 extern void rtnl_unlock(void);
757 extern int rtnl_trylock(void);
758 extern int rtnl_is_locked(void);
759
760 extern void rtnetlink_init(void);
761 extern void __rtnl_unlock(void);
762
763 #define ASSERT_RTNL() do { \
764 if (unlikely(!rtnl_is_locked())) { \
765 printk(KERN_ERR "RTNL: assertion failed at %s (%d)\n", \
766 __FILE__, __LINE__); \
767 dump_stack(); \
768 } \
769 } while(0)
770
771 static inline u32 rtm_get_table(struct rtattr **rta, u8 table)
772 {
773 return RTA_GET_U32(rta[RTA_TABLE-1]);
774 rtattr_failure:
775 return table;
776 }
777
778 #endif /* __KERNEL__ */
779
780
781 #endif /* __LINUX_RTNETLINK_H */
This page took 0.089364 seconds and 6 git commands to generate.