1 1.134 rin /* $NetBSD: route.h,v 1.134 2023/06/16 02:48:07 rin Exp $ */ 2 1.6 cgd 3 1.1 cgd /* 4 1.4 mycroft * Copyright (c) 1980, 1986, 1993 5 1.4 mycroft * The Regents of the University of California. All rights reserved. 6 1.1 cgd * 7 1.1 cgd * Redistribution and use in source and binary forms, with or without 8 1.1 cgd * modification, are permitted provided that the following conditions 9 1.1 cgd * are met: 10 1.1 cgd * 1. Redistributions of source code must retain the above copyright 11 1.1 cgd * notice, this list of conditions and the following disclaimer. 12 1.1 cgd * 2. Redistributions in binary form must reproduce the above copyright 13 1.1 cgd * notice, this list of conditions and the following disclaimer in the 14 1.1 cgd * documentation and/or other materials provided with the distribution. 15 1.36 agc * 3. Neither the name of the University nor the names of its contributors 16 1.1 cgd * may be used to endorse or promote products derived from this software 17 1.1 cgd * without specific prior written permission. 18 1.1 cgd * 19 1.1 cgd * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 20 1.1 cgd * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21 1.1 cgd * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22 1.1 cgd * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 23 1.1 cgd * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 24 1.1 cgd * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 25 1.1 cgd * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 26 1.1 cgd * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 27 1.1 cgd * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 28 1.1 cgd * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29 1.1 cgd * SUCH DAMAGE. 30 1.1 cgd * 31 1.11 christos * @(#)route.h 8.5 (Berkeley) 2/8/95 32 1.1 cgd */ 33 1.1 cgd 34 1.11 christos #ifndef _NET_ROUTE_H_ 35 1.11 christos #define _NET_ROUTE_H_ 36 1.13 thorpej 37 1.13 thorpej #include <sys/queue.h> 38 1.14 thorpej #include <sys/socket.h> 39 1.44 dyoung #include <sys/types.h> 40 1.44 dyoung #include <net/if.h> 41 1.109 ozaki #ifdef _KERNEL 42 1.109 ozaki #include <sys/rwlock.h> 43 1.109 ozaki #include <sys/condvar.h> 44 1.109 ozaki #include <sys/pserialize.h> 45 1.125 ozaki #include <sys/percpu.h> 46 1.110 christos #endif 47 1.109 ozaki #include <sys/psref.h> 48 1.13 thorpej 49 1.68 simonb #if !(defined(_KERNEL) || defined(_STANDALONE)) 50 1.67 dyoung #include <stdbool.h> 51 1.67 dyoung #endif 52 1.67 dyoung 53 1.1 cgd /* 54 1.1 cgd * Kernel resident routing tables. 55 1.39 perry * 56 1.1 cgd * The routing tables are initialized when interface addresses 57 1.1 cgd * are set by making entries for all directly connected interfaces. 58 1.1 cgd */ 59 1.1 cgd 60 1.1 cgd /* 61 1.67 dyoung * A route consists of a destination address and a reference 62 1.67 dyoung * to a routing entry. These are often held by protocols 63 1.67 dyoung * in their control blocks, e.g. inpcb. 64 1.67 dyoung */ 65 1.67 dyoung struct route { 66 1.67 dyoung struct rtentry *_ro_rt; 67 1.67 dyoung struct sockaddr *ro_sa; 68 1.114 ozaki uint64_t ro_rtcache_generation; 69 1.109 ozaki struct psref ro_psref; 70 1.109 ozaki int ro_bound; 71 1.67 dyoung }; 72 1.67 dyoung 73 1.67 dyoung /* 74 1.1 cgd * These numbers are used by reliable protocols for determining 75 1.1 cgd * retransmission behavior and are included in the routing structure. 76 1.1 cgd */ 77 1.1 cgd struct rt_metrics { 78 1.78 matt uint64_t rmx_locks; /* Kernel must leave these values alone */ 79 1.78 matt uint64_t rmx_mtu; /* MTU for this path */ 80 1.78 matt uint64_t rmx_hopcount; /* max hops expected */ 81 1.78 matt uint64_t rmx_recvpipe; /* inbound delay-bandwidth product */ 82 1.78 matt uint64_t rmx_sendpipe; /* outbound delay-bandwidth product */ 83 1.78 matt uint64_t rmx_ssthresh; /* outbound gateway buffer limit */ 84 1.78 matt uint64_t rmx_rtt; /* estimated round trip time */ 85 1.78 matt uint64_t rmx_rttvar; /* estimated rtt variance */ 86 1.72 christos time_t rmx_expire; /* lifetime for route, e.g. redirect */ 87 1.72 christos time_t rmx_pksent; /* packets sent using this route */ 88 1.72 christos }; 89 1.72 christos 90 1.1 cgd /* 91 1.1 cgd * rmx_rtt and rmx_rttvar are stored as microseconds; 92 1.1 cgd * RTTTOPRHZ(rtt) converts to a value suitable for use 93 1.1 cgd * by a protocol slowtimo counter. 94 1.1 cgd */ 95 1.1 cgd #define RTM_RTTUNIT 1000000 /* units for rtt, rttvar, as units per sec */ 96 1.1 cgd #define RTTTOPRHZ(r) ((r) / (RTM_RTTUNIT / PR_SLOWHZ)) 97 1.1 cgd 98 1.1 cgd /* 99 1.1 cgd * We distinguish between routes to hosts and routes to networks, 100 1.1 cgd * preferring the former if available. For each route we infer 101 1.1 cgd * the interface to use from the gateway address supplied when 102 1.1 cgd * the route was entered. Routes that forward packets through 103 1.1 cgd * gateways are marked so that the output routines know to address the 104 1.1 cgd * gateway rather than the ultimate destination. 105 1.1 cgd */ 106 1.1 cgd #ifndef RNF_NORMAL 107 1.4 mycroft #include <net/radix.h> 108 1.1 cgd #endif 109 1.1 cgd struct rtentry { 110 1.1 cgd struct radix_node rt_nodes[2]; /* tree glue, and other values */ 111 1.57 dyoung #define rt_mask(r) ((const struct sockaddr *)((r)->rt_nodes->rn_mask)) 112 1.1 cgd struct sockaddr *rt_gateway; /* value */ 113 1.22 ragge int rt_flags; /* up/down?, host/net */ 114 1.22 ragge int rt_refcnt; /* # held references */ 115 1.78 matt uint64_t rt_use; /* raw # packets forwarded */ 116 1.1 cgd struct ifnet *rt_ifp; /* the answer: interface to use */ 117 1.1 cgd struct ifaddr *rt_ifa; /* the answer: interface to use */ 118 1.44 dyoung uint32_t rt_ifa_seqno; 119 1.52 christos void * rt_llinfo; /* pointer to link level info cache */ 120 1.78 matt struct rt_metrics rt_rmx; /* metrics used by rx'ing protocols */ 121 1.4 mycroft struct rtentry *rt_gwroute; /* implied entry for gatewayed routes */ 122 1.12 kml LIST_HEAD(, rttimer) rt_timer; /* queue of timeouts for misc funcs */ 123 1.26 itojun struct rtentry *rt_parent; /* parent of cloned route */ 124 1.75 kefren struct sockaddr *_rt_key; 125 1.75 kefren struct sockaddr *rt_tag; /* route tagging info */ 126 1.109 ozaki #ifdef _KERNEL 127 1.109 ozaki kcondvar_t rt_cv; 128 1.117 christos struct psref_target rt_psref; 129 1.117 christos SLIST_ENTRY(rtentry) rt_free; /* queue of deferred frees */ 130 1.109 ozaki #endif 131 1.1 cgd }; 132 1.1 cgd 133 1.119 christos static __inline const struct sockaddr * 134 1.57 dyoung rt_getkey(const struct rtentry *rt) 135 1.57 dyoung { 136 1.57 dyoung return rt->_rt_key; 137 1.57 dyoung } 138 1.57 dyoung 139 1.1 cgd /* 140 1.1 cgd * Following structure necessary for 4.3 compatibility; 141 1.1 cgd * We should eventually move it to a compat file. 142 1.1 cgd */ 143 1.1 cgd struct ortentry { 144 1.69 matt uint32_t rt_hash; /* to speed lookups */ 145 1.11 christos struct sockaddr rt_dst; /* key */ 146 1.11 christos struct sockaddr rt_gateway; /* value */ 147 1.11 christos int16_t rt_flags; /* up/down?, host/net */ 148 1.11 christos int16_t rt_refcnt; /* # held references */ 149 1.69 matt uint32_t rt_use; /* raw # packets forwarded */ 150 1.11 christos struct ifnet *rt_ifp; /* the answer: interface to use */ 151 1.1 cgd }; 152 1.1 cgd 153 1.4 mycroft #define RTF_UP 0x1 /* route usable */ 154 1.1 cgd #define RTF_GATEWAY 0x2 /* destination is a gateway */ 155 1.1 cgd #define RTF_HOST 0x4 /* host entry (net otherwise) */ 156 1.1 cgd #define RTF_REJECT 0x8 /* host or net unreachable */ 157 1.1 cgd #define RTF_DYNAMIC 0x10 /* created dynamically (by redirect) */ 158 1.1 cgd #define RTF_MODIFIED 0x20 /* modified dynamically (by redirect) */ 159 1.1 cgd #define RTF_DONE 0x40 /* message confirmed */ 160 1.1 cgd #define RTF_MASK 0x80 /* subnet mask present */ 161 1.98 ozaki // #define RTF_CLONING 0x100 /* generate new routes on use */ 162 1.98 ozaki #define RTF_CONNECTED 0x100 /* hosts on this route are neighbours */ 163 1.98 ozaki // #define RTF_XRESOLVE 0x200 /* external daemon resolves name */ 164 1.98 ozaki // #define RTF_LLINFO 0x400 /* generated by ARP or NDP */ 165 1.95 ozaki #define RTF_LLDATA 0x400 /* used by apps to add/del L2 entries */ 166 1.4 mycroft #define RTF_STATIC 0x800 /* manually added */ 167 1.4 mycroft #define RTF_BLACKHOLE 0x1000 /* just discard pkts (during updates) */ 168 1.98 ozaki // #define RTF_CLONED 0x2000 /* this is a cloned route */ 169 1.1 cgd #define RTF_PROTO2 0x4000 /* protocol specific routing flag */ 170 1.1 cgd #define RTF_PROTO1 0x8000 /* protocol specific routing flag */ 171 1.44 dyoung #define RTF_SRC 0x10000 /* route has fixed source address */ 172 1.85 roy #define RTF_ANNOUNCE 0x20000 /* announce new ARP or NDP entry */ 173 1.87 roy #define RTF_LOCAL 0x40000 /* route represents a local address */ 174 1.88 roy #define RTF_BROADCAST 0x80000 /* route represents a bcast address */ 175 1.109 ozaki #define RTF_UPDATING 0x100000 /* route is updating */ 176 1.120 ozaki /* 177 1.120 ozaki * The flag is nevert set to rt_flags. It just tells rtrequest1 to set a passed 178 1.120 ozaki * ifa to rt_ifa (via rti_ifa) and not replace rt_ifa in ifa_rtrequest. 179 1.120 ozaki */ 180 1.120 ozaki #define RTF_DONTCHANGEIFA 0x200000 /* suppress rt_ifa replacement */ 181 1.1 cgd 182 1.116 ozaki /* 183 1.116 ozaki * 0x400 is exposed to userland just for backward compatibility. For that 184 1.116 ozaki * purpose, it should be shown as LLINFO. 185 1.116 ozaki */ 186 1.115 christos #define RTFBITS "\020\1UP\2GATEWAY\3HOST\4REJECT\5DYNAMIC\6MODIFIED\7DONE" \ 187 1.116 ozaki "\010MASK_PRESENT\011CONNECTED\012XRESOLVE\013LLINFO\014STATIC" \ 188 1.115 christos "\015BLACKHOLE\016CLONED\017PROTO2\020PROTO1\021SRC\022ANNOUNCE" \ 189 1.115 christos "\023LOCAL\024BROADCAST\025UPDATING" 190 1.115 christos 191 1.115 christos 192 1.1 cgd /* 193 1.1 cgd * Routing statistics. 194 1.1 cgd */ 195 1.1 cgd struct rtstat { 196 1.74 dyoung uint64_t rts_badredirect; /* bogus redirect calls */ 197 1.74 dyoung uint64_t rts_dynamic; /* routes created by redirects */ 198 1.74 dyoung uint64_t rts_newgateway; /* routes modified by redirects */ 199 1.74 dyoung uint64_t rts_unreach; /* lookups which failed */ 200 1.74 dyoung uint64_t rts_wildcard; /* lookups satisfied by a wildcard */ 201 1.1 cgd }; 202 1.78 matt 203 1.1 cgd /* 204 1.78 matt * Structures for routing messages. By forcing the first member to be aligned 205 1.78 matt * at a 64-bit boundary, we also force the size to be a multiple of 64-bits. 206 1.1 cgd */ 207 1.78 matt 208 1.78 matt #if !defined(_KERNEL) || !defined(COMPAT_RTSOCK) 209 1.78 matt /* 210 1.129 andvar * If we aren't being compiled for backwards compatibility, enforce 64-bit 211 1.78 matt * alignment so any routing message is the same regardless if the kernel 212 1.78 matt * is an ILP32 or LP64 kernel. 213 1.78 matt */ 214 1.78 matt #define __align64 __aligned(sizeof(uint64_t)) 215 1.78 matt #else 216 1.78 matt #define __align64 217 1.78 matt #endif 218 1.78 matt 219 1.1 cgd struct rt_msghdr { 220 1.78 matt u_short rtm_msglen __align64; 221 1.78 matt /* to skip over non-understood messages */ 222 1.4 mycroft u_char rtm_version; /* future binary compatibility */ 223 1.1 cgd u_char rtm_type; /* message type */ 224 1.1 cgd u_short rtm_index; /* index for associated ifp */ 225 1.4 mycroft int rtm_flags; /* flags, incl. kern & message, e.g. DONE */ 226 1.4 mycroft int rtm_addrs; /* bitmask identifying sockaddrs in msg */ 227 1.1 cgd pid_t rtm_pid; /* identify sender */ 228 1.1 cgd int rtm_seq; /* for sender to identify action */ 229 1.1 cgd int rtm_errno; /* why failed */ 230 1.1 cgd int rtm_use; /* from rtentry */ 231 1.78 matt int rtm_inits; /* which metrics we are initializing */ 232 1.78 matt struct rt_metrics rtm_rmx __align64; 233 1.78 matt /* metrics themselves */ 234 1.1 cgd }; 235 1.1 cgd 236 1.78 matt #undef __align64 237 1.78 matt 238 1.78 matt #define RTM_VERSION 4 /* Up the ante and ignore older versions */ 239 1.1 cgd 240 1.1 cgd #define RTM_ADD 0x1 /* Add Route */ 241 1.1 cgd #define RTM_DELETE 0x2 /* Delete Route */ 242 1.1 cgd #define RTM_CHANGE 0x3 /* Change Metrics or flags */ 243 1.1 cgd #define RTM_GET 0x4 /* Report Metrics */ 244 1.1 cgd #define RTM_LOSING 0x5 /* Kernel Suspects Partitioning */ 245 1.1 cgd #define RTM_REDIRECT 0x6 /* Told to use different route */ 246 1.1 cgd #define RTM_MISS 0x7 /* Lookup failed on this address */ 247 1.1 cgd #define RTM_LOCK 0x8 /* fix specified metrics */ 248 1.1 cgd #define RTM_OLDADD 0x9 /* caused by SIOCADDRT */ 249 1.1 cgd #define RTM_OLDDEL 0xa /* caused by SIOCDELRT */ 250 1.98 ozaki // #define RTM_RESOLVE 0xb /* req to resolve dst to LL addr */ 251 1.103 roy #define RTM_ONEWADDR 0xc /* Old (pre-8.0) RTM_NEWADDR message */ 252 1.103 roy #define RTM_ODELADDR 0xd /* Old (pre-8.0) RTM_DELADDR message */ 253 1.72 christos #define RTM_OOIFINFO 0xe /* Old (pre-1.5) RTM_IFINFO message */ 254 1.78 matt #define RTM_OIFINFO 0xf /* Old (pre-64bit time) RTM_IFINFO message */ 255 1.21 thorpej #define RTM_IFANNOUNCE 0x10 /* iface arrival/departure */ 256 1.41 dyoung #define RTM_IEEE80211 0x11 /* IEEE80211 wireless event */ 257 1.58 dyoung #define RTM_SETGATE 0x12 /* set prototype gateway for clones 258 1.58 dyoung * (see example in arp_rtrequest). 259 1.58 dyoung */ 260 1.71 dyoung #define RTM_LLINFO_UPD 0x13 /* indication to ARP/NDP/etc. that link-layer 261 1.71 dyoung * address has changed 262 1.71 dyoung */ 263 1.72 christos #define RTM_IFINFO 0x14 /* iface/link going up/down etc. */ 264 1.103 roy #define RTM_OCHGADDR 0x15 /* Old (pre-8.0) RTM_CHGADDR message */ 265 1.103 roy #define RTM_NEWADDR 0x16 /* address being added to iface */ 266 1.103 roy #define RTM_DELADDR 0x17 /* address being removed from iface */ 267 1.103 roy #define RTM_CHGADDR 0x18 /* address properties changed */ 268 1.1 cgd 269 1.128 christos #ifdef RTM_NAMES 270 1.128 christos static const char *rtm_names[] = { 271 1.128 christos "*none*", "add", "delete", "change", "get", 272 1.128 christos "losing", "redirect", "miss", "lock", "oldadd", 273 1.128 christos "olddel", "*resolve*", "onewaddr", "odeladdr", "ooifinfo", 274 1.128 christos "oifinfo", "ifannounce", "ieee80211", "setgate", "llinfo_upd", 275 1.128 christos "ifinfo", "ochgaddr", "newaddr", "deladdr", "chgaddr", 276 1.128 christos }; 277 1.128 christos #endif 278 1.128 christos 279 1.112 roy /* 280 1.112 roy * setsockopt defines used for the filtering. 281 1.112 roy */ 282 1.112 roy #define RO_MSGFILTER 1 /* array of which rtm_type to send to client */ 283 1.126 roy #define RO_MISSFILTER 2 /* array of sockaddrs to match miss dst */ 284 1.126 roy 285 1.126 roy #define RO_FILTSA_MAX 30 /* maximum number of sockaddrs per filter */ 286 1.112 roy 287 1.1 cgd #define RTV_MTU 0x1 /* init or lock _mtu */ 288 1.1 cgd #define RTV_HOPCOUNT 0x2 /* init or lock _hopcount */ 289 1.28 enami #define RTV_EXPIRE 0x4 /* init or lock _expire */ 290 1.1 cgd #define RTV_RPIPE 0x8 /* init or lock _recvpipe */ 291 1.1 cgd #define RTV_SPIPE 0x10 /* init or lock _sendpipe */ 292 1.1 cgd #define RTV_SSTHRESH 0x20 /* init or lock _ssthresh */ 293 1.1 cgd #define RTV_RTT 0x40 /* init or lock _rtt */ 294 1.1 cgd #define RTV_RTTVAR 0x80 /* init or lock _rttvar */ 295 1.1 cgd 296 1.115 christos #define RTVBITS "\020\1MTU\2HOPCOUNT\3EXPIRE\4RECVPIPE\5SENDPIPE" \ 297 1.115 christos "\6SSTHRESH\7RTT\010RTTVAR" 298 1.115 christos 299 1.4 mycroft /* 300 1.4 mycroft * Bitmask values for rtm_addr. 301 1.4 mycroft */ 302 1.1 cgd #define RTA_DST 0x1 /* destination sockaddr present */ 303 1.1 cgd #define RTA_GATEWAY 0x2 /* gateway sockaddr present */ 304 1.1 cgd #define RTA_NETMASK 0x4 /* netmask sockaddr present */ 305 1.1 cgd #define RTA_GENMASK 0x8 /* cloning mask sockaddr present */ 306 1.1 cgd #define RTA_IFP 0x10 /* interface name sockaddr present */ 307 1.1 cgd #define RTA_IFA 0x20 /* interface addr sockaddr present */ 308 1.1 cgd #define RTA_AUTHOR 0x40 /* sockaddr for author of redirect */ 309 1.4 mycroft #define RTA_BRD 0x80 /* for NEWADDR, broadcast or p-p dest addr */ 310 1.75 kefren #define RTA_TAG 0x100 /* route tag */ 311 1.4 mycroft 312 1.115 christos #define RTABITS "\020\1DST\2GATEWAY\3NETMASK\4GENMASK\5IFP\6IFA\7AUTHOR" \ 313 1.115 christos "\010BRD\011TAG" 314 1.115 christos 315 1.4 mycroft /* 316 1.4 mycroft * Index offsets for sockaddr array for alternate internal encoding. 317 1.4 mycroft */ 318 1.4 mycroft #define RTAX_DST 0 /* destination sockaddr present */ 319 1.4 mycroft #define RTAX_GATEWAY 1 /* gateway sockaddr present */ 320 1.4 mycroft #define RTAX_NETMASK 2 /* netmask sockaddr present */ 321 1.4 mycroft #define RTAX_GENMASK 3 /* cloning mask sockaddr present */ 322 1.4 mycroft #define RTAX_IFP 4 /* interface name sockaddr present */ 323 1.4 mycroft #define RTAX_IFA 5 /* interface addr sockaddr present */ 324 1.4 mycroft #define RTAX_AUTHOR 6 /* sockaddr for author of redirect */ 325 1.4 mycroft #define RTAX_BRD 7 /* for NEWADDR, broadcast or p-p dest addr */ 326 1.75 kefren #define RTAX_TAG 8 /* route tag */ 327 1.75 kefren #define RTAX_MAX 9 /* size of array to allocate */ 328 1.4 mycroft 329 1.111 roy #define RT_ROUNDUP2(a, n) ((a) > 0 ? (1 + (((a) - 1U) | ((n) - 1))) : (n)) 330 1.78 matt #define RT_ROUNDUP(a) RT_ROUNDUP2((a), sizeof(uint64_t)) 331 1.78 matt #define RT_ADVANCE(x, n) (x += RT_ROUNDUP((n)->sa_len)) 332 1.73 christos 333 1.4 mycroft struct rt_addrinfo { 334 1.4 mycroft int rti_addrs; 335 1.37 matt const struct sockaddr *rti_info[RTAX_MAX]; 336 1.24 itojun int rti_flags; 337 1.24 itojun struct ifaddr *rti_ifa; 338 1.24 itojun struct ifnet *rti_ifp; 339 1.4 mycroft }; 340 1.1 cgd 341 1.4 mycroft struct route_cb { 342 1.4 mycroft int ip_count; 343 1.18 itojun int ip6_count; 344 1.82 joerg int unused1; 345 1.75 kefren int mpls_count; 346 1.4 mycroft int any_count; 347 1.4 mycroft }; 348 1.1 cgd 349 1.39 perry /* 350 1.12 kml * This structure, and the prototypes for the rt_timer_{init,remove_all, 351 1.12 kml * add,timer} functions all used with the kind permission of BSDI. 352 1.12 kml * These allow functions to be called for routes at specific times. 353 1.12 kml */ 354 1.12 kml 355 1.12 kml struct rttimer { 356 1.17 thorpej TAILQ_ENTRY(rttimer) rtt_next; /* entry on timer queue */ 357 1.17 thorpej LIST_ENTRY(rttimer) rtt_link; /* multiple timers per rtentry */ 358 1.38 matt struct rttimer_queue *rtt_queue; /* back pointer to queue */ 359 1.38 matt struct rtentry *rtt_rt; /* Back pointer to the route */ 360 1.38 matt void (*rtt_func)(struct rtentry *, struct rttimer *); 361 1.38 matt time_t rtt_time; /* When this timer was registered */ 362 1.12 kml }; 363 1.12 kml 364 1.12 kml struct rttimer_queue { 365 1.12 kml long rtq_timeout; 366 1.23 itojun unsigned long rtq_count; 367 1.17 thorpej TAILQ_HEAD(, rttimer) rtq_head; 368 1.12 kml LIST_ENTRY(rttimer_queue) rtq_link; 369 1.17 thorpej }; 370 1.12 kml 371 1.12 kml 372 1.79 dyoung struct rtbl; 373 1.79 dyoung typedef struct rtbl rtbl_t; 374 1.79 dyoung 375 1.8 jtc #ifdef _KERNEL 376 1.72 christos 377 1.79 dyoung struct rtbl { 378 1.79 dyoung struct radix_node_head t_rnh; 379 1.79 dyoung }; 380 1.79 dyoung 381 1.72 christos struct rt_walkarg { 382 1.72 christos int w_op; 383 1.72 christos int w_arg; 384 1.72 christos int w_given; 385 1.72 christos int w_needed; 386 1.72 christos void * w_where; 387 1.72 christos int w_tmemsize; 388 1.72 christos int w_tmemneeded; 389 1.72 christos void * w_tmem; 390 1.72 christos }; 391 1.72 christos 392 1.57 dyoung #if 0 393 1.57 dyoung #define RT_DPRINTF(__fmt, ...) do { } while (/*CONSTCOND*/0) 394 1.57 dyoung #else 395 1.57 dyoung #define RT_DPRINTF(__fmt, ...) /* do nothing */ 396 1.57 dyoung #endif 397 1.57 dyoung 398 1.56 dyoung struct rtwalk { 399 1.56 dyoung int (*rw_f)(struct rtentry *, void *); 400 1.56 dyoung void *rw_v; 401 1.56 dyoung }; 402 1.78 matt 403 1.78 matt /* 404 1.78 matt * Global data specific to the routing socket. 405 1.78 matt */ 406 1.78 matt struct route_info { 407 1.78 matt struct sockaddr ri_dst; 408 1.78 matt struct sockaddr ri_src; 409 1.78 matt struct route_cb ri_cb; 410 1.78 matt int ri_maxqlen; 411 1.78 matt struct ifqueue ri_intrq; 412 1.78 matt void *ri_sih; 413 1.78 matt }; 414 1.78 matt 415 1.78 matt extern struct route_info route_info; 416 1.29 matt extern struct rtstat rtstat; 417 1.4 mycroft 418 1.11 christos struct socket; 419 1.11 christos 420 1.90 ozaki void rt_init(void); 421 1.90 ozaki 422 1.90 ozaki int rt_timer_add(struct rtentry *, 423 1.90 ozaki void(*)(struct rtentry *, struct rttimer *), 424 1.90 ozaki struct rttimer_queue *); 425 1.90 ozaki unsigned long 426 1.90 ozaki rt_timer_count(struct rttimer_queue *); 427 1.90 ozaki void rt_timer_queue_change(struct rttimer_queue *, long); 428 1.12 kml struct rttimer_queue * 429 1.90 ozaki rt_timer_queue_create(u_int); 430 1.106 ozaki void rt_timer_queue_destroy(struct rttimer_queue *); 431 1.90 ozaki 432 1.109 ozaki void rt_free(struct rtentry *); 433 1.109 ozaki void rt_unref(struct rtentry *); 434 1.109 ozaki 435 1.118 ozaki int rt_update(struct rtentry *, struct rt_addrinfo *, void *); 436 1.109 ozaki int rt_update_prepare(struct rtentry *); 437 1.109 ozaki void rt_update_finish(struct rtentry *); 438 1.109 ozaki 439 1.97 ozaki void rt_newmsg(const int, const struct rtentry *); 440 1.131 knakahar void rt_newmsg_dynamic(const int, const struct rtentry *); 441 1.4 mycroft struct rtentry * 442 1.90 ozaki rtalloc1(const struct sockaddr *, int); 443 1.90 ozaki int rtinit(struct ifaddr *, int, int); 444 1.90 ozaki void rtredirect(const struct sockaddr *, const struct sockaddr *, 445 1.37 matt const struct sockaddr *, int, const struct sockaddr *, 446 1.38 matt struct rtentry **); 447 1.90 ozaki int rtrequest(int, const struct sockaddr *, 448 1.37 matt const struct sockaddr *, const struct sockaddr *, int, 449 1.38 matt struct rtentry **); 450 1.90 ozaki int rtrequest1(int, struct rt_addrinfo *, struct rtentry **); 451 1.44 dyoung 452 1.90 ozaki int rt_ifa_addlocal(struct ifaddr *); 453 1.90 ozaki int rt_ifa_remlocal(struct ifaddr *, struct ifaddr *); 454 1.90 ozaki struct ifaddr * 455 1.90 ozaki rt_get_ifa(struct rtentry *); 456 1.49 joerg void rt_replace_ifa(struct rtentry *, struct ifaddr *); 457 1.90 ozaki int rt_setgate(struct rtentry *, const struct sockaddr *); 458 1.49 joerg 459 1.90 ozaki const struct sockaddr * 460 1.90 ozaki rt_settag(struct rtentry *, const struct sockaddr *); 461 1.90 ozaki struct sockaddr * 462 1.101 ozaki rt_gettag(const struct rtentry *); 463 1.75 kefren 464 1.101 ozaki int rt_check_reject_route(const struct rtentry *, const struct ifnet *); 465 1.107 ozaki void rt_delete_matched_entries(sa_family_t, 466 1.132 knakahar int (*)(struct rtentry *, void *), void *, bool); 467 1.132 knakahar void rt_replace_ifa_matched_entries(sa_family_t, 468 1.132 knakahar int (*)(struct rtentry *, void *), void *, struct ifaddr *); 469 1.109 ozaki int rt_walktree(sa_family_t, int (*)(struct rtentry *, void *), void *); 470 1.96 ozaki 471 1.119 christos static __inline void 472 1.94 ozaki rt_assert_referenced(const struct rtentry *rt) 473 1.94 ozaki { 474 1.94 ozaki 475 1.94 ozaki KASSERT(rt->rt_refcnt > 0); 476 1.94 ozaki } 477 1.94 ozaki 478 1.109 ozaki void rtcache_copy(struct route *, struct route *); 479 1.49 joerg void rtcache_free(struct route *); 480 1.90 ozaki struct rtentry * 481 1.90 ozaki rtcache_init(struct route *); 482 1.90 ozaki struct rtentry * 483 1.90 ozaki rtcache_init_noclone(struct route *); 484 1.90 ozaki struct rtentry * 485 1.90 ozaki rtcache_lookup2(struct route *, const struct sockaddr *, int, 486 1.90 ozaki int *); 487 1.54 dyoung int rtcache_setdst(struct route *, const struct sockaddr *); 488 1.90 ozaki struct rtentry * 489 1.90 ozaki rtcache_update(struct route *, int); 490 1.49 joerg 491 1.119 christos static __inline void 492 1.71 dyoung rtcache_invariants(const struct route *ro) 493 1.71 dyoung { 494 1.114 ozaki 495 1.71 dyoung KASSERT(ro->ro_sa != NULL || ro->_ro_rt == NULL); 496 1.71 dyoung } 497 1.71 dyoung 498 1.119 christos static __inline struct rtentry * 499 1.55 dyoung rtcache_lookup1(struct route *ro, const struct sockaddr *dst, int clone) 500 1.55 dyoung { 501 1.55 dyoung int hit; 502 1.55 dyoung 503 1.55 dyoung return rtcache_lookup2(ro, dst, clone, &hit); 504 1.55 dyoung } 505 1.55 dyoung 506 1.119 christos static __inline struct rtentry * 507 1.54 dyoung rtcache_lookup(struct route *ro, const struct sockaddr *dst) 508 1.51 dyoung { 509 1.54 dyoung return rtcache_lookup1(ro, dst, 1); 510 1.51 dyoung } 511 1.51 dyoung 512 1.119 christos static __inline const struct sockaddr * 513 1.54 dyoung rtcache_getdst(const struct route *ro) 514 1.51 dyoung { 515 1.109 ozaki 516 1.71 dyoung rtcache_invariants(ro); 517 1.54 dyoung return ro->ro_sa; 518 1.51 dyoung } 519 1.51 dyoung 520 1.109 ozaki struct rtentry * 521 1.109 ozaki rtcache_validate(struct route *); 522 1.108 ozaki 523 1.109 ozaki void rtcache_unref(struct rtentry *, struct route *); 524 1.108 ozaki 525 1.125 ozaki percpu_t * 526 1.125 ozaki rtcache_percpu_alloc(void); 527 1.125 ozaki 528 1.133 rin static __inline struct route * 529 1.125 ozaki rtcache_percpu_getref(percpu_t *pc) 530 1.125 ozaki { 531 1.125 ozaki 532 1.125 ozaki return *(struct route **)percpu_getref(pc); 533 1.125 ozaki } 534 1.125 ozaki 535 1.133 rin static __inline void 536 1.125 ozaki rtcache_percpu_putref(percpu_t *pc) 537 1.125 ozaki { 538 1.125 ozaki 539 1.125 ozaki percpu_putref(pc); 540 1.125 ozaki } 541 1.125 ozaki 542 1.125 ozaki 543 1.90 ozaki /* rtsock */ 544 1.90 ozaki void rt_ieee80211msg(struct ifnet *, int, void *, size_t); 545 1.90 ozaki void rt_ifannouncemsg(struct ifnet *, int); 546 1.90 ozaki void rt_ifmsg(struct ifnet *); 547 1.90 ozaki void rt_missmsg(int, const struct rt_addrinfo *, int, int); 548 1.90 ozaki struct mbuf * 549 1.90 ozaki rt_msg1(int, struct rt_addrinfo *, void *, int); 550 1.98 ozaki int rt_msg3(int, struct rt_addrinfo *, void *, struct rt_walkarg *, int *); 551 1.122 roy void rt_addrmsg(int, struct ifaddr *); 552 1.123 roy void rt_addrmsg_src(int, struct ifaddr *, const struct sockaddr *); 553 1.122 roy void rt_addrmsg_rt(int, struct ifaddr *, int, struct rtentry *); 554 1.90 ozaki void route_enqueue(struct mbuf *, int); 555 1.90 ozaki 556 1.113 ozaki struct llentry; 557 1.127 roy void rt_clonedmsg(int, const struct sockaddr *, const struct sockaddr *, 558 1.127 roy const uint8_t *, const struct ifnet *); 559 1.113 ozaki 560 1.118 ozaki void rt_setmetrics(void *, struct rtentry *); 561 1.118 ozaki 562 1.90 ozaki /* rtbl */ 563 1.90 ozaki int rt_addaddr(rtbl_t *, struct rtentry *, const struct sockaddr *); 564 1.90 ozaki void rt_assert_inactive(const struct rtentry *); 565 1.90 ozaki struct rtentry * 566 1.90 ozaki rt_deladdr(rtbl_t *, const struct sockaddr *, 567 1.90 ozaki const struct sockaddr *); 568 1.79 dyoung rtbl_t *rt_gettable(sa_family_t); 569 1.90 ozaki int rt_inithead(rtbl_t **, int); 570 1.90 ozaki struct rtentry * 571 1.90 ozaki rt_lookup(rtbl_t *, const struct sockaddr *, 572 1.90 ozaki const struct sockaddr *); 573 1.90 ozaki struct rtentry * 574 1.90 ozaki rt_matchaddr(rtbl_t *, const struct sockaddr *); 575 1.99 ozaki int rt_refines(const struct sockaddr *, const struct sockaddr *); 576 1.109 ozaki int rtbl_walktree(sa_family_t, int (*)(struct rtentry *, void *), void *); 577 1.107 ozaki struct rtentry * 578 1.107 ozaki rtbl_search_matched_entry(sa_family_t, 579 1.107 ozaki int (*)(struct rtentry *, void *), void *); 580 1.90 ozaki void rtbl_init(void); 581 1.56 dyoung 582 1.134 rin void sysctl_net_route_setup(struct sysctllog **, int, const char *); 583 1.121 pgoyette 584 1.8 jtc #endif /* _KERNEL */ 585 1.79 dyoung 586 1.42 elad #endif /* !_NET_ROUTE_H_ */ 587