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
95#ifndef KERNEL
96/* Private declaration for user-space (needed by ip_mroute.h) */
97struct route {
98#else /* KERNEL */
99struct route_old {
100#endif /* KERNEL */
101	void		*ro_rt;
102	uint32_t	ro_flags;
103	struct sockaddr	ro_dst;
104};
105#endif /* PRIVATE */
106
107#ifdef BSD_KERNEL_PRIVATE
108#include <kern/locks.h>
109#include <net/radix.h>
110
111/*
112 * Kernel resident routing tables.
113 *
114 * The routing tables are initialized when interface addresses
115 * are set by making entries for all directly connected interfaces.
116 */
117
118/* forward declarations */
119struct ifnet_llreach_info;
120struct rt_reach_info;
121
122/*
123 * IP route structure
124 *
125 * A route consists of a destination address and a reference
126 * to a routing entry.  These are often held by protocols
127 * in their control blocks, e.g. inpcb.
128 */
129struct route {
130	/*
131	 * N.B: struct route must begin with ro_{rt,srcia,flags}
132	 * because the code does some casts of a 'struct route_in6 *'
133	 * to a 'struct route *'.
134	 */
135	struct rtentry	*ro_rt;
136	struct ifaddr	*ro_srcia;
137	uint32_t	ro_flags;	/* route flags (see below) */
138	struct sockaddr	ro_dst;
139};
140
141#define	ROF_SRCIF_SELECTED	0x1	/* source interface was selected */
142
143#define	ROUTE_UNUSABLE(_ro)						\
144	((_ro)->ro_rt == NULL ||					\
145	((_ro)->ro_rt->rt_flags & (RTF_UP|RTF_CONDEMNED)) != RTF_UP ||	\
146	RT_GENID_OUTOFSYNC((_ro)->ro_rt))
147
148#define	_ROUTE_RELEASE_COMMON(_ro, _rnh_locked) do {			\
149	if ((_ro)->ro_rt != NULL) {					\
150		RT_LOCK_ASSERT_NOTHELD((_ro)->ro_rt);			\
151		if (_rnh_locked)					\
152			rtfree_locked((_ro)->ro_rt);			\
153		else							\
154			rtfree((_ro)->ro_rt);				\
155		(_ro)->ro_rt = NULL;					\
156	}								\
157	if ((_ro)->ro_srcia != NULL) {					\
158		IFA_REMREF((_ro)->ro_srcia);				\
159		(_ro)->ro_srcia = NULL;					\
160		(_ro)->ro_flags &= ~ROF_SRCIF_SELECTED;			\
161	}								\
162} while (0)
163
164#define	ROUTE_RELEASE_LOCKED(_ro)	_ROUTE_RELEASE_COMMON(_ro, TRUE)
165#define	ROUTE_RELEASE(_ro)		_ROUTE_RELEASE_COMMON(_ro, FALSE)
166
167/*
168 * We distinguish between routes to hosts and routes to networks,
169 * preferring the former if available.  For each route we infer
170 * the interface to use from the gateway address supplied when
171 * the route was entered.  Routes that forward packets through
172 * gateways are marked so that the output routines know to address the
173 * gateway rather than the ultimate destination.
174 */
175
176/*
177 * Kernel routing entry structure.
178 */
179struct rtentry {
180	struct	radix_node rt_nodes[2];	/* tree glue, and other values */
181#define	rt_key(r)	(SA((r)->rt_nodes->rn_key))
182#define	rt_mask(r)	(SA((r)->rt_nodes->rn_mask))
183	/*
184	 * See bsd/net/route.c for synchronization notes.
185	 */
186	decl_lck_mtx_data(, rt_lock);	/* lock for routing entry */
187	uint32_t rt_refcnt;		/* # held references */
188	uint32_t rt_flags;		/* up/down?, host/net */
189	uint32_t rt_genid;		/* route generation id */
190	struct sockaddr *rt_gateway;	/* value */
191	struct ifnet *rt_ifp;		/* the answer: interface to use */
192	struct ifaddr *rt_ifa;		/* the answer: interface addr to use */
193	struct sockaddr *rt_genmask;	/* for generation of cloned routes */
194	void *rt_llinfo;		/* pointer to link level info cache */
195	void (*rt_llinfo_get_ri)	/* llinfo get reachability info fn */
196	    (struct rtentry *, struct rt_reach_info *);
197	void (*rt_llinfo_get_iflri)	/* ifnet llinfo get reach. info fn */
198	    (struct rtentry *, struct ifnet_llreach_info *);
199	void (*rt_llinfo_purge)(struct rtentry *); /* llinfo purge fn */
200	void (*rt_llinfo_free)(void *); /* link level info free function */
201	struct rt_metrics rt_rmx;	/* metrics used by rx'ing protocols */
202#define	rt_use rt_rmx.rmx_pksent
203	struct rtentry *rt_gwroute;	/* implied entry for gatewayed routes */
204	struct rtentry *rt_parent;	/* cloning parent of this route */
205	struct nstat_counts *rt_stats;	/* route stats */
206	void (*rt_if_ref_fn)(struct ifnet *, int); /* interface ref func */
207
208	uint32_t *rt_tree_genid;	/* ptr to per-tree route_genid */
209	uint64_t rt_expire;		/* expiration time in uptime seconds */
210	uint64_t base_calendartime;	/* calendar time upon entry creation */
211	uint64_t base_uptime;		/* uptime upon entry creation */
212};
213
214/*
215 * Synchronize route entry's generation ID with the tree's.
216 */
217#define	RT_GENID_SYNC(_rt) do {						\
218	if ((_rt)->rt_tree_genid != NULL)				\
219		(_rt)->rt_genid = *(_rt)->rt_tree_genid;		\
220} while (0)
221
222/*
223 * Indicates whether or not the route entry's generation ID is stale.
224 */
225#define	RT_GENID_OUTOFSYNC(_rt)						\
226	((_rt)->rt_tree_genid != NULL &&				\
227	*(_rt)->rt_tree_genid != (_rt)->rt_genid)
228
229#endif /* BSD_KERNEL_PRIVATE */
230
231#define	RTF_UP		0x1		/* route usable */
232#define	RTF_GATEWAY	0x2		/* destination is a gateway */
233#define	RTF_HOST	0x4		/* host entry (net otherwise) */
234#define	RTF_REJECT	0x8		/* host or net unreachable */
235#define	RTF_DYNAMIC	0x10		/* created dynamically (by redirect) */
236#define	RTF_MODIFIED	0x20		/* modified dynamically (by redirect) */
237#define	RTF_DONE	0x40		/* message confirmed */
238#define	RTF_DELCLONE	0x80		/* delete cloned route */
239#define	RTF_CLONING	0x100		/* generate new routes on use */
240#define	RTF_XRESOLVE	0x200		/* external daemon resolves name */
241#define	RTF_LLINFO	0x400		/* generated by link layer (e.g. ARP) */
242#define	RTF_STATIC	0x800		/* manually added */
243#define	RTF_BLACKHOLE	0x1000		/* just discard pkts (during updates) */
244#define	RTF_NOIFREF	0x2000		/* not eligible for RTF_IFREF */
245#define	RTF_PROTO2	0x4000		/* protocol specific routing flag */
246#define	RTF_PROTO1	0x8000		/* protocol specific routing flag */
247
248#define	RTF_PRCLONING	0x10000		/* protocol requires cloning */
249#define	RTF_WASCLONED	0x20000		/* route generated through cloning */
250#define	RTF_PROTO3	0x40000		/* protocol specific routing flag */
251					/* 0x80000 unused */
252#define	RTF_PINNED	0x100000	/* future use */
253#define	RTF_LOCAL	0x200000	/* route represents a local address */
254#define	RTF_BROADCAST	0x400000	/* route represents a bcast address */
255#define	RTF_MULTICAST	0x800000	/* route represents a mcast address */
256#define	RTF_IFSCOPE	0x1000000	/* has valid interface scope */
257#define	RTF_CONDEMNED	0x2000000	/* defunct; no longer modifiable */
258#define	RTF_IFREF	0x4000000	/* route holds a ref to interface */
259#define	RTF_PROXY	0x8000000	/* proxying, no interface scope */
260#define	RTF_ROUTER	0x10000000	/* host is a router */
261					/* 0x20000000 and up unassigned */
262
263#define	RTF_BITS \
264	"\020\1UP\2GATEWAY\3HOST\4REJECT\5DYNAMIC\6MODIFIED\7DONE" \
265	"\10DELCLONE\11CLONING\12XRESOLVE\13LLINFO\14STATIC\15BLACKHOLE" \
266	"\16NOIFREF\17PROTO2\20PROTO1\21PRCLONING\22WASCLONED\23PROTO3" \
267	"\25PINNED\26LOCAL\27BROADCAST\30MULTICAST\31IFSCOPE\32CONDEMNED" \
268	"\33IFREF\34PROXY\35ROUTER"
269
270/*
271 * Routing statistics.
272 */
273struct	rtstat {
274	short	rts_badredirect;	/* bogus redirect calls */
275	short	rts_dynamic;		/* routes created by redirects */
276	short	rts_newgateway;		/* routes modified by redirects */
277	short	rts_unreach;		/* lookups which failed */
278	short	rts_wildcard;		/* lookups satisfied by a wildcard */
279};
280
281/*
282 * Structures for routing messages.
283 */
284struct rt_msghdr {
285	u_short	rtm_msglen;	/* to skip over non-understood messages */
286	u_char	rtm_version;	/* future binary compatibility */
287	u_char	rtm_type;	/* message type */
288	u_short	rtm_index;	/* index for associated ifp */
289	int	rtm_flags;	/* flags, incl. kern & message, e.g. DONE */
290	int	rtm_addrs;	/* bitmask identifying sockaddrs in msg */
291	pid_t	rtm_pid;	/* identify sender */
292	int	rtm_seq;	/* for sender to identify action */
293	int	rtm_errno;	/* why failed */
294	int	rtm_use;	/* from rtentry */
295	u_int32_t rtm_inits;	/* which metrics we are initializing */
296	struct rt_metrics rtm_rmx; /* metrics themselves */
297};
298
299struct rt_msghdr2 {
300	u_short	rtm_msglen;	/* to skip over non-understood messages */
301	u_char	rtm_version;	/* future binary compatibility */
302	u_char	rtm_type;	/* message type */
303	u_short	rtm_index;	/* index for associated ifp */
304	int	rtm_flags;	/* flags, incl. kern & message, e.g. DONE */
305	int	rtm_addrs;	/* bitmask identifying sockaddrs in msg */
306	int32_t	rtm_refcnt;	/* reference count */
307	int	rtm_parentflags; /* flags of the parent route */
308	int	rtm_reserved;	/* reserved field set to 0 */
309	int	rtm_use;	/* from rtentry */
310	u_int32_t rtm_inits;	/* which metrics we are initializing */
311	struct rt_metrics rtm_rmx; /* metrics themselves */
312};
313
314#ifdef PRIVATE
315/*
316 * Route reachability info.
317 */
318struct rt_reach_info {
319	u_int32_t	ri_refcnt;	/* reference count */
320	u_int32_t	ri_probes;	/* total # of probes */
321	u_int64_t	ri_snd_expire;	/* tx expiration (calendar) time */
322	u_int64_t	ri_rcv_expire;	/* rx expiration (calendar) time */
323	int32_t		ri_rssi;	/* received signal strength */
324	int32_t		ri_lqm;		/* link quality metric */
325	int32_t		ri_npm;		/* node proximity metric */
326};
327
328/*
329 * Extended routing message header (private).
330 */
331struct rt_msghdr_ext {
332	u_short	rtm_msglen;	/* to skip over non-understood messages */
333	u_char	rtm_version;	/* future binary compatibility */
334	u_char	rtm_type;	/* message type */
335	u_int32_t rtm_index;	/* index for associated ifp */
336	u_int32_t rtm_flags;	/* flags, incl. kern & message, e.g. DONE */
337	u_int32_t rtm_reserved;	/* for future use */
338	u_int32_t rtm_addrs;	/* bitmask identifying sockaddrs in msg */
339	pid_t	rtm_pid;	/* identify sender */
340	int	rtm_seq;	/* for sender to identify action */
341	int	rtm_errno;	/* why failed */
342	u_int32_t rtm_use;	/* from rtentry */
343	u_int32_t rtm_inits;	/* which metrics we are initializing */
344	struct rt_metrics rtm_rmx;	/* metrics themselves */
345	struct rt_reach_info rtm_ri;	/* route reachability info */
346};
347#endif /* PRIVATE */
348
349#define	RTM_VERSION	5	/* Up the ante and ignore older versions */
350
351/*
352 * Message types.
353 */
354#define	RTM_ADD		0x1	/* Add Route */
355#define	RTM_DELETE	0x2	/* Delete Route */
356#define	RTM_CHANGE	0x3	/* Change Metrics or flags */
357#define	RTM_GET		0x4	/* Report Metrics */
358#define	RTM_LOSING	0x5	/* Kernel Suspects Partitioning */
359#define	RTM_REDIRECT	0x6	/* Told to use different route */
360#define	RTM_MISS	0x7	/* Lookup failed on this address */
361#define	RTM_LOCK	0x8	/* fix specified metrics */
362#define	RTM_OLDADD	0x9	/* caused by SIOCADDRT */
363#define	RTM_OLDDEL	0xa	/* caused by SIOCDELRT */
364#define	RTM_RESOLVE	0xb	/* req to resolve dst to LL addr */
365#define	RTM_NEWADDR	0xc	/* address being added to iface */
366#define	RTM_DELADDR	0xd	/* address being removed from iface */
367#define	RTM_IFINFO	0xe	/* iface going up/down etc. */
368#define	RTM_NEWMADDR	0xf	/* mcast group membership being added to if */
369#define	RTM_DELMADDR	0x10	/* mcast group membership being deleted */
370#ifdef PRIVATE
371#define	RTM_GET_SILENT	0x11
372#endif /* PRIVATE */
373#define	RTM_IFINFO2	0x12	/* */
374#define	RTM_NEWMADDR2	0x13	/* */
375#define	RTM_GET2	0x14	/* */
376#ifdef PRIVATE
377#define	RTM_GET_EXT	0x15
378#endif /* PRIVATE */
379
380/*
381 * Bitmask values for rtm_inits and rmx_locks.
382 */
383#define	RTV_MTU		0x1	/* init or lock _mtu */
384#define	RTV_HOPCOUNT	0x2	/* init or lock _hopcount */
385#define	RTV_EXPIRE	0x4	/* init or lock _expire */
386#define	RTV_RPIPE	0x8	/* init or lock _recvpipe */
387#define	RTV_SPIPE	0x10	/* init or lock _sendpipe */
388#define	RTV_SSTHRESH	0x20	/* init or lock _ssthresh */
389#define	RTV_RTT		0x40	/* init or lock _rtt */
390#define	RTV_RTTVAR	0x80	/* init or lock _rttvar */
391
392/*
393 * Bitmask values for rtm_addrs.
394 */
395#define	RTA_DST		0x1	/* destination sockaddr present */
396#define	RTA_GATEWAY	0x2	/* gateway sockaddr present */
397#define	RTA_NETMASK	0x4	/* netmask sockaddr present */
398#define	RTA_GENMASK	0x8	/* cloning mask sockaddr present */
399#define	RTA_IFP		0x10	/* interface name sockaddr present */
400#define	RTA_IFA		0x20	/* interface addr sockaddr present */
401#define	RTA_AUTHOR	0x40	/* sockaddr for author of redirect */
402#define	RTA_BRD		0x80	/* for NEWADDR, broadcast or p-p dest addr */
403
404/*
405 * Index offsets for sockaddr array for alternate internal encoding.
406 */
407#define	RTAX_DST	0	/* destination sockaddr present */
408#define	RTAX_GATEWAY	1	/* gateway sockaddr present */
409#define	RTAX_NETMASK	2	/* netmask sockaddr present */
410#define	RTAX_GENMASK	3	/* cloning mask sockaddr present */
411#define	RTAX_IFP	4	/* interface name sockaddr present */
412#define	RTAX_IFA	5	/* interface addr sockaddr present */
413#define	RTAX_AUTHOR	6	/* sockaddr for author of redirect */
414#define	RTAX_BRD	7	/* for NEWADDR, broadcast or p-p dest addr */
415#define	RTAX_MAX	8	/* size of array to allocate */
416
417struct rt_addrinfo {
418	int	rti_addrs;
419	struct	sockaddr *rti_info[RTAX_MAX];
420};
421
422#ifdef PRIVATE
423/*
424 * For scoped routing; a zero interface scope value means nil/no scope.
425 */
426#define	IFSCOPE_NONE	0
427#endif /* PRIVATE */
428
429#ifdef BSD_KERNEL_PRIVATE
430/*
431 * Generic call trace used by some subsystems (e.g. route, ifaddr)
432 */
433#define	CTRACE_STACK_SIZE	8		/* depth of stack trace */
434#define	CTRACE_HIST_SIZE	4		/* refcnt history size */
435typedef struct ctrace {
436	void	*th;				/* thread ptr */
437	void	*pc[CTRACE_STACK_SIZE];		/* PC stack trace */
438} ctrace_t;
439
440extern void ctrace_record(ctrace_t *);
441
442#define	RT_LOCK_ASSERT_HELD(_rt)					\
443	lck_mtx_assert(&(_rt)->rt_lock, LCK_MTX_ASSERT_OWNED)
444
445#define	RT_LOCK_ASSERT_NOTHELD(_rt)					\
446	lck_mtx_assert(&(_rt)->rt_lock, LCK_MTX_ASSERT_NOTOWNED)
447
448#define	RT_LOCK(_rt) do {						\
449	rt_lock(_rt, FALSE);						\
450} while (0)
451
452#define	RT_LOCK_SPIN(_rt) do {						\
453	rt_lock(_rt, TRUE);						\
454} while (0)
455
456#define	RT_CONVERT_LOCK(_rt) do {					\
457	RT_LOCK_ASSERT_HELD(_rt);					\
458	lck_mtx_convert_spin(&(_rt)->rt_lock);				\
459} while (0)
460
461#define	RT_UNLOCK(_rt) do {						\
462	rt_unlock(_rt);							\
463} while (0)
464
465#define	RT_ADDREF_LOCKED(_rt) do {					\
466	rtref(_rt);							\
467} while (0)
468
469/*
470 * Spin variant mutex is used here; caller is responsible for
471 * converting any previously-held similar lock to full mutex.
472 */
473#define	RT_ADDREF(_rt) do {						\
474	RT_LOCK_SPIN(_rt);						\
475	RT_ADDREF_LOCKED(_rt);						\
476	RT_UNLOCK(_rt);							\
477} while (0)
478
479#define	RT_REMREF_LOCKED(_rt) do {					\
480	(void) rtunref(_rt);						\
481} while (0)
482
483/*
484 * Spin variant mutex is used here; caller is responsible for
485 * converting any previously-held similar lock to full mutex.
486 */
487#define	RT_REMREF(_rt) do {						\
488	RT_LOCK_SPIN(_rt);						\
489	RT_REMREF_LOCKED(_rt);						\
490	RT_UNLOCK(_rt);							\
491} while (0)
492
493/*
494 * This macro calculates skew in wall clock, just in case the user changes the
495 * system time. This skew adjustment is required because we now keep the
496 * expiration times in uptime terms in the kernel, but the userland still
497 * expects expiration times in terms of calendar times.  This is used when
498 * reporting rt_expire, ln_expire, etc. values to user space.
499 */
500#define	NET_CALCULATE_CLOCKSKEW(cc, ic, cu, iu)				\
501	((cc.tv_sec - ic) - (cu - iu))
502
503extern unsigned int rt_verbose;
504extern struct radix_node_head *rt_tables[AF_MAX+1];
505extern lck_mtx_t *rnh_lock;
506extern uint32_t route_genid_inet;	/* INET route generation count */
507#if INET6
508extern uint32_t route_genid_inet6;	/* INET6 route generation count */
509#endif /* INET6 */
510extern int rttrash;
511extern unsigned int rte_debug;
512
513struct ifmultiaddr;
514struct proc;
515
516extern void route_init(void);
517extern void routegenid_update(void);
518extern void routegenid_inet_update(void);
519extern void routegenid_inet6_update(void);
520extern void rt_ifmsg(struct ifnet *);
521extern void rt_missmsg(int, struct rt_addrinfo *, int, int);
522extern void rt_newaddrmsg(int, struct ifaddr *, int, struct rtentry *);
523extern void rt_newmaddrmsg(int, struct ifmultiaddr *);
524extern int rt_setgate(struct rtentry *, struct sockaddr *, struct sockaddr *);
525extern void set_primary_ifscope(int, unsigned int);
526extern unsigned int get_primary_ifscope(int);
527extern boolean_t rt_primary_default(struct rtentry *, struct sockaddr *);
528extern struct rtentry *rt_lookup(boolean_t, struct sockaddr *,
529    struct sockaddr *, struct radix_node_head *, unsigned int);
530extern struct rtentry *rt_lookup_coarse(boolean_t, struct sockaddr *,
531    struct sockaddr *, struct radix_node_head *);
532extern void rtalloc(struct route *);
533extern void rtalloc_scoped(struct route *, unsigned int);
534extern void rtalloc_ign(struct route *, uint32_t);
535extern void rtalloc_scoped_ign(struct route *, uint32_t, unsigned int);
536extern struct rtentry *rtalloc1(struct sockaddr *, int, uint32_t);
537extern struct rtentry *rtalloc1_scoped(struct sockaddr *, int, uint32_t,
538    unsigned int);
539extern struct rtentry *rtalloc1_scoped_locked(struct sockaddr *, int,
540    uint32_t, unsigned int);
541extern void rtfree_locked(struct rtentry *);
542extern void rtfree(struct rtentry *);
543extern void rtref(struct rtentry *);
544/*
545 * rtunref will decrement the refcount, rtfree will decrement and free if
546 * the refcount has reached zero and the route is not up.
547 * Unless you have good reason to do otherwise, use rtfree.
548 */
549extern int rtunref(struct rtentry *);
550extern void rtsetifa(struct rtentry *, struct ifaddr *);
551extern int rtinit(struct ifaddr *, int, int);
552extern int rtinit_locked(struct ifaddr *, int, int);
553extern int rtioctl(unsigned long, caddr_t, struct proc *);
554extern void rtredirect(struct ifnet *, struct sockaddr *, struct sockaddr *,
555    struct sockaddr *, int, struct sockaddr *, struct rtentry **);
556extern int rtrequest(int, struct sockaddr *,
557    struct sockaddr *, struct sockaddr *, int, struct rtentry **);
558extern int rtrequest_scoped(int, struct sockaddr *, struct sockaddr *,
559    struct sockaddr *, int, struct rtentry **, unsigned int);
560extern int rtrequest_locked(int, struct sockaddr *,
561    struct sockaddr *, struct sockaddr *, int, struct rtentry **);
562extern int rtrequest_scoped_locked(int, struct sockaddr *, struct sockaddr *,
563    struct sockaddr *, int, struct rtentry **, unsigned int);
564extern void sin_set_ifscope(struct sockaddr *, unsigned int);
565extern unsigned int sin_get_ifscope(struct sockaddr *);
566extern unsigned int sin6_get_ifscope(struct sockaddr *);
567extern void rt_lock(struct rtentry *, boolean_t);
568extern void rt_unlock(struct rtentry *);
569extern struct sockaddr *rtm_scrub(int, int, struct sockaddr *,
570    struct sockaddr *, void *, uint32_t, kauth_cred_t *);
571extern boolean_t rt_validate(struct rtentry *);
572extern void rt_set_proxy(struct rtentry *, boolean_t);
573extern void rt_set_gwroute(struct rtentry *, struct sockaddr *,
574    struct rtentry *);
575extern void rt_revalidate_gwroute(struct rtentry *, struct rtentry *);
576extern errno_t route_to_gwroute(const struct sockaddr *, struct rtentry *,
577    struct rtentry **);
578extern void rt_setexpire(struct rtentry *, uint64_t);
579extern void rt_str(struct rtentry *, char *, uint32_t, char *, uint32_t);
580extern const char *rtm2str(int);
581extern void route_copyin(struct route *, struct route *, size_t);
582extern void route_copyout(struct route *, const struct route *, size_t);
583#endif /* BSD_KERNEL_PRIVATE */
584#endif /* _NET_ROUTE_H_ */
585