1/*
2 * Copyright (c) 2000-2013 Apple Inc. All rights reserved.
3 *
4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5 *
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. The rights granted to you under the License
10 * may not be used to create, or enable the creation or redistribution of,
11 * unlawful or unlicensed copies of an Apple operating system, or to
12 * circumvent, violate, or enable the circumvention or violation of, any
13 * terms of an Apple operating system software license agreement.
14 *
15 * Please obtain a copy of the License at
16 * http://www.opensource.apple.com/apsl/ and read it before using this file.
17 *
18 * The Original Code and all software distributed under the License are
19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23 * Please see the License for the specific language governing rights and
24 * limitations under the License.
25 *
26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27 */
28/*
29 * Copyright (c) 1980, 1986, 1993
30 *	The Regents of the University of California.  All rights reserved.
31 *
32 * Redistribution and use in source and binary forms, with or without
33 * modification, are permitted provided that the following conditions
34 * are met:
35 * 1. Redistributions of source code must retain the above copyright
36 *    notice, this list of conditions and the following disclaimer.
37 * 2. Redistributions in binary form must reproduce the above copyright
38 *    notice, this list of conditions and the following disclaimer in the
39 *    documentation and/or other materials provided with the distribution.
40 * 3. All advertising materials mentioning features or use of this software
41 *    must display the following acknowledgement:
42 *	This product includes software developed by the University of
43 *	California, Berkeley and its contributors.
44 * 4. Neither the name of the University nor the names of its contributors
45 *    may be used to endorse or promote products derived from this software
46 *    without specific prior written permission.
47 *
48 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
49 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
50 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
51 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
52 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
53 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
54 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
55 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
56 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
57 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
58 * SUCH DAMAGE.
59 *
60 *	@(#)route.h	8.3 (Berkeley) 4/19/94
61 * $FreeBSD: src/sys/net/route.h,v 1.36.2.1 2000/08/16 06:14:23 jayanth Exp $
62 */
63
64#ifndef _NET_ROUTE_H_
65#define	_NET_ROUTE_H_
66#include <sys/appleapiopts.h>
67#include <stdint.h>
68#include <sys/types.h>
69#include <sys/socket.h>
70
71/*
72 * These numbers are used by reliable protocols for determining
73 * retransmission behavior and are included in the routing structure.
74 */
75struct rt_metrics {
76	u_int32_t	rmx_locks;	/* Kernel leaves these values alone */
77	u_int32_t	rmx_mtu;	/* MTU for this path */
78	u_int32_t	rmx_hopcount;	/* max hops expected */
79	int32_t		rmx_expire;	/* lifetime for route, e.g. redirect */
80	u_int32_t	rmx_recvpipe;	/* inbound delay-bandwidth product */
81	u_int32_t	rmx_sendpipe;	/* outbound delay-bandwidth product */
82	u_int32_t	rmx_ssthresh;	/* outbound gateway buffer limit */
83	u_int32_t	rmx_rtt;	/* estimated round trip time */
84	u_int32_t	rmx_rttvar;	/* estimated rtt variance */
85	u_int32_t	rmx_pksent;	/* packets sent using this route */
86	u_int32_t	rmx_filler[4];	/* will be used for T/TCP later */
87};
88
89/*
90 * rmx_rtt and rmx_rttvar are stored as microseconds;
91 */
92#define	RTM_RTTUNIT	1000000	/* units for rtt, rttvar, as units per sec */
93
94#ifdef PRIVATE
95struct route_old {
96	void		*ro_rt;
97	uint32_t	ro_flags;
98	struct sockaddr	ro_dst;
99};
100#endif /* PRIVATE */
101
102#ifdef BSD_KERNEL_PRIVATE
103#include <kern/locks.h>
104#include <net/radix.h>
105
106/*
107 * Kernel resident routing tables.
108 *
109 * The routing tables are initialized when interface addresses
110 * are set by making entries for all directly connected interfaces.
111 */
112
113/* forward declarations */
114struct ifnet_llreach_info;
115struct rt_reach_info;
116
117/*
118 * IP route structure
119 *
120 * A route consists of a destination address and a reference
121 * to a routing entry.  These are often held by protocols
122 * in their control blocks, e.g. inpcb.
123 */
124struct route {
125	/*
126	 * N.B: struct route must begin with ro_{rt,srcia,flags}
127	 * because the code does some casts of a 'struct route_in6 *'
128	 * to a 'struct route *'.
129	 */
130	struct rtentry	*ro_rt;
131	struct ifaddr	*ro_srcia;
132	uint32_t	ro_flags;	/* route flags (see below) */
133	struct sockaddr	ro_dst;
134};
135
136#define	ROF_SRCIF_SELECTED	0x1	/* source interface was selected */
137
138#define	ROUTE_UNUSABLE(_ro)						\
139	((_ro)->ro_rt == NULL ||					\
140	((_ro)->ro_rt->rt_flags & (RTF_UP|RTF_CONDEMNED)) != RTF_UP ||	\
141	RT_GENID_OUTOFSYNC((_ro)->ro_rt))
142
143#define	_ROUTE_RELEASE_COMMON(_ro, _rnh_locked) do {			\
144	if ((_ro)->ro_rt != NULL) {					\
145		RT_LOCK_ASSERT_NOTHELD((_ro)->ro_rt);			\
146		if (_rnh_locked)					\
147			rtfree_locked((_ro)->ro_rt);			\
148		else							\
149			rtfree((_ro)->ro_rt);				\
150		(_ro)->ro_rt = NULL;					\
151	}								\
152	if ((_ro)->ro_srcia != NULL) {					\
153		IFA_REMREF((_ro)->ro_srcia);				\
154		(_ro)->ro_srcia = NULL;					\
155		(_ro)->ro_flags &= ~ROF_SRCIF_SELECTED;			\
156	}								\
157} while (0)
158
159#define	ROUTE_RELEASE_LOCKED(_ro)	_ROUTE_RELEASE_COMMON(_ro, TRUE)
160#define	ROUTE_RELEASE(_ro)		_ROUTE_RELEASE_COMMON(_ro, FALSE)
161
162/*
163 * We distinguish between routes to hosts and routes to networks,
164 * preferring the former if available.  For each route we infer
165 * the interface to use from the gateway address supplied when
166 * the route was entered.  Routes that forward packets through
167 * gateways are marked so that the output routines know to address the
168 * gateway rather than the ultimate destination.
169 */
170
171/*
172 * Kernel routing entry structure.
173 */
174struct rtentry {
175	struct	radix_node rt_nodes[2];	/* tree glue, and other values */
176#define	rt_key(r)	(SA((r)->rt_nodes->rn_key))
177#define	rt_mask(r)	(SA((r)->rt_nodes->rn_mask))
178	/*
179	 * See bsd/net/route.c for synchronization notes.
180	 */
181	decl_lck_mtx_data(, rt_lock);	/* lock for routing entry */
182	uint32_t rt_refcnt;		/* # held references */
183	uint32_t rt_flags;		/* up/down?, host/net */
184	uint32_t rt_genid;		/* route generation id */
185	struct sockaddr *rt_gateway;	/* value */
186	struct ifnet *rt_ifp;		/* the answer: interface to use */
187	struct ifaddr *rt_ifa;		/* the answer: interface addr to use */
188	struct sockaddr *rt_genmask;	/* for generation of cloned routes */
189	void *rt_llinfo;		/* pointer to link level info cache */
190	void (*rt_llinfo_get_ri)	/* llinfo get reachability info fn */
191	    (struct rtentry *, struct rt_reach_info *);
192	void (*rt_llinfo_get_iflri)	/* ifnet llinfo get reach. info fn */
193	    (struct rtentry *, struct ifnet_llreach_info *);
194	void (*rt_llinfo_purge)(struct rtentry *); /* llinfo purge fn */
195	void (*rt_llinfo_free)(void *); /* link level info free function */
196	struct rt_metrics rt_rmx;	/* metrics used by rx'ing protocols */
197#define	rt_use rt_rmx.rmx_pksent
198	struct rtentry *rt_gwroute;	/* implied entry for gatewayed routes */
199	struct rtentry *rt_parent;	/* cloning parent of this route */
200	struct nstat_counts *rt_stats;	/* route stats */
201	void (*rt_if_ref_fn)(struct ifnet *, int); /* interface ref func */
202
203	uint32_t *rt_tree_genid;	/* ptr to per-tree route_genid */
204	uint64_t rt_expire;		/* expiration time in uptime seconds */
205	uint64_t base_calendartime;	/* calendar time upon entry creation */
206	uint64_t base_uptime;		/* uptime upon entry creation */
207};
208
209/*
210 * Synchronize route entry's generation ID with the tree's.
211 */
212#define	RT_GENID_SYNC(_rt) do {						\
213	if ((_rt)->rt_tree_genid != NULL)				\
214		(_rt)->rt_genid = *(_rt)->rt_tree_genid;		\
215} while (0)
216
217/*
218 * Indicates whether or not the route entry's generation ID is stale.
219 */
220#define	RT_GENID_OUTOFSYNC(_rt)						\
221	((_rt)->rt_tree_genid != NULL &&				\
222	*(_rt)->rt_tree_genid != (_rt)->rt_genid)
223
224#endif /* BSD_KERNEL_PRIVATE */
225
226#define	RTF_UP		0x1		/* route usable */
227#define	RTF_GATEWAY	0x2		/* destination is a gateway */
228#define	RTF_HOST	0x4		/* host entry (net otherwise) */
229#define	RTF_REJECT	0x8		/* host or net unreachable */
230#define	RTF_DYNAMIC	0x10		/* created dynamically (by redirect) */
231#define	RTF_MODIFIED	0x20		/* modified dynamically (by redirect) */
232#define	RTF_DONE	0x40		/* message confirmed */
233#define	RTF_DELCLONE	0x80		/* delete cloned route */
234#define	RTF_CLONING	0x100		/* generate new routes on use */
235#define	RTF_XRESOLVE	0x200		/* external daemon resolves name */
236#define	RTF_LLINFO	0x400		/* generated by link layer (e.g. ARP) */
237#define	RTF_STATIC	0x800		/* manually added */
238#define	RTF_BLACKHOLE	0x1000		/* just discard pkts (during updates) */
239#define	RTF_NOIFREF	0x2000		/* not eligible for RTF_IFREF */
240#define	RTF_PROTO2	0x4000		/* protocol specific routing flag */
241#define	RTF_PROTO1	0x8000		/* protocol specific routing flag */
242
243#define	RTF_PRCLONING	0x10000		/* protocol requires cloning */
244#define	RTF_WASCLONED	0x20000		/* route generated through cloning */
245#define	RTF_PROTO3	0x40000		/* protocol specific routing flag */
246					/* 0x80000 unused */
247#define	RTF_PINNED	0x100000	/* future use */
248#define	RTF_LOCAL	0x200000	/* route represents a local address */
249#define	RTF_BROADCAST	0x400000	/* route represents a bcast address */
250#define	RTF_MULTICAST	0x800000	/* route represents a mcast address */
251#define	RTF_IFSCOPE	0x1000000	/* has valid interface scope */
252#define	RTF_CONDEMNED	0x2000000	/* defunct; no longer modifiable */
253#define	RTF_IFREF	0x4000000	/* route holds a ref to interface */
254#define	RTF_PROXY	0x8000000	/* proxying, no interface scope */
255#define	RTF_ROUTER	0x10000000	/* host is a router */
256					/* 0x20000000 and up unassigned */
257
258#define	RTF_BITS \
259	"\020\1UP\2GATEWAY\3HOST\4REJECT\5DYNAMIC\6MODIFIED\7DONE" \
260	"\10DELCLONE\11CLONING\12XRESOLVE\13LLINFO\14STATIC\15BLACKHOLE" \
261	"\16NOIFREF\17PROTO2\20PROTO1\21PRCLONING\22WASCLONED\23PROTO3" \
262	"\25PINNED\26LOCAL\27BROADCAST\30MULTICAST\31IFSCOPE\32CONDEMNED" \
263	"\33IFREF\34PROXY\35ROUTER"
264
265/*
266 * Routing statistics.
267 */
268struct	rtstat {
269	short	rts_badredirect;	/* bogus redirect calls */
270	short	rts_dynamic;		/* routes created by redirects */
271	short	rts_newgateway;		/* routes modified by redirects */
272	short	rts_unreach;		/* lookups which failed */
273	short	rts_wildcard;		/* lookups satisfied by a wildcard */
274};
275
276/*
277 * Structures for routing messages.
278 */
279struct rt_msghdr {
280	u_short	rtm_msglen;	/* to skip over non-understood messages */
281	u_char	rtm_version;	/* future binary compatibility */
282	u_char	rtm_type;	/* message type */
283	u_short	rtm_index;	/* index for associated ifp */
284	int	rtm_flags;	/* flags, incl. kern & message, e.g. DONE */
285	int	rtm_addrs;	/* bitmask identifying sockaddrs in msg */
286	pid_t	rtm_pid;	/* identify sender */
287	int	rtm_seq;	/* for sender to identify action */
288	int	rtm_errno;	/* why failed */
289	int	rtm_use;	/* from rtentry */
290	u_int32_t rtm_inits;	/* which metrics we are initializing */
291	struct rt_metrics rtm_rmx; /* metrics themselves */
292};
293
294struct rt_msghdr2 {
295	u_short	rtm_msglen;	/* to skip over non-understood messages */
296	u_char	rtm_version;	/* future binary compatibility */
297	u_char	rtm_type;	/* message type */
298	u_short	rtm_index;	/* index for associated ifp */
299	int	rtm_flags;	/* flags, incl. kern & message, e.g. DONE */
300	int	rtm_addrs;	/* bitmask identifying sockaddrs in msg */
301	int32_t	rtm_refcnt;	/* reference count */
302	int	rtm_parentflags; /* flags of the parent route */
303	int	rtm_reserved;	/* reserved field set to 0 */
304	int	rtm_use;	/* from rtentry */
305	u_int32_t rtm_inits;	/* which metrics we are initializing */
306	struct rt_metrics rtm_rmx; /* metrics themselves */
307};
308
309#ifdef PRIVATE
310/*
311 * Route reachability info.
312 */
313struct rt_reach_info {
314	u_int32_t	ri_refcnt;	/* reference count */
315	u_int32_t	ri_probes;	/* total # of probes */
316	u_int64_t	ri_snd_expire;	/* tx expiration (calendar) time */
317	u_int64_t	ri_rcv_expire;	/* rx expiration (calendar) time */
318	int32_t		ri_rssi;	/* received signal strength */
319	int32_t		ri_lqm;		/* link quality metric */
320	int32_t		ri_npm;		/* node proximity metric */
321};
322
323/*
324 * Extended routing message header (private).
325 */
326struct rt_msghdr_ext {
327	u_short	rtm_msglen;	/* to skip over non-understood messages */
328	u_char	rtm_version;	/* future binary compatibility */
329	u_char	rtm_type;	/* message type */
330	u_int32_t rtm_index;	/* index for associated ifp */
331	u_int32_t rtm_flags;	/* flags, incl. kern & message, e.g. DONE */
332	u_int32_t rtm_reserved;	/* for future use */
333	u_int32_t rtm_addrs;	/* bitmask identifying sockaddrs in msg */
334	pid_t	rtm_pid;	/* identify sender */
335	int	rtm_seq;	/* for sender to identify action */
336	int	rtm_errno;	/* why failed */
337	u_int32_t rtm_use;	/* from rtentry */
338	u_int32_t rtm_inits;	/* which metrics we are initializing */
339	struct rt_metrics rtm_rmx;	/* metrics themselves */
340	struct rt_reach_info rtm_ri;	/* route reachability info */
341};
342#endif /* PRIVATE */
343
344#define	RTM_VERSION	5	/* Up the ante and ignore older versions */
345
346/*
347 * Message types.
348 */
349#define	RTM_ADD		0x1	/* Add Route */
350#define	RTM_DELETE	0x2	/* Delete Route */
351#define	RTM_CHANGE	0x3	/* Change Metrics or flags */
352#define	RTM_GET		0x4	/* Report Metrics */
353#define	RTM_LOSING	0x5	/* Kernel Suspects Partitioning */
354#define	RTM_REDIRECT	0x6	/* Told to use different route */
355#define	RTM_MISS	0x7	/* Lookup failed on this address */
356#define	RTM_LOCK	0x8	/* fix specified metrics */
357#define	RTM_OLDADD	0x9	/* caused by SIOCADDRT */
358#define	RTM_OLDDEL	0xa	/* caused by SIOCDELRT */
359#define	RTM_RESOLVE	0xb	/* req to resolve dst to LL addr */
360#define	RTM_NEWADDR	0xc	/* address being added to iface */
361#define	RTM_DELADDR	0xd	/* address being removed from iface */
362#define	RTM_IFINFO	0xe	/* iface going up/down etc. */
363#define	RTM_NEWMADDR	0xf	/* mcast group membership being added to if */
364#define	RTM_DELMADDR	0x10	/* mcast group membership being deleted */
365#ifdef PRIVATE
366#define	RTM_GET_SILENT	0x11
367#endif /* PRIVATE */
368#define	RTM_IFINFO2	0x12	/* */
369#define	RTM_NEWMADDR2	0x13	/* */
370#define	RTM_GET2	0x14	/* */
371#ifdef PRIVATE
372#define	RTM_GET_EXT	0x15
373#endif /* PRIVATE */
374
375/*
376 * Bitmask values for rtm_inits and rmx_locks.
377 */
378#define	RTV_MTU		0x1	/* init or lock _mtu */
379#define	RTV_HOPCOUNT	0x2	/* init or lock _hopcount */
380#define	RTV_EXPIRE	0x4	/* init or lock _expire */
381#define	RTV_RPIPE	0x8	/* init or lock _recvpipe */
382#define	RTV_SPIPE	0x10	/* init or lock _sendpipe */
383#define	RTV_SSTHRESH	0x20	/* init or lock _ssthresh */
384#define	RTV_RTT		0x40	/* init or lock _rtt */
385#define	RTV_RTTVAR	0x80	/* init or lock _rttvar */
386
387/*
388 * Bitmask values for rtm_addrs.
389 */
390#define	RTA_DST		0x1	/* destination sockaddr present */
391#define	RTA_GATEWAY	0x2	/* gateway sockaddr present */
392#define	RTA_NETMASK	0x4	/* netmask sockaddr present */
393#define	RTA_GENMASK	0x8	/* cloning mask sockaddr present */
394#define	RTA_IFP		0x10	/* interface name sockaddr present */
395#define	RTA_IFA		0x20	/* interface addr sockaddr present */
396#define	RTA_AUTHOR	0x40	/* sockaddr for author of redirect */
397#define	RTA_BRD		0x80	/* for NEWADDR, broadcast or p-p dest addr */
398
399/*
400 * Index offsets for sockaddr array for alternate internal encoding.
401 */
402#define	RTAX_DST	0	/* destination sockaddr present */
403#define	RTAX_GATEWAY	1	/* gateway sockaddr present */
404#define	RTAX_NETMASK	2	/* netmask sockaddr present */
405#define	RTAX_GENMASK	3	/* cloning mask sockaddr present */
406#define	RTAX_IFP	4	/* interface name sockaddr present */
407#define	RTAX_IFA	5	/* interface addr sockaddr present */
408#define	RTAX_AUTHOR	6	/* sockaddr for author of redirect */
409#define	RTAX_BRD	7	/* for NEWADDR, broadcast or p-p dest addr */
410#define	RTAX_MAX	8	/* size of array to allocate */
411
412struct rt_addrinfo {
413	int	rti_addrs;
414	struct	sockaddr *rti_info[RTAX_MAX];
415};
416
417#ifdef PRIVATE
418/*
419 * For scoped routing; a zero interface scope value means nil/no scope.
420 */
421#define	IFSCOPE_NONE	0
422#endif /* PRIVATE */
423
424#ifdef BSD_KERNEL_PRIVATE
425/*
426 * Generic call trace used by some subsystems (e.g. route, ifaddr)
427 */
428#define	CTRACE_STACK_SIZE	8		/* depth of stack trace */
429#define	CTRACE_HIST_SIZE	4		/* refcnt history size */
430typedef struct ctrace {
431	void	*th;				/* thread ptr */
432	void	*pc[CTRACE_STACK_SIZE];		/* PC stack trace */
433} ctrace_t;
434
435extern void ctrace_record(ctrace_t *);
436
437#define	RT_LOCK_ASSERT_HELD(_rt)					\
438	lck_mtx_assert(&(_rt)->rt_lock, LCK_MTX_ASSERT_OWNED)
439
440#define	RT_LOCK_ASSERT_NOTHELD(_rt)					\
441	lck_mtx_assert(&(_rt)->rt_lock, LCK_MTX_ASSERT_NOTOWNED)
442
443#define	RT_LOCK(_rt) do {						\
444	rt_lock(_rt, FALSE);						\
445} while (0)
446
447#define	RT_LOCK_SPIN(_rt) do {						\
448	rt_lock(_rt, TRUE);						\
449} while (0)
450
451#define	RT_CONVERT_LOCK(_rt) do {					\
452	RT_LOCK_ASSERT_HELD(_rt);					\
453	lck_mtx_convert_spin(&(_rt)->rt_lock);				\
454} while (0)
455
456#define	RT_UNLOCK(_rt) do {						\
457	rt_unlock(_rt);							\
458} while (0)
459
460#define	RT_ADDREF_LOCKED(_rt) do {					\
461	rtref(_rt);							\
462} while (0)
463
464/*
465 * Spin variant mutex is used here; caller is responsible for
466 * converting any previously-held similar lock to full mutex.
467 */
468#define	RT_ADDREF(_rt) do {						\
469	RT_LOCK_SPIN(_rt);						\
470	RT_ADDREF_LOCKED(_rt);						\
471	RT_UNLOCK(_rt);							\
472} while (0)
473
474#define	RT_REMREF_LOCKED(_rt) do {					\
475	(void) rtunref(_rt);						\
476} while (0)
477
478/*
479 * Spin variant mutex is used here; caller is responsible for
480 * converting any previously-held similar lock to full mutex.
481 */
482#define	RT_REMREF(_rt) do {						\
483	RT_LOCK_SPIN(_rt);						\
484	RT_REMREF_LOCKED(_rt);						\
485	RT_UNLOCK(_rt);							\
486} while (0)
487
488/*
489 * This macro calculates skew in wall clock, just in case the user changes the
490 * system time. This skew adjustment is required because we now keep the
491 * expiration times in uptime terms in the kernel, but the userland still
492 * expects expiration times in terms of calendar times.  This is used when
493 * reporting rt_expire, ln_expire, etc. values to user space.
494 */
495#define	NET_CALCULATE_CLOCKSKEW(cc, ic, cu, iu)				\
496	((cc.tv_sec - ic) - (cu - iu))
497
498extern unsigned int rt_verbose;
499extern struct radix_node_head *rt_tables[AF_MAX+1];
500extern lck_mtx_t *rnh_lock;
501extern uint32_t route_genid_inet;	/* INET route generation count */
502#if INET6
503extern uint32_t route_genid_inet6;	/* INET6 route generation count */
504#endif /* INET6 */
505extern int rttrash;
506extern unsigned int rte_debug;
507
508struct ifmultiaddr;
509struct proc;
510
511extern void route_init(void);
512extern void routegenid_update(void);
513extern void routegenid_inet_update(void);
514extern void routegenid_inet6_update(void);
515extern void rt_ifmsg(struct ifnet *);
516extern void rt_missmsg(int, struct rt_addrinfo *, int, int);
517extern void rt_newaddrmsg(int, struct ifaddr *, int, struct rtentry *);
518extern void rt_newmaddrmsg(int, struct ifmultiaddr *);
519extern int rt_setgate(struct rtentry *, struct sockaddr *, struct sockaddr *);
520extern void set_primary_ifscope(int, unsigned int);
521extern unsigned int get_primary_ifscope(int);
522extern boolean_t rt_primary_default(struct rtentry *, struct sockaddr *);
523extern struct rtentry *rt_lookup(boolean_t, struct sockaddr *,
524    struct sockaddr *, struct radix_node_head *, unsigned int);
525extern struct rtentry *rt_lookup_coarse(boolean_t, struct sockaddr *,
526    struct sockaddr *, struct radix_node_head *);
527extern void rtalloc(struct route *);
528extern void rtalloc_scoped(struct route *, unsigned int);
529extern void rtalloc_ign(struct route *, uint32_t);
530extern void rtalloc_scoped_ign(struct route *, uint32_t, unsigned int);
531extern struct rtentry *rtalloc1(struct sockaddr *, int, uint32_t);
532extern struct rtentry *rtalloc1_scoped(struct sockaddr *, int, uint32_t,
533    unsigned int);
534extern struct rtentry *rtalloc1_scoped_locked(struct sockaddr *, int,
535    uint32_t, unsigned int);
536extern void rtfree_locked(struct rtentry *);
537extern void rtfree(struct rtentry *);
538extern void rtref(struct rtentry *);
539/*
540 * rtunref will decrement the refcount, rtfree will decrement and free if
541 * the refcount has reached zero and the route is not up.
542 * Unless you have good reason to do otherwise, use rtfree.
543 */
544extern int rtunref(struct rtentry *);
545extern void rtsetifa(struct rtentry *, struct ifaddr *);
546extern int rtinit(struct ifaddr *, int, int);
547extern int rtinit_locked(struct ifaddr *, int, int);
548extern int rtioctl(unsigned long, caddr_t, struct proc *);
549extern void rtredirect(struct ifnet *, struct sockaddr *, struct sockaddr *,
550    struct sockaddr *, int, struct sockaddr *, struct rtentry **);
551extern int rtrequest(int, struct sockaddr *,
552    struct sockaddr *, struct sockaddr *, int, struct rtentry **);
553extern int rtrequest_scoped(int, struct sockaddr *, struct sockaddr *,
554    struct sockaddr *, int, struct rtentry **, unsigned int);
555extern int rtrequest_locked(int, struct sockaddr *,
556    struct sockaddr *, struct sockaddr *, int, struct rtentry **);
557extern int rtrequest_scoped_locked(int, struct sockaddr *, struct sockaddr *,
558    struct sockaddr *, int, struct rtentry **, unsigned int);
559extern void sin_set_ifscope(struct sockaddr *, unsigned int);
560extern unsigned int sin_get_ifscope(struct sockaddr *);
561extern unsigned int sin6_get_ifscope(struct sockaddr *);
562extern void rt_lock(struct rtentry *, boolean_t);
563extern void rt_unlock(struct rtentry *);
564extern struct sockaddr *rtm_scrub(int, int, struct sockaddr *,
565    struct sockaddr *, void *, uint32_t, kauth_cred_t *);
566extern boolean_t rt_validate(struct rtentry *);
567extern void rt_set_proxy(struct rtentry *, boolean_t);
568extern void rt_set_gwroute(struct rtentry *, struct sockaddr *,
569    struct rtentry *);
570extern void rt_revalidate_gwroute(struct rtentry *, struct rtentry *);
571extern errno_t route_to_gwroute(const struct sockaddr *, struct rtentry *,
572    struct rtentry **);
573extern void rt_setexpire(struct rtentry *, uint64_t);
574extern void rt_str(struct rtentry *, char *, uint32_t, char *, uint32_t);
575extern const char *rtm2str(int);
576extern void route_copyin(struct route *, struct route *, size_t);
577extern void route_copyout(struct route *, const struct route *, size_t);
578#endif /* BSD_KERNEL_PRIVATE */
579#endif /* _NET_ROUTE_H_ */
580