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