c30358f096e8e3206d6815f6ae809e875cd50e18
[dragonfly.git] / sys / net / route.h
1 /*
2  * Copyright (c) 2004, 2005 The DragonFly Project.  All rights reserved.
3  *
4  * This code is derived from software contributed to The DragonFly Project
5  * by Jeffrey M. Hsu.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  * 3. Neither the name of The DragonFly Project nor the names of its
16  *    contributors may be used to endorse or promote products derived
17  *    from this software without specific, prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
22  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
23  * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
24  * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
25  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
26  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
27  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
28  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
29  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30  * SUCH DAMAGE.
31  */
32
33 /*
34  * Copyright (c) 2004, 2005 Jeffrey M. Hsu.  All rights reserved.
35  *
36  * License terms: all terms for the DragonFly license above plus the following:
37  *
38  * 4. All advertising materials mentioning features or use of this software
39  *    must display the following acknowledgement:
40  *
41  *      This product includes software developed by Jeffrey M. Hsu
42  *      for the DragonFly Project.
43  *
44  *    This requirement may be waived with permission from Jeffrey Hsu.
45  *    Permission will be granted to any DragonFly user for free.
46  *    This requirement will sunset and may be removed on Jan 31, 2006,
47  *    after which the standard DragonFly license (as shown above) will
48  *    apply.
49  */
50
51 /*
52  * Copyright (c) 1980, 1986, 1993
53  *      The Regents of the University of California.  All rights reserved.
54  *
55  * Redistribution and use in source and binary forms, with or without
56  * modification, are permitted provided that the following conditions
57  * are met:
58  * 1. Redistributions of source code must retain the above copyright
59  *    notice, this list of conditions and the following disclaimer.
60  * 2. Redistributions in binary form must reproduce the above copyright
61  *    notice, this list of conditions and the following disclaimer in the
62  *    documentation and/or other materials provided with the distribution.
63  * 3. All advertising materials mentioning features or use of this software
64  *    must display the following acknowledgement:
65  *      This product includes software developed by the University of
66  *      California, Berkeley and its contributors.
67  * 4. Neither the name of the University nor the names of its contributors
68  *    may be used to endorse or promote products derived from this software
69  *    without specific prior written permission.
70  *
71  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
72  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
73  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
74  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
75  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
76  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
77  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
78  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
79  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
80  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
81  * SUCH DAMAGE.
82  *
83  *      @(#)route.h     8.4 (Berkeley) 1/9/95
84  * $FreeBSD: src/sys/net/route.h,v 1.36.2.5 2002/02/01 11:48:01 ru Exp $
85  * $DragonFly: src/sys/net/route.h,v 1.19 2006/05/20 02:42:08 dillon Exp $
86  */
87
88 #ifndef _NET_ROUTE_H_
89 #define _NET_ROUTE_H_
90
91 #ifndef _SYS_TYPES_H_
92 #include <sys/types.h>
93 #endif
94 #ifndef _SYS_PARAM_H_
95 #include <sys/param.h>
96 #endif
97 #ifndef _SYS_SOCKET_H_
98 #include <sys/socket.h>
99 #endif
100
101
102 /*
103  * Kernel resident routing tables.
104  *
105  * The routing tables are initialized when interface addresses
106  * are set by making entries for all directly connected interfaces.
107  */
108
109 /*
110  * A route consists of a destination address and a reference
111  * to a routing entry.  These are often held by protocols
112  * in their control blocks, e.g. inpcb.
113  */
114 struct route {
115         struct  rtentry *ro_rt;
116         struct  sockaddr ro_dst;
117 };
118
119 /*
120  * These numbers are used by reliable protocols for determining
121  * retransmission behavior and are included in the routing structure.
122  */
123 struct rt_metrics {     /* grouped for locality of reference */
124         u_long  rmx_locks;      /* Kernel must leave these values alone */
125         u_long  rmx_mtu;        /* MTU for this path */
126         u_long  rmx_pksent;     /* packets sent using this route */
127         u_long  rmx_expire;     /* lifetime for route */
128
129         u_long  rmx_sendpipe;   /* outbound delay-bandwidth product */
130         u_long  rmx_ssthresh;   /* outbound gateway buffer limit */
131         u_long  rmx_rtt;        /* estimated round trip time */
132         u_long  rmx_rttvar;     /* estimated rtt variance */
133
134         u_long  rmx_recvpipe;   /* inbound delay-bandwidth product */
135         u_long  rmx_hopcount;   /* max hops expected */
136         u_long  rmx_filler[4];  /* will be used for T/TCP later */
137 };
138
139 /*
140  * rmx_rtt and rmx_rttvar are stored as microseconds;
141  * RTTTOPRHZ(rtt) converts to a value suitable for use
142  * by a protocol slowtimo counter.
143  */
144 #define RTM_RTTUNIT     1000000 /* units for rtt, rttvar, as units per sec */
145 #define RTTTOPRHZ(r)    ((r) / (RTM_RTTUNIT / PR_SLOWHZ))
146
147 /*
148  * XXX kernel function pointer `rt_output' is visible to applications.
149  */
150 struct mbuf;
151
152 /*
153  * We distinguish between routes to hosts and routes to networks,
154  * preferring the former if available.  For each route we infer
155  * the interface to use from the gateway address supplied when
156  * the route was entered.  Routes that forward packets through
157  * gateways are marked so that the output routines know to address the
158  * gateway rather than the ultimate destination.
159  */
160 #ifndef RNF_NORMAL
161 #include <net/radix.h>
162 #endif
163
164 struct rtentry {
165         struct  radix_node rt_nodes[2]; /* tree glue, and other values */
166 #define rt_key(r)       ((struct sockaddr *)((r)->rt_nodes->rn_key))
167 #define rt_mask(r)      ((struct sockaddr *)((r)->rt_nodes->rn_mask))
168         struct  sockaddr *rt_gateway;   /* value */
169         long    rt_refcnt;              /* # held references */
170         u_long  rt_flags;               /* up/down?, host/net */
171         struct  ifnet *rt_ifp;          /* the answer: interface to use */
172         struct  ifaddr *rt_ifa;         /* the answer: interface to use */
173         struct  sockaddr *rt_genmask;   /* for generation of cloned routes */
174         void    *rt_llinfo;             /* pointer to link level info cache */
175         struct  rt_metrics rt_rmx;      /* metrics used by rx'ing protocols */
176         struct  rtentry *rt_gwroute;    /* implied entry for gatewayed routes */
177         int     (*rt_output) (struct ifnet *, struct mbuf *, struct sockaddr *,
178                               struct rtentry *);
179                                         /* output routine for this (rt,if) */
180         struct  rtentry *rt_parent;     /* cloning parent of this route */
181         void    *rt_filler2;            /* more filler */
182 };
183
184 /*
185  * Following structure necessary for 4.3 compatibility;
186  * We should eventually move it to a compat file.
187  */
188 struct ortentry {
189         u_long  rt_hash;                /* to speed lookups */
190         struct  sockaddr rt_dst;        /* key */
191         struct  sockaddr rt_gateway;    /* value */
192         short   rt_flags;               /* up/down?, host/net */
193         short   rt_refcnt;              /* # held references */
194         u_long  rt_use;                 /* raw # packets forwarded */
195         struct  ifnet *rt_ifp;          /* the answer: interface to use */
196 };
197
198 #define rt_use rt_rmx.rmx_pksent
199
200 #define RTF_UP          0x1             /* route usable */
201 #define RTF_GATEWAY     0x2             /* destination is a gateway */
202 #define RTF_HOST        0x4             /* host entry (net otherwise) */
203 #define RTF_REJECT      0x8             /* host or net unreachable */
204 #define RTF_DYNAMIC     0x10            /* created dynamically (by redirect) */
205 #define RTF_MODIFIED    0x20            /* modified dynamically (by redirect) */
206 #define RTF_DONE        0x40            /* message confirmed */
207 /*                      0x80               unused, was RTF_DELCLONE */
208 #define RTF_CLONING     0x100           /* generate new routes on use */
209 #define RTF_XRESOLVE    0x200           /* external daemon resolves name */
210 #define RTF_LLINFO      0x400           /* generated by link layer (e.g. ARP) */
211 #define RTF_STATIC      0x800           /* manually added */
212 #define RTF_BLACKHOLE   0x1000          /* just discard pkts (during updates) */
213 #define RTF_PROTO2      0x4000          /* protocol specific routing flag */
214 #define RTF_PROTO1      0x8000          /* protocol specific routing flag */
215
216 #define RTF_PRCLONING   0x10000         /* protocol requires cloning */
217 #define RTF_WASCLONED   0x20000         /* route generated through cloning */
218 #define RTF_PROTO3      0x40000         /* protocol specific routing flag */
219 /*                      0x80000            unused */
220 #define RTF_PINNED      0x100000        /* future use */
221 #define RTF_LOCAL       0x200000        /* route represents a local address */
222 #define RTF_BROADCAST   0x400000        /* route represents a bcast address */
223 #define RTF_MULTICAST   0x800000        /* route represents a mcast address */
224                                         /* 0x1000000 and up unassigned */
225
226 /*
227  * Routing statistics.
228  */
229 struct  rtstatistics {
230         u_long  rts_badredirect;        /* bogus redirect calls */
231         u_long  rts_dynamic;            /* routes created by redirects */
232         u_long  rts_newgateway;         /* routes modified by redirects */
233         u_long  rts_unreach;            /* lookups which failed */
234         u_long  rts_wildcard;           /* lookups satisfied by a wildcard */
235 };
236 /*
237  * Structures for routing messages.
238  */
239 struct rt_msghdr {
240         u_short rtm_msglen;     /* to skip over non-understood messages */
241         u_char  rtm_version;    /* future binary compatibility */
242         u_char  rtm_type;       /* message type */
243         u_short rtm_index;      /* index for associated ifp */
244         int     rtm_flags;      /* flags, incl. kern & message, e.g. DONE */
245         int     rtm_addrs;      /* bitmask identifying sockaddrs in msg */
246         pid_t   rtm_pid;        /* identify sender */
247         int     rtm_seq;        /* for sender to identify action */
248         int     rtm_errno;      /* why failed */
249         int     rtm_use;        /* from rtentry */
250         u_long  rtm_inits;      /* which metrics we are initializing */
251         struct  rt_metrics rtm_rmx; /* metrics themselves */
252 };
253
254 #define RTM_VERSION     5       /* Up the ante and ignore older versions */
255
256 /*
257  * Message types.
258  */
259 #define RTM_ADD         0x1     /* Add Route */
260 #define RTM_DELETE      0x2     /* Delete Route */
261 #define RTM_CHANGE      0x3     /* Change Metrics or flags */
262 #define RTM_GET         0x4     /* Report Metrics */
263 #define RTM_LOSING      0x5     /* Kernel Suspects Partitioning */
264 #define RTM_REDIRECT    0x6     /* Told to use different route */
265 #define RTM_MISS        0x7     /* Lookup failed on this address */
266 #define RTM_LOCK        0x8     /* fix specified metrics */
267 #define RTM_OLDADD      0x9     /* caused by SIOCADDRT */
268 #define RTM_OLDDEL      0xa     /* caused by SIOCDELRT */
269 #define RTM_RESOLVE     0xb     /* req to resolve dst to LL addr */
270 #define RTM_NEWADDR     0xc     /* address being added to iface */
271 #define RTM_DELADDR     0xd     /* address being removed from iface */
272 #define RTM_IFINFO      0xe     /* iface going up/down etc. */
273 #define RTM_NEWMADDR    0xf     /* mcast group membership being added to if */
274 #define RTM_DELMADDR    0x10    /* mcast group membership being deleted */
275 #define RTM_IFANNOUNCE  0x11    /* iface arrival/departure */
276 #define RTM_IEEE80211   0x12    /* IEEE80211 wireless event */
277
278 /*
279  * Bitmask values for rtm_inits and rmx_locks.
280  */
281 #define RTV_MTU         0x1     /* init or lock _mtu */
282 #define RTV_HOPCOUNT    0x2     /* init or lock _hopcount */
283 #define RTV_EXPIRE      0x4     /* init or lock _expire */
284 #define RTV_RPIPE       0x8     /* init or lock _recvpipe */
285 #define RTV_SPIPE       0x10    /* init or lock _sendpipe */
286 #define RTV_SSTHRESH    0x20    /* init or lock _ssthresh */
287 #define RTV_RTT         0x40    /* init or lock _rtt */
288 #define RTV_RTTVAR      0x80    /* init or lock _rttvar */
289
290 /*
291  * Bitmask values for rtm_addrs.
292  */
293 #define RTA_DST         0x1     /* destination sockaddr present */
294 #define RTA_GATEWAY     0x2     /* gateway sockaddr present */
295 #define RTA_NETMASK     0x4     /* netmask sockaddr present */
296 #define RTA_GENMASK     0x8     /* cloning mask sockaddr present */
297 #define RTA_IFP         0x10    /* interface name sockaddr present */
298 #define RTA_IFA         0x20    /* interface addr sockaddr present */
299 #define RTA_AUTHOR      0x40    /* sockaddr for author of redirect */
300 #define RTA_BRD         0x80    /* for NEWADDR, broadcast or p-p dest addr */
301
302 /*
303  * Index offsets for sockaddr array for alternate internal encoding.
304  */
305 #define RTAX_DST        0       /* destination sockaddr present */
306 #define RTAX_GATEWAY    1       /* gateway sockaddr present */
307 #define RTAX_NETMASK    2       /* netmask sockaddr present */
308 #define RTAX_GENMASK    3       /* cloning mask sockaddr present */
309 #define RTAX_IFP        4       /* interface name sockaddr present */
310 #define RTAX_IFA        5       /* interface addr sockaddr present */
311 #define RTAX_AUTHOR     6       /* sockaddr for author of redirect */
312 #define RTAX_BRD        7       /* for NEWADDR, broadcast or p-p dest addr */
313 #define RTAX_MAX        8       /* size of array to allocate */
314
315 struct rt_addrinfo {
316         int              rti_addrs;
317         struct sockaddr *rti_info[RTAX_MAX];
318         int              rti_flags;
319         struct ifaddr   *rti_ifa;
320         struct ifnet    *rti_ifp;
321 };
322
323 #ifdef _KERNEL
324
325 #define rti_dst         rti_info[RTAX_DST]
326 #define rti_gateway     rti_info[RTAX_GATEWAY]
327 #define rti_netmask     rti_info[RTAX_NETMASK]
328 #define rti_genmask     rti_info[RTAX_GENMASK]
329 #define rti_ifpaddr     rti_info[RTAX_IFP]
330 #define rti_ifaaddr     rti_info[RTAX_IFA]
331 #define rti_author      rti_info[RTAX_AUTHOR]
332 #define rti_bcastaddr   rti_info[RTAX_BRD]
333
334 extern struct radix_node_head *rt_tables[MAXCPU][AF_MAX+1];
335 extern struct lwkt_port *rt_ports[MAXCPU];
336
337 struct ifmultiaddr;
338 struct proc;
339 struct ucred;
340
341 void     route_init (void);
342 void     rt_dstmsg(int type, struct sockaddr *dst, int error);
343 int      rt_getifa (struct rt_addrinfo *);
344 void     rt_ieee80211msg(struct ifnet *, int, void *, size_t);
345 void     rt_ifannouncemsg (struct ifnet *, int);
346 void     rt_ifmsg (struct ifnet *);
347 int      rt_llroute (struct sockaddr *dst, struct rtentry *rt0,
348             struct rtentry **drt);
349 void     rt_missmsg (int, struct rt_addrinfo *, int, int);
350 void     rt_newaddrmsg (int, struct ifaddr *, int, struct rtentry *);
351 void     rt_newmaddrmsg (int, struct ifmultiaddr *);
352 void     rt_rtmsg(int cmd, struct rtentry *rt, struct ifnet *ifp, int error);
353 int      rt_setgate (struct rtentry *,
354             struct sockaddr *, struct sockaddr *);
355 void     rtalloc (struct route *);
356 void     rtalloc_ign (struct route *, u_long);
357
358 struct rtentry *
359          _rtlookup (struct sockaddr *, boolean_t, u_long);
360 #define         RTL_REPORTMSG   TRUE
361 #define         RTL_DONTREPORT  FALSE
362
363 /* flags to ignore */
364 #define         RTL_DOCLONE     0UL
365 #define         RTL_DONTCLONE   (RTF_CLONING | RTF_PRCLONING)
366
367 /*
368  * Look up a route with no cloning side-effects or miss reports generated.
369  */
370 static __inline struct rtentry *
371 rtpurelookup(struct sockaddr *dst)
372 {
373         return _rtlookup(dst, RTL_DONTREPORT, RTL_DONTCLONE);
374 }
375
376 /*
377  * Do full route lookup with cloning and reporting on misses.
378  */
379 static __inline struct rtentry *
380 rtlookup(struct sockaddr *dst)
381 {
382         return _rtlookup(dst, RTL_REPORTMSG, RTL_DOCLONE);
383 }
384
385 typedef void (*rtrequest1_callback_func_t)(int, int, struct rt_addrinfo *,
386                                       struct rtentry *, void *);
387
388 void     rtfree (struct rtentry *);
389 int      rtinit (struct ifaddr *, int, int);
390 int      rtioctl (u_long, caddr_t, struct ucred *);
391 void     rtredirect (struct sockaddr *, struct sockaddr *,
392             struct sockaddr *, int, struct sockaddr *);
393 int      rtrequest (int, struct sockaddr *,
394             struct sockaddr *, struct sockaddr *, int, struct rtentry **);
395 int      rtrequest_global (int, struct sockaddr *,
396             struct sockaddr *, struct sockaddr *, int);
397 int      rtrequest1 (int, struct rt_addrinfo *, struct rtentry **);
398 int      rtrequest1_global (int, struct rt_addrinfo *, rtrequest1_callback_func_t, void *);
399
400 void    rt_print(struct rt_addrinfo *, struct rtentry *);
401 void    rt_addrinfo_print(int cmd, struct rt_addrinfo *);
402 void    sockaddr_print(struct sockaddr *);
403
404 static __inline void
405 RTFREE(struct rtentry *rt)
406 {
407         if (rt->rt_refcnt <= 1)
408                 rtfree(rt);
409         else
410                 --rt->rt_refcnt;
411 }
412
413 static __inline
414 struct lwkt_port *
415 rtable_portfn(int cpu)
416 {  
417         return (rt_ports[cpu]);
418 }
419
420 int     in_inithead(void **, int);
421 #endif
422
423 #endif