1*53ee8cc1Swenshuai.xi #ifndef __LINUX_RTNETLINK_H 2*53ee8cc1Swenshuai.xi #define __LINUX_RTNETLINK_H 3*53ee8cc1Swenshuai.xi 4*53ee8cc1Swenshuai.xi #include <linux/netlink.h> 5*53ee8cc1Swenshuai.xi #include <linux/if_link.h> 6*53ee8cc1Swenshuai.xi #include <linux/if_addr.h> 7*53ee8cc1Swenshuai.xi #include <linux/neighbour.h> 8*53ee8cc1Swenshuai.xi 9*53ee8cc1Swenshuai.xi /**** 10*53ee8cc1Swenshuai.xi * Routing/neighbour discovery messages. 11*53ee8cc1Swenshuai.xi ****/ 12*53ee8cc1Swenshuai.xi 13*53ee8cc1Swenshuai.xi /* Types of messages */ 14*53ee8cc1Swenshuai.xi 15*53ee8cc1Swenshuai.xi enum { 16*53ee8cc1Swenshuai.xi RTM_BASE = 16, 17*53ee8cc1Swenshuai.xi #define RTM_BASE RTM_BASE 18*53ee8cc1Swenshuai.xi 19*53ee8cc1Swenshuai.xi RTM_NEWLINK = 16, 20*53ee8cc1Swenshuai.xi #define RTM_NEWLINK RTM_NEWLINK 21*53ee8cc1Swenshuai.xi RTM_DELLINK, 22*53ee8cc1Swenshuai.xi #define RTM_DELLINK RTM_DELLINK 23*53ee8cc1Swenshuai.xi RTM_GETLINK, 24*53ee8cc1Swenshuai.xi #define RTM_GETLINK RTM_GETLINK 25*53ee8cc1Swenshuai.xi RTM_SETLINK, 26*53ee8cc1Swenshuai.xi #define RTM_SETLINK RTM_SETLINK 27*53ee8cc1Swenshuai.xi 28*53ee8cc1Swenshuai.xi RTM_NEWADDR = 20, 29*53ee8cc1Swenshuai.xi #define RTM_NEWADDR RTM_NEWADDR 30*53ee8cc1Swenshuai.xi RTM_DELADDR, 31*53ee8cc1Swenshuai.xi #define RTM_DELADDR RTM_DELADDR 32*53ee8cc1Swenshuai.xi RTM_GETADDR, 33*53ee8cc1Swenshuai.xi #define RTM_GETADDR RTM_GETADDR 34*53ee8cc1Swenshuai.xi 35*53ee8cc1Swenshuai.xi RTM_NEWROUTE = 24, 36*53ee8cc1Swenshuai.xi #define RTM_NEWROUTE RTM_NEWROUTE 37*53ee8cc1Swenshuai.xi RTM_DELROUTE, 38*53ee8cc1Swenshuai.xi #define RTM_DELROUTE RTM_DELROUTE 39*53ee8cc1Swenshuai.xi RTM_GETROUTE, 40*53ee8cc1Swenshuai.xi #define RTM_GETROUTE RTM_GETROUTE 41*53ee8cc1Swenshuai.xi 42*53ee8cc1Swenshuai.xi RTM_NEWNEIGH = 28, 43*53ee8cc1Swenshuai.xi #define RTM_NEWNEIGH RTM_NEWNEIGH 44*53ee8cc1Swenshuai.xi RTM_DELNEIGH, 45*53ee8cc1Swenshuai.xi #define RTM_DELNEIGH RTM_DELNEIGH 46*53ee8cc1Swenshuai.xi RTM_GETNEIGH, 47*53ee8cc1Swenshuai.xi #define RTM_GETNEIGH RTM_GETNEIGH 48*53ee8cc1Swenshuai.xi 49*53ee8cc1Swenshuai.xi RTM_NEWRULE = 32, 50*53ee8cc1Swenshuai.xi #define RTM_NEWRULE RTM_NEWRULE 51*53ee8cc1Swenshuai.xi RTM_DELRULE, 52*53ee8cc1Swenshuai.xi #define RTM_DELRULE RTM_DELRULE 53*53ee8cc1Swenshuai.xi RTM_GETRULE, 54*53ee8cc1Swenshuai.xi #define RTM_GETRULE RTM_GETRULE 55*53ee8cc1Swenshuai.xi 56*53ee8cc1Swenshuai.xi RTM_NEWQDISC = 36, 57*53ee8cc1Swenshuai.xi #define RTM_NEWQDISC RTM_NEWQDISC 58*53ee8cc1Swenshuai.xi RTM_DELQDISC, 59*53ee8cc1Swenshuai.xi #define RTM_DELQDISC RTM_DELQDISC 60*53ee8cc1Swenshuai.xi RTM_GETQDISC, 61*53ee8cc1Swenshuai.xi #define RTM_GETQDISC RTM_GETQDISC 62*53ee8cc1Swenshuai.xi 63*53ee8cc1Swenshuai.xi RTM_NEWTCLASS = 40, 64*53ee8cc1Swenshuai.xi #define RTM_NEWTCLASS RTM_NEWTCLASS 65*53ee8cc1Swenshuai.xi RTM_DELTCLASS, 66*53ee8cc1Swenshuai.xi #define RTM_DELTCLASS RTM_DELTCLASS 67*53ee8cc1Swenshuai.xi RTM_GETTCLASS, 68*53ee8cc1Swenshuai.xi #define RTM_GETTCLASS RTM_GETTCLASS 69*53ee8cc1Swenshuai.xi 70*53ee8cc1Swenshuai.xi RTM_NEWTFILTER = 44, 71*53ee8cc1Swenshuai.xi #define RTM_NEWTFILTER RTM_NEWTFILTER 72*53ee8cc1Swenshuai.xi RTM_DELTFILTER, 73*53ee8cc1Swenshuai.xi #define RTM_DELTFILTER RTM_DELTFILTER 74*53ee8cc1Swenshuai.xi RTM_GETTFILTER, 75*53ee8cc1Swenshuai.xi #define RTM_GETTFILTER RTM_GETTFILTER 76*53ee8cc1Swenshuai.xi 77*53ee8cc1Swenshuai.xi RTM_NEWACTION = 48, 78*53ee8cc1Swenshuai.xi #define RTM_NEWACTION RTM_NEWACTION 79*53ee8cc1Swenshuai.xi RTM_DELACTION, 80*53ee8cc1Swenshuai.xi #define RTM_DELACTION RTM_DELACTION 81*53ee8cc1Swenshuai.xi RTM_GETACTION, 82*53ee8cc1Swenshuai.xi #define RTM_GETACTION RTM_GETACTION 83*53ee8cc1Swenshuai.xi 84*53ee8cc1Swenshuai.xi RTM_NEWPREFIX = 52, 85*53ee8cc1Swenshuai.xi #define RTM_NEWPREFIX RTM_NEWPREFIX 86*53ee8cc1Swenshuai.xi 87*53ee8cc1Swenshuai.xi RTM_GETMULTICAST = 58, 88*53ee8cc1Swenshuai.xi #define RTM_GETMULTICAST RTM_GETMULTICAST 89*53ee8cc1Swenshuai.xi 90*53ee8cc1Swenshuai.xi RTM_GETANYCAST = 62, 91*53ee8cc1Swenshuai.xi #define RTM_GETANYCAST RTM_GETANYCAST 92*53ee8cc1Swenshuai.xi 93*53ee8cc1Swenshuai.xi RTM_NEWNEIGHTBL = 64, 94*53ee8cc1Swenshuai.xi #define RTM_NEWNEIGHTBL RTM_NEWNEIGHTBL 95*53ee8cc1Swenshuai.xi RTM_GETNEIGHTBL = 66, 96*53ee8cc1Swenshuai.xi #define RTM_GETNEIGHTBL RTM_GETNEIGHTBL 97*53ee8cc1Swenshuai.xi RTM_SETNEIGHTBL, 98*53ee8cc1Swenshuai.xi #define RTM_SETNEIGHTBL RTM_SETNEIGHTBL 99*53ee8cc1Swenshuai.xi 100*53ee8cc1Swenshuai.xi RTM_NEWNDUSEROPT = 68, 101*53ee8cc1Swenshuai.xi #define RTM_NEWNDUSEROPT RTM_NEWNDUSEROPT 102*53ee8cc1Swenshuai.xi 103*53ee8cc1Swenshuai.xi RTM_NEWADDRLABEL = 72, 104*53ee8cc1Swenshuai.xi #define RTM_NEWADDRLABEL RTM_NEWADDRLABEL 105*53ee8cc1Swenshuai.xi RTM_DELADDRLABEL, 106*53ee8cc1Swenshuai.xi #define RTM_NEWADDRLABEL RTM_NEWADDRLABEL 107*53ee8cc1Swenshuai.xi RTM_GETADDRLABEL, 108*53ee8cc1Swenshuai.xi #define RTM_GETADDRLABEL RTM_GETADDRLABEL 109*53ee8cc1Swenshuai.xi 110*53ee8cc1Swenshuai.xi __RTM_MAX, 111*53ee8cc1Swenshuai.xi #define RTM_MAX (((__RTM_MAX + 3) & ~3) - 1) 112*53ee8cc1Swenshuai.xi }; 113*53ee8cc1Swenshuai.xi 114*53ee8cc1Swenshuai.xi #define RTM_NR_MSGTYPES (RTM_MAX + 1 - RTM_BASE) 115*53ee8cc1Swenshuai.xi #define RTM_NR_FAMILIES (RTM_NR_MSGTYPES >> 2) 116*53ee8cc1Swenshuai.xi #define RTM_FAM(cmd) (((cmd) - RTM_BASE) >> 2) 117*53ee8cc1Swenshuai.xi 118*53ee8cc1Swenshuai.xi /* 119*53ee8cc1Swenshuai.xi Generic structure for encapsulation of optional route information. 120*53ee8cc1Swenshuai.xi It is reminiscent of sockaddr, but with sa_family replaced 121*53ee8cc1Swenshuai.xi with attribute type. 122*53ee8cc1Swenshuai.xi */ 123*53ee8cc1Swenshuai.xi 124*53ee8cc1Swenshuai.xi struct rtattr 125*53ee8cc1Swenshuai.xi { 126*53ee8cc1Swenshuai.xi unsigned short rta_len; 127*53ee8cc1Swenshuai.xi unsigned short rta_type; 128*53ee8cc1Swenshuai.xi }; 129*53ee8cc1Swenshuai.xi 130*53ee8cc1Swenshuai.xi /* Macros to handle rtattributes */ 131*53ee8cc1Swenshuai.xi 132*53ee8cc1Swenshuai.xi #define RTA_ALIGNTO 4 133*53ee8cc1Swenshuai.xi #define RTA_ALIGN(len) ( ((len)+RTA_ALIGNTO-1) & ~(RTA_ALIGNTO-1) ) 134*53ee8cc1Swenshuai.xi #define RTA_OK(rta,len) ((len) >= (int)sizeof(struct rtattr) && \ 135*53ee8cc1Swenshuai.xi (rta)->rta_len >= sizeof(struct rtattr) && \ 136*53ee8cc1Swenshuai.xi (rta)->rta_len <= (len)) 137*53ee8cc1Swenshuai.xi #define RTA_NEXT(rta,attrlen) ((attrlen) -= RTA_ALIGN((rta)->rta_len), \ 138*53ee8cc1Swenshuai.xi (struct rtattr*)(((char*)(rta)) + RTA_ALIGN((rta)->rta_len))) 139*53ee8cc1Swenshuai.xi #define RTA_LENGTH(len) (RTA_ALIGN(sizeof(struct rtattr)) + (len)) 140*53ee8cc1Swenshuai.xi #define RTA_SPACE(len) RTA_ALIGN(RTA_LENGTH(len)) 141*53ee8cc1Swenshuai.xi #define RTA_DATA(rta) ((void*)(((char*)(rta)) + RTA_LENGTH(0))) 142*53ee8cc1Swenshuai.xi #define RTA_PAYLOAD(rta) ((int)((rta)->rta_len) - RTA_LENGTH(0)) 143*53ee8cc1Swenshuai.xi 144*53ee8cc1Swenshuai.xi 145*53ee8cc1Swenshuai.xi 146*53ee8cc1Swenshuai.xi 147*53ee8cc1Swenshuai.xi /****************************************************************************** 148*53ee8cc1Swenshuai.xi * Definitions used in routing table administration. 149*53ee8cc1Swenshuai.xi ****/ 150*53ee8cc1Swenshuai.xi 151*53ee8cc1Swenshuai.xi struct rtmsg 152*53ee8cc1Swenshuai.xi { 153*53ee8cc1Swenshuai.xi unsigned char rtm_family; 154*53ee8cc1Swenshuai.xi unsigned char rtm_dst_len; 155*53ee8cc1Swenshuai.xi unsigned char rtm_src_len; 156*53ee8cc1Swenshuai.xi unsigned char rtm_tos; 157*53ee8cc1Swenshuai.xi 158*53ee8cc1Swenshuai.xi unsigned char rtm_table; /* Routing table id */ 159*53ee8cc1Swenshuai.xi unsigned char rtm_protocol; /* Routing protocol; see below */ 160*53ee8cc1Swenshuai.xi unsigned char rtm_scope; /* See below */ 161*53ee8cc1Swenshuai.xi unsigned char rtm_type; /* See below */ 162*53ee8cc1Swenshuai.xi 163*53ee8cc1Swenshuai.xi unsigned rtm_flags; 164*53ee8cc1Swenshuai.xi }; 165*53ee8cc1Swenshuai.xi 166*53ee8cc1Swenshuai.xi /* rtm_type */ 167*53ee8cc1Swenshuai.xi 168*53ee8cc1Swenshuai.xi enum 169*53ee8cc1Swenshuai.xi { 170*53ee8cc1Swenshuai.xi RTN_UNSPEC, 171*53ee8cc1Swenshuai.xi RTN_UNICAST, /* Gateway or direct route */ 172*53ee8cc1Swenshuai.xi RTN_LOCAL, /* Accept locally */ 173*53ee8cc1Swenshuai.xi RTN_BROADCAST, /* Accept locally as broadcast, 174*53ee8cc1Swenshuai.xi send as broadcast */ 175*53ee8cc1Swenshuai.xi RTN_ANYCAST, /* Accept locally as broadcast, 176*53ee8cc1Swenshuai.xi but send as unicast */ 177*53ee8cc1Swenshuai.xi RTN_MULTICAST, /* Multicast route */ 178*53ee8cc1Swenshuai.xi RTN_BLACKHOLE, /* Drop */ 179*53ee8cc1Swenshuai.xi RTN_UNREACHABLE, /* Destination is unreachable */ 180*53ee8cc1Swenshuai.xi RTN_PROHIBIT, /* Administratively prohibited */ 181*53ee8cc1Swenshuai.xi RTN_THROW, /* Not in this table */ 182*53ee8cc1Swenshuai.xi RTN_NAT, /* Translate this address */ 183*53ee8cc1Swenshuai.xi RTN_XRESOLVE, /* Use external resolver */ 184*53ee8cc1Swenshuai.xi __RTN_MAX 185*53ee8cc1Swenshuai.xi }; 186*53ee8cc1Swenshuai.xi 187*53ee8cc1Swenshuai.xi #define RTN_MAX (__RTN_MAX - 1) 188*53ee8cc1Swenshuai.xi 189*53ee8cc1Swenshuai.xi 190*53ee8cc1Swenshuai.xi /* rtm_protocol */ 191*53ee8cc1Swenshuai.xi 192*53ee8cc1Swenshuai.xi #define RTPROT_UNSPEC 0 193*53ee8cc1Swenshuai.xi #define RTPROT_REDIRECT 1 /* Route installed by ICMP redirects; 194*53ee8cc1Swenshuai.xi not used by current IPv4 */ 195*53ee8cc1Swenshuai.xi #define RTPROT_KERNEL 2 /* Route installed by kernel */ 196*53ee8cc1Swenshuai.xi #define RTPROT_BOOT 3 /* Route installed during boot */ 197*53ee8cc1Swenshuai.xi #define RTPROT_STATIC 4 /* Route installed by administrator */ 198*53ee8cc1Swenshuai.xi 199*53ee8cc1Swenshuai.xi /* Values of protocol >= RTPROT_STATIC are not interpreted by kernel; 200*53ee8cc1Swenshuai.xi they are just passed from user and back as is. 201*53ee8cc1Swenshuai.xi It will be used by hypothetical multiple routing daemons. 202*53ee8cc1Swenshuai.xi Note that protocol values should be standardized in order to 203*53ee8cc1Swenshuai.xi avoid conflicts. 204*53ee8cc1Swenshuai.xi */ 205*53ee8cc1Swenshuai.xi 206*53ee8cc1Swenshuai.xi #define RTPROT_GATED 8 /* Apparently, GateD */ 207*53ee8cc1Swenshuai.xi #define RTPROT_RA 9 /* RDISC/ND router advertisements */ 208*53ee8cc1Swenshuai.xi #define RTPROT_MRT 10 /* Merit MRT */ 209*53ee8cc1Swenshuai.xi #define RTPROT_ZEBRA 11 /* Zebra */ 210*53ee8cc1Swenshuai.xi #define RTPROT_BIRD 12 /* BIRD */ 211*53ee8cc1Swenshuai.xi #define RTPROT_DNROUTED 13 /* DECnet routing daemon */ 212*53ee8cc1Swenshuai.xi #define RTPROT_XORP 14 /* XORP */ 213*53ee8cc1Swenshuai.xi #define RTPROT_NTK 15 /* Netsukuku */ 214*53ee8cc1Swenshuai.xi 215*53ee8cc1Swenshuai.xi /* rtm_scope 216*53ee8cc1Swenshuai.xi 217*53ee8cc1Swenshuai.xi Really it is not scope, but sort of distance to the destination. 218*53ee8cc1Swenshuai.xi NOWHERE are reserved for not existing destinations, HOST is our 219*53ee8cc1Swenshuai.xi local addresses, LINK are destinations, located on directly attached 220*53ee8cc1Swenshuai.xi link and UNIVERSE is everywhere in the Universe. 221*53ee8cc1Swenshuai.xi 222*53ee8cc1Swenshuai.xi Intermediate values are also possible f.e. interior routes 223*53ee8cc1Swenshuai.xi could be assigned a value between UNIVERSE and LINK. 224*53ee8cc1Swenshuai.xi */ 225*53ee8cc1Swenshuai.xi 226*53ee8cc1Swenshuai.xi enum rt_scope_t 227*53ee8cc1Swenshuai.xi { 228*53ee8cc1Swenshuai.xi RT_SCOPE_UNIVERSE=0, 229*53ee8cc1Swenshuai.xi /* User defined values */ 230*53ee8cc1Swenshuai.xi RT_SCOPE_SITE=200, 231*53ee8cc1Swenshuai.xi RT_SCOPE_LINK=253, 232*53ee8cc1Swenshuai.xi RT_SCOPE_HOST=254, 233*53ee8cc1Swenshuai.xi RT_SCOPE_NOWHERE=255 234*53ee8cc1Swenshuai.xi }; 235*53ee8cc1Swenshuai.xi 236*53ee8cc1Swenshuai.xi /* rtm_flags */ 237*53ee8cc1Swenshuai.xi 238*53ee8cc1Swenshuai.xi #define RTM_F_NOTIFY 0x100 /* Notify user of route change */ 239*53ee8cc1Swenshuai.xi #define RTM_F_CLONED 0x200 /* This route is cloned */ 240*53ee8cc1Swenshuai.xi #define RTM_F_EQUALIZE 0x400 /* Multipath equalizer: NI */ 241*53ee8cc1Swenshuai.xi #define RTM_F_PREFIX 0x800 /* Prefix addresses */ 242*53ee8cc1Swenshuai.xi 243*53ee8cc1Swenshuai.xi /* Reserved table identifiers */ 244*53ee8cc1Swenshuai.xi 245*53ee8cc1Swenshuai.xi enum rt_class_t 246*53ee8cc1Swenshuai.xi { 247*53ee8cc1Swenshuai.xi RT_TABLE_UNSPEC=0, 248*53ee8cc1Swenshuai.xi /* User defined values */ 249*53ee8cc1Swenshuai.xi RT_TABLE_COMPAT=252, 250*53ee8cc1Swenshuai.xi RT_TABLE_DEFAULT=253, 251*53ee8cc1Swenshuai.xi RT_TABLE_MAIN=254, 252*53ee8cc1Swenshuai.xi RT_TABLE_LOCAL=255, 253*53ee8cc1Swenshuai.xi RT_TABLE_MAX=0xFFFFFFFF 254*53ee8cc1Swenshuai.xi }; 255*53ee8cc1Swenshuai.xi 256*53ee8cc1Swenshuai.xi 257*53ee8cc1Swenshuai.xi /* Routing message attributes */ 258*53ee8cc1Swenshuai.xi 259*53ee8cc1Swenshuai.xi enum rtattr_type_t 260*53ee8cc1Swenshuai.xi { 261*53ee8cc1Swenshuai.xi RTA_UNSPEC, 262*53ee8cc1Swenshuai.xi RTA_DST, 263*53ee8cc1Swenshuai.xi RTA_SRC, 264*53ee8cc1Swenshuai.xi RTA_IIF, 265*53ee8cc1Swenshuai.xi RTA_OIF, 266*53ee8cc1Swenshuai.xi RTA_GATEWAY, 267*53ee8cc1Swenshuai.xi RTA_PRIORITY, 268*53ee8cc1Swenshuai.xi RTA_PREFSRC, 269*53ee8cc1Swenshuai.xi RTA_METRICS, 270*53ee8cc1Swenshuai.xi RTA_MULTIPATH, 271*53ee8cc1Swenshuai.xi RTA_PROTOINFO, /* no longer used */ 272*53ee8cc1Swenshuai.xi RTA_FLOW, 273*53ee8cc1Swenshuai.xi RTA_CACHEINFO, 274*53ee8cc1Swenshuai.xi RTA_SESSION, /* no longer used */ 275*53ee8cc1Swenshuai.xi RTA_MP_ALGO, /* no longer used */ 276*53ee8cc1Swenshuai.xi RTA_TABLE, 277*53ee8cc1Swenshuai.xi __RTA_MAX 278*53ee8cc1Swenshuai.xi }; 279*53ee8cc1Swenshuai.xi 280*53ee8cc1Swenshuai.xi #define RTA_MAX (__RTA_MAX - 1) 281*53ee8cc1Swenshuai.xi 282*53ee8cc1Swenshuai.xi #define RTM_RTA(r) ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct rtmsg)))) 283*53ee8cc1Swenshuai.xi #define RTM_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct rtmsg)) 284*53ee8cc1Swenshuai.xi 285*53ee8cc1Swenshuai.xi /* RTM_MULTIPATH --- array of struct rtnexthop. 286*53ee8cc1Swenshuai.xi * 287*53ee8cc1Swenshuai.xi * "struct rtnexthop" describes all necessary nexthop information, 288*53ee8cc1Swenshuai.xi * i.e. parameters of path to a destination via this nexthop. 289*53ee8cc1Swenshuai.xi * 290*53ee8cc1Swenshuai.xi * At the moment it is impossible to set different prefsrc, mtu, window 291*53ee8cc1Swenshuai.xi * and rtt for different paths from multipath. 292*53ee8cc1Swenshuai.xi */ 293*53ee8cc1Swenshuai.xi 294*53ee8cc1Swenshuai.xi struct rtnexthop 295*53ee8cc1Swenshuai.xi { 296*53ee8cc1Swenshuai.xi unsigned short rtnh_len; 297*53ee8cc1Swenshuai.xi unsigned char rtnh_flags; 298*53ee8cc1Swenshuai.xi unsigned char rtnh_hops; 299*53ee8cc1Swenshuai.xi int rtnh_ifindex; 300*53ee8cc1Swenshuai.xi }; 301*53ee8cc1Swenshuai.xi 302*53ee8cc1Swenshuai.xi /* rtnh_flags */ 303*53ee8cc1Swenshuai.xi 304*53ee8cc1Swenshuai.xi #define RTNH_F_DEAD 1 /* Nexthop is dead (used by multipath) */ 305*53ee8cc1Swenshuai.xi #define RTNH_F_PERVASIVE 2 /* Do recursive gateway lookup */ 306*53ee8cc1Swenshuai.xi #define RTNH_F_ONLINK 4 /* Gateway is forced on link */ 307*53ee8cc1Swenshuai.xi 308*53ee8cc1Swenshuai.xi /* Macros to handle hexthops */ 309*53ee8cc1Swenshuai.xi 310*53ee8cc1Swenshuai.xi #define RTNH_ALIGNTO 4 311*53ee8cc1Swenshuai.xi #define RTNH_ALIGN(len) ( ((len)+RTNH_ALIGNTO-1) & ~(RTNH_ALIGNTO-1) ) 312*53ee8cc1Swenshuai.xi #define RTNH_OK(rtnh,len) ((rtnh)->rtnh_len >= sizeof(struct rtnexthop) && \ 313*53ee8cc1Swenshuai.xi ((int)(rtnh)->rtnh_len) <= (len)) 314*53ee8cc1Swenshuai.xi #define RTNH_NEXT(rtnh) ((struct rtnexthop*)(((char*)(rtnh)) + RTNH_ALIGN((rtnh)->rtnh_len))) 315*53ee8cc1Swenshuai.xi #define RTNH_LENGTH(len) (RTNH_ALIGN(sizeof(struct rtnexthop)) + (len)) 316*53ee8cc1Swenshuai.xi #define RTNH_SPACE(len) RTNH_ALIGN(RTNH_LENGTH(len)) 317*53ee8cc1Swenshuai.xi #define RTNH_DATA(rtnh) ((struct rtattr*)(((char*)(rtnh)) + RTNH_LENGTH(0))) 318*53ee8cc1Swenshuai.xi 319*53ee8cc1Swenshuai.xi /* RTM_CACHEINFO */ 320*53ee8cc1Swenshuai.xi 321*53ee8cc1Swenshuai.xi struct rta_cacheinfo 322*53ee8cc1Swenshuai.xi { 323*53ee8cc1Swenshuai.xi __u32 rta_clntref; 324*53ee8cc1Swenshuai.xi __u32 rta_lastuse; 325*53ee8cc1Swenshuai.xi __s32 rta_expires; 326*53ee8cc1Swenshuai.xi __u32 rta_error; 327*53ee8cc1Swenshuai.xi __u32 rta_used; 328*53ee8cc1Swenshuai.xi 329*53ee8cc1Swenshuai.xi #define RTNETLINK_HAVE_PEERINFO 1 330*53ee8cc1Swenshuai.xi __u32 rta_id; 331*53ee8cc1Swenshuai.xi __u32 rta_ts; 332*53ee8cc1Swenshuai.xi __u32 rta_tsage; 333*53ee8cc1Swenshuai.xi }; 334*53ee8cc1Swenshuai.xi 335*53ee8cc1Swenshuai.xi /* RTM_METRICS --- array of struct rtattr with types of RTAX_* */ 336*53ee8cc1Swenshuai.xi 337*53ee8cc1Swenshuai.xi enum 338*53ee8cc1Swenshuai.xi { 339*53ee8cc1Swenshuai.xi RTAX_UNSPEC, 340*53ee8cc1Swenshuai.xi #define RTAX_UNSPEC RTAX_UNSPEC 341*53ee8cc1Swenshuai.xi RTAX_LOCK, 342*53ee8cc1Swenshuai.xi #define RTAX_LOCK RTAX_LOCK 343*53ee8cc1Swenshuai.xi RTAX_MTU, 344*53ee8cc1Swenshuai.xi #define RTAX_MTU RTAX_MTU 345*53ee8cc1Swenshuai.xi RTAX_WINDOW, 346*53ee8cc1Swenshuai.xi #define RTAX_WINDOW RTAX_WINDOW 347*53ee8cc1Swenshuai.xi RTAX_RTT, 348*53ee8cc1Swenshuai.xi #define RTAX_RTT RTAX_RTT 349*53ee8cc1Swenshuai.xi RTAX_RTTVAR, 350*53ee8cc1Swenshuai.xi #define RTAX_RTTVAR RTAX_RTTVAR 351*53ee8cc1Swenshuai.xi RTAX_SSTHRESH, 352*53ee8cc1Swenshuai.xi #define RTAX_SSTHRESH RTAX_SSTHRESH 353*53ee8cc1Swenshuai.xi RTAX_CWND, 354*53ee8cc1Swenshuai.xi #define RTAX_CWND RTAX_CWND 355*53ee8cc1Swenshuai.xi RTAX_ADVMSS, 356*53ee8cc1Swenshuai.xi #define RTAX_ADVMSS RTAX_ADVMSS 357*53ee8cc1Swenshuai.xi RTAX_REORDERING, 358*53ee8cc1Swenshuai.xi #define RTAX_REORDERING RTAX_REORDERING 359*53ee8cc1Swenshuai.xi RTAX_HOPLIMIT, 360*53ee8cc1Swenshuai.xi #define RTAX_HOPLIMIT RTAX_HOPLIMIT 361*53ee8cc1Swenshuai.xi RTAX_INITCWND, 362*53ee8cc1Swenshuai.xi #define RTAX_INITCWND RTAX_INITCWND 363*53ee8cc1Swenshuai.xi RTAX_FEATURES, 364*53ee8cc1Swenshuai.xi #define RTAX_FEATURES RTAX_FEATURES 365*53ee8cc1Swenshuai.xi RTAX_RTO_MIN, 366*53ee8cc1Swenshuai.xi #define RTAX_RTO_MIN RTAX_RTO_MIN 367*53ee8cc1Swenshuai.xi __RTAX_MAX 368*53ee8cc1Swenshuai.xi }; 369*53ee8cc1Swenshuai.xi 370*53ee8cc1Swenshuai.xi #define RTAX_MAX (__RTAX_MAX - 1) 371*53ee8cc1Swenshuai.xi 372*53ee8cc1Swenshuai.xi #define RTAX_FEATURE_ECN 0x00000001 373*53ee8cc1Swenshuai.xi #define RTAX_FEATURE_SACK 0x00000002 374*53ee8cc1Swenshuai.xi #define RTAX_FEATURE_TIMESTAMP 0x00000004 375*53ee8cc1Swenshuai.xi #define RTAX_FEATURE_ALLFRAG 0x00000008 376*53ee8cc1Swenshuai.xi 377*53ee8cc1Swenshuai.xi struct rta_session 378*53ee8cc1Swenshuai.xi { 379*53ee8cc1Swenshuai.xi __u8 proto; 380*53ee8cc1Swenshuai.xi __u8 pad1; 381*53ee8cc1Swenshuai.xi __u16 pad2; 382*53ee8cc1Swenshuai.xi 383*53ee8cc1Swenshuai.xi union { 384*53ee8cc1Swenshuai.xi struct { 385*53ee8cc1Swenshuai.xi __u16 sport; 386*53ee8cc1Swenshuai.xi __u16 dport; 387*53ee8cc1Swenshuai.xi } ports; 388*53ee8cc1Swenshuai.xi 389*53ee8cc1Swenshuai.xi struct { 390*53ee8cc1Swenshuai.xi __u8 type; 391*53ee8cc1Swenshuai.xi __u8 code; 392*53ee8cc1Swenshuai.xi __u16 ident; 393*53ee8cc1Swenshuai.xi } icmpt; 394*53ee8cc1Swenshuai.xi 395*53ee8cc1Swenshuai.xi __u32 spi; 396*53ee8cc1Swenshuai.xi } u; 397*53ee8cc1Swenshuai.xi }; 398*53ee8cc1Swenshuai.xi 399*53ee8cc1Swenshuai.xi /**** 400*53ee8cc1Swenshuai.xi * General form of address family dependent message. 401*53ee8cc1Swenshuai.xi ****/ 402*53ee8cc1Swenshuai.xi 403*53ee8cc1Swenshuai.xi struct rtgenmsg 404*53ee8cc1Swenshuai.xi { 405*53ee8cc1Swenshuai.xi unsigned char rtgen_family; 406*53ee8cc1Swenshuai.xi }; 407*53ee8cc1Swenshuai.xi 408*53ee8cc1Swenshuai.xi /***************************************************************** 409*53ee8cc1Swenshuai.xi * Link layer specific messages. 410*53ee8cc1Swenshuai.xi ****/ 411*53ee8cc1Swenshuai.xi 412*53ee8cc1Swenshuai.xi /* struct ifinfomsg 413*53ee8cc1Swenshuai.xi * passes link level specific information, not dependent 414*53ee8cc1Swenshuai.xi * on network protocol. 415*53ee8cc1Swenshuai.xi */ 416*53ee8cc1Swenshuai.xi 417*53ee8cc1Swenshuai.xi struct ifinfomsg 418*53ee8cc1Swenshuai.xi { 419*53ee8cc1Swenshuai.xi unsigned char ifi_family; 420*53ee8cc1Swenshuai.xi unsigned char __ifi_pad; 421*53ee8cc1Swenshuai.xi unsigned short ifi_type; /* ARPHRD_* */ 422*53ee8cc1Swenshuai.xi int ifi_index; /* Link index */ 423*53ee8cc1Swenshuai.xi unsigned ifi_flags; /* IFF_* flags */ 424*53ee8cc1Swenshuai.xi unsigned ifi_change; /* IFF_* change mask */ 425*53ee8cc1Swenshuai.xi }; 426*53ee8cc1Swenshuai.xi 427*53ee8cc1Swenshuai.xi /******************************************************************** 428*53ee8cc1Swenshuai.xi * prefix information 429*53ee8cc1Swenshuai.xi ****/ 430*53ee8cc1Swenshuai.xi 431*53ee8cc1Swenshuai.xi struct prefixmsg 432*53ee8cc1Swenshuai.xi { 433*53ee8cc1Swenshuai.xi unsigned char prefix_family; 434*53ee8cc1Swenshuai.xi unsigned char prefix_pad1; 435*53ee8cc1Swenshuai.xi unsigned short prefix_pad2; 436*53ee8cc1Swenshuai.xi int prefix_ifindex; 437*53ee8cc1Swenshuai.xi unsigned char prefix_type; 438*53ee8cc1Swenshuai.xi unsigned char prefix_len; 439*53ee8cc1Swenshuai.xi unsigned char prefix_flags; 440*53ee8cc1Swenshuai.xi unsigned char prefix_pad3; 441*53ee8cc1Swenshuai.xi }; 442*53ee8cc1Swenshuai.xi 443*53ee8cc1Swenshuai.xi enum 444*53ee8cc1Swenshuai.xi { 445*53ee8cc1Swenshuai.xi PREFIX_UNSPEC, 446*53ee8cc1Swenshuai.xi PREFIX_ADDRESS, 447*53ee8cc1Swenshuai.xi PREFIX_CACHEINFO, 448*53ee8cc1Swenshuai.xi __PREFIX_MAX 449*53ee8cc1Swenshuai.xi }; 450*53ee8cc1Swenshuai.xi 451*53ee8cc1Swenshuai.xi #define PREFIX_MAX (__PREFIX_MAX - 1) 452*53ee8cc1Swenshuai.xi 453*53ee8cc1Swenshuai.xi struct prefix_cacheinfo 454*53ee8cc1Swenshuai.xi { 455*53ee8cc1Swenshuai.xi __u32 preferred_time; 456*53ee8cc1Swenshuai.xi __u32 valid_time; 457*53ee8cc1Swenshuai.xi }; 458*53ee8cc1Swenshuai.xi 459*53ee8cc1Swenshuai.xi 460*53ee8cc1Swenshuai.xi /***************************************************************** 461*53ee8cc1Swenshuai.xi * Traffic control messages. 462*53ee8cc1Swenshuai.xi ****/ 463*53ee8cc1Swenshuai.xi 464*53ee8cc1Swenshuai.xi struct tcmsg 465*53ee8cc1Swenshuai.xi { 466*53ee8cc1Swenshuai.xi unsigned char tcm_family; 467*53ee8cc1Swenshuai.xi unsigned char tcm__pad1; 468*53ee8cc1Swenshuai.xi unsigned short tcm__pad2; 469*53ee8cc1Swenshuai.xi int tcm_ifindex; 470*53ee8cc1Swenshuai.xi __u32 tcm_handle; 471*53ee8cc1Swenshuai.xi __u32 tcm_parent; 472*53ee8cc1Swenshuai.xi __u32 tcm_info; 473*53ee8cc1Swenshuai.xi }; 474*53ee8cc1Swenshuai.xi 475*53ee8cc1Swenshuai.xi enum 476*53ee8cc1Swenshuai.xi { 477*53ee8cc1Swenshuai.xi TCA_UNSPEC, 478*53ee8cc1Swenshuai.xi TCA_KIND, 479*53ee8cc1Swenshuai.xi TCA_OPTIONS, 480*53ee8cc1Swenshuai.xi TCA_STATS, 481*53ee8cc1Swenshuai.xi TCA_XSTATS, 482*53ee8cc1Swenshuai.xi TCA_RATE, 483*53ee8cc1Swenshuai.xi TCA_FCNT, 484*53ee8cc1Swenshuai.xi TCA_STATS2, 485*53ee8cc1Swenshuai.xi __TCA_MAX 486*53ee8cc1Swenshuai.xi }; 487*53ee8cc1Swenshuai.xi 488*53ee8cc1Swenshuai.xi #define TCA_MAX (__TCA_MAX - 1) 489*53ee8cc1Swenshuai.xi 490*53ee8cc1Swenshuai.xi #define TCA_RTA(r) ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct tcmsg)))) 491*53ee8cc1Swenshuai.xi #define TCA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct tcmsg)) 492*53ee8cc1Swenshuai.xi 493*53ee8cc1Swenshuai.xi /******************************************************************** 494*53ee8cc1Swenshuai.xi * Neighbor Discovery userland options 495*53ee8cc1Swenshuai.xi ****/ 496*53ee8cc1Swenshuai.xi 497*53ee8cc1Swenshuai.xi struct nduseroptmsg 498*53ee8cc1Swenshuai.xi { 499*53ee8cc1Swenshuai.xi unsigned char nduseropt_family; 500*53ee8cc1Swenshuai.xi unsigned char nduseropt_pad1; 501*53ee8cc1Swenshuai.xi unsigned short nduseropt_opts_len; /* Total length of options */ 502*53ee8cc1Swenshuai.xi int nduseropt_ifindex; 503*53ee8cc1Swenshuai.xi __u8 nduseropt_icmp_type; 504*53ee8cc1Swenshuai.xi __u8 nduseropt_icmp_code; 505*53ee8cc1Swenshuai.xi unsigned short nduseropt_pad2; 506*53ee8cc1Swenshuai.xi unsigned int nduseropt_pad3; 507*53ee8cc1Swenshuai.xi /* Followed by one or more ND options */ 508*53ee8cc1Swenshuai.xi }; 509*53ee8cc1Swenshuai.xi 510*53ee8cc1Swenshuai.xi enum 511*53ee8cc1Swenshuai.xi { 512*53ee8cc1Swenshuai.xi NDUSEROPT_UNSPEC, 513*53ee8cc1Swenshuai.xi NDUSEROPT_SRCADDR, 514*53ee8cc1Swenshuai.xi __NDUSEROPT_MAX 515*53ee8cc1Swenshuai.xi }; 516*53ee8cc1Swenshuai.xi 517*53ee8cc1Swenshuai.xi #define NDUSEROPT_MAX (__NDUSEROPT_MAX - 1) 518*53ee8cc1Swenshuai.xi 519*53ee8cc1Swenshuai.xi /* RTnetlink multicast groups - backwards compatibility for userspace */ 520*53ee8cc1Swenshuai.xi #define RTMGRP_LINK 1 521*53ee8cc1Swenshuai.xi #define RTMGRP_NOTIFY 2 522*53ee8cc1Swenshuai.xi #define RTMGRP_NEIGH 4 523*53ee8cc1Swenshuai.xi #define RTMGRP_TC 8 524*53ee8cc1Swenshuai.xi 525*53ee8cc1Swenshuai.xi #define RTMGRP_IPV4_IFADDR 0x10 526*53ee8cc1Swenshuai.xi #define RTMGRP_IPV4_MROUTE 0x20 527*53ee8cc1Swenshuai.xi #define RTMGRP_IPV4_ROUTE 0x40 528*53ee8cc1Swenshuai.xi #define RTMGRP_IPV4_RULE 0x80 529*53ee8cc1Swenshuai.xi 530*53ee8cc1Swenshuai.xi #define RTMGRP_IPV6_IFADDR 0x100 531*53ee8cc1Swenshuai.xi #define RTMGRP_IPV6_MROUTE 0x200 532*53ee8cc1Swenshuai.xi #define RTMGRP_IPV6_ROUTE 0x400 533*53ee8cc1Swenshuai.xi #define RTMGRP_IPV6_IFINFO 0x800 534*53ee8cc1Swenshuai.xi 535*53ee8cc1Swenshuai.xi #define RTMGRP_DECnet_IFADDR 0x1000 536*53ee8cc1Swenshuai.xi #define RTMGRP_DECnet_ROUTE 0x4000 537*53ee8cc1Swenshuai.xi 538*53ee8cc1Swenshuai.xi #define RTMGRP_IPV6_PREFIX 0x20000 539*53ee8cc1Swenshuai.xi 540*53ee8cc1Swenshuai.xi /* RTnetlink multicast groups */ 541*53ee8cc1Swenshuai.xi enum rtnetlink_groups { 542*53ee8cc1Swenshuai.xi RTNLGRP_NONE, 543*53ee8cc1Swenshuai.xi #define RTNLGRP_NONE RTNLGRP_NONE 544*53ee8cc1Swenshuai.xi RTNLGRP_LINK, 545*53ee8cc1Swenshuai.xi #define RTNLGRP_LINK RTNLGRP_LINK 546*53ee8cc1Swenshuai.xi RTNLGRP_NOTIFY, 547*53ee8cc1Swenshuai.xi #define RTNLGRP_NOTIFY RTNLGRP_NOTIFY 548*53ee8cc1Swenshuai.xi RTNLGRP_NEIGH, 549*53ee8cc1Swenshuai.xi #define RTNLGRP_NEIGH RTNLGRP_NEIGH 550*53ee8cc1Swenshuai.xi RTNLGRP_TC, 551*53ee8cc1Swenshuai.xi #define RTNLGRP_TC RTNLGRP_TC 552*53ee8cc1Swenshuai.xi RTNLGRP_IPV4_IFADDR, 553*53ee8cc1Swenshuai.xi #define RTNLGRP_IPV4_IFADDR RTNLGRP_IPV4_IFADDR 554*53ee8cc1Swenshuai.xi RTNLGRP_IPV4_MROUTE, 555*53ee8cc1Swenshuai.xi #define RTNLGRP_IPV4_MROUTE RTNLGRP_IPV4_MROUTE 556*53ee8cc1Swenshuai.xi RTNLGRP_IPV4_ROUTE, 557*53ee8cc1Swenshuai.xi #define RTNLGRP_IPV4_ROUTE RTNLGRP_IPV4_ROUTE 558*53ee8cc1Swenshuai.xi RTNLGRP_IPV4_RULE, 559*53ee8cc1Swenshuai.xi #define RTNLGRP_IPV4_RULE RTNLGRP_IPV4_RULE 560*53ee8cc1Swenshuai.xi RTNLGRP_IPV6_IFADDR, 561*53ee8cc1Swenshuai.xi #define RTNLGRP_IPV6_IFADDR RTNLGRP_IPV6_IFADDR 562*53ee8cc1Swenshuai.xi RTNLGRP_IPV6_MROUTE, 563*53ee8cc1Swenshuai.xi #define RTNLGRP_IPV6_MROUTE RTNLGRP_IPV6_MROUTE 564*53ee8cc1Swenshuai.xi RTNLGRP_IPV6_ROUTE, 565*53ee8cc1Swenshuai.xi #define RTNLGRP_IPV6_ROUTE RTNLGRP_IPV6_ROUTE 566*53ee8cc1Swenshuai.xi RTNLGRP_IPV6_IFINFO, 567*53ee8cc1Swenshuai.xi #define RTNLGRP_IPV6_IFINFO RTNLGRP_IPV6_IFINFO 568*53ee8cc1Swenshuai.xi RTNLGRP_DECnet_IFADDR, 569*53ee8cc1Swenshuai.xi #define RTNLGRP_DECnet_IFADDR RTNLGRP_DECnet_IFADDR 570*53ee8cc1Swenshuai.xi RTNLGRP_NOP2, 571*53ee8cc1Swenshuai.xi RTNLGRP_DECnet_ROUTE, 572*53ee8cc1Swenshuai.xi #define RTNLGRP_DECnet_ROUTE RTNLGRP_DECnet_ROUTE 573*53ee8cc1Swenshuai.xi RTNLGRP_DECnet_RULE, 574*53ee8cc1Swenshuai.xi #define RTNLGRP_DECnet_RULE RTNLGRP_DECnet_RULE 575*53ee8cc1Swenshuai.xi RTNLGRP_NOP4, 576*53ee8cc1Swenshuai.xi RTNLGRP_IPV6_PREFIX, 577*53ee8cc1Swenshuai.xi #define RTNLGRP_IPV6_PREFIX RTNLGRP_IPV6_PREFIX 578*53ee8cc1Swenshuai.xi RTNLGRP_IPV6_RULE, 579*53ee8cc1Swenshuai.xi #define RTNLGRP_IPV6_RULE RTNLGRP_IPV6_RULE 580*53ee8cc1Swenshuai.xi RTNLGRP_ND_USEROPT, 581*53ee8cc1Swenshuai.xi #define RTNLGRP_ND_USEROPT RTNLGRP_ND_USEROPT 582*53ee8cc1Swenshuai.xi __RTNLGRP_MAX 583*53ee8cc1Swenshuai.xi }; 584*53ee8cc1Swenshuai.xi #define RTNLGRP_MAX (__RTNLGRP_MAX - 1) 585*53ee8cc1Swenshuai.xi 586*53ee8cc1Swenshuai.xi /* TC action piece */ 587*53ee8cc1Swenshuai.xi struct tcamsg 588*53ee8cc1Swenshuai.xi { 589*53ee8cc1Swenshuai.xi unsigned char tca_family; 590*53ee8cc1Swenshuai.xi unsigned char tca__pad1; 591*53ee8cc1Swenshuai.xi unsigned short tca__pad2; 592*53ee8cc1Swenshuai.xi }; 593*53ee8cc1Swenshuai.xi #define TA_RTA(r) ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct tcamsg)))) 594*53ee8cc1Swenshuai.xi #define TA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct tcamsg)) 595*53ee8cc1Swenshuai.xi #define TCA_ACT_TAB 1 /* attr type must be >=1 */ 596*53ee8cc1Swenshuai.xi #define TCAA_MAX 1 597*53ee8cc1Swenshuai.xi 598*53ee8cc1Swenshuai.xi /* End of information exported to user level */ 599*53ee8cc1Swenshuai.xi 600*53ee8cc1Swenshuai.xi 601*53ee8cc1Swenshuai.xi 602*53ee8cc1Swenshuai.xi #endif /* __LINUX_RTNETLINK_H */ 603