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