]> git.kernelconcepts.de Git - karo-tx-redboot.git/blob - packages/net/bsd_tcpip/v2_0/include/net/route.h
unified MX27, MX25, MX37 trees
[karo-tx-redboot.git] / packages / net / bsd_tcpip / v2_0 / include / net / route.h
1 //==========================================================================
2 //
3 //      include/net/route.h
4 //
5 //==========================================================================
6 //####BSDCOPYRIGHTBEGIN####
7 //
8 // -------------------------------------------
9 //
10 // Portions of this software may have been derived from OpenBSD, 
11 // FreeBSD or other sources, and are covered by the appropriate
12 // copyright disclaimers included herein.
13 //
14 // Portions created by Red Hat are
15 // Copyright (C) 2002 Red Hat, Inc. All Rights Reserved.
16 //
17 // -------------------------------------------
18 //
19 //####BSDCOPYRIGHTEND####
20 //==========================================================================
21
22 /*
23  * Copyright (c) 1980, 1986, 1993
24  *      The Regents of the University of California.  All rights reserved.
25  *
26  * Redistribution and use in source and binary forms, with or without
27  * modification, are permitted provided that the following conditions
28  * are met:
29  * 1. Redistributions of source code must retain the above copyright
30  *    notice, this list of conditions and the following disclaimer.
31  * 2. Redistributions in binary form must reproduce the above copyright
32  *    notice, this list of conditions and the following disclaimer in the
33  *    documentation and/or other materials provided with the distribution.
34  * 3. All advertising materials mentioning features or use of this software
35  *    must display the following acknowledgement:
36  *      This product includes software developed by the University of
37  *      California, Berkeley and its contributors.
38  * 4. Neither the name of the University nor the names of its contributors
39  *    may be used to endorse or promote products derived from this software
40  *    without specific prior written permission.
41  *
42  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
43  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
44  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
45  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
46  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
47  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
48  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
49  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
50  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
51  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
52  * SUCH DAMAGE.
53  *
54  *      @(#)route.h     8.3 (Berkeley) 4/19/94
55  * $FreeBSD: src/sys/net/route.h,v 1.36.2.1 2000/08/16 06:14:23 jayanth Exp $
56  */
57
58 #ifndef _NET_ROUTE_H_
59 #define _NET_ROUTE_H_
60
61 /*
62  * Kernel resident routing tables.
63  *
64  * The routing tables are initialized when interface addresses
65  * are set by making entries for all directly connected interfaces.
66  */
67
68 /*
69  * A route consists of a destination address and a reference
70  * to a routing entry.  These are often held by protocols
71  * in their control blocks, e.g. inpcb.
72  */
73 struct route {
74         struct  rtentry *ro_rt;
75         union {
76                 struct sockaddr_storage rou_dst_ss;
77                 struct sockaddr ro_dst_sa;
78         } ro_u;
79 };
80 #define ro_dst ro_u.ro_dst_sa
81
82 /*
83  * These numbers are used by reliable protocols for determining
84  * retransmission behavior and are included in the routing structure.
85  */
86 struct rt_metrics {
87         u_long  rmx_locks;      /* Kernel must leave these values alone */
88         u_long  rmx_mtu;        /* MTU for this path */
89         u_long  rmx_hopcount;   /* max hops expected */
90         u_long  rmx_expire;     /* lifetime for route, e.g. redirect */
91         u_long  rmx_recvpipe;   /* inbound delay-bandwidth product */
92         u_long  rmx_sendpipe;   /* outbound delay-bandwidth product */
93         u_long  rmx_ssthresh;   /* outbound gateway buffer limit */
94         u_long  rmx_rtt;        /* estimated round trip time */
95         u_long  rmx_rttvar;     /* estimated rtt variance */
96         u_long  rmx_pksent;     /* packets sent using this route */
97         u_long  rmx_filler[4];  /* will be used for T/TCP later */
98 };
99
100 /*
101  * rmx_rtt and rmx_rttvar are stored as microseconds;
102  * RTTTOPRHZ(rtt) converts to a value suitable for use
103  * by a protocol slowtimo counter.
104  */
105 #define RTM_RTTUNIT     1000000 /* units for rtt, rttvar, as units per sec */
106 #define RTTTOPRHZ(r)    ((r) / (RTM_RTTUNIT / PR_SLOWHZ))
107
108 /*
109  * XXX kernel function pointer `rt_output' is visible to applications.
110  */
111 struct mbuf;
112
113 /*
114  * We distinguish between routes to hosts and routes to networks,
115  * preferring the former if available.  For each route we infer
116  * the interface to use from the gateway address supplied when
117  * the route was entered.  Routes that forward packets through
118  * gateways are marked so that the output routines know to address the
119  * gateway rather than the ultimate destination.
120  */
121 #ifndef RNF_NORMAL
122 #include <net/radix.h>
123 #endif
124 struct rtentry {
125         struct  radix_node rt_nodes[2]; /* tree glue, and other values */
126 #define rt_key(r)       ((struct sockaddr *)((r)->rt_nodes->rn_key))
127 #define rt_mask(r)      ((struct sockaddr *)((r)->rt_nodes->rn_mask))
128         struct  sockaddr *rt_gateway;   /* value */
129         long    rt_refcnt;              /* # held references */
130         u_long  rt_flags;               /* up/down?, host/net */
131         struct  ifnet *rt_ifp;          /* the answer: interface to use */
132         struct  ifaddr *rt_ifa;         /* the answer: interface to use */
133         struct  sockaddr *rt_genmask;   /* for generation of cloned routes */
134         caddr_t rt_llinfo;              /* pointer to link level info cache */
135         struct  rt_metrics rt_rmx;      /* metrics used by rx'ing protocols */
136         struct  rtentry *rt_gwroute;    /* implied entry for gatewayed routes */
137         int     (*rt_output) __P((struct ifnet *, struct mbuf *,
138                                   struct sockaddr *, struct rtentry *));
139                                         /* output routine for this (rt,if) */
140         struct  rtentry *rt_parent;     /* cloning parent of this route */
141         void    *rt_filler2;            /* more filler */
142 };
143
144 /*
145  * Following structure necessary for 4.3 compatibility;
146  * We should eventually move it to a compat file.
147  */
148 struct ortentry {
149         u_long  rt_hash;                /* to speed lookups */
150         struct  sockaddr rt_dst;        /* key */
151         struct  sockaddr rt_gateway;    /* value */
152         short   rt_flags;               /* up/down?, host/net */
153         short   rt_refcnt;              /* # held references */
154         u_long  rt_use;                 /* raw # packets forwarded */
155         struct  ifnet *rt_ifp;          /* the answer: interface to use */
156 };
157
158 #define rt_use rt_rmx.rmx_pksent
159
160 /*
161  * This structure modelled after the Linux 'route' functions
162  * Used by the SIOCADDRT and SIOCDELRT calls
163  */
164 struct ecos_rtentry {
165     struct sockaddr rt_dst;             /* Target address.  */
166     struct sockaddr rt_gateway;         /* Gateway addr (RTF_GATEWAY).  */
167     struct sockaddr rt_genmask;         /* Target network mask (IP).  */
168     unsigned short int rt_flags;
169     unsigned char rt_tos;
170     unsigned char rt_class;
171     short int rt_metric;                /* +1 for binary compatibility!  */
172     char *rt_dev;                       /* Forcing the device at add.  */
173     unsigned long int rt_mtu;           /* Per route MTU/Window.  */
174     unsigned long int rt_window;        /* Window clamping.  */
175     unsigned short int rt_irtt;         /* Initial RTT.  */
176 };
177 /* Compatibility hack.  */
178 #define rt_mss  rt_mtu
179
180 #define RTF_UP          0x1             /* route usable */
181 #define RTF_GATEWAY     0x2             /* destination is a gateway */
182 #define RTF_HOST        0x4             /* host entry (net otherwise) */
183 #define RTF_REJECT      0x8             /* host or net unreachable */
184 #define RTF_DYNAMIC     0x10            /* created dynamically (by redirect) */
185 #define RTF_MODIFIED    0x20            /* modified dynamically (by redirect) */
186 #define RTF_DONE        0x40            /* message confirmed */
187 #define RTF_DELCLONE    0x80            /* delete cloned route */
188 #define RTF_CLONING     0x100           /* generate new routes on use */
189 #define RTF_XRESOLVE    0x200           /* external daemon resolves name */
190 #define RTF_LLINFO      0x400           /* generated by link layer (e.g. ARP) */
191 #define RTF_STATIC      0x800           /* manually added */
192 #define RTF_BLACKHOLE   0x1000          /* just discard pkts (during updates) */
193 #define RTF_PROTO2      0x4000          /* protocol specific routing flag */
194 #define RTF_PROTO1      0x8000          /* protocol specific routing flag */
195
196 #define RTF_PRCLONING   0x10000         /* protocol requires cloning */
197 #define RTF_WASCLONED   0x20000         /* route generated through cloning */
198 #define RTF_PROTO3      0x40000         /* protocol specific routing flag */
199 /*                      0x80000            unused */
200 #define RTF_PINNED      0x100000        /* future use */
201 #define RTF_LOCAL       0x200000        /* route represents a local address */
202 #define RTF_BROADCAST   0x400000        /* route represents a bcast address */
203 #define RTF_MULTICAST   0x800000        /* route represents a mcast address */
204                                         /* 0x1000000 and up unassigned */
205
206 /*
207  * Routing statistics.
208  */
209 struct  rtstat {
210         short   rts_badredirect;        /* bogus redirect calls */
211         short   rts_dynamic;            /* routes created by redirects */
212         short   rts_newgateway;         /* routes modified by redirects */
213         short   rts_unreach;            /* lookups which failed */
214         short   rts_wildcard;           /* lookups satisfied by a wildcard */
215 };
216 /*
217  * Structures for routing messages.
218  */
219 struct rt_msghdr {
220         u_short rtm_msglen;     /* to skip over non-understood messages */
221         u_char  rtm_version;    /* future binary compatibility */
222         u_char  rtm_type;       /* message type */
223         u_short rtm_index;      /* index for associated ifp */
224         int     rtm_flags;      /* flags, incl. kern & message, e.g. DONE */
225         int     rtm_addrs;      /* bitmask identifying sockaddrs in msg */
226         pid_t   rtm_pid;        /* identify sender */
227         int     rtm_seq;        /* for sender to identify action */
228         int     rtm_errno;      /* why failed */
229         int     rtm_use;        /* from rtentry */
230         u_long  rtm_inits;      /* which metrics we are initializing */
231         struct  rt_metrics rtm_rmx; /* metrics themselves */
232 };
233
234 #define RTM_VERSION     5       /* Up the ante and ignore older versions */
235
236 /*
237  * Message types.
238  */
239 #define RTM_ADD         0x1     /* Add Route */
240 #define RTM_DELETE      0x2     /* Delete Route */
241 #define RTM_CHANGE      0x3     /* Change Metrics or flags */
242 #define RTM_GET         0x4     /* Report Metrics */
243 #define RTM_LOSING      0x5     /* Kernel Suspects Partitioning */
244 #define RTM_REDIRECT    0x6     /* Told to use different route */
245 #define RTM_MISS        0x7     /* Lookup failed on this address */
246 #define RTM_LOCK        0x8     /* fix specified metrics */
247 #define RTM_OLDADD      0x9     /* caused by SIOCADDRT */
248 #define RTM_OLDDEL      0xa     /* caused by SIOCDELRT */
249 #define RTM_RESOLVE     0xb     /* req to resolve dst to LL addr */
250 #define RTM_NEWADDR     0xc     /* address being added to iface */
251 #define RTM_DELADDR     0xd     /* address being removed from iface */
252 #define RTM_IFINFO      0xe     /* iface going up/down etc. */
253 #define RTM_NEWMADDR    0xf     /* mcast group membership being added to if */
254 #define RTM_DELMADDR    0x10    /* mcast group membership being deleted */
255
256 /*
257  * Bitmask values for rtm_inits and rmx_locks.
258  */
259 #define RTV_MTU         0x1     /* init or lock _mtu */
260 #define RTV_HOPCOUNT    0x2     /* init or lock _hopcount */
261 #define RTV_EXPIRE      0x4     /* init or lock _expire */
262 #define RTV_RPIPE       0x8     /* init or lock _recvpipe */
263 #define RTV_SPIPE       0x10    /* init or lock _sendpipe */
264 #define RTV_SSTHRESH    0x20    /* init or lock _ssthresh */
265 #define RTV_RTT         0x40    /* init or lock _rtt */
266 #define RTV_RTTVAR      0x80    /* init or lock _rttvar */
267
268 /*
269  * Bitmask values for rtm_addrs.
270  */
271 #define RTA_DST         0x1     /* destination sockaddr present */
272 #define RTA_GATEWAY     0x2     /* gateway sockaddr present */
273 #define RTA_NETMASK     0x4     /* netmask sockaddr present */
274 #define RTA_GENMASK     0x8     /* cloning mask sockaddr present */
275 #define RTA_IFP         0x10    /* interface name sockaddr present */
276 #define RTA_IFA         0x20    /* interface addr sockaddr present */
277 #define RTA_AUTHOR      0x40    /* sockaddr for author of redirect */
278 #define RTA_BRD         0x80    /* for NEWADDR, broadcast or p-p dest addr */
279
280 /*
281  * Index offsets for sockaddr array for alternate internal encoding.
282  */
283 #define RTAX_DST        0       /* destination sockaddr present */
284 #define RTAX_GATEWAY    1       /* gateway sockaddr present */
285 #define RTAX_NETMASK    2       /* netmask sockaddr present */
286 #define RTAX_GENMASK    3       /* cloning mask sockaddr present */
287 #define RTAX_IFP        4       /* interface name sockaddr present */
288 #define RTAX_IFA        5       /* interface addr sockaddr present */
289 #define RTAX_AUTHOR     6       /* sockaddr for author of redirect */
290 #define RTAX_BRD        7       /* for NEWADDR, broadcast or p-p dest addr */
291 #define RTAX_MAX        8       /* size of array to allocate */
292
293 struct rt_addrinfo {
294         int     rti_addrs;
295         struct  sockaddr *rti_info[RTAX_MAX];
296 };
297
298 struct route_cb {
299         int     ip_count;
300         int     ip6_count;
301         int     ipx_count;
302         int     ns_count;
303         int     any_count;
304 };
305
306 #ifdef _KERNEL
307 #define RTFREE(rt) \
308         do { \
309                 if ((rt)->rt_refcnt <= 1) \
310                         rtfree(rt); \
311                 else \
312                         (rt)->rt_refcnt--; \
313         } while (0)
314
315 extern struct route_cb route_cb;
316 extern struct radix_node_head *rt_tables[AF_MAX+1];
317
318 struct ifmultiaddr;
319 struct proc;
320
321 void     route_init __P((void));
322 void     rt_ifmsg __P((struct ifnet *));
323 void     rt_missmsg __P((int, struct rt_addrinfo *, int, int));
324 void     rt_newaddrmsg __P((int, struct ifaddr *, int, struct rtentry *));
325 void     rt_newmaddrmsg __P((int, struct ifmultiaddr *));
326 int      rt_setgate __P((struct rtentry *,
327             struct sockaddr *, struct sockaddr *));
328 void     rtalloc __P((struct route *));
329 void     rtalloc_ign __P((struct route *, u_long));
330 struct rtentry *
331          rtalloc1 __P((struct sockaddr *, int, u_long));
332 void     rtfree __P((struct rtentry *));
333 int      rtinit __P((struct ifaddr *, int, int));
334 int      rtioctl __P((int, caddr_t, struct proc *));
335 void     rtredirect __P((struct sockaddr *, struct sockaddr *,
336             struct sockaddr *, int, struct sockaddr *, struct rtentry **));
337 int      rtrequest __P((int, struct sockaddr *,
338             struct sockaddr *, struct sockaddr *, int, struct rtentry **));
339 #endif
340
341 #endif