1*0f4c859eSApple OSS Distributions /* 2*0f4c859eSApple OSS Distributions * Copyright (c) 2000-2022 Apple Inc. All rights reserved. 3*0f4c859eSApple OSS Distributions * 4*0f4c859eSApple OSS Distributions * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 5*0f4c859eSApple OSS Distributions * 6*0f4c859eSApple OSS Distributions * This file contains Original Code and/or Modifications of Original Code 7*0f4c859eSApple OSS Distributions * as defined in and that are subject to the Apple Public Source License 8*0f4c859eSApple OSS Distributions * Version 2.0 (the 'License'). You may not use this file except in 9*0f4c859eSApple OSS Distributions * compliance with the License. The rights granted to you under the License 10*0f4c859eSApple OSS Distributions * may not be used to create, or enable the creation or redistribution of, 11*0f4c859eSApple OSS Distributions * unlawful or unlicensed copies of an Apple operating system, or to 12*0f4c859eSApple OSS Distributions * circumvent, violate, or enable the circumvention or violation of, any 13*0f4c859eSApple OSS Distributions * terms of an Apple operating system software license agreement. 14*0f4c859eSApple OSS Distributions * 15*0f4c859eSApple OSS Distributions * Please obtain a copy of the License at 16*0f4c859eSApple OSS Distributions * http://www.opensource.apple.com/apsl/ and read it before using this file. 17*0f4c859eSApple OSS Distributions * 18*0f4c859eSApple OSS Distributions * The Original Code and all software distributed under the License are 19*0f4c859eSApple OSS Distributions * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 20*0f4c859eSApple OSS Distributions * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 21*0f4c859eSApple OSS Distributions * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 22*0f4c859eSApple OSS Distributions * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 23*0f4c859eSApple OSS Distributions * Please see the License for the specific language governing rights and 24*0f4c859eSApple OSS Distributions * limitations under the License. 25*0f4c859eSApple OSS Distributions * 26*0f4c859eSApple OSS Distributions * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 27*0f4c859eSApple OSS Distributions */ 28*0f4c859eSApple OSS Distributions /* 29*0f4c859eSApple OSS Distributions * Copyright (c) 1980, 1986, 1993 30*0f4c859eSApple OSS Distributions * The Regents of the University of California. All rights reserved. 31*0f4c859eSApple OSS Distributions * 32*0f4c859eSApple OSS Distributions * Redistribution and use in source and binary forms, with or without 33*0f4c859eSApple OSS Distributions * modification, are permitted provided that the following conditions 34*0f4c859eSApple OSS Distributions * are met: 35*0f4c859eSApple OSS Distributions * 1. Redistributions of source code must retain the above copyright 36*0f4c859eSApple OSS Distributions * notice, this list of conditions and the following disclaimer. 37*0f4c859eSApple OSS Distributions * 2. Redistributions in binary form must reproduce the above copyright 38*0f4c859eSApple OSS Distributions * notice, this list of conditions and the following disclaimer in the 39*0f4c859eSApple OSS Distributions * documentation and/or other materials provided with the distribution. 40*0f4c859eSApple OSS Distributions * 3. All advertising materials mentioning features or use of this software 41*0f4c859eSApple OSS Distributions * must display the following acknowledgement: 42*0f4c859eSApple OSS Distributions * This product includes software developed by the University of 43*0f4c859eSApple OSS Distributions * California, Berkeley and its contributors. 44*0f4c859eSApple OSS Distributions * 4. Neither the name of the University nor the names of its contributors 45*0f4c859eSApple OSS Distributions * may be used to endorse or promote products derived from this software 46*0f4c859eSApple OSS Distributions * without specific prior written permission. 47*0f4c859eSApple OSS Distributions * 48*0f4c859eSApple OSS Distributions * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 49*0f4c859eSApple OSS Distributions * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 50*0f4c859eSApple OSS Distributions * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 51*0f4c859eSApple OSS Distributions * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 52*0f4c859eSApple OSS Distributions * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 53*0f4c859eSApple OSS Distributions * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 54*0f4c859eSApple OSS Distributions * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 55*0f4c859eSApple OSS Distributions * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 56*0f4c859eSApple OSS Distributions * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 57*0f4c859eSApple OSS Distributions * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 58*0f4c859eSApple OSS Distributions * SUCH DAMAGE. 59*0f4c859eSApple OSS Distributions * 60*0f4c859eSApple OSS Distributions * @(#)route.h 8.3 (Berkeley) 4/19/94 61*0f4c859eSApple OSS Distributions * $FreeBSD: src/sys/net/route.h,v 1.36.2.1 2000/08/16 06:14:23 jayanth Exp $ 62*0f4c859eSApple OSS Distributions */ 63*0f4c859eSApple OSS Distributions 64*0f4c859eSApple OSS Distributions #ifndef _NET_ROUTE_PRIVATE_H_ 65*0f4c859eSApple OSS Distributions #define _NET_ROUTE_PRIVATE_H_ 66*0f4c859eSApple OSS Distributions #include <net/route.h> 67*0f4c859eSApple OSS Distributions #include <stdint.h> 68*0f4c859eSApple OSS Distributions #include <sys/types.h> 69*0f4c859eSApple OSS Distributions #include <sys/socket.h> 70*0f4c859eSApple OSS Distributions #include <uuid/uuid.h> 71*0f4c859eSApple OSS Distributions 72*0f4c859eSApple OSS Distributions struct route_old { 73*0f4c859eSApple OSS Distributions void *ro_rt; 74*0f4c859eSApple OSS Distributions uint32_t ro_flags; 75*0f4c859eSApple OSS Distributions struct sockaddr ro_dst; 76*0f4c859eSApple OSS Distributions }; 77*0f4c859eSApple OSS Distributions 78*0f4c859eSApple OSS Distributions #ifdef BSD_KERNEL_PRIVATE 79*0f4c859eSApple OSS Distributions #include <kern/locks.h> 80*0f4c859eSApple OSS Distributions #include <net/radix.h> 81*0f4c859eSApple OSS Distributions #include <sys/eventhandler.h> 82*0f4c859eSApple OSS Distributions #include <net/if_dl.h> 83*0f4c859eSApple OSS Distributions #include <netinet/in_private.h> 84*0f4c859eSApple OSS Distributions 85*0f4c859eSApple OSS Distributions extern boolean_t trigger_v6_defrtr_select; 86*0f4c859eSApple OSS Distributions /* 87*0f4c859eSApple OSS Distributions * Kernel resident routing tables. 88*0f4c859eSApple OSS Distributions * 89*0f4c859eSApple OSS Distributions * The routing tables are initialized when interface addresses 90*0f4c859eSApple OSS Distributions * are set by making entries for all directly connected interfaces. 91*0f4c859eSApple OSS Distributions */ 92*0f4c859eSApple OSS Distributions 93*0f4c859eSApple OSS Distributions /* forward declarations */ 94*0f4c859eSApple OSS Distributions struct ifnet_llreach_info; 95*0f4c859eSApple OSS Distributions struct rt_reach_info; 96*0f4c859eSApple OSS Distributions 97*0f4c859eSApple OSS Distributions /* 98*0f4c859eSApple OSS Distributions * IP route structure 99*0f4c859eSApple OSS Distributions * 100*0f4c859eSApple OSS Distributions * A route consists of a destination address and a reference 101*0f4c859eSApple OSS Distributions * to a routing entry. These are often held by protocols 102*0f4c859eSApple OSS Distributions * in their control blocks, e.g. inpcb. 103*0f4c859eSApple OSS Distributions */ 104*0f4c859eSApple OSS Distributions struct route { 105*0f4c859eSApple OSS Distributions /* 106*0f4c859eSApple OSS Distributions * N.B: struct route must begin with ro_{rt, lle, srcia, flags} 107*0f4c859eSApple OSS Distributions * because the code does some casts of a 'struct route_in6 *' 108*0f4c859eSApple OSS Distributions * to a 'struct route *'. 109*0f4c859eSApple OSS Distributions */ 110*0f4c859eSApple OSS Distributions struct rtentry *ro_rt; 111*0f4c859eSApple OSS Distributions struct ifaddr *ro_srcia; 112*0f4c859eSApple OSS Distributions uint32_t ro_flags; /* route flags (see below) */ 113*0f4c859eSApple OSS Distributions #if __has_ptrcheck 114*0f4c859eSApple OSS Distributions struct sockaddr_in ro_dst; 115*0f4c859eSApple OSS Distributions #else 116*0f4c859eSApple OSS Distributions struct sockaddr ro_dst; 117*0f4c859eSApple OSS Distributions #endif 118*0f4c859eSApple OSS Distributions }; 119*0f4c859eSApple OSS Distributions 120*0f4c859eSApple OSS Distributions #define ROF_SRCIF_SELECTED 0x0001 /* source interface was selected */ 121*0f4c859eSApple OSS Distributions 122*0f4c859eSApple OSS Distributions #define ROUTE_UNUSABLE(_ro) \ 123*0f4c859eSApple OSS Distributions ((_ro)->ro_rt == NULL || \ 124*0f4c859eSApple OSS Distributions ((_ro)->ro_rt->rt_flags & (RTF_UP|RTF_CONDEMNED)) != RTF_UP || \ 125*0f4c859eSApple OSS Distributions RT_GENID_OUTOFSYNC((_ro)->ro_rt)) 126*0f4c859eSApple OSS Distributions 127*0f4c859eSApple OSS Distributions #define _ROUTE_RELEASE_COMMON(_ro, _rnh_locked) do { \ 128*0f4c859eSApple OSS Distributions if ((_ro)->ro_rt != NULL) { \ 129*0f4c859eSApple OSS Distributions RT_LOCK_ASSERT_NOTHELD((_ro)->ro_rt); \ 130*0f4c859eSApple OSS Distributions if (_rnh_locked) \ 131*0f4c859eSApple OSS Distributions rtfree_locked((_ro)->ro_rt); \ 132*0f4c859eSApple OSS Distributions else \ 133*0f4c859eSApple OSS Distributions rtfree((_ro)->ro_rt); \ 134*0f4c859eSApple OSS Distributions (_ro)->ro_rt = NULL; \ 135*0f4c859eSApple OSS Distributions } \ 136*0f4c859eSApple OSS Distributions if ((_ro)->ro_srcia != NULL) { \ 137*0f4c859eSApple OSS Distributions IFA_REMREF((_ro)->ro_srcia); \ 138*0f4c859eSApple OSS Distributions (_ro)->ro_srcia = NULL; \ 139*0f4c859eSApple OSS Distributions (_ro)->ro_flags &= ~ROF_SRCIF_SELECTED; \ 140*0f4c859eSApple OSS Distributions } \ 141*0f4c859eSApple OSS Distributions } while (0) 142*0f4c859eSApple OSS Distributions 143*0f4c859eSApple OSS Distributions #define ROUTE_RELEASE_LOCKED(_ro) _ROUTE_RELEASE_COMMON(_ro, TRUE) 144*0f4c859eSApple OSS Distributions #define ROUTE_RELEASE(_ro) _ROUTE_RELEASE_COMMON(_ro, FALSE) 145*0f4c859eSApple OSS Distributions 146*0f4c859eSApple OSS Distributions /* 147*0f4c859eSApple OSS Distributions * We distinguish between routes to hosts and routes to networks, 148*0f4c859eSApple OSS Distributions * preferring the former if available. For each route we infer 149*0f4c859eSApple OSS Distributions * the interface to use from the gateway address supplied when 150*0f4c859eSApple OSS Distributions * the route was entered. Routes that forward packets through 151*0f4c859eSApple OSS Distributions * gateways are marked so that the output routines know to address the 152*0f4c859eSApple OSS Distributions * gateway rather than the ultimate destination. 153*0f4c859eSApple OSS Distributions */ 154*0f4c859eSApple OSS Distributions 155*0f4c859eSApple OSS Distributions #define NRTT_HIST 10 156*0f4c859eSApple OSS Distributions /* 157*0f4c859eSApple OSS Distributions * Kernel routing entry structure. 158*0f4c859eSApple OSS Distributions */ 159*0f4c859eSApple OSS Distributions struct rtentry { 160*0f4c859eSApple OSS Distributions struct radix_node rt_nodes[2]; /* tree glue, and other values */ 161*0f4c859eSApple OSS Distributions #define rt_key(r) (SA((r)->rt_nodes->rn_key)) 162*0f4c859eSApple OSS Distributions #define rt_mask(r) (SA((r)->rt_nodes->rn_mask)) 163*0f4c859eSApple OSS Distributions /* 164*0f4c859eSApple OSS Distributions * See bsd/net/route.c for synchronization notes. 165*0f4c859eSApple OSS Distributions */ 166*0f4c859eSApple OSS Distributions decl_lck_mtx_data(, rt_lock); /* lock for routing entry */ 167*0f4c859eSApple OSS Distributions uint32_t rt_refcnt; /* # held references */ 168*0f4c859eSApple OSS Distributions uint32_t rt_flags; /* up/down?, host/net */ 169*0f4c859eSApple OSS Distributions uint32_t rt_genid; /* route generation id */ 170*0f4c859eSApple OSS Distributions struct sockaddr *rt_gateway; /* value */ 171*0f4c859eSApple OSS Distributions struct ifnet *rt_ifp; /* the answer: interface to use */ 172*0f4c859eSApple OSS Distributions struct ifaddr *rt_ifa; /* the answer: interface addr to use */ 173*0f4c859eSApple OSS Distributions struct sockaddr *rt_genmask; /* for generation of cloned routes */ 174*0f4c859eSApple OSS Distributions void *rt_llinfo; /* pointer to link level info cache */ 175*0f4c859eSApple OSS Distributions void (*rt_llinfo_get_ri) /* llinfo get reachability info fn */ 176*0f4c859eSApple OSS Distributions (struct rtentry *, struct rt_reach_info *); 177*0f4c859eSApple OSS Distributions void (*rt_llinfo_get_iflri) /* ifnet llinfo get reach. info fn */ 178*0f4c859eSApple OSS Distributions (struct rtentry *, struct ifnet_llreach_info *); 179*0f4c859eSApple OSS Distributions void (*rt_llinfo_purge)(struct rtentry *); /* llinfo purge fn */ 180*0f4c859eSApple OSS Distributions void (*rt_llinfo_free)(void *); /* link level info free function */ 181*0f4c859eSApple OSS Distributions void (*rt_llinfo_refresh) (struct rtentry *); /* expedite llinfo refresh */ 182*0f4c859eSApple OSS Distributions struct rt_metrics rt_rmx; /* metrics used by rx'ing protocols */ 183*0f4c859eSApple OSS Distributions #define rt_use rt_rmx.rmx_pksent 184*0f4c859eSApple OSS Distributions struct rtentry *rt_gwroute; /* implied entry for gatewayed routes */ 185*0f4c859eSApple OSS Distributions struct rtentry *rt_parent; /* cloning parent of this route */ 186*0f4c859eSApple OSS Distributions struct nstat_counts *rt_stats; /* route stats */ 187*0f4c859eSApple OSS Distributions void (*rt_if_ref_fn)(struct ifnet *, int); /* interface ref func */ 188*0f4c859eSApple OSS Distributions 189*0f4c859eSApple OSS Distributions uint32_t *rt_tree_genid; /* ptr to per-tree route_genid */ 190*0f4c859eSApple OSS Distributions uint64_t rt_expire; /* expiration time in uptime seconds */ 191*0f4c859eSApple OSS Distributions uint64_t base_calendartime; /* calendar time upon entry creation */ 192*0f4c859eSApple OSS Distributions uint64_t base_uptime; /* uptime upon entry creation */ 193*0f4c859eSApple OSS Distributions u_int32_t rtt_hist[NRTT_HIST]; /* RTT history sample by TCP connections */ 194*0f4c859eSApple OSS Distributions u_int32_t rtt_min; /* minimum RTT computed from history */ 195*0f4c859eSApple OSS Distributions u_int32_t rtt_expire_ts; /* RTT history expire timestamp */ 196*0f4c859eSApple OSS Distributions u_int8_t rtt_index; /* Index into RTT history */ 197*0f4c859eSApple OSS Distributions /* Event handler context for the rtentrt */ 198*0f4c859eSApple OSS Distributions struct eventhandler_lists_ctxt rt_evhdlr_ctxt; 199*0f4c859eSApple OSS Distributions }; 200*0f4c859eSApple OSS Distributions 201*0f4c859eSApple OSS Distributions #define rt_key_free(r) ({ \ 202*0f4c859eSApple OSS Distributions void *__r = rt_key(r); \ 203*0f4c859eSApple OSS Distributions kheap_free_addr(KHEAP_DATA_BUFFERS, __r); \ 204*0f4c859eSApple OSS Distributions }) 205*0f4c859eSApple OSS Distributions 206*0f4c859eSApple OSS Distributions enum { 207*0f4c859eSApple OSS Distributions ROUTE_STATUS_UPDATE = 1, 208*0f4c859eSApple OSS Distributions ROUTE_ENTRY_REFRESH, 209*0f4c859eSApple OSS Distributions ROUTE_ENTRY_DELETED, 210*0f4c859eSApple OSS Distributions ROUTE_LLENTRY_RESOLVED, 211*0f4c859eSApple OSS Distributions ROUTE_LLENTRY_UNREACH, 212*0f4c859eSApple OSS Distributions ROUTE_LLENTRY_CHANGED, 213*0f4c859eSApple OSS Distributions ROUTE_LLENTRY_STALE, 214*0f4c859eSApple OSS Distributions ROUTE_LLENTRY_TIMEDOUT, 215*0f4c859eSApple OSS Distributions ROUTE_LLENTRY_DELETED, 216*0f4c859eSApple OSS Distributions ROUTE_LLENTRY_EXPIRED, 217*0f4c859eSApple OSS Distributions ROUTE_LLENTRY_PROBED, 218*0f4c859eSApple OSS Distributions ROUTE_EVHDLR_DEREGISTER, 219*0f4c859eSApple OSS Distributions }; 220*0f4c859eSApple OSS Distributions 221*0f4c859eSApple OSS Distributions extern const char * route_event2str(int route_event); 222*0f4c859eSApple OSS Distributions 223*0f4c859eSApple OSS Distributions typedef void (*route_event_fn) (struct eventhandler_entry_arg, 224*0f4c859eSApple OSS Distributions struct sockaddr *, int, struct sockaddr *, int); 225*0f4c859eSApple OSS Distributions EVENTHANDLER_DECLARE(route_event, route_event_fn); 226*0f4c859eSApple OSS Distributions 227*0f4c859eSApple OSS Distributions /* 228*0f4c859eSApple OSS Distributions * Synchronize route entry's generation ID with the tree's. 229*0f4c859eSApple OSS Distributions */ 230*0f4c859eSApple OSS Distributions #define RT_GENID_SYNC(_rt) do { \ 231*0f4c859eSApple OSS Distributions if ((_rt)->rt_tree_genid != NULL) \ 232*0f4c859eSApple OSS Distributions (_rt)->rt_genid = *(_rt)->rt_tree_genid; \ 233*0f4c859eSApple OSS Distributions } while (0) 234*0f4c859eSApple OSS Distributions 235*0f4c859eSApple OSS Distributions /* 236*0f4c859eSApple OSS Distributions * Indicates whether or not the route entry's generation ID is stale. 237*0f4c859eSApple OSS Distributions */ 238*0f4c859eSApple OSS Distributions #define RT_GENID_OUTOFSYNC(_rt) \ 239*0f4c859eSApple OSS Distributions ((_rt)->rt_tree_genid != NULL && \ 240*0f4c859eSApple OSS Distributions *(_rt)->rt_tree_genid != (_rt)->rt_genid) 241*0f4c859eSApple OSS Distributions 242*0f4c859eSApple OSS Distributions enum { 243*0f4c859eSApple OSS Distributions ROUTE_OP_READ, 244*0f4c859eSApple OSS Distributions ROUTE_OP_WRITE, 245*0f4c859eSApple OSS Distributions }; 246*0f4c859eSApple OSS Distributions 247*0f4c859eSApple OSS Distributions extern int route_op_entitlement_check(struct socket *, kauth_cred_t, int, boolean_t); 248*0f4c859eSApple OSS Distributions #endif /* BSD_KERNEL_PRIVATE */ 249*0f4c859eSApple OSS Distributions 250*0f4c859eSApple OSS Distributions struct kev_netevent_apnfallbk_data { 251*0f4c859eSApple OSS Distributions pid_t epid; /* effective PID */ 252*0f4c859eSApple OSS Distributions uuid_t euuid; /* effective UUID */ 253*0f4c859eSApple OSS Distributions }; 254*0f4c859eSApple OSS Distributions 255*0f4c859eSApple OSS Distributions /* 256*0f4c859eSApple OSS Distributions * Route reachability info. 257*0f4c859eSApple OSS Distributions */ 258*0f4c859eSApple OSS Distributions struct rt_reach_info { 259*0f4c859eSApple OSS Distributions u_int32_t ri_refcnt; /* reference count */ 260*0f4c859eSApple OSS Distributions u_int32_t ri_probes; /* total # of probes */ 261*0f4c859eSApple OSS Distributions u_int64_t ri_snd_expire; /* tx expiration (calendar) time */ 262*0f4c859eSApple OSS Distributions u_int64_t ri_rcv_expire; /* rx expiration (calendar) time */ 263*0f4c859eSApple OSS Distributions int32_t ri_rssi; /* received signal strength */ 264*0f4c859eSApple OSS Distributions int32_t ri_lqm; /* link quality metric */ 265*0f4c859eSApple OSS Distributions int32_t ri_npm; /* node proximity metric */ 266*0f4c859eSApple OSS Distributions }; 267*0f4c859eSApple OSS Distributions 268*0f4c859eSApple OSS Distributions /* 269*0f4c859eSApple OSS Distributions * Extended routing message header (private). 270*0f4c859eSApple OSS Distributions */ 271*0f4c859eSApple OSS Distributions struct rt_msghdr_ext { 272*0f4c859eSApple OSS Distributions u_short rtm_msglen; /* to skip over non-understood messages */ 273*0f4c859eSApple OSS Distributions u_char rtm_version; /* future binary compatibility */ 274*0f4c859eSApple OSS Distributions u_char rtm_type; /* message type */ 275*0f4c859eSApple OSS Distributions u_int32_t rtm_index; /* index for associated ifp */ 276*0f4c859eSApple OSS Distributions u_int32_t rtm_flags; /* flags, incl. kern & message, e.g. DONE */ 277*0f4c859eSApple OSS Distributions u_int32_t rtm_reserved; /* for future use */ 278*0f4c859eSApple OSS Distributions u_int32_t rtm_addrs; /* bitmask identifying sockaddrs in msg */ 279*0f4c859eSApple OSS Distributions pid_t rtm_pid; /* identify sender */ 280*0f4c859eSApple OSS Distributions int rtm_seq; /* for sender to identify action */ 281*0f4c859eSApple OSS Distributions int rtm_errno; /* why failed */ 282*0f4c859eSApple OSS Distributions u_int32_t rtm_use; /* from rtentry */ 283*0f4c859eSApple OSS Distributions u_int32_t rtm_inits; /* which metrics we are initializing */ 284*0f4c859eSApple OSS Distributions struct rt_metrics rtm_rmx; /* metrics themselves */ 285*0f4c859eSApple OSS Distributions struct rt_reach_info rtm_ri; /* route reachability info */ 286*0f4c859eSApple OSS Distributions }; 287*0f4c859eSApple OSS Distributions 288*0f4c859eSApple OSS Distributions /* 289*0f4c859eSApple OSS Distributions * Message types. 290*0f4c859eSApple OSS Distributions */ 291*0f4c859eSApple OSS Distributions #define RTM_GET_SILENT 0x11 292*0f4c859eSApple OSS Distributions #define RTM_GET_EXT 0x15 293*0f4c859eSApple OSS Distributions 294*0f4c859eSApple OSS Distributions /* 295*0f4c859eSApple OSS Distributions * Bitmask values for rtm_inits and rmx_locks. 296*0f4c859eSApple OSS Distributions */ 297*0f4c859eSApple OSS Distributions #define RTV_REFRESH_HOST 0x100 /* init host route to expedite refresh */ 298*0f4c859eSApple OSS Distributions 299*0f4c859eSApple OSS Distributions /* 300*0f4c859eSApple OSS Distributions * For scoped routing; a zero interface scope value means nil/no scope. 301*0f4c859eSApple OSS Distributions */ 302*0f4c859eSApple OSS Distributions #define IFSCOPE_NONE 0 303*0f4c859eSApple OSS Distributions #define IFSCOPE_UNKNOWN IFSCOPE_NONE 304*0f4c859eSApple OSS Distributions 305*0f4c859eSApple OSS Distributions #ifdef BSD_KERNEL_PRIVATE 306*0f4c859eSApple OSS Distributions /* 307*0f4c859eSApple OSS Distributions * Generic call trace used by some subsystems (e.g. route, ifaddr) 308*0f4c859eSApple OSS Distributions */ 309*0f4c859eSApple OSS Distributions #define CTRACE_STACK_SIZE 8 /* depth of stack trace */ 310*0f4c859eSApple OSS Distributions #define CTRACE_HIST_SIZE 4 /* refcnt history size */ 311*0f4c859eSApple OSS Distributions typedef struct ctrace { 312*0f4c859eSApple OSS Distributions void *th; /* thread ptr */ 313*0f4c859eSApple OSS Distributions void *pc[CTRACE_STACK_SIZE]; /* PC stack trace */ 314*0f4c859eSApple OSS Distributions } ctrace_t; 315*0f4c859eSApple OSS Distributions 316*0f4c859eSApple OSS Distributions extern void ctrace_record(ctrace_t *); 317*0f4c859eSApple OSS Distributions 318*0f4c859eSApple OSS Distributions #define RT_LOCK_ASSERT_HELD(_rt) \ 319*0f4c859eSApple OSS Distributions LCK_MTX_ASSERT(&(_rt)->rt_lock, LCK_MTX_ASSERT_OWNED) 320*0f4c859eSApple OSS Distributions 321*0f4c859eSApple OSS Distributions #define RT_LOCK_ASSERT_NOTHELD(_rt) \ 322*0f4c859eSApple OSS Distributions LCK_MTX_ASSERT(&(_rt)->rt_lock, LCK_MTX_ASSERT_NOTOWNED) 323*0f4c859eSApple OSS Distributions 324*0f4c859eSApple OSS Distributions #define RT_LOCK(_rt) do { \ 325*0f4c859eSApple OSS Distributions rt_lock(_rt, FALSE); \ 326*0f4c859eSApple OSS Distributions } while (0) 327*0f4c859eSApple OSS Distributions 328*0f4c859eSApple OSS Distributions #define RT_LOCK_SPIN(_rt) do { \ 329*0f4c859eSApple OSS Distributions rt_lock(_rt, TRUE); \ 330*0f4c859eSApple OSS Distributions } while (0) 331*0f4c859eSApple OSS Distributions 332*0f4c859eSApple OSS Distributions #define RT_CONVERT_LOCK(_rt) do { \ 333*0f4c859eSApple OSS Distributions RT_LOCK_ASSERT_HELD(_rt); \ 334*0f4c859eSApple OSS Distributions lck_mtx_convert_spin(&(_rt)->rt_lock); \ 335*0f4c859eSApple OSS Distributions } while (0) 336*0f4c859eSApple OSS Distributions 337*0f4c859eSApple OSS Distributions #define RT_UNLOCK(_rt) do { \ 338*0f4c859eSApple OSS Distributions rt_unlock(_rt); \ 339*0f4c859eSApple OSS Distributions } while (0) 340*0f4c859eSApple OSS Distributions 341*0f4c859eSApple OSS Distributions #define RT_ADDREF_LOCKED(_rt) do { \ 342*0f4c859eSApple OSS Distributions rtref(_rt); \ 343*0f4c859eSApple OSS Distributions } while (0) 344*0f4c859eSApple OSS Distributions 345*0f4c859eSApple OSS Distributions /* 346*0f4c859eSApple OSS Distributions * Spin variant mutex is used here; caller is responsible for 347*0f4c859eSApple OSS Distributions * converting any previously-held similar lock to full mutex. 348*0f4c859eSApple OSS Distributions */ 349*0f4c859eSApple OSS Distributions #define RT_ADDREF(_rt) do { \ 350*0f4c859eSApple OSS Distributions RT_LOCK_SPIN(_rt); \ 351*0f4c859eSApple OSS Distributions RT_ADDREF_LOCKED(_rt); \ 352*0f4c859eSApple OSS Distributions RT_UNLOCK(_rt); \ 353*0f4c859eSApple OSS Distributions } while (0) 354*0f4c859eSApple OSS Distributions 355*0f4c859eSApple OSS Distributions #define RT_REMREF_LOCKED(_rt) do { \ 356*0f4c859eSApple OSS Distributions (void) rtunref(_rt); \ 357*0f4c859eSApple OSS Distributions } while (0) 358*0f4c859eSApple OSS Distributions 359*0f4c859eSApple OSS Distributions /* 360*0f4c859eSApple OSS Distributions * Spin variant mutex is used here; caller is responsible for 361*0f4c859eSApple OSS Distributions * converting any previously-held similar lock to full mutex. 362*0f4c859eSApple OSS Distributions */ 363*0f4c859eSApple OSS Distributions #define RT_REMREF(_rt) do { \ 364*0f4c859eSApple OSS Distributions RT_LOCK_SPIN(_rt); \ 365*0f4c859eSApple OSS Distributions RT_REMREF_LOCKED(_rt); \ 366*0f4c859eSApple OSS Distributions RT_UNLOCK(_rt); \ 367*0f4c859eSApple OSS Distributions } while (0) 368*0f4c859eSApple OSS Distributions 369*0f4c859eSApple OSS Distributions /* 370*0f4c859eSApple OSS Distributions * This macro calculates skew in wall clock, just in case the user changes the 371*0f4c859eSApple OSS Distributions * system time. This skew adjustment is required because we now keep the 372*0f4c859eSApple OSS Distributions * expiration times in uptime terms in the kernel, but the userland still 373*0f4c859eSApple OSS Distributions * expects expiration times in terms of calendar times. This is used when 374*0f4c859eSApple OSS Distributions * reporting rt_expire, ln_expire, etc. values to user space. 375*0f4c859eSApple OSS Distributions */ 376*0f4c859eSApple OSS Distributions #define NET_CALCULATE_CLOCKSKEW(cc, ic, cu, iu) \ 377*0f4c859eSApple OSS Distributions ((cc.tv_sec - ic) - (cu - iu)) 378*0f4c859eSApple OSS Distributions 379*0f4c859eSApple OSS Distributions extern unsigned int rt_verbose; 380*0f4c859eSApple OSS Distributions extern struct radix_node_head *rt_tables[AF_MAX + 1]; 381*0f4c859eSApple OSS Distributions extern lck_mtx_t rnh_lock_data; 382*0f4c859eSApple OSS Distributions #define rnh_lock (&rnh_lock_data) 383*0f4c859eSApple OSS Distributions extern uint32_t route_genid_inet; /* INET route generation count */ 384*0f4c859eSApple OSS Distributions extern uint32_t route_genid_inet6; /* INET6 route generation count */ 385*0f4c859eSApple OSS Distributions extern int rttrash; 386*0f4c859eSApple OSS Distributions extern unsigned int rte_debug; 387*0f4c859eSApple OSS Distributions 388*0f4c859eSApple OSS Distributions struct ifmultiaddr; 389*0f4c859eSApple OSS Distributions struct proc; 390*0f4c859eSApple OSS Distributions 391*0f4c859eSApple OSS Distributions extern void route_init(void); 392*0f4c859eSApple OSS Distributions extern void routegenid_update(void); 393*0f4c859eSApple OSS Distributions extern void routegenid_inet_update(void); 394*0f4c859eSApple OSS Distributions extern void routegenid_inet6_update(void); 395*0f4c859eSApple OSS Distributions extern void rt_ifmsg(struct ifnet *); 396*0f4c859eSApple OSS Distributions extern void rt_missmsg(u_char, struct rt_addrinfo *, int, int); 397*0f4c859eSApple OSS Distributions extern void rt_newaddrmsg(u_char, struct ifaddr *, int, struct rtentry *); 398*0f4c859eSApple OSS Distributions extern void rt_newmaddrmsg(u_char, struct ifmultiaddr *); 399*0f4c859eSApple OSS Distributions extern int rt_setgate(struct rtentry *, struct sockaddr *, struct sockaddr *); 400*0f4c859eSApple OSS Distributions extern void set_primary_ifscope(int, unsigned int); 401*0f4c859eSApple OSS Distributions extern unsigned int get_primary_ifscope(int); 402*0f4c859eSApple OSS Distributions extern boolean_t rt_primary_default(struct rtentry *, struct sockaddr *); 403*0f4c859eSApple OSS Distributions extern struct rtentry *rt_lookup(boolean_t, struct sockaddr *, 404*0f4c859eSApple OSS Distributions struct sockaddr *, struct radix_node_head *, unsigned int); 405*0f4c859eSApple OSS Distributions extern struct rtentry *rt_lookup_coarse(boolean_t, struct sockaddr *, 406*0f4c859eSApple OSS Distributions struct sockaddr *, struct radix_node_head *); 407*0f4c859eSApple OSS Distributions extern void rtalloc(struct route *); 408*0f4c859eSApple OSS Distributions extern void rtalloc_scoped(struct route *, unsigned int); 409*0f4c859eSApple OSS Distributions extern void rtalloc_ign(struct route *, uint32_t); 410*0f4c859eSApple OSS Distributions extern void rtalloc_scoped_ign(struct route *, uint32_t, unsigned int); 411*0f4c859eSApple OSS Distributions extern struct rtentry *rtalloc1(struct sockaddr *, int, uint32_t); 412*0f4c859eSApple OSS Distributions extern struct rtentry *rtalloc1_scoped(struct sockaddr *, int, uint32_t, 413*0f4c859eSApple OSS Distributions unsigned int); 414*0f4c859eSApple OSS Distributions extern struct rtentry *rtalloc1_scoped_locked(struct sockaddr *, int, 415*0f4c859eSApple OSS Distributions uint32_t, unsigned int); 416*0f4c859eSApple OSS Distributions extern void rtfree_locked(struct rtentry *); 417*0f4c859eSApple OSS Distributions extern void rtfree(struct rtentry *); 418*0f4c859eSApple OSS Distributions extern void rtref(struct rtentry *); 419*0f4c859eSApple OSS Distributions /* 420*0f4c859eSApple OSS Distributions * rtunref will decrement the refcount, rtfree will decrement and free if 421*0f4c859eSApple OSS Distributions * the refcount has reached zero and the route is not up. 422*0f4c859eSApple OSS Distributions * Unless you have good reason to do otherwise, use rtfree. 423*0f4c859eSApple OSS Distributions */ 424*0f4c859eSApple OSS Distributions extern int rtunref(struct rtentry *); 425*0f4c859eSApple OSS Distributions extern void rtsetifa(struct rtentry *, struct ifaddr *); 426*0f4c859eSApple OSS Distributions extern int rtinit(struct ifaddr *, uint8_t, int); 427*0f4c859eSApple OSS Distributions extern int rtinit_locked(struct ifaddr *, uint8_t, int); 428*0f4c859eSApple OSS Distributions extern int rtioctl(unsigned long, caddr_t, struct proc *); 429*0f4c859eSApple OSS Distributions extern void rtredirect(struct ifnet *, struct sockaddr *, struct sockaddr *, 430*0f4c859eSApple OSS Distributions struct sockaddr *, int, struct sockaddr *, struct rtentry **); 431*0f4c859eSApple OSS Distributions extern int rtrequest(int, struct sockaddr *, 432*0f4c859eSApple OSS Distributions struct sockaddr *, struct sockaddr *, int, struct rtentry **); 433*0f4c859eSApple OSS Distributions extern int rtrequest_scoped(int, struct sockaddr *, struct sockaddr *, 434*0f4c859eSApple OSS Distributions struct sockaddr *, int, struct rtentry **, unsigned int); 435*0f4c859eSApple OSS Distributions extern int rtrequest_locked(int, struct sockaddr *, 436*0f4c859eSApple OSS Distributions struct sockaddr *, struct sockaddr *, int, struct rtentry **); 437*0f4c859eSApple OSS Distributions extern int rtrequest_scoped_locked(int, struct sockaddr *, struct sockaddr *, 438*0f4c859eSApple OSS Distributions struct sockaddr *, int, struct rtentry **, unsigned int); 439*0f4c859eSApple OSS Distributions extern void sin_set_ifscope(struct sockaddr *, unsigned int); 440*0f4c859eSApple OSS Distributions extern unsigned int sin_get_ifscope(struct sockaddr *); 441*0f4c859eSApple OSS Distributions extern unsigned int sin6_get_ifscope(struct sockaddr *); 442*0f4c859eSApple OSS Distributions extern void rt_lock(struct rtentry *, boolean_t); 443*0f4c859eSApple OSS Distributions extern void rt_unlock(struct rtentry *); 444*0f4c859eSApple OSS Distributions extern struct sockaddr *rtm_scrub(int, int, struct sockaddr *, 445*0f4c859eSApple OSS Distributions struct sockaddr *, void *, uint32_t, kauth_cred_t *); 446*0f4c859eSApple OSS Distributions extern boolean_t rt_validate(struct rtentry *); 447*0f4c859eSApple OSS Distributions extern void rt_set_proxy(struct rtentry *, boolean_t); 448*0f4c859eSApple OSS Distributions extern void rt_set_gwroute(struct rtentry *, struct sockaddr *, 449*0f4c859eSApple OSS Distributions struct rtentry *); 450*0f4c859eSApple OSS Distributions extern void rt_revalidate_gwroute(struct rtentry *, struct rtentry *); 451*0f4c859eSApple OSS Distributions extern errno_t route_to_gwroute(const struct sockaddr *, struct rtentry *, 452*0f4c859eSApple OSS Distributions struct rtentry **); 453*0f4c859eSApple OSS Distributions extern void rt_setexpire(struct rtentry *, uint64_t); 454*0f4c859eSApple OSS Distributions extern void rt_str(struct rtentry *, char *, uint32_t, char *, uint32_t); 455*0f4c859eSApple OSS Distributions extern const char *rtm2str(int); 456*0f4c859eSApple OSS Distributions extern void route_clear(struct route *); 457*0f4c859eSApple OSS Distributions extern void route_copyin(struct route *, struct route *, size_t); 458*0f4c859eSApple OSS Distributions extern void route_copyout(struct route *, const struct route *, size_t); 459*0f4c859eSApple OSS Distributions extern boolean_t rt_ifa_is_dst(struct sockaddr *, struct ifaddr *); 460*0f4c859eSApple OSS Distributions extern struct sockaddr *sa_copy(struct sockaddr *, struct sockaddr_storage *, 461*0f4c859eSApple OSS Distributions unsigned int *); 462*0f4c859eSApple OSS Distributions 463*0f4c859eSApple OSS Distributions /* 464*0f4c859eSApple OSS Distributions * The following is used to enqueue work items for route events 465*0f4c859eSApple OSS Distributions * and also used to pass route event while walking the tree 466*0f4c859eSApple OSS Distributions */ 467*0f4c859eSApple OSS Distributions struct route_event { 468*0f4c859eSApple OSS Distributions struct rtentry *rt; 469*0f4c859eSApple OSS Distributions /* 470*0f4c859eSApple OSS Distributions * There's no reference taken on gwrt. 471*0f4c859eSApple OSS Distributions * We only use it to check whether we should 472*0f4c859eSApple OSS Distributions * point to rt_gateway or the embedded rt_addr 473*0f4c859eSApple OSS Distributions * structure. 474*0f4c859eSApple OSS Distributions */ 475*0f4c859eSApple OSS Distributions struct rtentry *gwrt; 476*0f4c859eSApple OSS Distributions union { 477*0f4c859eSApple OSS Distributions union sockaddr_in_4_6 _rtev_ipaddr; 478*0f4c859eSApple OSS Distributions char _rtev_addr_bytes[DLIL_SDLMAXLEN]; 479*0f4c859eSApple OSS Distributions } rt_addr; 480*0f4c859eSApple OSS Distributions uint32_t route_event_code; 481*0f4c859eSApple OSS Distributions eventhandler_tag evtag; 482*0f4c859eSApple OSS Distributions }; 483*0f4c859eSApple OSS Distributions 484*0f4c859eSApple OSS Distributions #define rtev_ipaddr rt_addr._rtev_ipaddr 485*0f4c859eSApple OSS Distributions #define rtev_addr_bytes rt_addr._rtev_addr_bytes 486*0f4c859eSApple OSS Distributions 487*0f4c859eSApple OSS Distributions extern void route_event_init(struct route_event *p_route_ev, struct rtentry *rt, 488*0f4c859eSApple OSS Distributions struct rtentry *gwrt, int route_ev_code); 489*0f4c859eSApple OSS Distributions extern int route_event_walktree(struct radix_node *rn, void *arg); 490*0f4c859eSApple OSS Distributions extern void route_event_enqueue_nwk_wq_entry(struct rtentry *, struct rtentry *, 491*0f4c859eSApple OSS Distributions uint32_t, eventhandler_tag, boolean_t); 492*0f4c859eSApple OSS Distributions #endif /* BSD_KERNEL_PRIVATE */ 493*0f4c859eSApple OSS Distributions #endif /* _NET_ROUTE_PRIVATE_H_ */ 494