1/* 2 * Copyright (c) 2000-2012 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 * Kernel resident routing tables. 73 * 74 * The routing tables are initialized when interface addresses 75 * are set by making entries for all directly connected interfaces. 76 */ 77 78/* 79 * A route consists of a destination address and a reference 80 * to a routing entry. These are often held by protocols 81 * in their control blocks, e.g. inpcb. 82 */ 83#ifdef PRIVATE 84struct rtentry; 85struct route { 86 /* 87 * N.B: struct route must begin with ro_rt and ro_flags 88 * because the code does some casts of a 'struct route_in6 *' 89 * to a 'struct route *'. 90 */ 91 struct rtentry *ro_rt; 92 uint32_t ro_flags; /* route flags (see below) */ 93 struct sockaddr ro_dst; 94}; 95 96#define ROF_SRCIF_SELECTED 0x1 /* source interface was selected */ 97 98/* 99 * Route reachability info (private) 100 */ 101struct rt_reach_info { 102 u_int32_t ri_refcnt; /* reference count */ 103 u_int32_t ri_probes; /* total # of probes */ 104 u_int64_t ri_snd_expire; /* transmit expiration (calendar) time */ 105 u_int64_t ri_rcv_expire; /* receive expiration (calendar) time */ 106 int32_t ri_rssi; /* received signal strength */ 107 int32_t ri_lqm; /* link quality metric */ 108 int32_t ri_npm; /* node proximity metric */ 109}; 110#else 111struct route; 112#endif /* PRIVATE */ 113 114/* 115 * These numbers are used by reliable protocols for determining 116 * retransmission behavior and are included in the routing structure. 117 */ 118struct rt_metrics { 119 u_int32_t rmx_locks; /* Kernel must leave these values alone */ 120 u_int32_t rmx_mtu; /* MTU for this path */ 121 u_int32_t rmx_hopcount; /* max hops expected */ 122 int32_t rmx_expire; /* lifetime for route, e.g. redirect */ 123 u_int32_t rmx_recvpipe; /* inbound delay-bandwidth product */ 124 u_int32_t rmx_sendpipe; /* outbound delay-bandwidth product */ 125 u_int32_t rmx_ssthresh; /* outbound gateway buffer limit */ 126 u_int32_t rmx_rtt; /* estimated round trip time */ 127 u_int32_t rmx_rttvar; /* estimated rtt variance */ 128 u_int32_t rmx_pksent; /* packets sent using this route */ 129 u_int32_t rmx_filler[4]; /* will be used for T/TCP later */ 130}; 131 132/* 133 * rmx_rtt and rmx_rttvar are stored as microseconds; 134 */ 135#define RTM_RTTUNIT 1000000 /* units for rtt, rttvar, as units per sec */ 136 137#ifdef KERNEL_PRIVATE 138/* 139 * New expiry value (in seconds) when dealing with interfaces which implement 140 * the if_want_aggressive_drain behavior. Otherwise the event mechanism wouldn't 141 * fire quick enough to cause any sort of significant gains in performance. 142 */ 143#define RT_IF_IDLE_EXPIRE_TIMEOUT 30 144#define RT_IF_IDLE_DRAIN_INTERVAL 10 145#endif /* KERNEL_PRIVATE */ 146 147/* 148 * We distinguish between routes to hosts and routes to networks, 149 * preferring the former if available. For each route we infer 150 * the interface to use from the gateway address supplied when 151 * the route was entered. Routes that forward packets through 152 * gateways are marked so that the output routines know to address the 153 * gateway rather than the ultimate destination. 154 */ 155#ifdef KERNEL_PRIVATE 156#include <kern/locks.h> 157#ifndef RNF_NORMAL 158#include <net/radix.h> 159#endif 160struct ifnet_llreach_info; /* forward declaration */ 161/* 162 * Kernel routing entry structure (private). 163 */ 164struct rtentry { 165 struct radix_node rt_nodes[2]; /* tree glue, and other values */ 166#define rt_key(r) ((struct sockaddr *)(void *)((r)->rt_nodes->rn_key)) 167#define rt_mask(r) ((struct sockaddr *)(void *)((r)->rt_nodes->rn_mask)) 168 struct sockaddr *rt_gateway; /* value */ 169 int32_t rt_refcnt; /* # held references */ 170 uint32_t rt_flags; /* up/down?, host/net */ 171 struct ifnet *rt_ifp; /* the answer: interface to use */ 172 struct ifaddr *rt_ifa; /* the answer: interface addr to use */ 173 struct sockaddr *rt_genmask; /* for generation of cloned routes */ 174 void *rt_llinfo; /* pointer to link level info cache */ 175 void (*rt_llinfo_get_ri) /* llinfo get reachability info fn */ 176 (struct rtentry *, struct rt_reach_info *); 177 void (*rt_llinfo_get_iflri) /* ifnet llinfo get reach. info fn */ 178 (struct rtentry *, struct ifnet_llreach_info *); 179 void (*rt_llinfo_purge)(struct rtentry *); /* llinfo purge fn */ 180 void (*rt_llinfo_free)(void *); /* link level info free function */ 181 struct rt_metrics rt_rmx; /* metrics used by rx'ing protocols */ 182 struct rtentry *rt_gwroute; /* implied entry for gatewayed routes */ 183 struct rtentry *rt_parent; /* cloning parent of this route */ 184 uint32_t generation_id; /* route generation id */ 185 /* 186 * See bsd/net/route.c for synchronization notes. 187 */ 188 decl_lck_mtx_data(, rt_lock); /* lock for routing entry */ 189 struct nstat_counts *rt_stats; 190 void (*rt_if_ref_fn)(struct ifnet *, int); /* interface ref func */ 191 192 uint64_t rt_expire; /* expiration time in uptime seconds */ 193 uint64_t base_calendartime; /* calendar time upon entry creation */ 194 uint64_t base_uptime;/* uptime upon entry creation */ 195}; 196 197extern void rt_setexpire(struct rtentry *, uint64_t); 198#endif /* KERNEL_PRIVATE */ 199 200#ifdef KERNEL_PRIVATE 201#define rt_use rt_rmx.rmx_pksent 202#endif /* KERNEL_PRIVATE */ 203 204#define RTF_UP 0x1 /* route usable */ 205#define RTF_GATEWAY 0x2 /* destination is a gateway */ 206#define RTF_HOST 0x4 /* host entry (net otherwise) */ 207#define RTF_REJECT 0x8 /* host or net unreachable */ 208#define RTF_DYNAMIC 0x10 /* created dynamically (by redirect) */ 209#define RTF_MODIFIED 0x20 /* modified dynamically (by redirect) */ 210#define RTF_DONE 0x40 /* message confirmed */ 211#define RTF_DELCLONE 0x80 /* delete cloned route */ 212#define RTF_CLONING 0x100 /* generate new routes on use */ 213#define RTF_XRESOLVE 0x200 /* external daemon resolves name */ 214#define RTF_LLINFO 0x400 /* generated by link layer (e.g. ARP) */ 215#define RTF_STATIC 0x800 /* manually added */ 216#define RTF_BLACKHOLE 0x1000 /* just discard pkts (during updates) */ 217#define RTF_PROTO2 0x4000 /* protocol specific routing flag */ 218#define RTF_PROTO1 0x8000 /* protocol specific routing flag */ 219 220#define RTF_PRCLONING 0x10000 /* protocol requires cloning */ 221#define RTF_WASCLONED 0x20000 /* route generated through cloning */ 222#define RTF_PROTO3 0x40000 /* protocol specific routing flag */ 223 /* 0x80000 unused */ 224#define RTF_PINNED 0x100000 /* future use */ 225#define RTF_LOCAL 0x200000 /* route represents a local address */ 226#define RTF_BROADCAST 0x400000 /* route represents a bcast address */ 227#define RTF_MULTICAST 0x800000 /* route represents a mcast address */ 228#define RTF_IFSCOPE 0x1000000 /* has valid interface scope */ 229#define RTF_CONDEMNED 0x2000000 /* defunct; no longer modifiable */ 230#define RTF_IFREF 0x4000000 /* route holds a ref to interface */ 231#define RTF_PROXY 0x8000000 /* proxying, no interface scope */ 232#define RTF_ROUTER 0x10000000 /* host is a router */ 233 /* 0x20000000 and up unassigned */ 234 235/* 236 * Routing statistics. 237 */ 238struct rtstat { 239 short rts_badredirect; /* bogus redirect calls */ 240 short rts_dynamic; /* routes created by redirects */ 241 short rts_newgateway; /* routes modified by redirects */ 242 short rts_unreach; /* lookups which failed */ 243 short rts_wildcard; /* lookups satisfied by a wildcard */ 244}; 245 246/* 247 * Structures for routing messages. 248 */ 249struct rt_msghdr { 250 u_short rtm_msglen; /* to skip over non-understood messages */ 251 u_char rtm_version; /* future binary compatibility */ 252 u_char rtm_type; /* message type */ 253 u_short rtm_index; /* index for associated ifp */ 254 int rtm_flags; /* flags, incl. kern & message, e.g. DONE */ 255 int rtm_addrs; /* bitmask identifying sockaddrs in msg */ 256 pid_t rtm_pid; /* identify sender */ 257 int rtm_seq; /* for sender to identify action */ 258 int rtm_errno; /* why failed */ 259 int rtm_use; /* from rtentry */ 260 u_int32_t rtm_inits; /* which metrics we are initializing */ 261 struct rt_metrics rtm_rmx; /* metrics themselves */ 262}; 263 264struct rt_msghdr2 { 265 u_short rtm_msglen; /* to skip over non-understood messages */ 266 u_char rtm_version; /* future binary compatibility */ 267 u_char rtm_type; /* message type */ 268 u_short rtm_index; /* index for associated ifp */ 269 int rtm_flags; /* flags, incl. kern & message, e.g. DONE */ 270 int rtm_addrs; /* bitmask identifying sockaddrs in msg */ 271 int32_t rtm_refcnt; /* reference count */ 272 int rtm_parentflags; /* flags of the parent route */ 273 int rtm_reserved; /* reserved field set to 0 */ 274 int rtm_use; /* from rtentry */ 275 u_int32_t rtm_inits; /* which metrics we are initializing */ 276 struct rt_metrics rtm_rmx; /* metrics themselves */ 277}; 278 279#ifdef PRIVATE 280/* 281 * Extended routing message header (private). 282 */ 283struct rt_msghdr_ext { 284 u_short rtm_msglen; /* to skip over non-understood messages */ 285 u_char rtm_version; /* future binary compatibility */ 286 u_char rtm_type; /* message type */ 287 u_int32_t rtm_index; /* index for associated ifp */ 288 u_int32_t rtm_flags; /* flags, incl. kern & message, e.g. DONE */ 289 u_int32_t rtm_reserved; /* for future use */ 290 u_int32_t 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 u_int32_t rtm_use; /* from rtentry */ 295 u_int32_t rtm_inits; /* which metrics we are initializing */ 296 struct rt_metrics rtm_rmx; /* metrics themselves */ 297 struct rt_reach_info rtm_ri; /* route reachability info */ 298}; 299#endif /* PRIVATE */ 300 301#define RTM_VERSION 5 /* Up the ante and ignore older versions */ 302 303/* 304 * Message types. 305 */ 306#define RTM_ADD 0x1 /* Add Route */ 307#define RTM_DELETE 0x2 /* Delete Route */ 308#define RTM_CHANGE 0x3 /* Change Metrics or flags */ 309#define RTM_GET 0x4 /* Report Metrics */ 310#define RTM_LOSING 0x5 /* Kernel Suspects Partitioning */ 311#define RTM_REDIRECT 0x6 /* Told to use different route */ 312#define RTM_MISS 0x7 /* Lookup failed on this address */ 313#define RTM_LOCK 0x8 /* fix specified metrics */ 314#define RTM_OLDADD 0x9 /* caused by SIOCADDRT */ 315#define RTM_OLDDEL 0xa /* caused by SIOCDELRT */ 316#define RTM_RESOLVE 0xb /* req to resolve dst to LL addr */ 317#define RTM_NEWADDR 0xc /* address being added to iface */ 318#define RTM_DELADDR 0xd /* address being removed from iface */ 319#define RTM_IFINFO 0xe /* iface going up/down etc. */ 320#define RTM_NEWMADDR 0xf /* mcast group membership being added to if */ 321#define RTM_DELMADDR 0x10 /* mcast group membership being deleted */ 322#ifdef PRIVATE 323#define RTM_GET_SILENT 0x11 324#endif /* PRIVATE */ 325#define RTM_IFINFO2 0x12 /* */ 326#define RTM_NEWMADDR2 0x13 /* */ 327#define RTM_GET2 0x14 /* */ 328#ifdef PRIVATE 329#define RTM_GET_EXT 0x15 330#endif /* PRIVATE */ 331 332/* 333 * Bitmask values for rtm_inits and rmx_locks. 334 */ 335#define RTV_MTU 0x1 /* init or lock _mtu */ 336#define RTV_HOPCOUNT 0x2 /* init or lock _hopcount */ 337#define RTV_EXPIRE 0x4 /* init or lock _expire */ 338#define RTV_RPIPE 0x8 /* init or lock _recvpipe */ 339#define RTV_SPIPE 0x10 /* init or lock _sendpipe */ 340#define RTV_SSTHRESH 0x20 /* init or lock _ssthresh */ 341#define RTV_RTT 0x40 /* init or lock _rtt */ 342#define RTV_RTTVAR 0x80 /* init or lock _rttvar */ 343 344/* 345 * Bitmask values for rtm_addrs. 346 */ 347#define RTA_DST 0x1 /* destination sockaddr present */ 348#define RTA_GATEWAY 0x2 /* gateway sockaddr present */ 349#define RTA_NETMASK 0x4 /* netmask sockaddr present */ 350#define RTA_GENMASK 0x8 /* cloning mask sockaddr present */ 351#define RTA_IFP 0x10 /* interface name sockaddr present */ 352#define RTA_IFA 0x20 /* interface addr sockaddr present */ 353#define RTA_AUTHOR 0x40 /* sockaddr for author of redirect */ 354#define RTA_BRD 0x80 /* for NEWADDR, broadcast or p-p dest addr */ 355 356/* 357 * Index offsets for sockaddr array for alternate internal encoding. 358 */ 359#define RTAX_DST 0 /* destination sockaddr present */ 360#define RTAX_GATEWAY 1 /* gateway sockaddr present */ 361#define RTAX_NETMASK 2 /* netmask sockaddr present */ 362#define RTAX_GENMASK 3 /* cloning mask sockaddr present */ 363#define RTAX_IFP 4 /* interface name sockaddr present */ 364#define RTAX_IFA 5 /* interface addr sockaddr present */ 365#define RTAX_AUTHOR 6 /* sockaddr for author of redirect */ 366#define RTAX_BRD 7 /* for NEWADDR, broadcast or p-p dest addr */ 367#define RTAX_MAX 8 /* size of array to allocate */ 368 369struct rt_addrinfo { 370 int rti_addrs; 371 struct sockaddr *rti_info[RTAX_MAX]; 372}; 373 374struct route_cb { 375 int ip_count; 376 int ip6_count; 377 int ipx_count; 378 int ns_count; 379 int iso_count; 380 int any_count; 381}; 382 383#ifdef PRIVATE 384/* 385 * For scoped routing; a zero interface scope value means nil/no scope. 386 */ 387#define IFSCOPE_NONE 0 388#endif /* PRIVATE */ 389 390#ifdef KERNEL_PRIVATE 391/* 392 * Generic call trace used by some subsystems (e.g. route, ifaddr) 393 */ 394#define CTRACE_STACK_SIZE 8 /* depth of stack trace */ 395#define CTRACE_HIST_SIZE 4 /* refcnt history size */ 396typedef struct ctrace { 397 void *th; /* thread ptr */ 398 void *pc[CTRACE_STACK_SIZE]; /* PC stack trace */ 399} ctrace_t; 400 401extern void ctrace_record(ctrace_t *); 402 403#define RT_LOCK_ASSERT_HELD(_rt) \ 404 lck_mtx_assert(&(_rt)->rt_lock, LCK_MTX_ASSERT_OWNED) 405 406#define RT_LOCK_ASSERT_NOTHELD(_rt) \ 407 lck_mtx_assert(&(_rt)->rt_lock, LCK_MTX_ASSERT_NOTOWNED) 408 409#define RT_LOCK(_rt) do { \ 410 if (!rte_debug) \ 411 lck_mtx_lock(&(_rt)->rt_lock); \ 412 else \ 413 rt_lock(_rt, FALSE); \ 414} while (0) 415 416#define RT_LOCK_SPIN(_rt) do { \ 417 if (!rte_debug) \ 418 lck_mtx_lock_spin(&(_rt)->rt_lock); \ 419 else \ 420 rt_lock(_rt, TRUE); \ 421} while (0) 422 423#define RT_CONVERT_LOCK(_rt) do { \ 424 RT_LOCK_ASSERT_HELD(_rt); \ 425 lck_mtx_convert_spin(&(_rt)->rt_lock); \ 426} while (0) 427 428#define RT_UNLOCK(_rt) do { \ 429 if (!rte_debug) \ 430 lck_mtx_unlock(&(_rt)->rt_lock); \ 431 else \ 432 rt_unlock(_rt); \ 433} while (0) 434 435#define RT_ADDREF_LOCKED(_rt) do { \ 436 if (!rte_debug) { \ 437 RT_LOCK_ASSERT_HELD(_rt); \ 438 if (++(_rt)->rt_refcnt == 0) \ 439 panic("RT_ADDREF(%p) bad refcnt\n", _rt); \ 440 } else { \ 441 rtref(_rt); \ 442 } \ 443} while (0) 444 445/* 446 * Spin variant mutex is used here; caller is responsible for 447 * converting any previously-held similar lock to full mutex. 448 */ 449#define RT_ADDREF(_rt) do { \ 450 RT_LOCK_SPIN(_rt); \ 451 RT_ADDREF_LOCKED(_rt); \ 452 RT_UNLOCK(_rt); \ 453} while (0) 454 455#define RT_REMREF_LOCKED(_rt) do { \ 456 if (!rte_debug) { \ 457 RT_LOCK_ASSERT_HELD(_rt); \ 458 if ((_rt)->rt_refcnt == 0) \ 459 panic("RT_REMREF(%p) bad refcnt\n", _rt); \ 460 --(_rt)->rt_refcnt; \ 461 } else { \ 462 (void) rtunref(_rt); \ 463 } \ 464} while (0) 465 466/* 467 * Spin variant mutex is used here; caller is responsible for 468 * converting any previously-held similar lock to full mutex. 469 */ 470#define RT_REMREF(_rt) do { \ 471 RT_LOCK_SPIN(_rt); \ 472 RT_REMREF_LOCKED(_rt); \ 473 RT_UNLOCK(_rt); \ 474} while (0) 475 476#define RTFREE(_rt) rtfree(_rt) 477#define RTFREE_LOCKED(_rt) rtfree_locked(_rt) 478 479extern struct route_cb route_cb; 480extern struct radix_node_head *rt_tables[AF_MAX+1]; 481__private_extern__ lck_mtx_t *rnh_lock; 482__private_extern__ int use_routegenid; 483__private_extern__ uint32_t route_generation; 484__private_extern__ int rttrash; 485__private_extern__ unsigned int rte_debug; 486 487struct ifmultiaddr; 488struct proc; 489 490extern void route_init(void) __attribute__((section("__TEXT, initcode"))); 491extern void routegenid_update(void); 492extern void rt_ifmsg(struct ifnet *); 493extern void rt_missmsg(int, struct rt_addrinfo *, int, int); 494extern void rt_newaddrmsg(int, struct ifaddr *, int, struct rtentry *); 495extern void rt_newmaddrmsg(int, struct ifmultiaddr *); 496extern int rt_setgate(struct rtentry *, struct sockaddr *, struct sockaddr *); 497extern void set_primary_ifscope(int, unsigned int); 498extern unsigned int get_primary_ifscope(int); 499extern boolean_t rt_primary_default(struct rtentry *, struct sockaddr *); 500extern struct rtentry *rt_lookup(boolean_t, struct sockaddr *, 501 struct sockaddr *, struct radix_node_head *, unsigned int); 502extern void rtalloc(struct route *); 503extern void rtalloc_scoped(struct route *, unsigned int); 504extern void rtalloc_ign(struct route *, uint32_t); 505extern void rtalloc_scoped_ign(struct route *, uint32_t, unsigned int); 506extern struct rtentry *rtalloc1(struct sockaddr *, int, uint32_t); 507extern struct rtentry *rtalloc1_scoped(struct sockaddr *, int, uint32_t, 508 unsigned int); 509extern struct rtentry *rtalloc1_scoped_locked(struct sockaddr *, int, 510 uint32_t, unsigned int); 511extern void rtfree(struct rtentry *); 512extern void rtfree_locked(struct rtentry *); 513extern void rtref(struct rtentry *); 514/* 515 * rtunref will decrement the refcount, rtfree will decrement and free if 516 * the refcount has reached zero and the route is not up. 517 * Unless you have good reason to do otherwise, use rtfree. 518 */ 519extern int rtunref(struct rtentry *); 520extern void rtsetifa(struct rtentry *, struct ifaddr *); 521extern int rtinit(struct ifaddr *, int, int); 522extern int rtinit_locked(struct ifaddr *, int, int); 523extern int rtioctl(unsigned long, caddr_t, struct proc *); 524extern void rtredirect(struct ifnet *, struct sockaddr *, struct sockaddr *, 525 struct sockaddr *, int, struct sockaddr *, struct rtentry **); 526extern int rtrequest(int, struct sockaddr *, 527 struct sockaddr *, struct sockaddr *, int, struct rtentry **); 528extern int rtrequest_scoped(int, struct sockaddr *, struct sockaddr *, 529 struct sockaddr *, int, struct rtentry **, unsigned int); 530extern int rtrequest_locked(int, struct sockaddr *, 531 struct sockaddr *, struct sockaddr *, int, struct rtentry **); 532extern int rtrequest_scoped_locked(int, struct sockaddr *, struct sockaddr *, 533 struct sockaddr *, int, struct rtentry **, unsigned int); 534extern void sin_set_ifscope(struct sockaddr *, unsigned int); 535extern unsigned int sin_get_ifscope(struct sockaddr *); 536extern unsigned int sin6_get_ifscope(struct sockaddr *); 537extern void rt_lock(struct rtentry *, boolean_t); 538extern void rt_unlock(struct rtentry *); 539extern struct sockaddr *rtm_scrub_ifscope(int, int, struct sockaddr *, 540 struct sockaddr *, struct sockaddr_storage *); 541extern u_int64_t rt_expiry(struct rtentry *, u_int64_t, u_int32_t); 542extern void rt_set_idleref(struct rtentry *); 543extern void rt_clear_idleref(struct rtentry *); 544extern void rt_aggdrain(int); 545extern boolean_t rt_validate(struct rtentry *); 546extern void rt_set_proxy(struct rtentry *, boolean_t); 547extern void rt_set_gwroute(struct rtentry *, struct sockaddr *, 548 struct rtentry *); 549extern void rt_revalidate_gwroute(struct rtentry *, struct rtentry *); 550extern errno_t route_to_gwroute(const struct sockaddr *, struct rtentry *, 551 struct rtentry **); 552 553#ifdef XNU_KERNEL_PRIVATE 554extern void route_copyin(struct route *src, struct route *dst, size_t length); 555extern void route_copyout(struct route *dst, const struct route *src, size_t length); 556#endif /* XNU_KERNEL_PRIVATE */ 557 558#endif /* KERNEL_PRIVATE */ 559 560#endif 561