Blame include/uapi/linux/rtnetlink.h

Packit d3f73b
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
Packit d3f73b
#ifndef __LINUX_RTNETLINK_H
Packit d3f73b
#define __LINUX_RTNETLINK_H
Packit d3f73b
Packit d3f73b
#include <linux/types.h>
Packit d3f73b
#include <linux/netlink.h>
Packit d3f73b
#include <linux/if_link.h>
Packit d3f73b
#include <linux/if_addr.h>
Packit d3f73b
#include <linux/neighbour.h>
Packit d3f73b
Packit d3f73b
/* rtnetlink families. Values up to 127 are reserved for real address
Packit d3f73b
 * families, values above 128 may be used arbitrarily.
Packit d3f73b
 */
Packit d3f73b
#define RTNL_FAMILY_IPMR		128
Packit d3f73b
#define RTNL_FAMILY_IP6MR		129
Packit d3f73b
#define RTNL_FAMILY_MAX			129
Packit d3f73b
Packit d3f73b
/****
Packit d3f73b
 *		Routing/neighbour discovery messages.
Packit d3f73b
 ****/
Packit d3f73b
Packit d3f73b
/* Types of messages */
Packit d3f73b
Packit d3f73b
enum {
Packit d3f73b
	RTM_BASE	= 16,
Packit d3f73b
#define RTM_BASE	RTM_BASE
Packit d3f73b
Packit d3f73b
	RTM_NEWLINK	= 16,
Packit d3f73b
#define RTM_NEWLINK	RTM_NEWLINK
Packit d3f73b
	RTM_DELLINK,
Packit d3f73b
#define RTM_DELLINK	RTM_DELLINK
Packit d3f73b
	RTM_GETLINK,
Packit d3f73b
#define RTM_GETLINK	RTM_GETLINK
Packit d3f73b
	RTM_SETLINK,
Packit d3f73b
#define RTM_SETLINK	RTM_SETLINK
Packit d3f73b
Packit d3f73b
	RTM_NEWADDR	= 20,
Packit d3f73b
#define RTM_NEWADDR	RTM_NEWADDR
Packit d3f73b
	RTM_DELADDR,
Packit d3f73b
#define RTM_DELADDR	RTM_DELADDR
Packit d3f73b
	RTM_GETADDR,
Packit d3f73b
#define RTM_GETADDR	RTM_GETADDR
Packit d3f73b
Packit d3f73b
	RTM_NEWROUTE	= 24,
Packit d3f73b
#define RTM_NEWROUTE	RTM_NEWROUTE
Packit d3f73b
	RTM_DELROUTE,
Packit d3f73b
#define RTM_DELROUTE	RTM_DELROUTE
Packit d3f73b
	RTM_GETROUTE,
Packit d3f73b
#define RTM_GETROUTE	RTM_GETROUTE
Packit d3f73b
Packit d3f73b
	RTM_NEWNEIGH	= 28,
Packit d3f73b
#define RTM_NEWNEIGH	RTM_NEWNEIGH
Packit d3f73b
	RTM_DELNEIGH,
Packit d3f73b
#define RTM_DELNEIGH	RTM_DELNEIGH
Packit d3f73b
	RTM_GETNEIGH,
Packit d3f73b
#define RTM_GETNEIGH	RTM_GETNEIGH
Packit d3f73b
Packit d3f73b
	RTM_NEWRULE	= 32,
Packit d3f73b
#define RTM_NEWRULE	RTM_NEWRULE
Packit d3f73b
	RTM_DELRULE,
Packit d3f73b
#define RTM_DELRULE	RTM_DELRULE
Packit d3f73b
	RTM_GETRULE,
Packit d3f73b
#define RTM_GETRULE	RTM_GETRULE
Packit d3f73b
Packit d3f73b
	RTM_NEWQDISC	= 36,
Packit d3f73b
#define RTM_NEWQDISC	RTM_NEWQDISC
Packit d3f73b
	RTM_DELQDISC,
Packit d3f73b
#define RTM_DELQDISC	RTM_DELQDISC
Packit d3f73b
	RTM_GETQDISC,
Packit d3f73b
#define RTM_GETQDISC	RTM_GETQDISC
Packit d3f73b
Packit d3f73b
	RTM_NEWTCLASS	= 40,
Packit d3f73b
#define RTM_NEWTCLASS	RTM_NEWTCLASS
Packit d3f73b
	RTM_DELTCLASS,
Packit d3f73b
#define RTM_DELTCLASS	RTM_DELTCLASS
Packit d3f73b
	RTM_GETTCLASS,
Packit d3f73b
#define RTM_GETTCLASS	RTM_GETTCLASS
Packit d3f73b
Packit d3f73b
	RTM_NEWTFILTER	= 44,
Packit d3f73b
#define RTM_NEWTFILTER	RTM_NEWTFILTER
Packit d3f73b
	RTM_DELTFILTER,
Packit d3f73b
#define RTM_DELTFILTER	RTM_DELTFILTER
Packit d3f73b
	RTM_GETTFILTER,
Packit d3f73b
#define RTM_GETTFILTER	RTM_GETTFILTER
Packit d3f73b
Packit d3f73b
	RTM_NEWACTION	= 48,
Packit d3f73b
#define RTM_NEWACTION   RTM_NEWACTION
Packit d3f73b
	RTM_DELACTION,
Packit d3f73b
#define RTM_DELACTION   RTM_DELACTION
Packit d3f73b
	RTM_GETACTION,
Packit d3f73b
#define RTM_GETACTION   RTM_GETACTION
Packit d3f73b
Packit d3f73b
	RTM_NEWPREFIX	= 52,
Packit d3f73b
#define RTM_NEWPREFIX	RTM_NEWPREFIX
Packit d3f73b
Packit d3f73b
	RTM_GETMULTICAST = 58,
Packit d3f73b
#define RTM_GETMULTICAST RTM_GETMULTICAST
Packit d3f73b
Packit d3f73b
	RTM_GETANYCAST	= 62,
Packit d3f73b
#define RTM_GETANYCAST	RTM_GETANYCAST
Packit d3f73b
Packit d3f73b
	RTM_NEWNEIGHTBL	= 64,
Packit d3f73b
#define RTM_NEWNEIGHTBL	RTM_NEWNEIGHTBL
Packit d3f73b
	RTM_GETNEIGHTBL	= 66,
Packit d3f73b
#define RTM_GETNEIGHTBL	RTM_GETNEIGHTBL
Packit d3f73b
	RTM_SETNEIGHTBL,
Packit d3f73b
#define RTM_SETNEIGHTBL	RTM_SETNEIGHTBL
Packit d3f73b
Packit d3f73b
	RTM_NEWNDUSEROPT = 68,
Packit d3f73b
#define RTM_NEWNDUSEROPT RTM_NEWNDUSEROPT
Packit d3f73b
Packit d3f73b
	RTM_NEWADDRLABEL = 72,
Packit d3f73b
#define RTM_NEWADDRLABEL RTM_NEWADDRLABEL
Packit d3f73b
	RTM_DELADDRLABEL,
Packit d3f73b
#define RTM_DELADDRLABEL RTM_DELADDRLABEL
Packit d3f73b
	RTM_GETADDRLABEL,
Packit d3f73b
#define RTM_GETADDRLABEL RTM_GETADDRLABEL
Packit d3f73b
Packit d3f73b
	RTM_GETDCB = 78,
Packit d3f73b
#define RTM_GETDCB RTM_GETDCB
Packit d3f73b
	RTM_SETDCB,
Packit d3f73b
#define RTM_SETDCB RTM_SETDCB
Packit d3f73b
Packit d3f73b
	RTM_NEWNETCONF = 80,
Packit d3f73b
#define RTM_NEWNETCONF RTM_NEWNETCONF
Packit d3f73b
	RTM_DELNETCONF,
Packit d3f73b
#define RTM_DELNETCONF RTM_DELNETCONF
Packit d3f73b
	RTM_GETNETCONF = 82,
Packit d3f73b
#define RTM_GETNETCONF RTM_GETNETCONF
Packit d3f73b
Packit d3f73b
	RTM_NEWMDB = 84,
Packit d3f73b
#define RTM_NEWMDB RTM_NEWMDB
Packit d3f73b
	RTM_DELMDB = 85,
Packit d3f73b
#define RTM_DELMDB RTM_DELMDB
Packit d3f73b
	RTM_GETMDB = 86,
Packit d3f73b
#define RTM_GETMDB RTM_GETMDB
Packit d3f73b
Packit d3f73b
	RTM_NEWNSID = 88,
Packit d3f73b
#define RTM_NEWNSID RTM_NEWNSID
Packit d3f73b
	RTM_DELNSID = 89,
Packit d3f73b
#define RTM_DELNSID RTM_DELNSID
Packit d3f73b
	RTM_GETNSID = 90,
Packit d3f73b
#define RTM_GETNSID RTM_GETNSID
Packit d3f73b
Packit d3f73b
	RTM_NEWSTATS = 92,
Packit d3f73b
#define RTM_NEWSTATS RTM_NEWSTATS
Packit d3f73b
	RTM_GETSTATS = 94,
Packit d3f73b
#define RTM_GETSTATS RTM_GETSTATS
Packit d3f73b
Packit d3f73b
	RTM_NEWCACHEREPORT = 96,
Packit d3f73b
#define RTM_NEWCACHEREPORT RTM_NEWCACHEREPORT
Packit d3f73b
Packit d3f73b
	RTM_NEWCHAIN = 100,
Packit d3f73b
#define RTM_NEWCHAIN RTM_NEWCHAIN
Packit d3f73b
	RTM_DELCHAIN,
Packit d3f73b
#define RTM_DELCHAIN RTM_DELCHAIN
Packit d3f73b
	RTM_GETCHAIN,
Packit d3f73b
#define RTM_GETCHAIN RTM_GETCHAIN
Packit d3f73b
Packit d3f73b
	RTM_NEWNEXTHOP = 104,
Packit d3f73b
#define RTM_NEWNEXTHOP	RTM_NEWNEXTHOP
Packit d3f73b
	RTM_DELNEXTHOP,
Packit d3f73b
#define RTM_DELNEXTHOP	RTM_DELNEXTHOP
Packit d3f73b
	RTM_GETNEXTHOP,
Packit d3f73b
#define RTM_GETNEXTHOP	RTM_GETNEXTHOP
Packit d3f73b
Packit d3f73b
	__RTM_MAX,
Packit d3f73b
#define RTM_MAX		(((__RTM_MAX + 3) & ~3) - 1)
Packit d3f73b
};
Packit d3f73b
Packit d3f73b
#define RTM_NR_MSGTYPES	(RTM_MAX + 1 - RTM_BASE)
Packit d3f73b
#define RTM_NR_FAMILIES	(RTM_NR_MSGTYPES >> 2)
Packit d3f73b
#define RTM_FAM(cmd)	(((cmd) - RTM_BASE) >> 2)
Packit d3f73b
Packit d3f73b
/* 
Packit d3f73b
   Generic structure for encapsulation of optional route information.
Packit d3f73b
   It is reminiscent of sockaddr, but with sa_family replaced
Packit d3f73b
   with attribute type.
Packit d3f73b
 */
Packit d3f73b
Packit d3f73b
struct rtattr {
Packit d3f73b
	unsigned short	rta_len;
Packit d3f73b
	unsigned short	rta_type;
Packit d3f73b
};
Packit d3f73b
Packit d3f73b
/* Macros to handle rtattributes */
Packit d3f73b
Packit d3f73b
#define RTA_ALIGNTO	4U
Packit d3f73b
#define RTA_ALIGN(len) ( ((len)+RTA_ALIGNTO-1) & ~(RTA_ALIGNTO-1) )
Packit d3f73b
#define RTA_OK(rta,len) ((len) >= (int)sizeof(struct rtattr) && \
Packit d3f73b
			 (rta)->rta_len >= sizeof(struct rtattr) && \
Packit d3f73b
			 (rta)->rta_len <= (len))
Packit d3f73b
#define RTA_NEXT(rta,attrlen)	((attrlen) -= RTA_ALIGN((rta)->rta_len), \
Packit d3f73b
				 (struct rtattr*)(((char*)(rta)) + RTA_ALIGN((rta)->rta_len)))
Packit d3f73b
#define RTA_LENGTH(len)	(RTA_ALIGN(sizeof(struct rtattr)) + (len))
Packit d3f73b
#define RTA_SPACE(len)	RTA_ALIGN(RTA_LENGTH(len))
Packit d3f73b
#define RTA_DATA(rta)   ((void*)(((char*)(rta)) + RTA_LENGTH(0)))
Packit d3f73b
#define RTA_PAYLOAD(rta) ((int)((rta)->rta_len) - RTA_LENGTH(0))
Packit d3f73b
Packit d3f73b
Packit d3f73b
Packit d3f73b
Packit d3f73b
/******************************************************************************
Packit d3f73b
 *		Definitions used in routing table administration.
Packit d3f73b
 ****/
Packit d3f73b
Packit d3f73b
struct rtmsg {
Packit d3f73b
	unsigned char		rtm_family;
Packit d3f73b
	unsigned char		rtm_dst_len;
Packit d3f73b
	unsigned char		rtm_src_len;
Packit d3f73b
	unsigned char		rtm_tos;
Packit d3f73b
Packit d3f73b
	unsigned char		rtm_table;	/* Routing table id */
Packit d3f73b
	unsigned char		rtm_protocol;	/* Routing protocol; see below	*/
Packit d3f73b
	unsigned char		rtm_scope;	/* See below */	
Packit d3f73b
	unsigned char		rtm_type;	/* See below	*/
Packit d3f73b
Packit d3f73b
	unsigned		rtm_flags;
Packit d3f73b
};
Packit d3f73b
Packit d3f73b
/* rtm_type */
Packit d3f73b
Packit d3f73b
enum {
Packit d3f73b
	RTN_UNSPEC,
Packit d3f73b
	RTN_UNICAST,		/* Gateway or direct route	*/
Packit d3f73b
	RTN_LOCAL,		/* Accept locally		*/
Packit d3f73b
	RTN_BROADCAST,		/* Accept locally as broadcast,
Packit d3f73b
				   send as broadcast */
Packit d3f73b
	RTN_ANYCAST,		/* Accept locally as broadcast,
Packit d3f73b
				   but send as unicast */
Packit d3f73b
	RTN_MULTICAST,		/* Multicast route		*/
Packit d3f73b
	RTN_BLACKHOLE,		/* Drop				*/
Packit d3f73b
	RTN_UNREACHABLE,	/* Destination is unreachable   */
Packit d3f73b
	RTN_PROHIBIT,		/* Administratively prohibited	*/
Packit d3f73b
	RTN_THROW,		/* Not in this table		*/
Packit d3f73b
	RTN_NAT,		/* Translate this address	*/
Packit d3f73b
	RTN_XRESOLVE,		/* Use external resolver	*/
Packit d3f73b
	__RTN_MAX
Packit d3f73b
};
Packit d3f73b
Packit d3f73b
#define RTN_MAX (__RTN_MAX - 1)
Packit d3f73b
Packit d3f73b
Packit d3f73b
/* rtm_protocol */
Packit d3f73b
Packit d3f73b
#define RTPROT_UNSPEC	0
Packit d3f73b
#define RTPROT_REDIRECT	1	/* Route installed by ICMP redirects;
Packit d3f73b
				   not used by current IPv4 */
Packit d3f73b
#define RTPROT_KERNEL	2	/* Route installed by kernel		*/
Packit d3f73b
#define RTPROT_BOOT	3	/* Route installed during boot		*/
Packit d3f73b
#define RTPROT_STATIC	4	/* Route installed by administrator	*/
Packit d3f73b
Packit d3f73b
/* Values of protocol >= RTPROT_STATIC are not interpreted by kernel;
Packit d3f73b
   they are just passed from user and back as is.
Packit d3f73b
   It will be used by hypothetical multiple routing daemons.
Packit d3f73b
   Note that protocol values should be standardized in order to
Packit d3f73b
   avoid conflicts.
Packit d3f73b
 */
Packit d3f73b
Packit d3f73b
#define RTPROT_GATED	8	/* Apparently, GateD */
Packit d3f73b
#define RTPROT_RA	9	/* RDISC/ND router advertisements */
Packit d3f73b
#define RTPROT_MRT	10	/* Merit MRT */
Packit d3f73b
#define RTPROT_ZEBRA	11	/* Zebra */
Packit d3f73b
#define RTPROT_BIRD	12	/* BIRD */
Packit d3f73b
#define RTPROT_DNROUTED	13	/* DECnet routing daemon */
Packit d3f73b
#define RTPROT_XORP	14	/* XORP */
Packit d3f73b
#define RTPROT_NTK	15	/* Netsukuku */
Packit d3f73b
#define RTPROT_DHCP	16      /* DHCP client */
Packit d3f73b
#define RTPROT_MROUTED	17      /* Multicast daemon */
Packit d3f73b
#define RTPROT_BABEL	42      /* Babel daemon */
Packit d3f73b
#define RTPROT_BGP	186     /* BGP Routes */
Packit d3f73b
#define RTPROT_ISIS	187     /* ISIS Routes */
Packit d3f73b
#define RTPROT_OSPF	188     /* OSPF Routes */
Packit d3f73b
#define RTPROT_RIP	189     /* RIP Routes */
Packit d3f73b
#define RTPROT_EIGRP	192     /* EIGRP Routes */
Packit d3f73b
Packit d3f73b
/* rtm_scope
Packit d3f73b
Packit d3f73b
   Really it is not scope, but sort of distance to the destination.
Packit d3f73b
   NOWHERE are reserved for not existing destinations, HOST is our
Packit d3f73b
   local addresses, LINK are destinations, located on directly attached
Packit d3f73b
   link and UNIVERSE is everywhere in the Universe.
Packit d3f73b
Packit d3f73b
   Intermediate values are also possible f.e. interior routes
Packit d3f73b
   could be assigned a value between UNIVERSE and LINK.
Packit d3f73b
*/
Packit d3f73b
Packit d3f73b
enum rt_scope_t {
Packit d3f73b
	RT_SCOPE_UNIVERSE=0,
Packit d3f73b
/* User defined values  */
Packit d3f73b
	RT_SCOPE_SITE=200,
Packit d3f73b
	RT_SCOPE_LINK=253,
Packit d3f73b
	RT_SCOPE_HOST=254,
Packit d3f73b
	RT_SCOPE_NOWHERE=255
Packit d3f73b
};
Packit d3f73b
Packit d3f73b
/* rtm_flags */
Packit d3f73b
Packit d3f73b
#define RTM_F_NOTIFY		0x100	/* Notify user of route change	*/
Packit d3f73b
#define RTM_F_CLONED		0x200	/* This route is cloned		*/
Packit d3f73b
#define RTM_F_EQUALIZE		0x400	/* Multipath equalizer: NI	*/
Packit d3f73b
#define RTM_F_PREFIX		0x800	/* Prefix addresses		*/
Packit d3f73b
#define RTM_F_LOOKUP_TABLE	0x1000	/* set rtm_table to FIB lookup result */
Packit d3f73b
#define RTM_F_FIB_MATCH	        0x2000	/* return full fib lookup match */
Packit d3f73b
Packit d3f73b
/* Reserved table identifiers */
Packit d3f73b
Packit d3f73b
enum rt_class_t {
Packit d3f73b
	RT_TABLE_UNSPEC=0,
Packit d3f73b
/* User defined values */
Packit d3f73b
	RT_TABLE_COMPAT=252,
Packit d3f73b
	RT_TABLE_DEFAULT=253,
Packit d3f73b
	RT_TABLE_MAIN=254,
Packit d3f73b
	RT_TABLE_LOCAL=255,
Packit d3f73b
	RT_TABLE_MAX=0xFFFFFFFF
Packit d3f73b
};
Packit d3f73b
Packit d3f73b
Packit d3f73b
/* Routing message attributes */
Packit d3f73b
Packit d3f73b
enum rtattr_type_t {
Packit d3f73b
	RTA_UNSPEC,
Packit d3f73b
	RTA_DST,
Packit d3f73b
	RTA_SRC,
Packit d3f73b
	RTA_IIF,
Packit d3f73b
	RTA_OIF,
Packit d3f73b
	RTA_GATEWAY,
Packit d3f73b
	RTA_PRIORITY,
Packit d3f73b
	RTA_PREFSRC,
Packit d3f73b
	RTA_METRICS,
Packit d3f73b
	RTA_MULTIPATH,
Packit d3f73b
	RTA_PROTOINFO, /* no longer used */
Packit d3f73b
	RTA_FLOW,
Packit d3f73b
	RTA_CACHEINFO,
Packit d3f73b
	RTA_SESSION, /* no longer used */
Packit d3f73b
	RTA_MP_ALGO, /* no longer used */
Packit d3f73b
	RTA_TABLE,
Packit d3f73b
	RTA_MARK,
Packit d3f73b
	RTA_MFC_STATS,
Packit d3f73b
	RTA_VIA,
Packit d3f73b
	RTA_NEWDST,
Packit d3f73b
	RTA_PREF,
Packit d3f73b
	RTA_ENCAP_TYPE,
Packit d3f73b
	RTA_ENCAP,
Packit d3f73b
	RTA_EXPIRES,
Packit d3f73b
	RTA_PAD,
Packit d3f73b
	RTA_UID,
Packit d3f73b
	RTA_TTL_PROPAGATE,
Packit d3f73b
	RTA_IP_PROTO,
Packit d3f73b
	RTA_SPORT,
Packit d3f73b
	RTA_DPORT,
Packit d3f73b
	RTA_NH_ID,
Packit d3f73b
	__RTA_MAX
Packit d3f73b
};
Packit d3f73b
Packit d3f73b
#define RTA_MAX (__RTA_MAX - 1)
Packit d3f73b
Packit d3f73b
#define RTM_RTA(r)  ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct rtmsg))))
Packit d3f73b
#define RTM_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct rtmsg))
Packit d3f73b
Packit d3f73b
/* RTM_MULTIPATH --- array of struct rtnexthop.
Packit d3f73b
 *
Packit d3f73b
 * "struct rtnexthop" describes all necessary nexthop information,
Packit d3f73b
 * i.e. parameters of path to a destination via this nexthop.
Packit d3f73b
 *
Packit d3f73b
 * At the moment it is impossible to set different prefsrc, mtu, window
Packit d3f73b
 * and rtt for different paths from multipath.
Packit d3f73b
 */
Packit d3f73b
Packit d3f73b
struct rtnexthop {
Packit d3f73b
	unsigned short		rtnh_len;
Packit d3f73b
	unsigned char		rtnh_flags;
Packit d3f73b
	unsigned char		rtnh_hops;
Packit d3f73b
	int			rtnh_ifindex;
Packit d3f73b
};
Packit d3f73b
Packit d3f73b
/* rtnh_flags */
Packit d3f73b
Packit d3f73b
#define RTNH_F_DEAD		1	/* Nexthop is dead (used by multipath)	*/
Packit d3f73b
#define RTNH_F_PERVASIVE	2	/* Do recursive gateway lookup	*/
Packit d3f73b
#define RTNH_F_ONLINK		4	/* Gateway is forced on link	*/
Packit d3f73b
#define RTNH_F_OFFLOAD		8	/* offloaded route */
Packit d3f73b
#define RTNH_F_LINKDOWN		16	/* carrier-down on nexthop */
Packit d3f73b
#define RTNH_F_UNRESOLVED	32	/* The entry is unresolved (ipmr) */
Packit d3f73b
Packit d3f73b
#define RTNH_COMPARE_MASK	(RTNH_F_DEAD | RTNH_F_LINKDOWN | RTNH_F_OFFLOAD)
Packit d3f73b
Packit d3f73b
/* Macros to handle hexthops */
Packit d3f73b
Packit d3f73b
#define RTNH_ALIGNTO	4
Packit d3f73b
#define RTNH_ALIGN(len) ( ((len)+RTNH_ALIGNTO-1) & ~(RTNH_ALIGNTO-1) )
Packit d3f73b
#define RTNH_OK(rtnh,len) ((rtnh)->rtnh_len >= sizeof(struct rtnexthop) && \
Packit d3f73b
			   ((int)(rtnh)->rtnh_len) <= (len))
Packit d3f73b
#define RTNH_NEXT(rtnh)	((struct rtnexthop*)(((char*)(rtnh)) + RTNH_ALIGN((rtnh)->rtnh_len)))
Packit d3f73b
#define RTNH_LENGTH(len) (RTNH_ALIGN(sizeof(struct rtnexthop)) + (len))
Packit d3f73b
#define RTNH_SPACE(len)	RTNH_ALIGN(RTNH_LENGTH(len))
Packit d3f73b
#define RTNH_DATA(rtnh)   ((struct rtattr*)(((char*)(rtnh)) + RTNH_LENGTH(0)))
Packit d3f73b
Packit d3f73b
/* RTA_VIA */
Packit d3f73b
struct rtvia {
Packit d3f73b
	__kernel_sa_family_t	rtvia_family;
Packit d3f73b
	__u8			rtvia_addr[0];
Packit d3f73b
};
Packit d3f73b
Packit d3f73b
/* RTM_CACHEINFO */
Packit d3f73b
Packit d3f73b
struct rta_cacheinfo {
Packit d3f73b
	__u32	rta_clntref;
Packit d3f73b
	__u32	rta_lastuse;
Packit d3f73b
	__s32	rta_expires;
Packit d3f73b
	__u32	rta_error;
Packit d3f73b
	__u32	rta_used;
Packit d3f73b
Packit d3f73b
#define RTNETLINK_HAVE_PEERINFO 1
Packit d3f73b
	__u32	rta_id;
Packit d3f73b
	__u32	rta_ts;
Packit d3f73b
	__u32	rta_tsage;
Packit d3f73b
};
Packit d3f73b
Packit d3f73b
/* RTM_METRICS --- array of struct rtattr with types of RTAX_* */
Packit d3f73b
Packit d3f73b
enum {
Packit d3f73b
	RTAX_UNSPEC,
Packit d3f73b
#define RTAX_UNSPEC RTAX_UNSPEC
Packit d3f73b
	RTAX_LOCK,
Packit d3f73b
#define RTAX_LOCK RTAX_LOCK
Packit d3f73b
	RTAX_MTU,
Packit d3f73b
#define RTAX_MTU RTAX_MTU
Packit d3f73b
	RTAX_WINDOW,
Packit d3f73b
#define RTAX_WINDOW RTAX_WINDOW
Packit d3f73b
	RTAX_RTT,
Packit d3f73b
#define RTAX_RTT RTAX_RTT
Packit d3f73b
	RTAX_RTTVAR,
Packit d3f73b
#define RTAX_RTTVAR RTAX_RTTVAR
Packit d3f73b
	RTAX_SSTHRESH,
Packit d3f73b
#define RTAX_SSTHRESH RTAX_SSTHRESH
Packit d3f73b
	RTAX_CWND,
Packit d3f73b
#define RTAX_CWND RTAX_CWND
Packit d3f73b
	RTAX_ADVMSS,
Packit d3f73b
#define RTAX_ADVMSS RTAX_ADVMSS
Packit d3f73b
	RTAX_REORDERING,
Packit d3f73b
#define RTAX_REORDERING RTAX_REORDERING
Packit d3f73b
	RTAX_HOPLIMIT,
Packit d3f73b
#define RTAX_HOPLIMIT RTAX_HOPLIMIT
Packit d3f73b
	RTAX_INITCWND,
Packit d3f73b
#define RTAX_INITCWND RTAX_INITCWND
Packit d3f73b
	RTAX_FEATURES,
Packit d3f73b
#define RTAX_FEATURES RTAX_FEATURES
Packit d3f73b
	RTAX_RTO_MIN,
Packit d3f73b
#define RTAX_RTO_MIN RTAX_RTO_MIN
Packit d3f73b
	RTAX_INITRWND,
Packit d3f73b
#define RTAX_INITRWND RTAX_INITRWND
Packit d3f73b
	RTAX_QUICKACK,
Packit d3f73b
#define RTAX_QUICKACK RTAX_QUICKACK
Packit d3f73b
	RTAX_CC_ALGO,
Packit d3f73b
#define RTAX_CC_ALGO RTAX_CC_ALGO
Packit d3f73b
	RTAX_FASTOPEN_NO_COOKIE,
Packit d3f73b
#define RTAX_FASTOPEN_NO_COOKIE RTAX_FASTOPEN_NO_COOKIE
Packit d3f73b
	__RTAX_MAX
Packit d3f73b
};
Packit d3f73b
Packit d3f73b
#define RTAX_MAX (__RTAX_MAX - 1)
Packit d3f73b
Packit d3f73b
#define RTAX_FEATURE_ECN	(1 << 0)
Packit d3f73b
#define RTAX_FEATURE_SACK	(1 << 1)
Packit d3f73b
#define RTAX_FEATURE_TIMESTAMP	(1 << 2)
Packit d3f73b
#define RTAX_FEATURE_ALLFRAG	(1 << 3)
Packit d3f73b
Packit d3f73b
#define RTAX_FEATURE_MASK	(RTAX_FEATURE_ECN | RTAX_FEATURE_SACK | \
Packit d3f73b
				 RTAX_FEATURE_TIMESTAMP | RTAX_FEATURE_ALLFRAG)
Packit d3f73b
Packit d3f73b
struct rta_session {
Packit d3f73b
	__u8	proto;
Packit d3f73b
	__u8	pad1;
Packit d3f73b
	__u16	pad2;
Packit d3f73b
Packit d3f73b
	union {
Packit d3f73b
		struct {
Packit d3f73b
			__u16	sport;
Packit d3f73b
			__u16	dport;
Packit d3f73b
		} ports;
Packit d3f73b
Packit d3f73b
		struct {
Packit d3f73b
			__u8	type;
Packit d3f73b
			__u8	code;
Packit d3f73b
			__u16	ident;
Packit d3f73b
		} icmpt;
Packit d3f73b
Packit d3f73b
		__u32		spi;
Packit d3f73b
	} u;
Packit d3f73b
};
Packit d3f73b
Packit d3f73b
struct rta_mfc_stats {
Packit d3f73b
	__u64	mfcs_packets;
Packit d3f73b
	__u64	mfcs_bytes;
Packit d3f73b
	__u64	mfcs_wrong_if;
Packit d3f73b
};
Packit d3f73b
Packit d3f73b
/****
Packit d3f73b
 *		General form of address family dependent message.
Packit d3f73b
 ****/
Packit d3f73b
Packit d3f73b
struct rtgenmsg {
Packit d3f73b
	unsigned char		rtgen_family;
Packit d3f73b
};
Packit d3f73b
Packit d3f73b
/*****************************************************************
Packit d3f73b
 *		Link layer specific messages.
Packit d3f73b
 ****/
Packit d3f73b
Packit d3f73b
/* struct ifinfomsg
Packit d3f73b
 * passes link level specific information, not dependent
Packit d3f73b
 * on network protocol.
Packit d3f73b
 */
Packit d3f73b
Packit d3f73b
struct ifinfomsg {
Packit d3f73b
	unsigned char	ifi_family;
Packit d3f73b
	unsigned char	__ifi_pad;
Packit d3f73b
	unsigned short	ifi_type;		/* ARPHRD_* */
Packit d3f73b
	int		ifi_index;		/* Link index	*/
Packit d3f73b
	unsigned	ifi_flags;		/* IFF_* flags	*/
Packit d3f73b
	unsigned	ifi_change;		/* IFF_* change mask */
Packit d3f73b
};
Packit d3f73b
Packit d3f73b
/********************************************************************
Packit d3f73b
 *		prefix information 
Packit d3f73b
 ****/
Packit d3f73b
Packit d3f73b
struct prefixmsg {
Packit d3f73b
	unsigned char	prefix_family;
Packit d3f73b
	unsigned char	prefix_pad1;
Packit d3f73b
	unsigned short	prefix_pad2;
Packit d3f73b
	int		prefix_ifindex;
Packit d3f73b
	unsigned char	prefix_type;
Packit d3f73b
	unsigned char	prefix_len;
Packit d3f73b
	unsigned char	prefix_flags;
Packit d3f73b
	unsigned char	prefix_pad3;
Packit d3f73b
};
Packit d3f73b
Packit d3f73b
enum 
Packit d3f73b
{
Packit d3f73b
	PREFIX_UNSPEC,
Packit d3f73b
	PREFIX_ADDRESS,
Packit d3f73b
	PREFIX_CACHEINFO,
Packit d3f73b
	__PREFIX_MAX
Packit d3f73b
};
Packit d3f73b
Packit d3f73b
#define PREFIX_MAX	(__PREFIX_MAX - 1)
Packit d3f73b
Packit d3f73b
struct prefix_cacheinfo {
Packit d3f73b
	__u32	preferred_time;
Packit d3f73b
	__u32	valid_time;
Packit d3f73b
};
Packit d3f73b
Packit d3f73b
Packit d3f73b
/*****************************************************************
Packit d3f73b
 *		Traffic control messages.
Packit d3f73b
 ****/
Packit d3f73b
Packit d3f73b
struct tcmsg {
Packit d3f73b
	unsigned char	tcm_family;
Packit d3f73b
	unsigned char	tcm__pad1;
Packit d3f73b
	unsigned short	tcm__pad2;
Packit d3f73b
	int		tcm_ifindex;
Packit d3f73b
	__u32		tcm_handle;
Packit d3f73b
	__u32		tcm_parent;
Packit d3f73b
/* tcm_block_index is used instead of tcm_parent
Packit d3f73b
 * in case tcm_ifindex == TCM_IFINDEX_MAGIC_BLOCK
Packit d3f73b
 */
Packit d3f73b
#define tcm_block_index tcm_parent
Packit d3f73b
	__u32		tcm_info;
Packit d3f73b
};
Packit d3f73b
Packit d3f73b
/* For manipulation of filters in shared block, tcm_ifindex is set to
Packit d3f73b
 * TCM_IFINDEX_MAGIC_BLOCK, and tcm_parent is aliased to tcm_block_index
Packit d3f73b
 * which is the block index.
Packit d3f73b
 */
Packit d3f73b
#define TCM_IFINDEX_MAGIC_BLOCK (0xFFFFFFFFU)
Packit d3f73b
Packit d3f73b
enum {
Packit d3f73b
	TCA_UNSPEC,
Packit d3f73b
	TCA_KIND,
Packit d3f73b
	TCA_OPTIONS,
Packit d3f73b
	TCA_STATS,
Packit d3f73b
	TCA_XSTATS,
Packit d3f73b
	TCA_RATE,
Packit d3f73b
	TCA_FCNT,
Packit d3f73b
	TCA_STATS2,
Packit d3f73b
	TCA_STAB,
Packit d3f73b
	TCA_PAD,
Packit d3f73b
	TCA_DUMP_INVISIBLE,
Packit d3f73b
	TCA_CHAIN,
Packit d3f73b
	TCA_HW_OFFLOAD,
Packit d3f73b
	TCA_INGRESS_BLOCK,
Packit d3f73b
	TCA_EGRESS_BLOCK,
Packit d3f73b
	__TCA_MAX
Packit d3f73b
};
Packit d3f73b
Packit d3f73b
#define TCA_MAX (__TCA_MAX - 1)
Packit d3f73b
Packit d3f73b
#define TCA_RTA(r)  ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct tcmsg))))
Packit d3f73b
#define TCA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct tcmsg))
Packit d3f73b
Packit d3f73b
/********************************************************************
Packit d3f73b
 *		Neighbor Discovery userland options
Packit d3f73b
 ****/
Packit d3f73b
Packit d3f73b
struct nduseroptmsg {
Packit d3f73b
	unsigned char	nduseropt_family;
Packit d3f73b
	unsigned char	nduseropt_pad1;
Packit d3f73b
	unsigned short	nduseropt_opts_len;	/* Total length of options */
Packit d3f73b
	int		nduseropt_ifindex;
Packit d3f73b
	__u8		nduseropt_icmp_type;
Packit d3f73b
	__u8		nduseropt_icmp_code;
Packit d3f73b
	unsigned short	nduseropt_pad2;
Packit d3f73b
	unsigned int	nduseropt_pad3;
Packit d3f73b
	/* Followed by one or more ND options */
Packit d3f73b
};
Packit d3f73b
Packit d3f73b
enum {
Packit d3f73b
	NDUSEROPT_UNSPEC,
Packit d3f73b
	NDUSEROPT_SRCADDR,
Packit d3f73b
	__NDUSEROPT_MAX
Packit d3f73b
};
Packit d3f73b
Packit d3f73b
#define NDUSEROPT_MAX	(__NDUSEROPT_MAX - 1)
Packit d3f73b
Packit d3f73b
/* RTnetlink multicast groups - backwards compatibility for userspace */
Packit d3f73b
#define RTMGRP_LINK		1
Packit d3f73b
#define RTMGRP_NOTIFY		2
Packit d3f73b
#define RTMGRP_NEIGH		4
Packit d3f73b
#define RTMGRP_TC		8
Packit d3f73b
Packit d3f73b
#define RTMGRP_IPV4_IFADDR	0x10
Packit d3f73b
#define RTMGRP_IPV4_MROUTE	0x20
Packit d3f73b
#define RTMGRP_IPV4_ROUTE	0x40
Packit d3f73b
#define RTMGRP_IPV4_RULE	0x80
Packit d3f73b
Packit d3f73b
#define RTMGRP_IPV6_IFADDR	0x100
Packit d3f73b
#define RTMGRP_IPV6_MROUTE	0x200
Packit d3f73b
#define RTMGRP_IPV6_ROUTE	0x400
Packit d3f73b
#define RTMGRP_IPV6_IFINFO	0x800
Packit d3f73b
Packit d3f73b
#define RTMGRP_DECnet_IFADDR    0x1000
Packit d3f73b
#define RTMGRP_DECnet_ROUTE     0x4000
Packit d3f73b
Packit d3f73b
#define RTMGRP_IPV6_PREFIX	0x20000
Packit d3f73b
Packit d3f73b
/* RTnetlink multicast groups */
Packit d3f73b
enum rtnetlink_groups {
Packit d3f73b
	RTNLGRP_NONE,
Packit d3f73b
#define RTNLGRP_NONE		RTNLGRP_NONE
Packit d3f73b
	RTNLGRP_LINK,
Packit d3f73b
#define RTNLGRP_LINK		RTNLGRP_LINK
Packit d3f73b
	RTNLGRP_NOTIFY,
Packit d3f73b
#define RTNLGRP_NOTIFY		RTNLGRP_NOTIFY
Packit d3f73b
	RTNLGRP_NEIGH,
Packit d3f73b
#define RTNLGRP_NEIGH		RTNLGRP_NEIGH
Packit d3f73b
	RTNLGRP_TC,
Packit d3f73b
#define RTNLGRP_TC		RTNLGRP_TC
Packit d3f73b
	RTNLGRP_IPV4_IFADDR,
Packit d3f73b
#define RTNLGRP_IPV4_IFADDR	RTNLGRP_IPV4_IFADDR
Packit d3f73b
	RTNLGRP_IPV4_MROUTE,
Packit d3f73b
#define	RTNLGRP_IPV4_MROUTE	RTNLGRP_IPV4_MROUTE
Packit d3f73b
	RTNLGRP_IPV4_ROUTE,
Packit d3f73b
#define RTNLGRP_IPV4_ROUTE	RTNLGRP_IPV4_ROUTE
Packit d3f73b
	RTNLGRP_IPV4_RULE,
Packit d3f73b
#define RTNLGRP_IPV4_RULE	RTNLGRP_IPV4_RULE
Packit d3f73b
	RTNLGRP_IPV6_IFADDR,
Packit d3f73b
#define RTNLGRP_IPV6_IFADDR	RTNLGRP_IPV6_IFADDR
Packit d3f73b
	RTNLGRP_IPV6_MROUTE,
Packit d3f73b
#define RTNLGRP_IPV6_MROUTE	RTNLGRP_IPV6_MROUTE
Packit d3f73b
	RTNLGRP_IPV6_ROUTE,
Packit d3f73b
#define RTNLGRP_IPV6_ROUTE	RTNLGRP_IPV6_ROUTE
Packit d3f73b
	RTNLGRP_IPV6_IFINFO,
Packit d3f73b
#define RTNLGRP_IPV6_IFINFO	RTNLGRP_IPV6_IFINFO
Packit d3f73b
	RTNLGRP_DECnet_IFADDR,
Packit d3f73b
#define RTNLGRP_DECnet_IFADDR	RTNLGRP_DECnet_IFADDR
Packit d3f73b
	RTNLGRP_NOP2,
Packit d3f73b
	RTNLGRP_DECnet_ROUTE,
Packit d3f73b
#define RTNLGRP_DECnet_ROUTE	RTNLGRP_DECnet_ROUTE
Packit d3f73b
	RTNLGRP_DECnet_RULE,
Packit d3f73b
#define RTNLGRP_DECnet_RULE	RTNLGRP_DECnet_RULE
Packit d3f73b
	RTNLGRP_NOP4,
Packit d3f73b
	RTNLGRP_IPV6_PREFIX,
Packit d3f73b
#define RTNLGRP_IPV6_PREFIX	RTNLGRP_IPV6_PREFIX
Packit d3f73b
	RTNLGRP_IPV6_RULE,
Packit d3f73b
#define RTNLGRP_IPV6_RULE	RTNLGRP_IPV6_RULE
Packit d3f73b
	RTNLGRP_ND_USEROPT,
Packit d3f73b
#define RTNLGRP_ND_USEROPT	RTNLGRP_ND_USEROPT
Packit d3f73b
	RTNLGRP_PHONET_IFADDR,
Packit d3f73b
#define RTNLGRP_PHONET_IFADDR	RTNLGRP_PHONET_IFADDR
Packit d3f73b
	RTNLGRP_PHONET_ROUTE,
Packit d3f73b
#define RTNLGRP_PHONET_ROUTE	RTNLGRP_PHONET_ROUTE
Packit d3f73b
	RTNLGRP_DCB,
Packit d3f73b
#define RTNLGRP_DCB		RTNLGRP_DCB
Packit d3f73b
	RTNLGRP_IPV4_NETCONF,
Packit d3f73b
#define RTNLGRP_IPV4_NETCONF	RTNLGRP_IPV4_NETCONF
Packit d3f73b
	RTNLGRP_IPV6_NETCONF,
Packit d3f73b
#define RTNLGRP_IPV6_NETCONF	RTNLGRP_IPV6_NETCONF
Packit d3f73b
	RTNLGRP_MDB,
Packit d3f73b
#define RTNLGRP_MDB		RTNLGRP_MDB
Packit d3f73b
	RTNLGRP_MPLS_ROUTE,
Packit d3f73b
#define RTNLGRP_MPLS_ROUTE	RTNLGRP_MPLS_ROUTE
Packit d3f73b
	RTNLGRP_NSID,
Packit d3f73b
#define RTNLGRP_NSID		RTNLGRP_NSID
Packit d3f73b
	RTNLGRP_MPLS_NETCONF,
Packit d3f73b
#define RTNLGRP_MPLS_NETCONF	RTNLGRP_MPLS_NETCONF
Packit d3f73b
	RTNLGRP_IPV4_MROUTE_R,
Packit d3f73b
#define RTNLGRP_IPV4_MROUTE_R	RTNLGRP_IPV4_MROUTE_R
Packit d3f73b
	RTNLGRP_IPV6_MROUTE_R,
Packit d3f73b
#define RTNLGRP_IPV6_MROUTE_R	RTNLGRP_IPV6_MROUTE_R
Packit d3f73b
	RTNLGRP_NEXTHOP,
Packit d3f73b
#define RTNLGRP_NEXTHOP		RTNLGRP_NEXTHOP
Packit d3f73b
	__RTNLGRP_MAX
Packit d3f73b
};
Packit d3f73b
#define RTNLGRP_MAX	(__RTNLGRP_MAX - 1)
Packit d3f73b
Packit d3f73b
/* TC action piece */
Packit d3f73b
struct tcamsg {
Packit d3f73b
	unsigned char	tca_family;
Packit d3f73b
	unsigned char	tca__pad1;
Packit d3f73b
	unsigned short	tca__pad2;
Packit d3f73b
};
Packit d3f73b
Packit d3f73b
enum {
Packit d3f73b
	TCA_ROOT_UNSPEC,
Packit d3f73b
	TCA_ROOT_TAB,
Packit d3f73b
#define TCA_ACT_TAB TCA_ROOT_TAB
Packit d3f73b
#define TCAA_MAX TCA_ROOT_TAB
Packit d3f73b
	TCA_ROOT_FLAGS,
Packit d3f73b
	TCA_ROOT_COUNT,
Packit d3f73b
	TCA_ROOT_TIME_DELTA, /* in msecs */
Packit d3f73b
	__TCA_ROOT_MAX,
Packit d3f73b
#define	TCA_ROOT_MAX (__TCA_ROOT_MAX - 1)
Packit d3f73b
};
Packit d3f73b
Packit d3f73b
#define TA_RTA(r)  ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct tcamsg))))
Packit d3f73b
#define TA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct tcamsg))
Packit d3f73b
/* tcamsg flags stored in attribute TCA_ROOT_FLAGS
Packit d3f73b
 *
Packit d3f73b
 * TCA_FLAG_LARGE_DUMP_ON user->kernel to request for larger than TCA_ACT_MAX_PRIO
Packit d3f73b
 * actions in a dump. All dump responses will contain the number of actions
Packit d3f73b
 * being dumped stored in for user app's consumption in TCA_ROOT_COUNT
Packit d3f73b
 *
Packit d3f73b
 */
Packit d3f73b
#define TCA_FLAG_LARGE_DUMP_ON		(1 << 0)
Packit d3f73b
Packit d3f73b
/* New extended info filters for IFLA_EXT_MASK */
Packit d3f73b
#define RTEXT_FILTER_VF		(1 << 0)
Packit d3f73b
#define RTEXT_FILTER_BRVLAN	(1 << 1)
Packit d3f73b
#define RTEXT_FILTER_BRVLAN_COMPRESSED	(1 << 2)
Packit d3f73b
#define	RTEXT_FILTER_SKIP_STATS	(1 << 3)
Packit d3f73b
Packit d3f73b
/* End of information exported to user level */
Packit d3f73b
Packit d3f73b
Packit d3f73b
Packit d3f73b
#endif /* __LINUX_RTNETLINK_H */