xref: /freebsd/sys/net/route.h (revision 4a77657cbc011ea657ccb079fff6b58b295eccb0)
1c398230bSWarner Losh /*-
251369649SPedro F. Giffuni  * SPDX-License-Identifier: BSD-3-Clause
351369649SPedro F. Giffuni  *
4df8bae1dSRodney W. Grimes  * Copyright (c) 1980, 1986, 1993
5df8bae1dSRodney W. Grimes  *	The Regents of the University of California.  All rights reserved.
6df8bae1dSRodney W. Grimes  *
7df8bae1dSRodney W. Grimes  * Redistribution and use in source and binary forms, with or without
8df8bae1dSRodney W. Grimes  * modification, are permitted provided that the following conditions
9df8bae1dSRodney W. Grimes  * are met:
10df8bae1dSRodney W. Grimes  * 1. Redistributions of source code must retain the above copyright
11df8bae1dSRodney W. Grimes  *    notice, this list of conditions and the following disclaimer.
12df8bae1dSRodney W. Grimes  * 2. Redistributions in binary form must reproduce the above copyright
13df8bae1dSRodney W. Grimes  *    notice, this list of conditions and the following disclaimer in the
14df8bae1dSRodney W. Grimes  *    documentation and/or other materials provided with the distribution.
15fbbd9655SWarner Losh  * 3. Neither the name of the University nor the names of its contributors
16df8bae1dSRodney W. Grimes  *    may be used to endorse or promote products derived from this software
17df8bae1dSRodney W. Grimes  *    without specific prior written permission.
18df8bae1dSRodney W. Grimes  *
19df8bae1dSRodney W. Grimes  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20df8bae1dSRodney W. Grimes  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21df8bae1dSRodney W. Grimes  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22df8bae1dSRodney W. Grimes  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23df8bae1dSRodney W. Grimes  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24df8bae1dSRodney W. Grimes  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25df8bae1dSRodney W. Grimes  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26df8bae1dSRodney W. Grimes  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27df8bae1dSRodney W. Grimes  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28df8bae1dSRodney W. Grimes  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29df8bae1dSRodney W. Grimes  * SUCH DAMAGE.
30df8bae1dSRodney W. Grimes  */
31df8bae1dSRodney W. Grimes 
32cea1da3bSPaul Richards #ifndef _NET_ROUTE_H_
33cea1da3bSPaul Richards #define _NET_ROUTE_H_
34cea1da3bSPaul Richards 
35ee0bd4b9SHiroki Sato #include <net/vnet.h>
36e3a7aa6fSGleb Smirnoff 
37df8bae1dSRodney W. Grimes /*
38df8bae1dSRodney W. Grimes  * Kernel resident routing tables.
39df8bae1dSRodney W. Grimes  *
40df8bae1dSRodney W. Grimes  * The routing tables are initialized when interface addresses
41df8bae1dSRodney W. Grimes  * are set by making entries for all directly connected interfaces.
42df8bae1dSRodney W. Grimes  */
43df8bae1dSRodney W. Grimes 
44df8bae1dSRodney W. Grimes /*
450d4df029SAlexander V. Chernikov  * Struct route consiste of a destination address,
460d4df029SAlexander V. Chernikov  * a route entry pointer, link-layer prepend data pointer along
470d4df029SAlexander V. Chernikov  * with its length.
48df8bae1dSRodney W. Grimes  */
49df8bae1dSRodney W. Grimes struct route {
50983066f0SAlexander V. Chernikov 	struct	nhop_object *ro_nh;
516d768226SGeorge V. Neville-Neil 	struct	llentry *ro_lle;
526d768226SGeorge V. Neville-Neil 	/*
536d768226SGeorge V. Neville-Neil 	 * ro_prepend and ro_plen are only used for bpf to pass in a
546d768226SGeorge V. Neville-Neil 	 * preformed header.  They are not cacheable.
556d768226SGeorge V. Neville-Neil 	 */
564fb3a820SAlexander V. Chernikov 	char		*ro_prepend;
574fb3a820SAlexander V. Chernikov 	uint16_t	ro_plen;
584fb3a820SAlexander V. Chernikov 	uint16_t	ro_flags;
590d4df029SAlexander V. Chernikov 	uint16_t	ro_mtu;	/* saved ro_rt mtu */
600d4df029SAlexander V. Chernikov 	uint16_t	spare;
61df8bae1dSRodney W. Grimes 	struct	sockaddr ro_dst;
62df8bae1dSRodney W. Grimes };
63df8bae1dSRodney W. Grimes 
644fb3a820SAlexander V. Chernikov #define	RT_L2_ME_BIT		2	/* dst L2 addr is our address */
654fb3a820SAlexander V. Chernikov #define	RT_MAY_LOOP_BIT		3	/* dst may require loop copy */
664fb3a820SAlexander V. Chernikov #define	RT_HAS_HEADER_BIT	4	/* mbuf already have its header prepended */
674fb3a820SAlexander V. Chernikov 
6836402a68SAlexander V. Chernikov #define	RT_L2_ME		(1 << RT_L2_ME_BIT)		/* 0x0004 */
6936402a68SAlexander V. Chernikov #define	RT_MAY_LOOP		(1 << RT_MAY_LOOP_BIT)		/* 0x0008 */
7036402a68SAlexander V. Chernikov #define	RT_HAS_HEADER		(1 << RT_HAS_HEADER_BIT)	/* 0x0010 */
7136402a68SAlexander V. Chernikov 
7236402a68SAlexander V. Chernikov #define	RT_REJECT		0x0020		/* Destination is reject */
7336402a68SAlexander V. Chernikov #define	RT_BLACKHOLE		0x0040		/* Destination is blackhole */
7436402a68SAlexander V. Chernikov #define	RT_HAS_GW		0x0080		/* Destination has GW  */
756d768226SGeorge V. Neville-Neil #define	RT_LLE_CACHE		0x0100		/* Cache link layer  */
761eeb6d97SKip Macy 
77df8bae1dSRodney W. Grimes struct rt_metrics {
78df8bae1dSRodney W. Grimes 	u_long	rmx_locks;	/* Kernel must leave these values alone */
79df8bae1dSRodney W. Grimes 	u_long	rmx_mtu;	/* MTU for this path */
80df8bae1dSRodney W. Grimes 	u_long	rmx_hopcount;	/* max hops expected */
81df8bae1dSRodney W. Grimes 	u_long	rmx_expire;	/* lifetime for route, e.g. redirect */
826c5e9bbdSMike Pritchard 	u_long	rmx_recvpipe;	/* inbound delay-bandwidth product */
836c5e9bbdSMike Pritchard 	u_long	rmx_sendpipe;	/* outbound delay-bandwidth product */
84df8bae1dSRodney W. Grimes 	u_long	rmx_ssthresh;	/* outbound gateway buffer limit */
85df8bae1dSRodney W. Grimes 	u_long	rmx_rtt;	/* estimated round trip time */
86df8bae1dSRodney W. Grimes 	u_long	rmx_rttvar;	/* estimated rtt variance */
87df8bae1dSRodney W. Grimes 	u_long	rmx_pksent;	/* packets sent using this route */
88427ac07fSKip Macy 	u_long	rmx_weight;	/* route weight */
89a6663252SAlexander V. Chernikov 	u_long	rmx_nhidx;	/* route nexhop index */
90a6663252SAlexander V. Chernikov 	u_long	rmx_filler[2];	/* will be used for T/TCP later */
91df8bae1dSRodney W. Grimes };
92df8bae1dSRodney W. Grimes 
93df8bae1dSRodney W. Grimes /*
94df8bae1dSRodney W. Grimes  * rmx_rtt and rmx_rttvar are stored as microseconds;
95df8bae1dSRodney W. Grimes  */
96df8bae1dSRodney W. Grimes #define	RTM_RTTUNIT	1000000	/* units for rtt, rttvar, as units per sec */
97df8bae1dSRodney W. Grimes 
98427c2f4eSAlexander V. Chernikov /* lle state is exported in rmx_state rt_metrics field */
99427c2f4eSAlexander V. Chernikov #define	rmx_state	rmx_weight
100427c2f4eSAlexander V. Chernikov 
1012259a030SAlexander V. Chernikov /* default route weight */
1022259a030SAlexander V. Chernikov #define	RT_DEFAULT_WEIGHT	1
1032259a030SAlexander V. Chernikov #define	RT_MAX_WEIGHT		16777215	/* 3 bytes */
1042259a030SAlexander V. Chernikov 
10584cc0778SGeorge V. Neville-Neil /*
10684cc0778SGeorge V. Neville-Neil  * Keep a generation count of routing table, incremented on route addition,
10784cc0778SGeorge V. Neville-Neil  * so we can invalidate caches.  This is accessed without a lock, as precision
10884cc0778SGeorge V. Neville-Neil  * is not required.
10984cc0778SGeorge V. Neville-Neil  */
11084cc0778SGeorge V. Neville-Neil typedef volatile u_int rt_gen_t;	/* tree generation (for adds) */
11184cc0778SGeorge V. Neville-Neil #define RT_GEN(fibnum, af)	rt_tables_get_gen(fibnum, af)
11284cc0778SGeorge V. Neville-Neil 
113556d81ddSBjoern A. Zeeb #define	RT_DEFAULT_FIB	0	/* Explicitly mark fib=0 restricted cases */
1147d9b6df1SAlexander V. Chernikov #define	RT_ALL_FIBS	-1	/* Announce event for every fib */
1159f21b0b8SHiroki Sato #ifdef _KERNEL
116f5247a23SAlexander V. Chernikov VNET_DECLARE(uint32_t, _rt_numfibs);	/* number of existing route tables */
117f5247a23SAlexander V. Chernikov #define	V_rt_numfibs		VNET(_rt_numfibs)
118f5247a23SAlexander V. Chernikov /* temporary compat arg */
119f5247a23SAlexander V. Chernikov #define	rt_numfibs		V_rt_numfibs
120ee0bd4b9SHiroki Sato VNET_DECLARE(u_int, rt_add_addr_allfibs); /* Announce interfaces to all fibs */
121ee0bd4b9SHiroki Sato #define	V_rt_add_addr_allfibs	VNET(rt_add_addr_allfibs)
1220c325f53SAlexander V. Chernikov 
1230c325f53SAlexander V. Chernikov /* Calculate flowid for locally-originated packets */
1240c325f53SAlexander V. Chernikov #define	V_fib_hash_outbound	VNET(fib_hash_outbound)
1250c325f53SAlexander V. Chernikov VNET_DECLARE(u_int, fib_hash_outbound);
1260c325f53SAlexander V. Chernikov 
1270c325f53SAlexander V. Chernikov /* Outbound flowid generation rules */
1280c325f53SAlexander V. Chernikov #ifdef RSS
1290c325f53SAlexander V. Chernikov 
1300c325f53SAlexander V. Chernikov #define fib4_calc_packet_hash		xps_proto_software_hash_v4
1310c325f53SAlexander V. Chernikov #define fib6_calc_packet_hash		xps_proto_software_hash_v6
1320c325f53SAlexander V. Chernikov #define	CALC_FLOWID_OUTBOUND_SENDTO	true
1330c325f53SAlexander V. Chernikov 
1340c325f53SAlexander V. Chernikov #ifdef ROUTE_MPATH
1350c325f53SAlexander V. Chernikov #define	CALC_FLOWID_OUTBOUND		V_fib_hash_outbound
1360c325f53SAlexander V. Chernikov #else
1370c325f53SAlexander V. Chernikov #define	CALC_FLOWID_OUTBOUND		false
1389f21b0b8SHiroki Sato #endif
1396670942fSBruce Evans 
1400c325f53SAlexander V. Chernikov #else /* !RSS */
1410c325f53SAlexander V. Chernikov 
1420c325f53SAlexander V. Chernikov #define fib4_calc_packet_hash		fib4_calc_software_hash
1430c325f53SAlexander V. Chernikov #define fib6_calc_packet_hash		fib6_calc_software_hash
1440c325f53SAlexander V. Chernikov 
1450c325f53SAlexander V. Chernikov #ifdef ROUTE_MPATH
1460c325f53SAlexander V. Chernikov #define	CALC_FLOWID_OUTBOUND_SENDTO	V_fib_hash_outbound
1470c325f53SAlexander V. Chernikov #define	CALC_FLOWID_OUTBOUND		V_fib_hash_outbound
1480c325f53SAlexander V. Chernikov #else
1490c325f53SAlexander V. Chernikov #define	CALC_FLOWID_OUTBOUND_SENDTO	false
1500c325f53SAlexander V. Chernikov #define	CALC_FLOWID_OUTBOUND		false
1510c325f53SAlexander V. Chernikov #endif
1520c325f53SAlexander V. Chernikov 
1530c325f53SAlexander V. Chernikov #endif /* RSS */
1540c325f53SAlexander V. Chernikov 
1550c325f53SAlexander V. Chernikov 
1560c325f53SAlexander V. Chernikov #endif /* _KERNEL */
1570c325f53SAlexander V. Chernikov 
1586670942fSBruce Evans /*
159df8bae1dSRodney W. Grimes  * We distinguish between routes to hosts and routes to networks,
160df8bae1dSRodney W. Grimes  * preferring the former if available.  For each route we infer
161df8bae1dSRodney W. Grimes  * the interface to use from the gateway address supplied when
162df8bae1dSRodney W. Grimes  * the route was entered.  Routes that forward packets through
163df8bae1dSRodney W. Grimes  * gateways are marked so that the output routines know to address the
164df8bae1dSRodney W. Grimes  * gateway rather than the ultimate destination.
165df8bae1dSRodney W. Grimes  */
166df8bae1dSRodney W. Grimes #define	RTF_UP		0x1		/* route usable */
167df8bae1dSRodney W. Grimes #define	RTF_GATEWAY	0x2		/* destination is a gateway */
168df8bae1dSRodney W. Grimes #define	RTF_HOST	0x4		/* host entry (net otherwise) */
169df8bae1dSRodney W. Grimes #define	RTF_REJECT	0x8		/* host or net unreachable */
170df8bae1dSRodney W. Grimes #define	RTF_DYNAMIC	0x10		/* created dynamically (by redirect) */
171df8bae1dSRodney W. Grimes #define	RTF_MODIFIED	0x20		/* modified dynamically (by redirect) */
172df8bae1dSRodney W. Grimes #define RTF_DONE	0x40		/* message confirmed */
173be2ac88cSJonathan Lemon /*			0x80		   unused, was RTF_DELCLONE */
1746e6b3f7cSQing Li /*			0x100		   unused, was RTF_CLONING */
175df8bae1dSRodney W. Grimes #define RTF_XRESOLVE	0x200		/* external daemon resolves name */
17614981d80SQing Li #define RTF_LLINFO	0x400		/* DEPRECATED - exists ONLY for backward
17714981d80SQing Li 					   compatibility */
1788eca593cSQing Li #define RTF_LLDATA	0x400		/* used by apps to add/del L2 entries */
179df8bae1dSRodney W. Grimes #define RTF_STATIC	0x800		/* manually added */
180df8bae1dSRodney W. Grimes #define RTF_BLACKHOLE	0x1000		/* just discard pkts (during updates) */
181df8bae1dSRodney W. Grimes #define RTF_PROTO2	0x4000		/* protocol specific routing flag */
182df8bae1dSRodney W. Grimes #define RTF_PROTO1	0x8000		/* protocol specific routing flag */
18366dcee72SGleb Smirnoff /*			0x10000		   unused, was RTF_PRCLONING */
1846e6b3f7cSQing Li /*			0x20000		   unused, was RTF_WASCLONED */
185995add1aSGarrett Wollman #define RTF_PROTO3	0x40000		/* protocol specific routing flag */
1867f948f12SAlexander V. Chernikov #define	RTF_FIXEDMTU	0x80000		/* MTU was explicitly specified */
1873034f43fSAlexander V. Chernikov #define RTF_PINNED	0x100000	/* route is immutable */
1889f9b3dc4SGarrett Wollman #define	RTF_LOCAL	0x200000 	/* route represents a local address */
1899f9b3dc4SGarrett Wollman #define	RTF_BROADCAST	0x400000	/* route represents a bcast address */
1909f9b3dc4SGarrett Wollman #define	RTF_MULTICAST	0x800000	/* route represents a mcast address */
191427ac07fSKip Macy 					/* 0x8000000 and up unassigned */
192427ac07fSKip Macy #define	RTF_STICKY	 0x10000000	/* always route dst->src */
193427ac07fSKip Macy 
19464d5c277SAlexander V. Chernikov /*			0x40000000	   unused, was RTF_RNH_LOCKED */
195df8bae1dSRodney W. Grimes 
196f672f56fSQing Li #define	RTF_GWFLAG_COMPAT 0x80000000	/* a compatibility bit for interacting
197f672f56fSQing Li 					   with existing routing apps */
198f672f56fSQing Li 
19922cafcf0SAndre Oppermann /* Mask of RTF flags that are allowed to be modified by RTM_CHANGE. */
20022cafcf0SAndre Oppermann #define RTF_FMASK	\
20122cafcf0SAndre Oppermann 	(RTF_PROTO1 | RTF_PROTO2 | RTF_PROTO3 | RTF_BLACKHOLE | \
202427ac07fSKip Macy 	 RTF_REJECT | RTF_STATIC | RTF_STICKY)
20322cafcf0SAndre Oppermann 
204df8bae1dSRodney W. Grimes /*
20565ff3638SAlexander V. Chernikov  * fib_ nexthop API flags.
20665ff3638SAlexander V. Chernikov  */
20765ff3638SAlexander V. Chernikov 
20865ff3638SAlexander V. Chernikov /* Consumer-visible nexthop info flags */
209fedeb08bSAlexander V. Chernikov #define	NHF_MULTIPATH		0x0008	/* Nexhop is a nexthop group */
21065ff3638SAlexander V. Chernikov #define	NHF_REJECT		0x0010	/* RTF_REJECT */
21165ff3638SAlexander V. Chernikov #define	NHF_BLACKHOLE		0x0020	/* RTF_BLACKHOLE */
21265ff3638SAlexander V. Chernikov #define	NHF_REDIRECT		0x0040	/* RTF_DYNAMIC|RTF_MODIFIED */
21365ff3638SAlexander V. Chernikov #define	NHF_DEFAULT		0x0080	/* Default route */
21465ff3638SAlexander V. Chernikov #define	NHF_BROADCAST		0x0100	/* RTF_BROADCAST */
21565ff3638SAlexander V. Chernikov #define	NHF_GATEWAY		0x0200	/* RTF_GATEWAY */
2166ca363ebSGleb Smirnoff #define	NHF_HOST		0x0400	/* RTF_HOST */
21765ff3638SAlexander V. Chernikov 
21865ff3638SAlexander V. Chernikov /* Nexthop request flags */
219a6663252SAlexander V. Chernikov #define	NHR_NONE		0x00	/* empty flags field */
22077df2c21SAlexander V. Chernikov #define	NHR_REF			0x01	/* reference nexhop */
22177df2c21SAlexander V. Chernikov #define	NHR_NODEFAULT		0x02	/* uRPF: do not consider default route */
222a6663252SAlexander V. Chernikov 
2239a1b64d5SAlexander V. Chernikov /* Control plane route request flags */
2249a1b64d5SAlexander V. Chernikov #define	NHR_COPY		0x100	/* Copy rte data */
225b712e3e3SAlexander V. Chernikov #define	NHR_UNLOCKED		0x200	/* Do not lock table */
2269a1b64d5SAlexander V. Chernikov 
22765ff3638SAlexander V. Chernikov /*
228df8bae1dSRodney W. Grimes  * Routing statistics.
229df8bae1dSRodney W. Grimes  */
230df8bae1dSRodney W. Grimes struct rtstat {
231185c3d2bSGleb Smirnoff 	uint64_t rts_badredirect;	/* bogus redirect calls */
232185c3d2bSGleb Smirnoff 	uint64_t rts_dynamic;		/* routes created by redirects */
233185c3d2bSGleb Smirnoff 	uint64_t rts_newgateway;	/* routes modified by redirects */
234185c3d2bSGleb Smirnoff 	uint64_t rts_unreach;		/* lookups which failed */
235185c3d2bSGleb Smirnoff 	uint64_t rts_wildcard;		/* lookups satisfied by a wildcard */
236a6663252SAlexander V. Chernikov 	uint64_t rts_nh_idx_alloc_failure;	/* nexthop index alloc failure*/
237a6663252SAlexander V. Chernikov 	uint64_t rts_nh_alloc_failure;	/* nexthop allocation failure*/
238fedeb08bSAlexander V. Chernikov 	uint64_t rts_add_failure;	/* # of route addition failures */
239fedeb08bSAlexander V. Chernikov 	uint64_t rts_add_retry;		/* # of route addition retries */
240fedeb08bSAlexander V. Chernikov 	uint64_t rts_del_failure;	/* # of route deletion failure */
241fedeb08bSAlexander V. Chernikov 	uint64_t rts_del_retry;		/* # of route deletion retries */
2423360a158SKyle Evans 	uint64_t rts_spare[5];
243df8bae1dSRodney W. Grimes };
244185c3d2bSGleb Smirnoff 
245df8bae1dSRodney W. Grimes /*
246df8bae1dSRodney W. Grimes  * Structures for routing messages.
247df8bae1dSRodney W. Grimes  */
248df8bae1dSRodney W. Grimes struct rt_msghdr {
249df8bae1dSRodney W. Grimes 	u_short	rtm_msglen;	/* to skip over non-understood messages */
250df8bae1dSRodney W. Grimes 	u_char	rtm_version;	/* future binary compatibility */
251df8bae1dSRodney W. Grimes 	u_char	rtm_type;	/* message type */
252df8bae1dSRodney W. Grimes 	u_short	rtm_index;	/* index for associated ifp */
253d25f8522SMark Johnston 	u_short _rtm_spare1;
254df8bae1dSRodney W. Grimes 	int	rtm_flags;	/* flags, incl. kern & message, e.g. DONE */
255df8bae1dSRodney W. Grimes 	int	rtm_addrs;	/* bitmask identifying sockaddrs in msg */
256df8bae1dSRodney W. Grimes 	pid_t	rtm_pid;	/* identify sender */
257df8bae1dSRodney W. Grimes 	int	rtm_seq;	/* for sender to identify action */
258df8bae1dSRodney W. Grimes 	int	rtm_errno;	/* why failed */
25922cafcf0SAndre Oppermann 	int	rtm_fmask;	/* bitmask used in RTM_CHANGE message */
260df8bae1dSRodney W. Grimes 	u_long	rtm_inits;	/* which metrics we are initializing */
261df8bae1dSRodney W. Grimes 	struct	rt_metrics rtm_rmx; /* metrics themselves */
262df8bae1dSRodney W. Grimes };
263df8bae1dSRodney W. Grimes 
2648f22a721SKip Macy #define RTM_VERSION	5	/* Up the ante and ignore older versions */
265df8bae1dSRodney W. Grimes 
26690d62512SAlexander V. Chernikov #ifndef NETLINK_COMPAT
26797998e86SRuslan Ermilov /*
26897998e86SRuslan Ermilov  * Message types.
2692f8c6c0aSPatrick Kelsey  *
2702f8c6c0aSPatrick Kelsey  * The format for each message is annotated below using the following
2712f8c6c0aSPatrick Kelsey  * identifiers:
2722f8c6c0aSPatrick Kelsey  *
2732f8c6c0aSPatrick Kelsey  * (1) struct rt_msghdr
2742f8c6c0aSPatrick Kelsey  * (2) struct ifa_msghdr
2752f8c6c0aSPatrick Kelsey  * (3) struct if_msghdr
2762f8c6c0aSPatrick Kelsey  * (4) struct ifma_msghdr
2772f8c6c0aSPatrick Kelsey  * (5) struct if_announcemsghdr
2782f8c6c0aSPatrick Kelsey  *
27997998e86SRuslan Ermilov  */
2802f8c6c0aSPatrick Kelsey #define	RTM_ADD		0x1	/* (1) Add Route */
2812f8c6c0aSPatrick Kelsey #define	RTM_DELETE	0x2	/* (1) Delete Route */
2822f8c6c0aSPatrick Kelsey #define	RTM_CHANGE	0x3	/* (1) Change Metrics or flags */
2832f8c6c0aSPatrick Kelsey #define	RTM_GET		0x4	/* (1) Report Metrics */
2842f8c6c0aSPatrick Kelsey #define	RTM_LOSING	0x5	/* (1) Kernel Suspects Partitioning */
2852f8c6c0aSPatrick Kelsey #define	RTM_REDIRECT	0x6	/* (1) Told to use different route */
2862f8c6c0aSPatrick Kelsey #define	RTM_MISS	0x7	/* (1) Lookup failed on this address */
2872f8c6c0aSPatrick Kelsey #define	RTM_LOCK	0x8	/* (1) fix specified metrics */
28866dcee72SGleb Smirnoff 		    /*	0x9  */
28966dcee72SGleb Smirnoff 		    /*	0xa  */
2902f8c6c0aSPatrick Kelsey #define	RTM_RESOLVE	0xb	/* (1) req to resolve dst to LL addr */
2912f8c6c0aSPatrick Kelsey #define	RTM_NEWADDR	0xc	/* (2) address being added to iface */
2922f8c6c0aSPatrick Kelsey #define	RTM_DELADDR	0xd	/* (2) address being removed from iface */
2932f8c6c0aSPatrick Kelsey #define	RTM_IFINFO	0xe	/* (3) iface going up/down etc. */
2942f8c6c0aSPatrick Kelsey #define	RTM_NEWMADDR	0xf	/* (4) mcast group membership being added to if */
2952f8c6c0aSPatrick Kelsey #define	RTM_DELMADDR	0x10	/* (4) mcast group membership being deleted */
2962f8c6c0aSPatrick Kelsey #define	RTM_IFANNOUNCE	0x11	/* (5) iface arrival/departure */
2972f8c6c0aSPatrick Kelsey #define	RTM_IEEE80211	0x12	/* (5) IEEE80211 wireless event */
298*4a77657cSAndrey V. Elsukov #define	RTM_IPFWLOG	0x13	/* (1) IPFW rule match log event */
299df8bae1dSRodney W. Grimes 
30090d62512SAlexander V. Chernikov #endif /* NETLINK_COMPAT*/
30190d62512SAlexander V. Chernikov 
30297998e86SRuslan Ermilov /*
30397998e86SRuslan Ermilov  * Bitmask values for rtm_inits and rmx_locks.
30497998e86SRuslan Ermilov  */
305df8bae1dSRodney W. Grimes #define RTV_MTU		0x1	/* init or lock _mtu */
306df8bae1dSRodney W. Grimes #define RTV_HOPCOUNT	0x2	/* init or lock _hopcount */
30797998e86SRuslan Ermilov #define RTV_EXPIRE	0x4	/* init or lock _expire */
308df8bae1dSRodney W. Grimes #define RTV_RPIPE	0x8	/* init or lock _recvpipe */
309df8bae1dSRodney W. Grimes #define RTV_SPIPE	0x10	/* init or lock _sendpipe */
310df8bae1dSRodney W. Grimes #define RTV_SSTHRESH	0x20	/* init or lock _ssthresh */
311df8bae1dSRodney W. Grimes #define RTV_RTT		0x40	/* init or lock _rtt */
312df8bae1dSRodney W. Grimes #define RTV_RTTVAR	0x80	/* init or lock _rttvar */
313427ac07fSKip Macy #define RTV_WEIGHT	0x100	/* init or lock _weight */
314df8bae1dSRodney W. Grimes 
31590d62512SAlexander V. Chernikov #ifndef NETLINK_COMPAT
31690d62512SAlexander V. Chernikov 
317df8bae1dSRodney W. Grimes /*
31897998e86SRuslan Ermilov  * Bitmask values for rtm_addrs.
319df8bae1dSRodney W. Grimes  */
320df8bae1dSRodney W. Grimes #define RTA_DST		0x1	/* destination sockaddr present */
321df8bae1dSRodney W. Grimes #define RTA_GATEWAY	0x2	/* gateway sockaddr present */
322df8bae1dSRodney W. Grimes #define RTA_NETMASK	0x4	/* netmask sockaddr present */
323df8bae1dSRodney W. Grimes #define RTA_GENMASK	0x8	/* cloning mask sockaddr present */
324df8bae1dSRodney W. Grimes #define RTA_IFP		0x10	/* interface name sockaddr present */
325df8bae1dSRodney W. Grimes #define RTA_IFA		0x20	/* interface addr sockaddr present */
326df8bae1dSRodney W. Grimes #define RTA_AUTHOR	0x40	/* sockaddr for author of redirect */
327df8bae1dSRodney W. Grimes #define RTA_BRD		0x80	/* for NEWADDR, broadcast or p-p dest addr */
328df8bae1dSRodney W. Grimes 
32990d62512SAlexander V. Chernikov #endif /* NETLINK_COMPAT*/
33090d62512SAlexander V. Chernikov 
331df8bae1dSRodney W. Grimes /*
332df8bae1dSRodney W. Grimes  * Index offsets for sockaddr array for alternate internal encoding.
333df8bae1dSRodney W. Grimes  */
334df8bae1dSRodney W. Grimes #define RTAX_DST	0	/* destination sockaddr present */
335df8bae1dSRodney W. Grimes #define RTAX_GATEWAY	1	/* gateway sockaddr present */
336df8bae1dSRodney W. Grimes #define RTAX_NETMASK	2	/* netmask sockaddr present */
337df8bae1dSRodney W. Grimes #define RTAX_GENMASK	3	/* cloning mask sockaddr present */
338df8bae1dSRodney W. Grimes #define RTAX_IFP	4	/* interface name sockaddr present */
339df8bae1dSRodney W. Grimes #define RTAX_IFA	5	/* interface addr sockaddr present */
340df8bae1dSRodney W. Grimes #define RTAX_AUTHOR	6	/* sockaddr for author of redirect */
341df8bae1dSRodney W. Grimes #define RTAX_BRD	7	/* for NEWADDR, broadcast or p-p dest addr */
342df8bae1dSRodney W. Grimes #define RTAX_MAX	8	/* size of array to allocate */
343df8bae1dSRodney W. Grimes 
34457e70e44SAlexander V. Chernikov struct rtentry;
3455cdc4844SAlexander V. Chernikov struct nhop_object;
3467511a638SAlexander V. Chernikov typedef int rib_filter_f_t(const struct rtentry *, const struct nhop_object *,
347539642a2SAlexander V. Chernikov     void *);
348e8b0643eSAlexander V. Chernikov 
349df8bae1dSRodney W. Grimes struct rt_addrinfo {
350e8b0643eSAlexander V. Chernikov 	int	rti_addrs;			/* Route RTF_ flags */
351e8b0643eSAlexander V. Chernikov 	int	rti_flags;			/* Route RTF_ flags */
352e8b0643eSAlexander V. Chernikov 	struct	sockaddr *rti_info[RTAX_MAX];	/* Sockaddr data */
353e8b0643eSAlexander V. Chernikov 	struct	ifaddr *rti_ifa;		/* value of rt_ifa addr */
354e8b0643eSAlexander V. Chernikov 	struct	ifnet *rti_ifp;			/* route interface */
3557511a638SAlexander V. Chernikov 	rib_filter_f_t	*rti_filter;		/* filter function */
35623677398SGordon Bergling 	void	*rti_filterdata;		/* filter parameters */
357e8b0643eSAlexander V. Chernikov 	u_long	rti_mflags;			/* metrics RTV_ flags */
358e8b0643eSAlexander V. Chernikov 	u_long	rti_spare;			/* Will be used for fib */
359e8b0643eSAlexander V. Chernikov 	struct	rt_metrics *rti_rmx;		/* Pointer to route metrics */
360df8bae1dSRodney W. Grimes };
361df8bae1dSRodney W. Grimes 
362e74642dfSLuigi Rizzo /*
363e74642dfSLuigi Rizzo  * This macro returns the size of a struct sockaddr when passed
364e74642dfSLuigi Rizzo  * through a routing socket. Basically we round up sa_len to
365e74642dfSLuigi Rizzo  * a multiple of sizeof(long), with a minimum of sizeof(long).
366e74642dfSLuigi Rizzo  * The case sa_len == 0 should only apply to empty structures.
367e74642dfSLuigi Rizzo  */
368e74642dfSLuigi Rizzo #define SA_SIZE(sa)						\
3692f8c6c0aSPatrick Kelsey     (  (((struct sockaddr *)(sa))->sa_len == 0) ?		\
370e74642dfSLuigi Rizzo 	sizeof(long)		:				\
371e74642dfSLuigi Rizzo 	1 + ( (((struct sockaddr *)(sa))->sa_len - 1) | (sizeof(long) - 1) ) )
372e74642dfSLuigi Rizzo 
37336d55f0fSAlexander V. Chernikov #define	sa_equal(a, b) (	\
374441f9243SAlexander V. Chernikov     (((const struct sockaddr *)(a))->sa_len == ((const struct sockaddr *)(b))->sa_len) && \
375441f9243SAlexander V. Chernikov     (bcmp((a), (b), ((const struct sockaddr *)(b))->sa_len) == 0))
37636d55f0fSAlexander V. Chernikov 
377664a31e4SPeter Wemm #ifdef _KERNEL
3781ebe9986SJeffrey Hsu 
3796b533b5dSQing Li #define RT_LINK_IS_UP(ifp)	(!((ifp)->if_capabilities & IFCAP_LINKSTATE) \
380355ad3eaSQing Li 				 || (ifp)->if_link_state == LINK_STATE_UP)
381c7ea0aa6SQing Li 
382983066f0SAlexander V. Chernikov #define	RO_NHFREE(_ro) do {					\
383983066f0SAlexander V. Chernikov 	if ((_ro)->ro_nh) {					\
384983066f0SAlexander V. Chernikov 		NH_FREE((_ro)->ro_nh);				\
385983066f0SAlexander V. Chernikov 		(_ro)->ro_nh = NULL;				\
386983066f0SAlexander V. Chernikov 	}							\
387983066f0SAlexander V. Chernikov } while (0)
388983066f0SAlexander V. Chernikov 
389fc21c53fSRyan Stone #define	RO_INVALIDATE_CACHE(ro) do {					\
390fc21c53fSRyan Stone 		if ((ro)->ro_lle != NULL) {				\
391fc21c53fSRyan Stone 			LLE_FREE((ro)->ro_lle);				\
392fc21c53fSRyan Stone 			(ro)->ro_lle = NULL;				\
393fc21c53fSRyan Stone 		}							\
394983066f0SAlexander V. Chernikov 		if ((ro)->ro_nh != NULL) {				\
395983066f0SAlexander V. Chernikov 			NH_FREE((ro)->ro_nh);				\
396983066f0SAlexander V. Chernikov 			(ro)->ro_nh = NULL;				\
397983066f0SAlexander V. Chernikov 		}							\
398fc21c53fSRyan Stone 	} while (0)
399fc21c53fSRyan Stone 
40062e1a437SZhenlei Huang #define RO_GET_FAMILY(ro, dst)	((ro) != NULL &&		\
40162e1a437SZhenlei Huang 	(ro)->ro_flags & RT_HAS_GW				\
40262e1a437SZhenlei Huang 	? (ro)->ro_dst.sa_family : (dst)->sa_family)
40362e1a437SZhenlei Huang 
40484cc0778SGeorge V. Neville-Neil /*
40584cc0778SGeorge V. Neville-Neil  * Validate a cached route based on a supplied cookie.  If there is an
40684cc0778SGeorge V. Neville-Neil  * out-of-date cache, simply free it.  Update the generation number
40784cc0778SGeorge V. Neville-Neil  * for the new allocation
40884cc0778SGeorge V. Neville-Neil  */
409983066f0SAlexander V. Chernikov #define NH_VALIDATE(ro, cookiep, fibnum) do {				\
41084cc0778SGeorge V. Neville-Neil 	rt_gen_t cookie = RT_GEN(fibnum, (ro)->ro_dst.sa_family);	\
4116d768226SGeorge V. Neville-Neil 	if (*(cookiep) != cookie) {					\
412fc21c53fSRyan Stone 		RO_INVALIDATE_CACHE(ro);				\
41384cc0778SGeorge V. Neville-Neil 		*(cookiep) = cookie;					\
41484cc0778SGeorge V. Neville-Neil 	}								\
41584cc0778SGeorge V. Neville-Neil } while (0)
41684cc0778SGeorge V. Neville-Neil 
417477180fbSGarrett Wollman struct ifmultiaddr;
41861eee0e2SAlexander V. Chernikov struct rib_head;
419477180fbSGarrett Wollman 
420b83a279fSSam Leffler void	 rt_ieee80211msg(struct ifnet *, int, void *, size_t);
4211bcd230fSAlexander V. Chernikov void	 rt_ifmsg(struct ifnet *, int);
422929ddbbbSAlfred Perlstein void	 rt_missmsg(int, struct rt_addrinfo *, int, int);
423528737fdSBjoern A. Zeeb void	 rt_missmsg_fib(int, struct rt_addrinfo *, int, int, int);
4244cbac30bSAlexander V. Chernikov int	 rt_addrmsg(int, struct ifaddr *, int);
425d68cf57bSAlexander V. Chernikov int	 rt_routemsg(int, struct rtentry *, struct nhop_object *, int);
426e02d3fe7SAlexander V. Chernikov int	 rt_routemsg_info(int, struct rt_addrinfo *, int);
427929ddbbbSAlfred Perlstein void	 rt_newmaddrmsg(int, struct ifmultiaddr *);
42866230639SAlexander V. Chernikov void 	 rt_maskedcopy(const struct sockaddr *, struct sockaddr *,
42966230639SAlexander V. Chernikov 	    const struct sockaddr *);
430ead85fe4SAlexander V. Chernikov struct rib_head *rt_table_init(int, int, u_int);
43161eee0e2SAlexander V. Chernikov void	rt_table_destroy(struct rib_head *);
432f5247a23SAlexander V. Chernikov u_int	rt_tables_get_gen(uint32_t table, sa_family_t family);
4333916ebe8SLuigi Rizzo 
434fc88ecd3SAlexander V. Chernikov struct sockaddr *rtsock_fix_netmask(const struct sockaddr *dst,
435fc88ecd3SAlexander V. Chernikov 	    const struct sockaddr *smask, struct sockaddr_storage *dmask);
4363916ebe8SLuigi Rizzo 
4377f948f12SAlexander V. Chernikov void	rt_updatemtu(struct ifnet *);
4388b07e49aSJulian Elischer 
4394bdf0b6aSAlexander V. Chernikov void	rt_flushifroutes(struct ifnet *ifp);
4404bdf0b6aSAlexander V. Chernikov 
4418b07e49aSJulian Elischer /* XXX MRT NEW VERSIONS THAT USE FIBs
4428b07e49aSJulian Elischer  * For now the protocol indepedent versions are the same as the AF_INET ones
4438b07e49aSJulian Elischer  * but this will change..
4448b07e49aSJulian Elischer  */
4458e8f1cc9SMark Johnston int	rtioctl_fib(u_long, caddr_t, u_int);
4468b07e49aSJulian Elischer 
447a6663252SAlexander V. Chernikov /* New API */
448b1d63265SAlexander V. Chernikov void rib_flush_routes_family(int family);
449682b902dSAlexander V. Chernikov struct nhop_object *rib_lookup(uint32_t fibnum, const struct sockaddr *dst,
450682b902dSAlexander V. Chernikov 	    uint32_t flags, uint32_t flowid);
45163f7f392SAlexander V. Chernikov const char *rib_print_family(int family);
452df8bae1dSRodney W. Grimes #endif
453cea1da3bSPaul Richards 
454cea1da3bSPaul Richards #endif
455