Line data Source code
1 : /* $OpenBSD: route.h,v 1.172 2018/07/12 16:07:35 florian Exp $ */
2 : /* $NetBSD: route.h,v 1.9 1996/02/13 22:00:49 christos Exp $ */
3 :
4 : /*
5 : * Copyright (c) 1980, 1986, 1993
6 : * The Regents of the University of California. All rights reserved.
7 : *
8 : * Redistribution and use in source and binary forms, with or without
9 : * modification, are permitted provided that the following conditions
10 : * are met:
11 : * 1. Redistributions of source code must retain the above copyright
12 : * notice, this list of conditions and the following disclaimer.
13 : * 2. Redistributions in binary form must reproduce the above copyright
14 : * notice, this list of conditions and the following disclaimer in the
15 : * documentation and/or other materials provided with the distribution.
16 : * 3. Neither the name of the University nor the names of its contributors
17 : * may be used to endorse or promote products derived from this software
18 : * without specific prior written permission.
19 : *
20 : * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21 : * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 : * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 : * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24 : * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25 : * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26 : * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27 : * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28 : * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29 : * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30 : * SUCH DAMAGE.
31 : *
32 : * @(#)route.h 8.3 (Berkeley) 4/19/94
33 : */
34 :
35 : #ifndef _NET_ROUTE_H_
36 : #define _NET_ROUTE_H_
37 :
38 : /*
39 : * Kernel resident routing tables.
40 : *
41 : * The routing tables are initialized when interface addresses
42 : * are set by making entries for all directly connected interfaces.
43 : */
44 :
45 : /*
46 : * These numbers are used by reliable protocols for determining
47 : * retransmission behavior and are included in the routing structure.
48 : */
49 : struct rt_kmetrics {
50 : u_int64_t rmx_pksent; /* packets sent using this route */
51 : int64_t rmx_expire; /* lifetime for route, e.g. redirect */
52 : u_int rmx_locks; /* Kernel must leave these values */
53 : u_int rmx_mtu; /* MTU for this path */
54 : };
55 :
56 : /*
57 : * Huge version for userland compatibility.
58 : */
59 : struct rt_metrics {
60 : u_int64_t rmx_pksent; /* packets sent using this route */
61 : int64_t rmx_expire; /* lifetime for route, e.g. redirect */
62 : u_int rmx_locks; /* Kernel must leave these values */
63 : u_int rmx_mtu; /* MTU for this path */
64 : u_int rmx_refcnt; /* # references hold */
65 : /* some apps may still need these no longer used metrics */
66 : u_int rmx_hopcount; /* max hops expected */
67 : u_int rmx_recvpipe; /* inbound delay-bandwidth product */
68 : u_int rmx_sendpipe; /* outbound delay-bandwidth product */
69 : u_int rmx_ssthresh; /* outbound gateway buffer limit */
70 : u_int rmx_rtt; /* estimated round trip time */
71 : u_int rmx_rttvar; /* estimated rtt variance */
72 : u_int rmx_pad;
73 : };
74 :
75 : /*
76 : * rmx_rtt and rmx_rttvar are stored as microseconds;
77 : * RTTTOPRHZ(rtt) converts to a value suitable for use
78 : * by a protocol slowtimo counter.
79 : */
80 : #define RTM_RTTUNIT 1000000 /* units for rtt, rttvar, as units per sec */
81 : #define RTTTOPRHZ(r) ((r) / (RTM_RTTUNIT / PR_SLOWHZ))
82 :
83 : #include <sys/queue.h>
84 : #include <net/rtable.h>
85 :
86 : /*
87 : * We distinguish between routes to hosts and routes to networks,
88 : * preferring the former if available. For each route we infer
89 : * the interface to use from the gateway address supplied when
90 : * the route was entered. Routes that forward packets through
91 : * gateways are marked so that the output routines know to address the
92 : * gateway rather than the ultimate destination.
93 : */
94 :
95 : struct rtentry {
96 : #if !defined(_KERNEL) && !defined(ART)
97 : struct radix_node rt_nodes[2]; /* tree glue, and other values */
98 : #else
99 : struct sockaddr *rt_dest; /* destination */
100 : SRPL_ENTRY(rtentry) rt_next; /* Next multipath entry to our dst. */
101 : #endif
102 : struct sockaddr *rt_gateway; /* value */
103 : struct ifaddr *rt_ifa; /* the answer: interface addr to use */
104 : caddr_t rt_llinfo; /* pointer to link level info cache or
105 : to an MPLS structure */
106 : union {
107 : struct rtentry *_nh; /* implied entry for gatewayed routes */
108 : unsigned int _ref; /* # gatewayed caching this route */
109 : } RT_gw;
110 : #define rt_gwroute RT_gw._nh
111 : #define rt_cachecnt RT_gw._ref
112 : struct rtentry *rt_parent; /* If cloned, parent of this route. */
113 : LIST_HEAD(, rttimer) rt_timer; /* queue of timeouts for misc funcs */
114 : struct rt_kmetrics rt_rmx; /* metrics used by rx'ing protocols */
115 : unsigned int rt_ifidx; /* the answer: interface to use */
116 : unsigned int rt_flags; /* up/down?, host/net */
117 : int rt_refcnt; /* # held references */
118 : #if defined(_KERNEL) || defined(ART)
119 : int rt_plen; /* prefix length */
120 : #endif
121 : uint16_t rt_labelid; /* route label ID */
122 : uint8_t rt_priority; /* routing priority to use */
123 : };
124 : #define rt_use rt_rmx.rmx_pksent
125 : #define rt_expire rt_rmx.rmx_expire
126 : #define rt_locks rt_rmx.rmx_locks
127 : #define rt_mtu rt_rmx.rmx_mtu
128 :
129 : /* bitmask values for rtm_flags */
130 : #define RTF_UP 0x1 /* route usable */
131 : #define RTF_GATEWAY 0x2 /* destination is a gateway */
132 : #define RTF_HOST 0x4 /* host entry (net otherwise) */
133 : #define RTF_REJECT 0x8 /* host or net unreachable */
134 : #define RTF_DYNAMIC 0x10 /* created dynamically (by redirect) */
135 : #define RTF_MODIFIED 0x20 /* modified dynamically (by redirect) */
136 : #define RTF_DONE 0x40 /* message confirmed */
137 : #define RTF_CLONING 0x100 /* generate new routes on use */
138 : #define RTF_MULTICAST 0x200 /* route associated to a mcast addr. */
139 : #define RTF_LLINFO 0x400 /* generated by ARP or ND */
140 : #define RTF_STATIC 0x800 /* manually added */
141 : #define RTF_BLACKHOLE 0x1000 /* just discard pkts (during updates) */
142 : #define RTF_PROTO3 0x2000 /* protocol specific routing flag */
143 : #define RTF_PROTO2 0x4000 /* protocol specific routing flag */
144 : #define RTF_ANNOUNCE RTF_PROTO2 /* announce L2 entry */
145 : #define RTF_PROTO1 0x8000 /* protocol specific routing flag */
146 : #define RTF_CLONED 0x10000 /* this is a cloned route */
147 : #define RTF_CACHED 0x20000 /* cached by a RTF_GATEWAY entry */
148 : #define RTF_MPATH 0x40000 /* multipath route or operation */
149 : #define RTF_MPLS 0x100000 /* MPLS additional infos */
150 : #define RTF_LOCAL 0x200000 /* route to a local address */
151 : #define RTF_BROADCAST 0x400000 /* route associated to a bcast addr. */
152 : #define RTF_CONNECTED 0x800000 /* interface route */
153 : #define RTF_BFD 0x1000000 /* Link state controlled by BFD */
154 :
155 : /* mask of RTF flags that are allowed to be modified by RTM_CHANGE */
156 : #define RTF_FMASK \
157 : (RTF_LLINFO | RTF_PROTO1 | RTF_PROTO2 | RTF_PROTO3 | RTF_BLACKHOLE | \
158 : RTF_REJECT | RTF_STATIC | RTF_MPLS | RTF_BFD)
159 :
160 : /* Routing priorities used by the different routing protocols */
161 : #define RTP_NONE 0 /* unset priority use sane default */
162 : #define RTP_LOCAL 1 /* local address routes (must be the highest) */
163 : #define RTP_CONNECTED 4 /* directly connected routes */
164 : #define RTP_STATIC 8 /* static routes base priority */
165 : #define RTP_EIGRP 28 /* EIGRP routes */
166 : #define RTP_OSPF 32 /* OSPF routes */
167 : #define RTP_ISIS 36 /* IS-IS routes */
168 : #define RTP_RIP 40 /* RIP routes */
169 : #define RTP_BGP 48 /* BGP routes */
170 : #define RTP_DEFAULT 56 /* routes that have nothing set */
171 : #define RTP_PROPOSAL_STATIC 57
172 : #define RTP_PROPOSAL_DHCLIENT 58
173 : #define RTP_PROPOSAL_SLAAC 59
174 : #define RTP_MAX 63 /* maximum priority */
175 : #define RTP_ANY 64 /* any of the above */
176 : #define RTP_MASK 0x7f
177 : #define RTP_DOWN 0x80 /* route/link is down */
178 :
179 : /*
180 : * Routing statistics.
181 : */
182 : struct rtstat {
183 : u_int32_t rts_badredirect; /* bogus redirect calls */
184 : u_int32_t rts_dynamic; /* routes created by redirects */
185 : u_int32_t rts_newgateway; /* routes modified by redirects */
186 : u_int32_t rts_unreach; /* lookups which failed */
187 : u_int32_t rts_wildcard; /* lookups satisfied by a wildcard */
188 : };
189 :
190 : /*
191 : * Routing Table Info.
192 : */
193 : struct rt_tableinfo {
194 : u_short rti_tableid; /* routing table id */
195 : u_short rti_domainid; /* routing domain id */
196 : };
197 :
198 : /*
199 : * Structures for routing messages.
200 : */
201 : struct rt_msghdr {
202 : u_short rtm_msglen; /* to skip over non-understood messages */
203 : u_char rtm_version; /* future binary compatibility */
204 : u_char rtm_type; /* message type */
205 : u_short rtm_hdrlen; /* sizeof(rt_msghdr) to skip over the header */
206 : u_short rtm_index; /* index for associated ifp */
207 : u_short rtm_tableid; /* routing table id */
208 : u_char rtm_priority; /* routing priority */
209 : u_char rtm_mpls; /* MPLS additional infos */
210 : int rtm_addrs; /* bitmask identifying sockaddrs in msg */
211 : int rtm_flags; /* flags, incl. kern & message, e.g. DONE */
212 : int rtm_fmask; /* bitmask used in RTM_CHANGE message */
213 : pid_t rtm_pid; /* identify sender */
214 : int rtm_seq; /* for sender to identify action */
215 : int rtm_errno; /* why failed */
216 : u_int rtm_inits; /* which metrics we are initializing */
217 : struct rt_metrics rtm_rmx; /* metrics themselves */
218 : };
219 : /* overload no longer used field */
220 : #define rtm_use rtm_rmx.rmx_pksent
221 :
222 : #define RTM_VERSION 5 /* Up the ante and ignore older versions */
223 :
224 : #define RTM_MAXSIZE 2048 /* Maximum size of an accepted route msg */
225 :
226 : /* values for rtm_type */
227 : #define RTM_ADD 0x1 /* Add Route */
228 : #define RTM_DELETE 0x2 /* Delete Route */
229 : #define RTM_CHANGE 0x3 /* Change Metrics or flags */
230 : #define RTM_GET 0x4 /* Report Metrics */
231 : #define RTM_LOSING 0x5 /* Kernel Suspects Partitioning */
232 : #define RTM_REDIRECT 0x6 /* Told to use different route */
233 : #define RTM_MISS 0x7 /* Lookup failed on this address */
234 : #define RTM_RESOLVE 0xb /* req to resolve dst to LL addr */
235 : #define RTM_NEWADDR 0xc /* address being added to iface */
236 : #define RTM_DELADDR 0xd /* address being removed from iface */
237 : #define RTM_IFINFO 0xe /* iface going up/down etc. */
238 : #define RTM_IFANNOUNCE 0xf /* iface arrival/departure */
239 : #define RTM_DESYNC 0x10 /* route socket buffer overflow */
240 : #define RTM_INVALIDATE 0x11 /* Invalidate cache of L2 route */
241 : #define RTM_BFD 0x12 /* bidirectional forwarding detection */
242 : #define RTM_PROPOSAL 0x13 /* proposal for netconfigd */
243 : #define RTM_CHGADDRATTR 0x14 /* address attribute change */
244 :
245 : #define RTV_MTU 0x1 /* init or lock _mtu */
246 : #define RTV_HOPCOUNT 0x2 /* init or lock _hopcount */
247 : #define RTV_EXPIRE 0x4 /* init or lock _expire */
248 : #define RTV_RPIPE 0x8 /* init or lock _recvpipe */
249 : #define RTV_SPIPE 0x10 /* init or lock _sendpipe */
250 : #define RTV_SSTHRESH 0x20 /* init or lock _ssthresh */
251 : #define RTV_RTT 0x40 /* init or lock _rtt */
252 : #define RTV_RTTVAR 0x80 /* init or lock _rttvar */
253 :
254 : /*
255 : * Bitmask values for rtm_addrs.
256 : */
257 : #define RTA_DST 0x1 /* destination sockaddr present */
258 : #define RTA_GATEWAY 0x2 /* gateway sockaddr present */
259 : #define RTA_NETMASK 0x4 /* netmask sockaddr present */
260 : #define RTA_GENMASK 0x8 /* cloning mask sockaddr present */
261 : #define RTA_IFP 0x10 /* interface name sockaddr present */
262 : #define RTA_IFA 0x20 /* interface addr sockaddr present */
263 : #define RTA_AUTHOR 0x40 /* sockaddr for author of redirect */
264 : #define RTA_BRD 0x80 /* for NEWADDR, broadcast or p-p dest addr */
265 : #define RTA_SRC 0x100 /* source sockaddr present */
266 : #define RTA_SRCMASK 0x200 /* source netmask present */
267 : #define RTA_LABEL 0x400 /* route label present */
268 : #define RTA_BFD 0x800 /* bfd present */
269 : #define RTA_DNS 0x1000 /* DNS Servers sockaddr present */
270 : #define RTA_STATIC 0x2000 /* RFC 3442 encoded static routes present */
271 : #define RTA_SEARCH 0x4000 /* RFC 3397 encoded search path present */
272 :
273 : /*
274 : * Index offsets for sockaddr array for alternate internal encoding.
275 : */
276 : #define RTAX_DST 0 /* destination sockaddr present */
277 : #define RTAX_GATEWAY 1 /* gateway sockaddr present */
278 : #define RTAX_NETMASK 2 /* netmask sockaddr present */
279 : #define RTAX_GENMASK 3 /* cloning mask sockaddr present */
280 : #define RTAX_IFP 4 /* interface name sockaddr present */
281 : #define RTAX_IFA 5 /* interface addr sockaddr present */
282 : #define RTAX_AUTHOR 6 /* sockaddr for author of redirect */
283 : #define RTAX_BRD 7 /* for NEWADDR, broadcast or p-p dest addr */
284 : #define RTAX_SRC 8 /* source sockaddr present */
285 : #define RTAX_SRCMASK 9 /* source netmask present */
286 : #define RTAX_LABEL 10 /* route label present */
287 : #define RTAX_BFD 11 /* bfd present */
288 : #define RTAX_DNS 12 /* DNS Server(s) sockaddr present */
289 : #define RTAX_STATIC 13 /* RFC 3442 encoded static routes present */
290 : #define RTAX_SEARCH 14 /* RFC 3397 encoded search path present */
291 : #define RTAX_MAX 15 /* size of array to allocate */
292 :
293 : /*
294 : * setsockopt defines used for the filtering.
295 : */
296 : #define ROUTE_MSGFILTER 1 /* bitmask to specifiy which types should be
297 : sent to the client. */
298 : #define ROUTE_TABLEFILTER 2 /* change routing table the socket is listening
299 : on, RTABLE_ANY listens on all tables. */
300 : #define ROUTE_PRIOFILTER 3 /* only pass updates with a priority higher or
301 : equal (actual value lower) to the specified
302 : priority. */
303 :
304 : #define ROUTE_FILTER(m) (1 << (m))
305 : #define RTABLE_ANY 0xffffffff
306 :
307 : #define RTLABEL_LEN 32
308 :
309 : struct sockaddr_rtlabel {
310 : u_int8_t sr_len; /* total length */
311 : sa_family_t sr_family; /* address family */
312 : char sr_label[RTLABEL_LEN];
313 : };
314 :
315 : #define RTDNS_LEN 128
316 :
317 : struct sockaddr_rtdns {
318 : u_int8_t sr_len; /* total length */
319 : sa_family_t sr_family; /* address family */
320 : char sr_dns[RTDNS_LEN];
321 : };
322 :
323 : #define RTSTATIC_LEN 128
324 :
325 : struct sockaddr_rtstatic {
326 : u_int8_t sr_len; /* total length */
327 : sa_family_t sr_family; /* address family */
328 : char sr_static[RTSTATIC_LEN];
329 : };
330 :
331 : #define RTSEARCH_LEN 128
332 :
333 : struct sockaddr_rtsearch {
334 : u_int8_t sr_len; /* total length */
335 : sa_family_t sr_family; /* address family */
336 : char sr_search[RTSEARCH_LEN];
337 : };
338 :
339 : /*
340 : * A route consists of a destination address and a reference
341 : * to a routing entry. These are often held by protocols
342 : * in their control blocks, e.g. inpcb.
343 : */
344 : struct route {
345 : struct rtentry *ro_rt;
346 : u_long ro_tableid; /* u_long because of alignment */
347 : struct sockaddr ro_dst;
348 : };
349 :
350 : struct rt_addrinfo {
351 : int rti_addrs;
352 : struct sockaddr *rti_info[RTAX_MAX];
353 : int rti_flags;
354 : struct ifaddr *rti_ifa;
355 : struct rt_msghdr *rti_rtm;
356 : u_char rti_mpls;
357 : };
358 :
359 : #ifdef _KERNEL
360 :
361 : #include <sys/percpu.h>
362 :
363 : enum rtstat_counters {
364 : rts_badredirect, /* bogus redirect calls */
365 : rts_dynamic, /* routes created by redirects */
366 : rts_newgateway, /* routes modified by redirects */
367 : rts_unreach, /* lookups which failed */
368 : rts_wildcard, /* lookups satisfied by a wildcard */
369 :
370 : rts_ncounters
371 : };
372 :
373 : static inline void
374 0 : rtstat_inc(enum rtstat_counters c)
375 : {
376 : extern struct cpumem *rtcounters;
377 :
378 0 : counters_inc(rtcounters, c);
379 0 : }
380 :
381 : /*
382 : * This structure, and the prototypes for the rt_timer_{init,remove_all,
383 : * add,timer} functions all used with the kind permission of BSDI.
384 : * These allow functions to be called for routes at specific times.
385 : */
386 : struct rttimer {
387 : TAILQ_ENTRY(rttimer) rtt_next; /* entry on timer queue */
388 : LIST_ENTRY(rttimer) rtt_link; /* multiple timers per rtentry */
389 : struct rttimer_queue *rtt_queue;/* back pointer to queue */
390 : struct rtentry *rtt_rt; /* Back pointer to the route */
391 : void (*rtt_func)(struct rtentry *,
392 : struct rttimer *);
393 : time_t rtt_time; /* When this timer was registered */
394 : u_int rtt_tableid; /* routing table id of rtt_rt */
395 : };
396 :
397 : struct rttimer_queue {
398 : long rtq_timeout;
399 : unsigned long rtq_count;
400 : TAILQ_HEAD(, rttimer) rtq_head;
401 : LIST_ENTRY(rttimer_queue) rtq_link;
402 : };
403 :
404 : const char *rtlabel_id2name(u_int16_t);
405 : u_int16_t rtlabel_name2id(char *);
406 : struct sockaddr *rtlabel_id2sa(u_int16_t, struct sockaddr_rtlabel *);
407 : void rtlabel_unref(u_int16_t);
408 :
409 : /*
410 : * Values for additional argument to rtalloc()
411 : */
412 : #define RT_RESOLVE 1
413 :
414 : extern struct rtstat rtstat;
415 :
416 : struct mbuf;
417 : struct socket;
418 : struct ifnet;
419 : struct sockaddr_in6;
420 : struct bfd_config;
421 :
422 : void route_init(void);
423 : void rtm_ifchg(struct ifnet *);
424 : void rtm_ifannounce(struct ifnet *, int);
425 : void rtm_bfd(struct bfd_config *);
426 : void rt_maskedcopy(struct sockaddr *,
427 : struct sockaddr *, struct sockaddr *);
428 : struct sockaddr *rt_plen2mask(struct rtentry *, struct sockaddr_in6 *);
429 : void rtm_send(struct rtentry *, int, int, unsigned int);
430 : void rtm_addr(int, struct ifaddr *);
431 : void rtm_miss(int, struct rt_addrinfo *, int, uint8_t, u_int, int, u_int);
432 : int rt_setgate(struct rtentry *, struct sockaddr *, u_int);
433 : struct rtentry *rt_getll(struct rtentry *);
434 :
435 : int rt_timer_add(struct rtentry *,
436 : void(*)(struct rtentry *, struct rttimer *),
437 : struct rttimer_queue *, u_int);
438 : void rt_timer_remove_all(struct rtentry *);
439 : struct rttimer_queue *rt_timer_queue_create(u_int);
440 : void rt_timer_queue_change(struct rttimer_queue *, long);
441 : void rt_timer_queue_destroy(struct rttimer_queue *);
442 : unsigned long rt_timer_queue_count(struct rttimer_queue *);
443 : void rt_timer_timer(void *);
444 :
445 : int rt_mpls_set(struct rtentry *, struct sockaddr *, uint8_t);
446 : void rt_mpls_clear(struct rtentry *);
447 :
448 : int rtisvalid(struct rtentry *);
449 : int rt_hash(struct rtentry *, struct sockaddr *, uint32_t *);
450 : struct rtentry *rtalloc_mpath(struct sockaddr *, uint32_t *, u_int);
451 : struct rtentry *rtalloc(struct sockaddr *, int, unsigned int);
452 : void rtref(struct rtentry *);
453 : void rtfree(struct rtentry *);
454 :
455 : int rt_ifa_add(struct ifaddr *, int, struct sockaddr *);
456 : int rt_ifa_del(struct ifaddr *, int, struct sockaddr *);
457 : void rt_ifa_purge(struct ifaddr *);
458 : int rt_ifa_addlocal(struct ifaddr *);
459 : int rt_ifa_dellocal(struct ifaddr *);
460 : void rtredirect(struct sockaddr *, struct sockaddr *, struct sockaddr *, struct rtentry **, unsigned int);
461 : int rtrequest(int, struct rt_addrinfo *, u_int8_t, struct rtentry **,
462 : u_int);
463 : int rtrequest_delete(struct rt_addrinfo *, u_int8_t, struct ifnet *,
464 : struct rtentry **, u_int);
465 : void rt_if_track(struct ifnet *);
466 : int rt_if_linkstate_change(struct rtentry *, void *, u_int);
467 : int rtdeletemsg(struct rtentry *, struct ifnet *, u_int);
468 : #endif /* _KERNEL */
469 :
470 : #endif /* _NET_ROUTE_H_ */
|