linux-old/include/linux/rtnetlink.h
<<
>>
Prefs
   1#ifndef __LINUX_RTNETLINK_H
   2#define __LINUX_RTNETLINK_H
   3
   4#include <linux/netlink.h>
   5
   6#define RTNL_DEBUG 1
   7
   8
   9/****
  10 *              Routing/neighbour discovery messages.
  11 ****/
  12
  13/* Types of messages */
  14
  15#define RTM_BASE        0x10
  16
  17#define RTM_NEWLINK     (RTM_BASE+0)
  18#define RTM_DELLINK     (RTM_BASE+1)
  19#define RTM_GETLINK     (RTM_BASE+2)
  20
  21#define RTM_NEWADDR     (RTM_BASE+4)
  22#define RTM_DELADDR     (RTM_BASE+5)
  23#define RTM_GETADDR     (RTM_BASE+6)
  24
  25#define RTM_NEWROUTE    (RTM_BASE+8)
  26#define RTM_DELROUTE    (RTM_BASE+9)
  27#define RTM_GETROUTE    (RTM_BASE+10)
  28
  29#define RTM_NEWNEIGH    (RTM_BASE+12)
  30#define RTM_DELNEIGH    (RTM_BASE+13)
  31#define RTM_GETNEIGH    (RTM_BASE+14)
  32
  33#define RTM_NEWRULE     (RTM_BASE+16)
  34#define RTM_DELRULE     (RTM_BASE+17)
  35#define RTM_GETRULE     (RTM_BASE+18)
  36
  37#define RTM_NEWQDISC    (RTM_BASE+20)
  38#define RTM_DELQDISC    (RTM_BASE+21)
  39#define RTM_GETQDISC    (RTM_BASE+22)
  40
  41#define RTM_NEWTCLASS   (RTM_BASE+24)
  42#define RTM_DELTCLASS   (RTM_BASE+25)
  43#define RTM_GETTCLASS   (RTM_BASE+26)
  44
  45#define RTM_NEWTFILTER  (RTM_BASE+28)
  46#define RTM_DELTFILTER  (RTM_BASE+29)
  47#define RTM_GETTFILTER  (RTM_BASE+30)
  48
  49#define RTM_MAX         (RTM_BASE+31)
  50
  51/* 
  52   Generic structure for encapsulation of optional route information.
  53   It is reminiscent of sockaddr, but with sa_family replaced
  54   with attribute type.
  55 */
  56
  57struct rtattr
  58{
  59        unsigned short  rta_len;
  60        unsigned short  rta_type;
  61};
  62
  63/* Macros to handle rtattributes */
  64
  65#define RTA_ALIGNTO     4
  66#define RTA_ALIGN(len) ( ((len)+RTA_ALIGNTO-1) & ~(RTA_ALIGNTO-1) )
  67#define RTA_OK(rta,len) ((len) >= (int)sizeof(struct rtattr) && \
  68                         (rta)->rta_len >= sizeof(struct rtattr) && \
  69                         (rta)->rta_len <= (len))
  70#define RTA_NEXT(rta,attrlen)   ((attrlen) -= RTA_ALIGN((rta)->rta_len), \
  71                                 (struct rtattr*)(((char*)(rta)) + RTA_ALIGN((rta)->rta_len)))
  72#define RTA_LENGTH(len) (RTA_ALIGN(sizeof(struct rtattr)) + (len))
  73#define RTA_SPACE(len)  RTA_ALIGN(RTA_LENGTH(len))
  74#define RTA_DATA(rta)   ((void*)(((char*)(rta)) + RTA_LENGTH(0)))
  75#define RTA_PAYLOAD(rta) ((int)((rta)->rta_len) - RTA_LENGTH(0))
  76
  77
  78
  79
  80/******************************************************************************
  81 *              Definitions used in routing table administration.
  82 ****/
  83
  84struct rtmsg
  85{
  86        unsigned char           rtm_family;
  87        unsigned char           rtm_dst_len;
  88        unsigned char           rtm_src_len;
  89        unsigned char           rtm_tos;
  90
  91        unsigned char           rtm_table;      /* Routing table id */
  92        unsigned char           rtm_protocol;   /* Routing protocol; see below  */
  93        unsigned char           rtm_scope;      /* See below */ 
  94        unsigned char           rtm_type;       /* See below    */
  95
  96        unsigned                rtm_flags;
  97};
  98
  99/* rtm_type */
 100
 101enum
 102{
 103        RTN_UNSPEC,
 104        RTN_UNICAST,            /* Gateway or direct route      */
 105        RTN_LOCAL,              /* Accept locally               */
 106        RTN_BROADCAST,          /* Accept locally as broadcast,
 107                                   send as broadcast */
 108        RTN_ANYCAST,            /* Accept locally as broadcast,
 109                                   but send as unicast */
 110        RTN_MULTICAST,          /* Multicast route              */
 111        RTN_BLACKHOLE,          /* Drop                         */
 112        RTN_UNREACHABLE,        /* Destination is unreachable   */
 113        RTN_PROHIBIT,           /* Administratively prohibited  */
 114        RTN_THROW,              /* Not in this table            */
 115        RTN_NAT,                /* Translate this address       */
 116        RTN_XRESOLVE,           /* Use external resolver        */
 117        __RTN_MAX
 118};
 119
 120#define RTN_MAX (__RTN_MAX - 1)
 121
 122
 123/* rtm_protocol */
 124
 125#define RTPROT_UNSPEC   0
 126#define RTPROT_REDIRECT 1       /* Route installed by ICMP redirects;
 127                                   not used by current IPv4 */
 128#define RTPROT_KERNEL   2       /* Route installed by kernel            */
 129#define RTPROT_BOOT     3       /* Route installed during boot          */
 130#define RTPROT_STATIC   4       /* Route installed by administrator     */
 131
 132/* Values of protocol >= RTPROT_STATIC are not interpreted by kernel;
 133   they are just passed from user and back as is.
 134   It will be used by hypothetical multiple routing daemons.
 135   Note that protocol values should be standardized in order to
 136   avoid conflicts.
 137 */
 138
 139#define RTPROT_GATED    8       /* Apparently, GateD */
 140#define RTPROT_RA       9       /* RDISC/ND router advertisements */
 141#define RTPROT_MRT      10      /* Merit MRT */
 142#define RTPROT_ZEBRA    11      /* Zebra */
 143#define RTPROT_BIRD     12      /* BIRD */
 144#define RTPROT_DNROUTED 13      /* DECnet routing daemon */
 145#define RTPROT_XORP     14      /* XORP */
 146
 147/* rtm_scope
 148
 149   Really it is not scope, but sort of distance to the destination.
 150   NOWHERE are reserved for not existing destinations, HOST is our
 151   local addresses, LINK are destinations, located on directly attached
 152   link and UNIVERSE is everywhere in the Universe.
 153
 154   Intermediate values are also possible f.e. interior routes
 155   could be assigned a value between UNIVERSE and LINK.
 156*/
 157
 158enum rt_scope_t
 159{
 160        RT_SCOPE_UNIVERSE=0,
 161/* User defined values  */
 162        RT_SCOPE_SITE=200,
 163        RT_SCOPE_LINK=253,
 164        RT_SCOPE_HOST=254,
 165        RT_SCOPE_NOWHERE=255
 166};
 167
 168/* rtm_flags */
 169
 170#define RTM_F_NOTIFY            0x100   /* Notify user of route change  */
 171#define RTM_F_CLONED            0x200   /* This route is cloned         */
 172#define RTM_F_EQUALIZE          0x400   /* Multipath equalizer: NI      */
 173#define RTM_F_PREFIX            0x800   /* Prefix addresses             */
 174
 175/* Reserved table identifiers */
 176
 177enum rt_class_t
 178{
 179        RT_TABLE_UNSPEC=0,
 180/* User defined values */
 181        RT_TABLE_DEFAULT=253,
 182        RT_TABLE_MAIN=254,
 183        RT_TABLE_LOCAL=255,
 184        __RT_TABLE_MAX
 185};
 186#define RT_TABLE_MAX (__RT_TABLE_MAX - 1)
 187
 188
 189
 190/* Routing message attributes */
 191
 192enum rtattr_type_t
 193{
 194        RTA_UNSPEC,
 195        RTA_DST,
 196        RTA_SRC,
 197        RTA_IIF,
 198        RTA_OIF,
 199        RTA_GATEWAY,
 200        RTA_PRIORITY,
 201        RTA_PREFSRC,
 202        RTA_METRICS,
 203        RTA_MULTIPATH,
 204        RTA_PROTOINFO,
 205        RTA_FLOW,
 206        RTA_CACHEINFO,
 207        __RTA_MAX
 208};
 209
 210#define RTA_MAX (__RTA_MAX - 1)
 211
 212#define RTM_RTA(r)  ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct rtmsg))))
 213#define RTM_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct rtmsg))
 214
 215/* RTM_MULTIPATH --- array of struct rtnexthop.
 216 *
 217 * "struct rtnexthop" describes all necessary nexthop information,
 218 * i.e. parameters of path to a destination via this nexthop.
 219 *
 220 * At the moment it is impossible to set different prefsrc, mtu, window
 221 * and rtt for different paths from multipath.
 222 */
 223
 224struct rtnexthop
 225{
 226        unsigned short          rtnh_len;
 227        unsigned char           rtnh_flags;
 228        unsigned char           rtnh_hops;
 229        int                     rtnh_ifindex;
 230};
 231
 232/* rtnh_flags */
 233
 234#define RTNH_F_DEAD             1       /* Nexthop is dead (used by multipath)  */
 235#define RTNH_F_PERVASIVE        2       /* Do recursive gateway lookup  */
 236#define RTNH_F_ONLINK           4       /* Gateway is forced on link    */
 237
 238/* Macros to handle hexthops */
 239
 240#define RTNH_ALIGNTO    4
 241#define RTNH_ALIGN(len) ( ((len)+RTNH_ALIGNTO-1) & ~(RTNH_ALIGNTO-1) )
 242#define RTNH_OK(rtnh,len) ((rtnh)->rtnh_len >= sizeof(struct rtnexthop) && \
 243                           ((int)(rtnh)->rtnh_len) <= (len))
 244#define RTNH_NEXT(rtnh) ((struct rtnexthop*)(((char*)(rtnh)) + RTNH_ALIGN((rtnh)->rtnh_len)))
 245#define RTNH_LENGTH(len) (RTNH_ALIGN(sizeof(struct rtnexthop)) + (len))
 246#define RTNH_SPACE(len) RTNH_ALIGN(RTNH_LENGTH(len))
 247#define RTNH_DATA(rtnh)   ((struct rtattr*)(((char*)(rtnh)) + RTNH_LENGTH(0)))
 248
 249/* RTM_CACHEINFO */
 250
 251struct rta_cacheinfo
 252{
 253        __u32   rta_clntref;
 254        __u32   rta_lastuse;
 255        __s32   rta_expires;
 256        __u32   rta_error;
 257        __u32   rta_used;
 258
 259#define RTNETLINK_HAVE_PEERINFO 1
 260        __u32   rta_id;
 261        __u32   rta_ts;
 262        __u32   rta_tsage;
 263};
 264
 265/* RTM_METRICS --- array of struct rtattr with types of RTAX_* */
 266
 267enum
 268{
 269        RTAX_UNSPEC,
 270#define RTAX_UNSPEC RTAX_UNSPEC
 271        RTAX_LOCK,
 272#define RTAX_LOCK RTAX_LOCK
 273        RTAX_MTU,
 274#define RTAX_MTU RTAX_MTU
 275        RTAX_WINDOW,
 276#define RTAX_WINDOW RTAX_WINDOW
 277        RTAX_RTT,
 278#define RTAX_RTT RTAX_RTT
 279        RTAX_RTTVAR,
 280#define RTAX_RTTVAR RTAX_RTTVAR
 281        RTAX_SSTHRESH,
 282#define RTAX_SSTHRESH RTAX_SSTHRESH
 283        RTAX_CWND,
 284#define RTAX_CWND RTAX_CWND
 285        RTAX_ADVMSS,
 286#define RTAX_ADVMSS RTAX_ADVMSS
 287        RTAX_REORDERING,
 288#define RTAX_REORDERING RTAX_REORDERING
 289        __RTAX_MAX
 290};
 291
 292#define RTAX_MAX (__RTAX_MAX - 1)
 293
 294
 295
 296/*********************************************************
 297 *              Interface address.
 298 ****/
 299
 300struct ifaddrmsg
 301{
 302        unsigned char   ifa_family;
 303        unsigned char   ifa_prefixlen;  /* The prefix length            */
 304        unsigned char   ifa_flags;      /* Flags                        */
 305        unsigned char   ifa_scope;      /* See above                    */
 306        int             ifa_index;      /* Link index                   */
 307};
 308
 309enum
 310{
 311        IFA_UNSPEC,
 312        IFA_ADDRESS,
 313        IFA_LOCAL,
 314        IFA_LABEL,
 315        IFA_BROADCAST,
 316        IFA_ANYCAST,
 317        IFA_CACHEINFO,
 318        __IFA_MAX
 319};
 320
 321#define IFA_MAX (__IFA_MAX - 1)
 322
 323/* ifa_flags */
 324
 325#define IFA_F_SECONDARY         0x01
 326
 327#define IFA_F_DEPRECATED        0x20
 328#define IFA_F_TENTATIVE         0x40
 329#define IFA_F_PERMANENT         0x80
 330
 331struct ifa_cacheinfo
 332{
 333        __s32   ifa_prefered;
 334        __s32   ifa_valid;
 335};
 336
 337
 338#define IFA_RTA(r)  ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ifaddrmsg))))
 339#define IFA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ifaddrmsg))
 340
 341/*
 342   Important comment:
 343   IFA_ADDRESS is prefix address, rather than local interface address.
 344   It makes no difference for normally configured broadcast interfaces,
 345   but for point-to-point IFA_ADDRESS is DESTINATION address,
 346   local address is supplied in IFA_LOCAL attribute.
 347 */
 348
 349/**************************************************************
 350 *              Neighbour discovery.
 351 ****/
 352
 353struct ndmsg
 354{
 355        unsigned char   ndm_family;
 356        unsigned char   ndm_pad1;
 357        unsigned short  ndm_pad2;
 358        int             ndm_ifindex;    /* Link index                   */
 359        __u16           ndm_state;
 360        __u8            ndm_flags;
 361        __u8            ndm_type;
 362};
 363
 364enum
 365{
 366        NDA_UNSPEC,
 367        NDA_DST,
 368        NDA_LLADDR,
 369        NDA_CACHEINFO,
 370        __NDA_MAX
 371};
 372
 373#define NDA_MAX (__NDA_MAX - 1)
 374
 375#define NDA_RTA(r)  ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ndmsg))))
 376#define NDA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ndmsg))
 377
 378/*
 379 *      Neighbor Cache Entry Flags
 380 */
 381
 382#define NTF_PROXY       0x08    /* == ATF_PUBL */
 383#define NTF_ROUTER      0x80
 384
 385/*
 386 *      Neighbor Cache Entry States.
 387 */
 388
 389#define NUD_INCOMPLETE  0x01
 390#define NUD_REACHABLE   0x02
 391#define NUD_STALE       0x04
 392#define NUD_DELAY       0x08
 393#define NUD_PROBE       0x10
 394#define NUD_FAILED      0x20
 395
 396/* Dummy states */
 397#define NUD_NOARP       0x40
 398#define NUD_PERMANENT   0x80
 399#define NUD_NONE        0x00
 400
 401
 402struct nda_cacheinfo
 403{
 404        __u32           ndm_confirmed;
 405        __u32           ndm_used;
 406        __u32           ndm_updated;
 407        __u32           ndm_refcnt;
 408};
 409
 410/****
 411 *              General form of address family dependent message.
 412 ****/
 413
 414struct rtgenmsg
 415{
 416        unsigned char           rtgen_family;
 417};
 418
 419/*****************************************************************
 420 *              Link layer specific messages.
 421 ****/
 422
 423/* struct ifinfomsg
 424 * passes link level specific information, not dependent
 425 * on network protocol.
 426 */
 427
 428struct ifinfomsg
 429{
 430        unsigned char   ifi_family;
 431        unsigned char   __ifi_pad;
 432        unsigned short  ifi_type;               /* ARPHRD_* */
 433        int             ifi_index;              /* Link index   */
 434        unsigned        ifi_flags;              /* IFF_* flags  */
 435        unsigned        ifi_change;             /* IFF_* change mask */
 436};
 437
 438enum
 439{
 440        IFLA_UNSPEC,
 441        IFLA_ADDRESS,
 442        IFLA_BROADCAST,
 443        IFLA_IFNAME,
 444        IFLA_MTU,
 445        IFLA_LINK,
 446        IFLA_QDISC,
 447        IFLA_STATS,
 448        IFLA_COST,
 449#define IFLA_COST IFLA_COST
 450        IFLA_PRIORITY,
 451#define IFLA_PRIORITY IFLA_PRIORITY
 452        IFLA_MASTER,
 453#define IFLA_MASTER IFLA_MASTER
 454        IFLA_WIRELESS,          /* Wireless Extension event - see wireless.h */
 455#define IFLA_WIRELESS IFLA_WIRELESS
 456        IFLA_PROTINFO,          /* Protocol specific information for a link */
 457#define IFLA_PROTINFO IFLA_PROTINFO
 458        __IFLA_MAX
 459};
 460
 461
 462#define IFLA_MAX (__IFLA_MAX - 1)
 463
 464#define IFLA_RTA(r)  ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ifinfomsg))))
 465#define IFLA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ifinfomsg))
 466
 467/* ifi_flags.
 468
 469   IFF_* flags.
 470
 471   The only change is:
 472   IFF_LOOPBACK, IFF_BROADCAST and IFF_POINTOPOINT are
 473   more not changeable by user. They describe link media
 474   characteristics and set by device driver.
 475
 476   Comments:
 477   - Combination IFF_BROADCAST|IFF_POINTOPOINT is invalid
 478   - If neither of these three flags are set;
 479     the interface is NBMA.
 480
 481   - IFF_MULTICAST does not mean anything special:
 482   multicasts can be used on all not-NBMA links.
 483   IFF_MULTICAST means that this media uses special encapsulation
 484   for multicast frames. Apparently, all IFF_POINTOPOINT and
 485   IFF_BROADCAST devices are able to use multicasts too.
 486 */
 487
 488/* IFLA_LINK.
 489   For usual devices it is equal ifi_index.
 490   If it is a "virtual interface" (f.e. tunnel), ifi_link
 491   can point to real physical interface (f.e. for bandwidth calculations),
 492   or maybe 0, what means, that real media is unknown (usual
 493   for IPIP tunnels, when route to endpoint is allowed to change)
 494 */
 495
 496/* Subtype attributes for IFLA_PROTINFO */
 497enum
 498{
 499        IFLA_INET6_UNSPEC,
 500        IFLA_INET6_FLAGS,       /* link flags                   */
 501        IFLA_INET6_CONF,        /* sysctl parameters            */
 502        IFLA_INET6_STATS,       /* statistics                   */
 503        IFLA_INET6_MCAST,       /* MC things. What of them?     */
 504        __IFLA_INET6_MAX
 505};
 506
 507#define IFLA_INET6_MAX  (__IFLA_INET6_MAX - 1)
 508
 509/*****************************************************************
 510 *              Traffic control messages.
 511 ****/
 512
 513struct tcmsg
 514{
 515        unsigned char   tcm_family;
 516        unsigned char   tcm__pad1;
 517        unsigned short  tcm__pad2;
 518        int             tcm_ifindex;
 519        __u32           tcm_handle;
 520        __u32           tcm_parent;
 521        __u32           tcm_info;
 522};
 523
 524enum
 525{
 526        TCA_UNSPEC,
 527        TCA_KIND,
 528        TCA_OPTIONS,
 529        TCA_STATS,
 530        TCA_XSTATS,
 531        TCA_RATE,
 532        __TCA_MAX
 533};
 534
 535#define TCA_MAX (__TCA_MAX - 1)
 536
 537#define TCA_RTA(r)  ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct tcmsg))))
 538#define TCA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct tcmsg))
 539
 540
 541/* SUMMARY: maximal rtattr understood by kernel */
 542
 543#define RTATTR_MAX              RTA_MAX
 544
 545/* RTnetlink multicast groups */
 546
 547#define RTMGRP_LINK             1
 548#define RTMGRP_NOTIFY           2
 549#define RTMGRP_NEIGH            4
 550#define RTMGRP_TC               8
 551
 552#define RTMGRP_IPV4_IFADDR      0x10
 553#define RTMGRP_IPV4_MROUTE      0x20
 554#define RTMGRP_IPV4_ROUTE       0x40
 555
 556#define RTMGRP_IPV6_IFADDR      0x100
 557#define RTMGRP_IPV6_MROUTE      0x200
 558#define RTMGRP_IPV6_ROUTE       0x400
 559
 560#define RTMGRP_DECnet_IFADDR    0x1000
 561#define RTMGRP_DECnet_ROUTE     0x4000
 562
 563/* End of information exported to user level */
 564
 565#ifdef __KERNEL__
 566
 567#include <linux/config.h>
 568
 569static __inline__ int rtattr_strcmp(struct rtattr *rta, char *str)
 570{
 571        int len = strlen(str) + 1;
 572        return len > rta->rta_len || memcmp(RTA_DATA(rta), str, len);
 573}
 574
 575extern int rtattr_parse(struct rtattr *tb[], int maxattr, struct rtattr *rta, int len);
 576
 577extern struct sock *rtnl;
 578
 579struct rtnetlink_link
 580{
 581        int (*doit)(struct sk_buff *, struct nlmsghdr*, void *attr);
 582        int (*dumpit)(struct sk_buff *, struct netlink_callback *cb);
 583};
 584
 585extern struct rtnetlink_link * rtnetlink_links[NPROTO];
 586extern int rtnetlink_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb);
 587extern int rtnetlink_send(struct sk_buff *skb, u32 pid, u32 group, int echo);
 588extern int rtnetlink_put_metrics(struct sk_buff *skb, unsigned *metrics);
 589
 590extern void __rta_fill(struct sk_buff *skb, int attrtype, int attrlen, const void *data);
 591
 592#define RTA_PUT(skb, attrtype, attrlen, data) \
 593({ if (skb_tailroom(skb) < (int)RTA_SPACE(attrlen)) goto rtattr_failure; \
 594   __rta_fill(skb, attrtype, attrlen, data); })
 595
 596extern void rtmsg_ifinfo(int type, struct net_device *dev, unsigned change);
 597
 598extern struct semaphore rtnl_sem;
 599
 600#define rtnl_exlock()           do { } while(0)
 601#define rtnl_exunlock()         do { } while(0)
 602#define rtnl_exlock_nowait()    (0)
 603
 604#define rtnl_shlock()           down(&rtnl_sem)
 605#define rtnl_shlock_nowait()    down_trylock(&rtnl_sem)
 606
 607#define rtnl_shunlock() do { up(&rtnl_sem); \
 608                             if (rtnl && rtnl->receive_queue.qlen) \
 609                                     rtnl->data_ready(rtnl, 0); \
 610                        } while(0)
 611
 612extern void rtnl_lock(void);
 613extern void rtnl_unlock(void);
 614extern void rtnetlink_init(void);
 615
 616#define ASSERT_RTNL() do { if (down_trylock(&rtnl_sem) == 0)  { up(&rtnl_sem); \
 617printk("RTNL: assertion failed at " __FILE__ "(%d)\n", __LINE__); } \
 618                   } while(0)
 619#define BUG_TRAP(x) if (!(x)) { printk("KERNEL: assertion (" #x ") failed at " __FILE__ "(%d)\n", __LINE__); }
 620
 621
 622#endif /* __KERNEL__ */
 623
 624
 625#endif  /* __LINUX_RTNETLINK_H */
 626
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.