1 /* $OpenBSD: route.h,v 1.46 2006/06/18 11:47:45 pascoe 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 #include <sys/queue.h>
39
40 /*
41 * Kernel resident routing tables.
42 *
43 * The routing tables are initialized when interface addresses
44 * are set by making entries for all directly connected interfaces.
45 */
46
47 /*
48 * A route consists of a destination address and a reference
49 * to a routing entry. These are often held by protocols
50 * in their control blocks, e.g. inpcb.
51 */
52 struct route {
53 struct rtentry *ro_rt;
54 struct sockaddr ro_dst;
55 };
56
57 /*
58 * These numbers are used by reliable protocols for determining
59 * retransmission behavior and are included in the routing structure.
60 */
61 struct rt_kmetrics {
62 u_long rmx_locks; /* Kernel must leave these values alone */
63 u_long rmx_mtu; /* MTU for this path */
64 u_long rmx_expire; /* lifetime for route, e.g. redirect */
65 u_long rmx_pksent; /* packets sent using this route */
66 };
67
68 /*
69 * Huge version for userland compatibility.
70 */
71 struct rt_metrics {
72 u_long rmx_locks; /* Kernel must leave these values alone */
73 u_long rmx_mtu; /* MTU for this path */
74 u_long rmx_hopcount; /* max hops expected */
75 u_long rmx_expire; /* lifetime for route, e.g. redirect */
76 u_long rmx_recvpipe; /* inbound delay-bandwidth product */
77 u_long rmx_sendpipe; /* outbound delay-bandwidth product */
78 u_long rmx_ssthresh; /* outbound gateway buffer limit (deprecated) */
79 u_long rmx_rtt; /* estimated round trip time (deprecated) */
80 u_long rmx_rttvar; /* estimated rtt variance (deprecated) */
81 u_long rmx_pksent; /* packets sent using this route */
82 };
83 /* XXX overloading some values that are no longer used. */
84 #define rmx_refcnt rmx_rttvar /* # held references only used by sysctl */
85 #define rmx_rt_tableid rmx_rtt /* routing table ID */
86
87 /*
88 * rmx_rtt and rmx_rttvar are stored as microseconds;
89 * RTTTOPRHZ(rtt) converts to a value suitable for use
90 * by a protocol slowtimo counter.
91 */
92 #define RTM_RTTUNIT 1000000 /* units for rtt, rttvar, as units per sec */
93 #define RTTTOPRHZ(r) ((r) / (RTM_RTTUNIT / PR_SLOWHZ))
94
95 /*
96 * We distinguish between routes to hosts and routes to networks,
97 * preferring the former if available. For each route we infer
98 * the interface to use from the gateway address supplied when
99 * the route was entered. Routes that forward packets through
100 * gateways are marked so that the output routines know to address the
101 * gateway rather than the ultimate destination.
102 */
103 #ifndef RNF_NORMAL
104 #include <net/radix.h>
105 #include <net/radix_mpath.h>
106 #endif
107 struct rtentry {
108 struct radix_node rt_nodes[2]; /* tree glue, and other values */
109 #define rt_key(r) ((struct sockaddr *)((r)->rt_nodes->rn_key))
110 #define rt_mask(r) ((struct sockaddr *)((r)->rt_nodes->rn_mask))
111 struct sockaddr *rt_gateway; /* value */
112 u_int rt_flags; /* up/down?, host/net */
113 int rt_refcnt; /* # held references */
114 struct ifnet *rt_ifp; /* the answer: interface to use */
115 struct ifaddr *rt_ifa; /* the answer: interface to use */
116 struct sockaddr *rt_genmask; /* for generation of cloned routes */
117 caddr_t rt_llinfo; /* pointer to link level info cache */
118 struct rt_kmetrics rt_rmx; /* metrics used by rx'ing protocols */
119 struct rtentry *rt_gwroute; /* implied entry for gatewayed routes */
120 struct rtentry *rt_parent; /* If cloned, parent of this route. */
121 LIST_HEAD(, rttimer) rt_timer; /* queue of timeouts for misc funcs */
122 u_int16_t rt_labelid; /* route label ID */
123 };
124 #define rt_use rt_rmx.rmx_pksent
125
126 #define RTF_UP 0x1 /* route usable */
127 #define RTF_GATEWAY 0x2 /* destination is a gateway */
128 #define RTF_HOST 0x4 /* host entry (net otherwise) */
129 #define RTF_REJECT 0x8 /* host or net unreachable */
130 #define RTF_DYNAMIC 0x10 /* created dynamically (by redirect) */
131 #define RTF_MODIFIED 0x20 /* modified dynamically (by redirect) */
132 #define RTF_DONE 0x40 /* message confirmed */
133 #define RTF_MASK 0x80 /* subnet mask present */
134 #define RTF_CLONING 0x100 /* generate new routes on use */
135 #define RTF_XRESOLVE 0x200 /* external daemon resolves name */
136 #define RTF_LLINFO 0x400 /* generated by ARP or ESIS */
137 #define RTF_STATIC 0x800 /* manually added */
138 #define RTF_BLACKHOLE 0x1000 /* just discard pkts (during updates) */
139 #define RTF_PROTO3 0x2000 /* protocol specific routing flag */
140 #define RTF_PROTO2 0x4000 /* protocol specific routing flag */
141 #define RTF_PROTO1 0x8000 /* protocol specific routing flag */
142 #define RTF_CLONED 0x10000 /* this is a cloned route */
143 #define RTF_SOURCE 0x20000 /* this route has a source selector */
144 #define RTF_MPATH 0x40000 /* multipath route or operation */
145 #define RTF_JUMBO 0x80000 /* try to use jumbo frames */
146
147 /* mask of RTF flags that are allowed to be modified by RTM_CHANGE */
148 #define RTF_FMASK \
149 (RTF_JUMBO | RTF_PROTO1 | RTF_PROTO2 | RTF_PROTO3 | RTF_BLACKHOLE | \
150 RTF_REJECT | RTF_STATIC)
151
152 #ifndef _KERNEL
153 /* obsoleted */
154 #define RTF_TUNNEL 0x100000 /* Tunnelling bit. */
155 #endif
156
157 /*
158 * Routing statistics.
159 */
160 struct rtstat {
161 u_int32_t rts_badredirect; /* bogus redirect calls */
162 u_int32_t rts_dynamic; /* routes created by redirects */
163 u_int32_t rts_newgateway; /* routes modified by redirects */
164 u_int32_t rts_unreach; /* lookups which failed */
165 u_int32_t rts_wildcard; /* lookups satisfied by a wildcard */
166 };
167
168 /*
169 * Structures for routing messages.
170 */
171 struct rt_msghdr {
172 u_short rtm_msglen; /* to skip over non-understood messages */
173 u_char rtm_version; /* future binary compatibility */
174 u_char rtm_type; /* message type */
175 u_short rtm_index; /* index for associated ifp */
176 int rtm_flags; /* flags, incl. kern & message, e.g. DONE */
177 int rtm_addrs; /* bitmask identifying sockaddrs in msg */
178 pid_t rtm_pid; /* identify sender */
179 int rtm_seq; /* for sender to identify action */
180 int rtm_errno; /* why failed */
181 int rtm_use; /* deprecated use rtm_rmx->rmx_pksent */
182 #define rtm_fmask rtm_use /* bitmask used in RTM_CHANGE message */
183 u_long rtm_inits; /* which metrics we are initializing */
184 struct rt_metrics rtm_rmx; /* metrics themselves */
185 };
186 /* overload no longer used field */
187 #define rtm_tableid rtm_rmx.rmx_rt_tableid
188
189 #define RTM_VERSION 3 /* Up the ante and ignore older versions */
190
191 #define RTM_ADD 0x1 /* Add Route */
192 #define RTM_DELETE 0x2 /* Delete Route */
193 #define RTM_CHANGE 0x3 /* Change Metrics or flags */
194 #define RTM_GET 0x4 /* Report Metrics */
195 #define RTM_LOSING 0x5 /* Kernel Suspects Partitioning */
196 #define RTM_REDIRECT 0x6 /* Told to use different route */
197 #define RTM_MISS 0x7 /* Lookup failed on this address */
198 #define RTM_LOCK 0x8 /* fix specified metrics */
199 #define RTM_RESOLVE 0xb /* req to resolve dst to LL addr */
200 #define RTM_NEWADDR 0xc /* address being added to iface */
201 #define RTM_DELADDR 0xd /* address being removed from iface */
202 #define RTM_IFINFO 0xe /* iface going up/down etc. */
203 #define RTM_IFANNOUNCE 0xf /* iface arrival/departure */
204
205 #define RTV_MTU 0x1 /* init or lock _mtu */
206 #define RTV_HOPCOUNT 0x2 /* init or lock _hopcount */
207 #define RTV_EXPIRE 0x4 /* init or lock _hopcount */
208 #define RTV_RPIPE 0x8 /* init or lock _recvpipe */
209 #define RTV_SPIPE 0x10 /* init or lock _sendpipe */
210 #define RTV_SSTHRESH 0x20 /* init or lock _ssthresh */
211 #define RTV_RTT 0x40 /* init or lock _rtt */
212 #define RTV_RTTVAR 0x80 /* init or lock _rttvar */
213
214 /*
215 * Bitmask values for rtm_addr.
216 */
217 #define RTA_DST 0x1 /* destination sockaddr present */
218 #define RTA_GATEWAY 0x2 /* gateway sockaddr present */
219 #define RTA_NETMASK 0x4 /* netmask sockaddr present */
220 #define RTA_GENMASK 0x8 /* cloning mask sockaddr present */
221 #define RTA_IFP 0x10 /* interface name sockaddr present */
222 #define RTA_IFA 0x20 /* interface addr sockaddr present */
223 #define RTA_AUTHOR 0x40 /* sockaddr for author of redirect */
224 #define RTA_BRD 0x80 /* for NEWADDR, broadcast or p-p dest addr */
225 #define RTA_SRC 0x100 /* source sockaddr present */
226 #define RTA_SRCMASK 0x200 /* source netmask present */
227 #define RTA_LABEL 0x400 /* route label present */
228
229 /*
230 * Index offsets for sockaddr array for alternate internal encoding.
231 */
232 #define RTAX_DST 0 /* destination sockaddr present */
233 #define RTAX_GATEWAY 1 /* gateway sockaddr present */
234 #define RTAX_NETMASK 2 /* netmask sockaddr present */
235 #define RTAX_GENMASK 3 /* cloning mask sockaddr present */
236 #define RTAX_IFP 4 /* interface name sockaddr present */
237 #define RTAX_IFA 5 /* interface addr sockaddr present */
238 #define RTAX_AUTHOR 6 /* sockaddr for author of redirect */
239 #define RTAX_BRD 7 /* for NEWADDR, broadcast or p-p dest addr */
240 #define RTAX_SRC 8 /* source sockaddr present */
241 #define RTAX_SRCMASK 9 /* source netmask present */
242 #define RTAX_LABEL 10 /* route label present */
243 #define RTAX_MAX 11 /* size of array to allocate */
244
245 struct rt_addrinfo {
246 int rti_addrs;
247 struct sockaddr *rti_info[RTAX_MAX];
248 int rti_flags;
249 struct ifaddr *rti_ifa;
250 struct ifnet *rti_ifp;
251 struct rt_msghdr *rti_rtm;
252 };
253
254 struct route_cb {
255 int ip_count;
256 int ip6_count;
257 int any_count;
258 };
259
260 /*
261 * This structure, and the prototypes for the rt_timer_{init,remove_all,
262 * add,timer} functions all used with the kind permission of BSDI.
263 * These allow functions to be called for routes at specific times.
264 */
265
266 struct rttimer {
267 TAILQ_ENTRY(rttimer) rtt_next; /* entry on timer queue */
268 LIST_ENTRY(rttimer) rtt_link; /* multiple timers per rtentry */
269 struct rttimer_queue *rtt_queue;/* back pointer to queue */
270 struct rtentry *rtt_rt; /* Back pointer to the route */
271 void (*rtt_func)(struct rtentry *,
272 struct rttimer *);
273 time_t rtt_time; /* When this timer was registered */
274 };
275
276 struct rttimer_queue {
277 long rtq_timeout;
278 unsigned long rtq_count;
279 TAILQ_HEAD(, rttimer) rtq_head;
280 LIST_ENTRY(rttimer_queue) rtq_link;
281 };
282
283 #define RTLABEL_LEN 32
284
285 struct sockaddr_rtlabel {
286 u_int8_t sr_len; /* total length */
287 sa_family_t sr_family; /* address family */
288 char sr_label[RTLABEL_LEN];
289 };
290
291 #define RT_TABLEID_MAX 255
292
293 #ifdef _KERNEL
294 const char *rtlabel_id2name(u_int16_t);
295 u_int16_t rtlabel_name2id(char *);
296 void rtlabel_unref(u_int16_t);
297
298 #define RTFREE(rt) do { \
299 if ((rt)->rt_refcnt <= 1) \
300 rtfree(rt); \
301 else \
302 (rt)->rt_refcnt--; \
303 } while (0)
304
305 /*
306 * Values for additional argument to rtalloc_noclone() and rtalloc2()
307 */
308 #define ALL_CLONING 0
309 #define ONNET_CLONING 1
310 #define NO_CLONING 2
311
312 extern struct route_cb route_cb;
313 extern struct rtstat rtstat;
314 extern const struct sockaddr_rtin rt_defmask4;
315
316 struct socket;
317 void route_init(void);
318 int rtable_add(u_int);
319 int rtable_exists(u_int);
320 int route_output(struct mbuf *, ...);
321 int route_usrreq(struct socket *, int, struct mbuf *,
322 struct mbuf *, struct mbuf *);
323 void rt_ifmsg(struct ifnet *);
324 void rt_ifannouncemsg(struct ifnet *, int);
325 void rt_maskedcopy(struct sockaddr *,
326 struct sockaddr *, struct sockaddr *);
327 void rt_missmsg(int, struct rt_addrinfo *, int, struct ifnet *, int,
328 u_int);
329 void rt_newaddrmsg(int, struct ifaddr *, int, struct rtentry *);
330 int rt_setgate(struct rtentry *, struct sockaddr *,
331 struct sockaddr *, u_int);
332 void rt_setmetrics(u_long, struct rt_metrics *, struct rt_kmetrics *);
333 void rt_getmetrics(struct rt_kmetrics *, struct rt_metrics *);
334 int rt_timer_add(struct rtentry *,
335 void(*)(struct rtentry *, struct rttimer *),
336 struct rttimer_queue *);
337 void rt_timer_init(void);
338 struct rttimer_queue *
339 rt_timer_queue_create(u_int);
340 void rt_timer_queue_change(struct rttimer_queue *, long);
341 void rt_timer_queue_destroy(struct rttimer_queue *, int);
342 void rt_timer_remove_all(struct rtentry *);
343 unsigned long rt_timer_count(struct rttimer_queue *);
344 void rt_timer_timer(void *);
345 void rtalloc(struct route *);
346 #ifdef SMALL_KERNEL
347 #define rtalloc_mpath(r, s, t) rtalloc(r)
348 #endif
349 struct rtentry *
350 rtalloc1(struct sockaddr *, int, u_int);
351 void rtalloc_noclone(struct route *, int);
352 struct rtentry *
353 rtalloc2(struct sockaddr *, int, int);
354 void rtfree(struct rtentry *);
355 int rt_getifa(struct rt_addrinfo *);
356 int rtinit(struct ifaddr *, int, int);
357 int rtioctl(u_long, caddr_t, struct proc *);
358 void rtredirect(struct sockaddr *, struct sockaddr *,
359 struct sockaddr *, int, struct sockaddr *,
360 struct rtentry **);
361 int rtrequest(int, struct sockaddr *,
362 struct sockaddr *, struct sockaddr *, int,
363 struct rtentry **, u_int);
364 int rtrequest1(int, struct rt_addrinfo *, struct rtentry **, u_int);
365 void rt_if_remove(struct ifnet *);
366
367 struct radix_node_head *rt_gettable(sa_family_t, u_int);
368 struct radix_node *rt_lookup(struct sockaddr *, struct sockaddr *, int);
369 #endif /* _KERNEL */
370 #endif /* _NET_ROUTE_H_ */