xref: /freebsd/sys/netlink/route/route.h (revision 969cb79f5b7e7547d24895c40d6735fe07cbcf35)
17e5bf684SAlexander V. Chernikov /*-
24d846d26SWarner Losh  * SPDX-License-Identifier: BSD-2-Clause
37e5bf684SAlexander V. Chernikov  *
47e5bf684SAlexander V. Chernikov  * Copyright (c) 2022 Alexander V. Chernikov <melifaro@FreeBSD.org>
57e5bf684SAlexander V. Chernikov  *
67e5bf684SAlexander V. Chernikov  * Redistribution and use in source and binary forms, with or without
77e5bf684SAlexander V. Chernikov  * modification, are permitted provided that the following conditions
87e5bf684SAlexander V. Chernikov  * are met:
97e5bf684SAlexander V. Chernikov  * 1. Redistributions of source code must retain the above copyright
107e5bf684SAlexander V. Chernikov  *    notice, this list of conditions and the following disclaimer.
117e5bf684SAlexander V. Chernikov  * 2. Redistributions in binary form must reproduce the above copyright
127e5bf684SAlexander V. Chernikov  *    notice, this list of conditions and the following disclaimer in the
137e5bf684SAlexander V. Chernikov  *    documentation and/or other materials provided with the distribution.
147e5bf684SAlexander V. Chernikov  *
157e5bf684SAlexander V. Chernikov  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
167e5bf684SAlexander V. Chernikov  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
177e5bf684SAlexander V. Chernikov  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
187e5bf684SAlexander V. Chernikov  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
197e5bf684SAlexander V. Chernikov  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
207e5bf684SAlexander V. Chernikov  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
217e5bf684SAlexander V. Chernikov  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
227e5bf684SAlexander V. Chernikov  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
237e5bf684SAlexander V. Chernikov  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
247e5bf684SAlexander V. Chernikov  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
257e5bf684SAlexander V. Chernikov  * SUCH DAMAGE.
267e5bf684SAlexander V. Chernikov  */
277e5bf684SAlexander V. Chernikov 
287e5bf684SAlexander V. Chernikov /*
297e5bf684SAlexander V. Chernikov  * Route-related (RTM_<NEW|DEL|GET>ROUTE) message header and attributes.
307e5bf684SAlexander V. Chernikov  */
317e5bf684SAlexander V. Chernikov 
327e5bf684SAlexander V. Chernikov #ifndef _NETLINK_ROUTE_ROUTE_H_
337e5bf684SAlexander V. Chernikov #define _NETLINK_ROUTE_ROUTE_H_
347e5bf684SAlexander V. Chernikov 
357e5bf684SAlexander V. Chernikov /* Base header for all of the relevant messages */
367e5bf684SAlexander V. Chernikov struct rtmsg {
377e5bf684SAlexander V. Chernikov 	unsigned char	rtm_family;	/* address family */
387e5bf684SAlexander V. Chernikov 	unsigned char	rtm_dst_len;	/* Prefix length */
397e5bf684SAlexander V. Chernikov 	unsigned char	rtm_src_len;	/* Source prefix length (not used) */
407e5bf684SAlexander V. Chernikov 	unsigned char	rtm_tos;	/* Type of service (not used) */
417e5bf684SAlexander V. Chernikov 	unsigned char	rtm_table;	/* rtable id */
427e5bf684SAlexander V. Chernikov 	unsigned char	rtm_protocol;	/* Routing protocol id (RTPROT_) */
437e5bf684SAlexander V. Chernikov 	unsigned char	rtm_scope;	/* Route distance (RT_SCOPE_) */
447e5bf684SAlexander V. Chernikov 	unsigned char	rtm_type;	/* Route type (RTN_) */
457e5bf684SAlexander V. Chernikov 	unsigned 	rtm_flags;	/* Route flags (RTM_F_) */
467e5bf684SAlexander V. Chernikov };
477e5bf684SAlexander V. Chernikov 
487e5bf684SAlexander V. Chernikov /*
497e5bf684SAlexander V. Chernikov  * RFC 3549, 3.1.1, route type (rtm_type field).
507e5bf684SAlexander V. Chernikov  */
517e5bf684SAlexander V. Chernikov enum {
527e5bf684SAlexander V. Chernikov 	RTN_UNSPEC,
537e5bf684SAlexander V. Chernikov 	RTN_UNICAST,		/* Unicast route */
547e5bf684SAlexander V. Chernikov 	RTN_LOCAL,		/* Accept locally (not supported) */
557e5bf684SAlexander V. Chernikov 	RTN_BROADCAST,		/* Accept locally as broadcast, send as broadcast */
567e5bf684SAlexander V. Chernikov 	RTN_ANYCAST,		/* Accept locally as broadcast, but send as unicast */
577e5bf684SAlexander V. Chernikov 	RTN_MULTICAST,		/* Multicast route */
587e5bf684SAlexander V. Chernikov 	RTN_BLACKHOLE,		/* Drop traffic towards destination */
597e5bf684SAlexander V. Chernikov 	RTN_UNREACHABLE,	/* Destination is unreachable */
607e5bf684SAlexander V. Chernikov 	RTN_PROHIBIT,		/* Administratively prohibited */
617e5bf684SAlexander V. Chernikov 	RTN_THROW,		/* Not in this table (not supported) */
627e5bf684SAlexander V. Chernikov 	RTN_NAT,		/* Translate this address (not supported) */
637e5bf684SAlexander V. Chernikov 	RTN_XRESOLVE,		/* Use external resolver (not supported) */
647e5bf684SAlexander V. Chernikov 	__RTN_MAX,
657e5bf684SAlexander V. Chernikov };
667e5bf684SAlexander V. Chernikov #define RTN_MAX (__RTN_MAX - 1)
677e5bf684SAlexander V. Chernikov 
687e5bf684SAlexander V. Chernikov /*
697e5bf684SAlexander V. Chernikov  * RFC 3549, 3.1.1, protocol (Identifies what/who added the route).
707e5bf684SAlexander V. Chernikov  * Values larger than RTPROT_STATIC(4) are not interpreted by the
717e5bf684SAlexander V. Chernikov  * kernel, they are just for user information.
727e5bf684SAlexander V. Chernikov  */
737e5bf684SAlexander V. Chernikov #define	RTPROT_UNSPEC		0
747e5bf684SAlexander V. Chernikov #define RTPROT_REDIRECT		1 /* Route installed by ICMP redirect */
757e5bf684SAlexander V. Chernikov #define RTPROT_KERNEL		2 /* Route installed by kernel */
767e5bf684SAlexander V. Chernikov #define RTPROT_BOOT		3 /* Route installed during boot */
777e5bf684SAlexander V. Chernikov #define RTPROT_STATIC		4 /* Route installed by administrator */
787e5bf684SAlexander V. Chernikov 
797e5bf684SAlexander V. Chernikov #define	RTPROT_GATED		8
807e5bf684SAlexander V. Chernikov #define RTPROT_RA		9
817e5bf684SAlexander V. Chernikov #define RTPROT_MRT		1
827e5bf684SAlexander V. Chernikov #define RTPROT_ZEBRA		11
837e5bf684SAlexander V. Chernikov #define RTPROT_BIRD		12
847e5bf684SAlexander V. Chernikov #define RTPROT_DNROUTED		13
857e5bf684SAlexander V. Chernikov #define RTPROT_XORP		14
867e5bf684SAlexander V. Chernikov #define RTPROT_NTK		15
877e5bf684SAlexander V. Chernikov #define RTPROT_DHCP		16
887e5bf684SAlexander V. Chernikov #define RTPROT_MROUTED		17
897e5bf684SAlexander V. Chernikov #define RTPROT_KEEPALIVED	18
907e5bf684SAlexander V. Chernikov #define RTPROT_BABEL		42
917e5bf684SAlexander V. Chernikov #define RTPROT_OPENR		99
927e5bf684SAlexander V. Chernikov #define RTPROT_BGP		186
937e5bf684SAlexander V. Chernikov #define RTPROT_ISIS		187
947e5bf684SAlexander V. Chernikov #define RTPROT_OSPF		188
957e5bf684SAlexander V. Chernikov #define RTPROT_RIP		189
967e5bf684SAlexander V. Chernikov #define RTPROT_EIGRP		192
977e5bf684SAlexander V. Chernikov 
987e5bf684SAlexander V. Chernikov /*
997e5bf684SAlexander V. Chernikov  * RFC 3549 3.1.1 Route scope (valid distance to destination).
1007e5bf684SAlexander V. Chernikov  *
1017e5bf684SAlexander V. Chernikov  * The values between RT_SCOPE_UNIVERSE(0) and RT_SCOPE_SITE(200)
1027e5bf684SAlexander V. Chernikov  *  are available to the user.
1037e5bf684SAlexander V. Chernikov  */
1047e5bf684SAlexander V. Chernikov enum rt_scope_t {
1057e5bf684SAlexander V. Chernikov 	RT_SCOPE_UNIVERSE = 0,
1067e5bf684SAlexander V. Chernikov 	/* User defined values  */
1077e5bf684SAlexander V. Chernikov 	RT_SCOPE_SITE = 200,
1087e5bf684SAlexander V. Chernikov 	RT_SCOPE_LINK = 253,
1097e5bf684SAlexander V. Chernikov 	RT_SCOPE_HOST = 254,
1107e5bf684SAlexander V. Chernikov 	RT_SCOPE_NOWHERE = 255
1117e5bf684SAlexander V. Chernikov };
1127e5bf684SAlexander V. Chernikov 
1137e5bf684SAlexander V. Chernikov /*
1147e5bf684SAlexander V. Chernikov  * RFC 3549 3.1.1 Route flags (rtm_flags).
1157e5bf684SAlexander V. Chernikov  * Is a composition of RTNH_F flags (0x1..0x40 range), RTM_F flags (below)
1167e5bf684SAlexander V. Chernikov  * and per-protocol (IPv4/IPv6) flags.
1177e5bf684SAlexander V. Chernikov  */
1187e5bf684SAlexander V. Chernikov #define RTM_F_NOTIFY		0x00000100 /* not supported */
1197e5bf684SAlexander V. Chernikov #define RTM_F_CLONED		0x00000200 /* not supported */
1207e5bf684SAlexander V. Chernikov #define RTM_F_EQUALIZE		0x00000400 /* not supported */
1217e5bf684SAlexander V. Chernikov #define RTM_F_PREFIX		0x00000800 /* not supported */
1227e5bf684SAlexander V. Chernikov #define RTM_F_LOOKUP_TABLE	0x00001000 /* not supported */
1237e5bf684SAlexander V. Chernikov #define RTM_F_FIB_MATCH		0x00002000 /* not supported */
1247e5bf684SAlexander V. Chernikov #define RTM_F_OFFLOAD		0x00004000 /* not supported */
1257e5bf684SAlexander V. Chernikov #define RTM_F_TRAP		0x00008000 /* not supported */
1267e5bf684SAlexander V. Chernikov #define RTM_F_OFFLOAD_FAILED	0x20000000 /* not supported */
1277e5bf684SAlexander V. Chernikov 
1287e5bf684SAlexander V. Chernikov /* Compatibility handling helpers */
1297e5bf684SAlexander V. Chernikov #ifndef _KERNEL
1307e5bf684SAlexander V. Chernikov #define	NL_RTM_HDRLEN		((int)sizeof(struct rtmsg))
1317e5bf684SAlexander V. Chernikov #define	RTM_RTA(_rtm)		((struct rtattr *)((char *)(_rtm) + NL_RTM_HDRLEN))
1327e5bf684SAlexander V. Chernikov #define	RTM_PAYLOAD(_hdr)	NLMSG_PAYLOAD((_hdr), NL_RTM_HDRLEN)
1337e5bf684SAlexander V. Chernikov #endif
1347e5bf684SAlexander V. Chernikov 
1357e5bf684SAlexander V. Chernikov /*
1367e5bf684SAlexander V. Chernikov  * Routing table identifiers.
137*969cb79fSGleb Smirnoff  * FreeBSD route table numbering starts from 0, where 0 is a valid default
138*969cb79fSGleb Smirnoff  * routing table.  Indicating "all tables" via netlink can be done by not
139*969cb79fSGleb Smirnoff  * including RTA_TABLE attribute and keeping rtm_table=0 (compatibility) or
140*969cb79fSGleb Smirnoff  * setting RTA_TABLE value to RT_TABLE_UNSPEC.
1417e5bf684SAlexander V. Chernikov  */
1427e5bf684SAlexander V. Chernikov #define	RT_TABLE_MAIN	0		/* RT_DEFAULT_FIB */
1437e5bf684SAlexander V. Chernikov #define	RT_TABLE_UNSPEC	0xFFFFFFFF	/* RT_ALL_FIBS */
1447e5bf684SAlexander V. Chernikov 
1457e5bf684SAlexander V. Chernikov enum rtattr_type_t {
1467e5bf684SAlexander V. Chernikov 	NL_RTA_UNSPEC,
1477e5bf684SAlexander V. Chernikov 	NL_RTA_DST		= 1, /* binary, IPv4/IPv6 destination */
1487e5bf684SAlexander V. Chernikov 	NL_RTA_SRC		= 2, /* binary, preferred source address */
1497e5bf684SAlexander V. Chernikov 	NL_RTA_IIF		= 3, /* not supported */
1507e5bf684SAlexander V. Chernikov 	NL_RTA_OIF		= 4, /* u32, transmit ifindex */
1517e5bf684SAlexander V. Chernikov 	NL_RTA_GATEWAY		= 5, /* binary: IPv4/IPv6 gateway */
1527e5bf684SAlexander V. Chernikov 	NL_RTA_PRIORITY		= 6, /* not supported */
1537e5bf684SAlexander V. Chernikov 	NL_RTA_PREFSRC		= 7, /* not supported */
1547e5bf684SAlexander V. Chernikov 	NL_RTA_METRICS		= 8, /* nested, list of NL_RTAX* attrs */
1557e5bf684SAlexander V. Chernikov 	NL_RTA_MULTIPATH	= 9, /* binary, array of struct rtnexthop */
1567e5bf684SAlexander V. Chernikov 	NL_RTA_PROTOINFO	= 10, /* not supported / deprecated */
1577e5bf684SAlexander V. Chernikov 	NL_RTA_KNH_ID		= 10, /* u32, FreeBSD specific, kernel nexthop index */
1587e5bf684SAlexander V. Chernikov 	NL_RTA_FLOW		= 11, /* not supported */
1597e5bf684SAlexander V. Chernikov 	NL_RTA_CACHEINFO	= 12, /* not supported */
1607e5bf684SAlexander V. Chernikov 	NL_RTA_SESSION		= 13, /* not supported / deprecated */
1613ebccb20SAlexander V. Chernikov 	NL_RTA_WEIGHT		= 13, /* u32, FreeBSD specific, path weight */
1627e5bf684SAlexander V. Chernikov 	NL_RTA_MP_ALGO		= 14, /* not supported / deprecated */
1633ebccb20SAlexander V. Chernikov 	NL_RTA_RTFLAGS		= 14, /* u32, FreeBSD specific, path flags (RTF_)*/
1647e5bf684SAlexander V. Chernikov 	NL_RTA_TABLE		= 15, /* u32, fibnum */
1657e5bf684SAlexander V. Chernikov 	NL_RTA_MARK		= 16, /* not supported */
1667e5bf684SAlexander V. Chernikov 	NL_RTA_MFC_STATS	= 17, /* not supported */
1677e5bf684SAlexander V. Chernikov 	NL_RTA_VIA		= 18, /* binary, struct rtvia */
1687e5bf684SAlexander V. Chernikov 	NL_RTA_NEWDST		= 19, /* not supported */
1697e5bf684SAlexander V. Chernikov 	NL_RTA_PREF		= 20, /* not supported */
1707e5bf684SAlexander V. Chernikov 	NL_RTA_ENCAP_TYPE	= 21, /* not supported */
1717e5bf684SAlexander V. Chernikov 	NL_RTA_ENCAP		= 22, /* not supported */
1727e5bf684SAlexander V. Chernikov 	NL_RTA_EXPIRES		= 23, /* u32, seconds till expiration */
1737e5bf684SAlexander V. Chernikov 	NL_RTA_PAD		= 24, /* not supported */
1747e5bf684SAlexander V. Chernikov 	NL_RTA_UID		= 25, /* not supported */
1757e5bf684SAlexander V. Chernikov 	NL_RTA_TTL_PROPAGATE	= 26, /* not supported */
1767e5bf684SAlexander V. Chernikov 	NL_RTA_IP_PROTO		= 27, /* not supported */
1777e5bf684SAlexander V. Chernikov 	NL_RTA_SPORT		= 28, /* not supported */
1787e5bf684SAlexander V. Chernikov 	NL_RTA_DPORT		= 29, /* not supported */
1797e5bf684SAlexander V. Chernikov 	NL_RTA_NH_ID		= 30, /* u32, nexthop/nexthop group index */
1807e5bf684SAlexander V. Chernikov 	__RTA_MAX
1817e5bf684SAlexander V. Chernikov };
1827e5bf684SAlexander V. Chernikov #define NL_RTA_MAX (__RTA_MAX - 1)
1837e5bf684SAlexander V. Chernikov 
1847e5bf684SAlexander V. Chernikov /*
1857e5bf684SAlexander V. Chernikov  * Attributes that can be used as filters:
1867e5bf684SAlexander V. Chernikov  *
1877e5bf684SAlexander V. Chernikov  */
1887e5bf684SAlexander V. Chernikov 
1897e5bf684SAlexander V. Chernikov #ifndef _KERNEL
1907e5bf684SAlexander V. Chernikov /*
1917e5bf684SAlexander V. Chernikov  * RTA_* space has clashes with rtsock namespace.
1927e5bf684SAlexander V. Chernikov  * Use NL_RTA_ prefix in the kernel and map to
1937e5bf684SAlexander V. Chernikov  * RTA_ for userland.
1947e5bf684SAlexander V. Chernikov  */
1957e5bf684SAlexander V. Chernikov #define RTA_UNSPEC		NL_RTA_UNSPEC
1967e5bf684SAlexander V. Chernikov #define RTA_DST			NL_RTA_DST
1977e5bf684SAlexander V. Chernikov #define RTA_SRC			NL_RTA_SRC
1987e5bf684SAlexander V. Chernikov #define RTA_IIF			NL_RTA_IIF
1997e5bf684SAlexander V. Chernikov #define RTA_OIF			NL_RTA_OIF
2007e5bf684SAlexander V. Chernikov #define RTA_GATEWAY		NL_RTA_GATEWAY
2017e5bf684SAlexander V. Chernikov #define RTA_PRIORITY		NL_RTA_PRIORITY
2027e5bf684SAlexander V. Chernikov #define RTA_PREFSRC		NL_RTA_PREFSRC
2037e5bf684SAlexander V. Chernikov #define RTA_METRICS		NL_RTA_METRICS
2047e5bf684SAlexander V. Chernikov #define RTA_MULTIPATH		NL_RTA_MULTIPATH
2057e5bf684SAlexander V. Chernikov #define	RTA_PROTOINFO		NL_RTA_PROTOINFO
2067e5bf684SAlexander V. Chernikov #define	RTA_KNH_ID		NL_RTA_KNH_ID
2077e5bf684SAlexander V. Chernikov #define RTA_FLOW		NL_RTA_FLOW
2087e5bf684SAlexander V. Chernikov #define RTA_CACHEINFO		NL_RTA_CACHEINFO
2097e5bf684SAlexander V. Chernikov #define	RTA_SESSION		NL_RTA_SESSION
2107e5bf684SAlexander V. Chernikov #define	RTA_MP_ALGO		NL_RTA_MP_ALGO
2117e5bf684SAlexander V. Chernikov #define RTA_TABLE		NL_RTA_TABLE
2127e5bf684SAlexander V. Chernikov #define RTA_MARK		NL_RTA_MARK
2137e5bf684SAlexander V. Chernikov #define RTA_MFC_STATS		NL_RTA_MFC_STATS
2147e5bf684SAlexander V. Chernikov #define RTA_VIA			NL_RTA_VIA
2157e5bf684SAlexander V. Chernikov #define RTA_NEWDST		NL_RTA_NEWDST
2167e5bf684SAlexander V. Chernikov #define RTA_PREF		NL_RTA_PREF
2177e5bf684SAlexander V. Chernikov #define RTA_ENCAP_TYPE		NL_RTA_ENCAP_TYPE
2187e5bf684SAlexander V. Chernikov #define RTA_ENCAP		NL_RTA_ENCAP
2197e5bf684SAlexander V. Chernikov #define RTA_EXPIRES		NL_RTA_EXPIRES
2207e5bf684SAlexander V. Chernikov #define RTA_PAD			NL_RTA_PAD
2217e5bf684SAlexander V. Chernikov #define RTA_UID			NL_RTA_UID
2227e5bf684SAlexander V. Chernikov #define RTA_TTL_PROPAGATE	NL_RTA_TTL_PROPAGATE
2237e5bf684SAlexander V. Chernikov #define RTA_IP_PROTO		NL_RTA_IP_PROTO
2247e5bf684SAlexander V. Chernikov #define RTA_SPORT		NL_RTA_SPORT
2257e5bf684SAlexander V. Chernikov #define RTA_DPORT		NL_RTA_DPORT
2267e5bf684SAlexander V. Chernikov #define RTA_NH_ID		NL_RTA_NH_ID
2277e5bf684SAlexander V. Chernikov #define	RTA_MAX			NL_RTA_MAX
2287e5bf684SAlexander V. Chernikov #endif
2297e5bf684SAlexander V. Chernikov 
2307e5bf684SAlexander V. Chernikov /* route attribute header */
2317e5bf684SAlexander V. Chernikov struct rtattr {
2327e5bf684SAlexander V. Chernikov 	unsigned short rta_len;
2337e5bf684SAlexander V. Chernikov 	unsigned short rta_type;
2347e5bf684SAlexander V. Chernikov };
2357e5bf684SAlexander V. Chernikov 
2367e5bf684SAlexander V. Chernikov #define	NL_RTA_ALIGN_SIZE	NL_ITEM_ALIGN_SIZE
2377e5bf684SAlexander V. Chernikov #define	NL_RTA_ALIGN		NL_ITEM_ALIGN
2387e5bf684SAlexander V. Chernikov #define	NL_RTA_HDRLEN		((int)sizeof(struct rtattr))
2397e5bf684SAlexander V. Chernikov #define	NL_RTA_DATA_LEN(_rta)	((int)((_rta)->rta_len - NL_RTA_HDRLEN))
2407e5bf684SAlexander V. Chernikov #define	NL_RTA_DATA(_rta)	NL_ITEM_DATA(_rta, NL_RTA_HDRLEN)
2417e5bf684SAlexander V. Chernikov #define	NL_RTA_DATA_CONST(_rta)	NL_ITEM_DATA_CONST(_rta, NL_RTA_HDRLEN)
2427e5bf684SAlexander V. Chernikov 
2437e5bf684SAlexander V. Chernikov /* Compatibility attribute handling helpers */
2447e5bf684SAlexander V. Chernikov #ifndef _KERNEL
2457e5bf684SAlexander V. Chernikov #define	RTA_ALIGNTO		NL_RTA_ALIGN_SIZE
2467e5bf684SAlexander V. Chernikov #define	RTA_ALIGN(_len)		NL_RTA_ALIGN(_len)
2477e5bf684SAlexander V. Chernikov #define	_RTA_LEN(_rta)		((int)(_rta)->rta_len)
2487e5bf684SAlexander V. Chernikov #define	_RTA_ALIGNED_LEN(_rta)	RTA_ALIGN(_RTA_LEN(_rta))
2497e5bf684SAlexander V. Chernikov #define	RTA_OK(_rta, _len)	NL_ITEM_OK(_rta, _len, NL_RTA_HDRLEN, _RTA_LEN)
2507e5bf684SAlexander V. Chernikov #define	RTA_NEXT(_rta, _len)	NL_ITEM_ITER(_rta, _len, _RTA_ALIGNED_LEN)
2517e5bf684SAlexander V. Chernikov #define	RTA_LENGTH(_len)	(NL_RTA_HDRLEN + (_len))
2527e5bf684SAlexander V. Chernikov #define	RTA_SPACE(_len)		RTA_ALIGN(RTA_LENGTH(_len))
2537e5bf684SAlexander V. Chernikov #define	RTA_DATA(_rta)		NL_RTA_DATA(_rta)
2547e5bf684SAlexander V. Chernikov #define	RTA_PAYLOAD(_rta)	((int)(_RTA_LEN(_rta) - NL_RTA_HDRLEN))
2557e5bf684SAlexander V. Chernikov #endif
2567e5bf684SAlexander V. Chernikov 
2577e5bf684SAlexander V. Chernikov /* RTA attribute headers */
2587e5bf684SAlexander V. Chernikov 
2597e5bf684SAlexander V. Chernikov /* RTA_VIA */
2607e5bf684SAlexander V. Chernikov struct rtvia {
2617e5bf684SAlexander V. Chernikov 	sa_family_t	rtvia_family;
2627e5bf684SAlexander V. Chernikov 	uint8_t		rtvia_addr[0];
2637e5bf684SAlexander V. Chernikov };
2647e5bf684SAlexander V. Chernikov 
2657e5bf684SAlexander V. Chernikov /*
2667e5bf684SAlexander V. Chernikov  * RTA_METRICS is a nested attribute, consisting of a list of
2677e5bf684SAlexander V. Chernikov  * TLVs with types defined below.
2687e5bf684SAlexander V. Chernikov  */
2697e5bf684SAlexander V. Chernikov  enum {
2707e5bf684SAlexander V. Chernikov 	NL_RTAX_UNSPEC,
2717e5bf684SAlexander V. Chernikov 	NL_RTAX_LOCK			= 1, /* not supported */
2727e5bf684SAlexander V. Chernikov 	NL_RTAX_MTU			= 2, /* desired path MTU */
2737e5bf684SAlexander V. Chernikov 	NL_RTAX_WINDOW			= 3, /* not supported */
2747e5bf684SAlexander V. Chernikov 	NL_RTAX_RTT			= 4, /* not supported */
2757e5bf684SAlexander V. Chernikov 	NL_RTAX_RTTVAR			= 5, /* not supported */
2767e5bf684SAlexander V. Chernikov 	NL_RTAX_SSTHRESH		= 6, /* not supported */
2777e5bf684SAlexander V. Chernikov 	NL_RTAX_CWND			= 7, /* not supported */
2787e5bf684SAlexander V. Chernikov 	NL_RTAX_ADVMSS			= 8, /* not supported  */
2797e5bf684SAlexander V. Chernikov 	NL_RTAX_REORDERING		= 9, /* not supported */
2807e5bf684SAlexander V. Chernikov 	NL_RTAX_HOPLIMIT		= 10, /* not supported */
2817e5bf684SAlexander V. Chernikov 	NL_RTAX_INITCWND		= 11, /* not supporrted */
2827e5bf684SAlexander V. Chernikov 	NL_RTAX_FEATURES		= 12, /* not supported */
2837e5bf684SAlexander V. Chernikov 	NL_RTAX_RTO_MIN			= 13, /* not supported */
2847e5bf684SAlexander V. Chernikov 	NL_RTAX_INITRWND		= 14, /* not supported */
2857e5bf684SAlexander V. Chernikov 	NL_RTAX_QUICKACK		= 15, /* not supported */
28616f8d882SMarek Zarychta 	NL_RTAX_CC_ALGO			= 16, /* not supported */
28716f8d882SMarek Zarychta 	NL_RTAX_FASTOPEN_NO_COOKIE	= 17, /* not supported */
2887e5bf684SAlexander V. Chernikov 	__NL_RTAX_MAX
2897e5bf684SAlexander V. Chernikov };
2907e5bf684SAlexander V. Chernikov #define NL_RTAX_MAX (__NL_RTAX_MAX - 1)
2917e5bf684SAlexander V. Chernikov 
2927e5bf684SAlexander V. Chernikov #define RTAX_FEATURE_ECN (1 << 0)
2937e5bf684SAlexander V. Chernikov #define RTAX_FEATURE_SACK (1 << 1)
2947e5bf684SAlexander V. Chernikov #define RTAX_FEATURE_TIMESTAMP (1 << 2)
2957e5bf684SAlexander V. Chernikov #define RTAX_FEATURE_ALLFRAG (1 << 3)
2967e5bf684SAlexander V. Chernikov 
2977e5bf684SAlexander V. Chernikov #define RTAX_FEATURE_MASK                                                \
2987e5bf684SAlexander V. Chernikov 	(RTAX_FEATURE_ECN | RTAX_FEATURE_SACK | RTAX_FEATURE_TIMESTAMP | \
2997e5bf684SAlexander V. Chernikov 	    RTAX_FEATURE_ALLFRAG)
3007e5bf684SAlexander V. Chernikov 
3017e5bf684SAlexander V. Chernikov #ifndef _KERNEL
3027e5bf684SAlexander V. Chernikov 
3037e5bf684SAlexander V. Chernikov /*
3047e5bf684SAlexander V. Chernikov  * RTAX_* space clashes with rtsock namespace.
3057e5bf684SAlexander V. Chernikov  * Use NL_RTAX_ prefix in the kernel and map to
3067e5bf684SAlexander V. Chernikov  * RTAX_ for userland.
3077e5bf684SAlexander V. Chernikov  */
3087e5bf684SAlexander V. Chernikov #define RTAX_UNSPEC		NL_RTAX_UNSPEC
3097e5bf684SAlexander V. Chernikov #define RTAX_LOCK		NL_RTAX_LOCK
3107e5bf684SAlexander V. Chernikov #define RTAX_MTU		NL_RTAX_MTU
3117e5bf684SAlexander V. Chernikov #define RTAX_WINDOW		NL_RTAX_WINDOW
3127e5bf684SAlexander V. Chernikov #define RTAX_RTT		NL_RTAX_RTT
3137e5bf684SAlexander V. Chernikov #define RTAX_RTTVAR		NL_RTAX_RTTVAR
3147e5bf684SAlexander V. Chernikov #define RTAX_SSTHRESH		NL_RTAX_SSTHRESH
3157e5bf684SAlexander V. Chernikov #define RTAX_CWND		NL_RTAX_CWND
3167e5bf684SAlexander V. Chernikov #define RTAX_ADVMSS		NL_RTAX_ADVMSS
3177e5bf684SAlexander V. Chernikov #define RTAX_REORDERING		NL_RTAX_REORDERING
3187e5bf684SAlexander V. Chernikov #define RTAX_HOPLIMIT		NL_RTAX_HOPLIMIT
3197e5bf684SAlexander V. Chernikov #define RTAX_INITCWND		NL_RTAX_INITCWND
3207e5bf684SAlexander V. Chernikov #define RTAX_FEATURES		NL_RTAX_FEATURES
3217e5bf684SAlexander V. Chernikov #define RTAX_RTO_MIN		NL_RTAX_RTO_MIN
3227e5bf684SAlexander V. Chernikov #define RTAX_INITRWND		NL_RTAX_INITRWND
3237e5bf684SAlexander V. Chernikov #define RTAX_QUICKACK		NL_RTAX_QUICKACK
3247e5bf684SAlexander V. Chernikov #define RTAX_CC_ALGO		NL_RTAX_CC_ALGO
3257e5bf684SAlexander V. Chernikov #define RTAX_FASTOPEN_NO_COOKIE	NL_RTAX_FASTOPEN_NO_COOKIE
3267e5bf684SAlexander V. Chernikov #endif
3277e5bf684SAlexander V. Chernikov 
3287e5bf684SAlexander V. Chernikov /*
3297e5bf684SAlexander V. Chernikov  * RTA_MULTIPATH consists of an array of rtnexthop structures.
3307e5bf684SAlexander V. Chernikov  * Each rtnexthop structure contains RTA_GATEWAY or RTA_VIA
3317e5bf684SAlexander V. Chernikov  * attribute following the header.
3327e5bf684SAlexander V. Chernikov  */
3337e5bf684SAlexander V. Chernikov struct rtnexthop {
3347e5bf684SAlexander V. Chernikov 	unsigned short		rtnh_len;
3357e5bf684SAlexander V. Chernikov 	unsigned char		rtnh_flags;
3367e5bf684SAlexander V. Chernikov 	unsigned char		rtnh_hops;	/* nexthop weight */
3377e5bf684SAlexander V. Chernikov 	int			rtnh_ifindex;
3387e5bf684SAlexander V. Chernikov };
3397e5bf684SAlexander V. Chernikov 
3407e5bf684SAlexander V. Chernikov /* rtnh_flags */
3417e5bf684SAlexander V. Chernikov #define RTNH_F_DEAD		0x01	/* not supported */
3427e5bf684SAlexander V. Chernikov #define RTNH_F_PERVASIVE	0x02	/* not supported */
3437e5bf684SAlexander V. Chernikov #define RTNH_F_ONLINK		0x04	/* not supported */
3447e5bf684SAlexander V. Chernikov #define RTNH_F_OFFLOAD		0x08	/* not supported */
3457e5bf684SAlexander V. Chernikov #define RTNH_F_LINKDOWN		0x10	/* not supported */
3467e5bf684SAlexander V. Chernikov #define RTNH_F_UNRESOLVED	0x20	/* not supported */
3477e5bf684SAlexander V. Chernikov #define RTNH_F_TRAP		0x40	/* not supported */
3487e5bf684SAlexander V. Chernikov 
3497e5bf684SAlexander V. Chernikov #define RTNH_COMPARE_MASK	(RTNH_F_DEAD | RTNH_F_LINKDOWN | \
3507e5bf684SAlexander V. Chernikov 				 RTNH_F_OFFLOAD | RTNH_F_TRAP)
3517e5bf684SAlexander V. Chernikov 
3527e5bf684SAlexander V. Chernikov /* Macros to handle hexthops */
3537e5bf684SAlexander V. Chernikov #define	RTNH_ALIGNTO		NL_ITEM_ALIGN_SIZE
3547e5bf684SAlexander V. Chernikov #define	RTNH_ALIGN(_len)	NL_ITEM_ALIGN(_len)
3557e5bf684SAlexander V. Chernikov #define	RTNH_HDRLEN		((int)sizeof(struct rtnexthop))
3567e5bf684SAlexander V. Chernikov #define	_RTNH_LEN(_nh)		((int)(_nh)->rtnh_len)
3577e5bf684SAlexander V. Chernikov #define	_RTNH_ALIGNED_LEN(_nh)	RTNH_ALIGN(_RTNH_LEN(_nh))
3587e5bf684SAlexander V. Chernikov #define	RTNH_OK(_nh, _len)	NL_ITEM_OK(_nh, _len, RTNH_HDRLEN, _RTNH_LEN)
3597e5bf684SAlexander V. Chernikov #define	RTNH_NEXT(_nh)		((struct rtnexthop *)((char *)(_nh) + _RTNH_ALIGNED_LEN(_nh)))
3607e5bf684SAlexander V. Chernikov #define	RTNH_LENGTH(_len)	(RTNH_HDRLEN + (_len))
3617e5bf684SAlexander V. Chernikov #define	RTNH_SPACE(_len)	RTNH_ALIGN(RTNH_LENGTH(_len))
3627e5bf684SAlexander V. Chernikov #define	RTNH_DATA(_nh)		((struct rtattr *)NL_ITEM_DATA(_nh, RTNH_HDRLEN))
3637e5bf684SAlexander V. Chernikov 
3647e5bf684SAlexander V. Chernikov struct rtgenmsg {
3657e5bf684SAlexander V. Chernikov 	unsigned char rtgen_family;
3667e5bf684SAlexander V. Chernikov };
3677e5bf684SAlexander V. Chernikov 
3687e5bf684SAlexander V. Chernikov #endif
369