|
|
1.1 root 1: /*
2: * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
6: * Portions Copyright (c) 1999 Apple Computer, Inc. All Rights
7: * Reserved. This file contains Original Code and/or Modifications of
8: * Original Code as defined in and that are subject to the Apple Public
9: * Source License Version 1.1 (the "License"). You may not use this file
10: * except in compliance with the License. Please obtain a copy of the
11: * License at http://www.apple.com/publicsource and read it before using
12: * this file.
13: *
14: * The Original Code and all software distributed under the License are
15: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
16: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
17: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
18: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
19: * License for the specific language governing rights and limitations
20: * under the License.
21: *
22: * @APPLE_LICENSE_HEADER_END@
23: */
24:
25: /* Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved */
26: /*
27: * Copyright (c) 1980, 1986, 1993
28: * The Regents of the University of California. All rights reserved.
29: *
30: * Redistribution and use in source and binary forms, with or without
31: * modification, are permitted provided that the following conditions
32: * are met:
33: * 1. Redistributions of source code must retain the above copyright
34: * notice, this list of conditions and the following disclaimer.
35: * 2. Redistributions in binary form must reproduce the above copyright
36: * notice, this list of conditions and the following disclaimer in the
37: * documentation and/or other materials provided with the distribution.
38: * 3. All advertising materials mentioning features or use of this software
39: * must display the following acknowledgement:
40: * This product includes software developed by the University of
41: * California, Berkeley and its contributors.
42: * 4. Neither the name of the University nor the names of its contributors
43: * may be used to endorse or promote products derived from this software
44: * without specific prior written permission.
45: *
46: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
47: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
48: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
49: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
50: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
51: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
52: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
53: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
54: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
55: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
56: * SUCH DAMAGE.
57: *
58: * @(#)route.h 8.5 (Berkeley) 2/8/95
59: */
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: struct sockaddr ro_dst;
76: };
77:
78: /*
79: * These numbers are used by reliable protocols for determining
80: * retransmission behavior and are included in the routing structure.
81: */
82: struct rt_metrics {
83: u_long rmx_locks; /* Kernel must leave these values alone */
84: u_long rmx_mtu; /* MTU for this path */
85: u_long rmx_hopcount; /* max hops expected */
86: u_long rmx_expire; /* lifetime for route, e.g. redirect */
87: u_long rmx_recvpipe; /* inbound delay-bandwith product */
88: u_long rmx_sendpipe; /* outbound delay-bandwith product */
89: u_long rmx_ssthresh; /* outbound gateway buffer limit */
90: u_long rmx_rtt; /* estimated round trip time */
91: u_long rmx_rttvar; /* estimated rtt variance */
92: u_long rmx_pksent; /* packets sent using this route */
93: };
94:
95: /*
96: * rmx_rtt and rmx_rttvar are stored as microseconds;
97: * RTTTOPRHZ(rtt) converts to a value suitable for use
98: * by a protocol slowtimo counter.
99: */
100: #define RTM_RTTUNIT 1000000 /* units for rtt, rttvar, as units per sec */
101: #define RTTTOPRHZ(r) ((r) / (RTM_RTTUNIT / PR_SLOWHZ))
102:
103: /*
104: * We distinguish between routes to hosts and routes to networks,
105: * preferring the former if available. For each route we infer
106: * the interface to use from the gateway address supplied when
107: * the route was entered. Routes that forward packets through
108: * gateways are marked so that the output routines know to address the
109: * gateway rather than the ultimate destination.
110: */
111: #ifndef RNF_NORMAL
112: #include <net/radix.h>
113: #endif
114: struct rtentry {
115: struct radix_node rt_nodes[2]; /* tree glue, and other values */
116: #define rt_key(r) ((struct sockaddr *)((r)->rt_nodes->rn_key))
117: #define rt_mask(r) ((struct sockaddr *)((r)->rt_nodes->rn_mask))
118: struct sockaddr *rt_gateway; /* value */
119: short rt_flags; /* up/down?, host/net */
120: short rt_refcnt; /* # held references */
121: u_long rt_use; /* raw # packets forwarded */
122: struct ifnet *rt_ifp; /* the answer: interface to use */
123: struct ifaddr *rt_ifa; /* the answer: interface to use */
124: struct sockaddr *rt_genmask; /* for generation of cloned routes */
125: caddr_t rt_llinfo; /* pointer to link level info cache */
126: struct rt_metrics rt_rmx; /* metrics used by rx'ing protocols */
127: struct rtentry *rt_gwroute; /* implied entry for gatewayed routes */
128: };
129:
130: /*
131: * Following structure necessary for 4.3 compatibility;
132: * We should eventually move it to a compat file.
133: */
134: struct ortentry {
135: u_int32_t rt_hash; /* to speed lookups */
136: struct sockaddr rt_dst; /* key */
137: struct sockaddr rt_gateway; /* value */
138: int16_t rt_flags; /* up/down?, host/net */
139: int16_t rt_refcnt; /* # held references */
140: u_int32_t rt_use; /* raw # packets forwarded */
141: struct ifnet *rt_ifp; /* the answer: interface to use */
142: };
143:
144: #define RTF_UP 0x1 /* route usable */
145: #define RTF_GATEWAY 0x2 /* destination is a gateway */
146: #define RTF_HOST 0x4 /* host entry (net otherwise) */
147: #define RTF_REJECT 0x8 /* host or net unreachable */
148: #define RTF_DYNAMIC 0x10 /* created dynamically (by redirect) */
149: #define RTF_MODIFIED 0x20 /* modified dynamically (by redirect) */
150: #define RTF_DONE 0x40 /* message confirmed */
151: #define RTF_MASK 0x80 /* subnet mask present */
152: #define RTF_CLONING 0x100 /* generate new routes on use */
153: #define RTF_XRESOLVE 0x200 /* external daemon resolves name */
154: #define RTF_LLINFO 0x400 /* generated by ARP or ESIS */
155: #define RTF_STATIC 0x800 /* manually added */
156: #define RTF_BLACKHOLE 0x1000 /* just discard pkts (during updates) */
157: #define RTF_PROTO2 0x4000 /* protocol specific routing flag */
158: #define RTF_PROTO1 0x8000 /* protocol specific routing flag */
159:
160:
161: /*
162: * Routing statistics.
163: */
164: struct rtstat {
165: short rts_badredirect; /* bogus redirect calls */
166: short rts_dynamic; /* routes created by redirects */
167: short rts_newgateway; /* routes modified by redirects */
168: short rts_unreach; /* lookups which failed */
169: short rts_wildcard; /* lookups satisfied by a wildcard */
170: };
171: /*
172: * Structures for routing messages.
173: */
174: struct rt_msghdr {
175: u_short rtm_msglen; /* to skip over non-understood messages */
176: u_char rtm_version; /* future binary compatibility */
177: u_char rtm_type; /* message type */
178: u_short rtm_index; /* index for associated ifp */
179: int rtm_flags; /* flags, incl. kern & message, e.g. DONE */
180: int rtm_addrs; /* bitmask identifying sockaddrs in msg */
181: pid_t rtm_pid; /* identify sender */
182: int rtm_seq; /* for sender to identify action */
183: int rtm_errno; /* why failed */
184: int rtm_use; /* from rtentry */
185: u_long rtm_inits; /* which metrics we are initializing */
186: struct rt_metrics rtm_rmx; /* metrics themselves */
187: };
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_OLDADD 0x9 /* caused by SIOCADDRT */
200: #define RTM_OLDDEL 0xa /* caused by SIOCDELRT */
201: #define RTM_RESOLVE 0xb /* req to resolve dst to LL addr */
202: #define RTM_NEWADDR 0xc /* address being added to iface */
203: #define RTM_DELADDR 0xd /* address being removed from iface */
204: #define RTM_IFINFO 0xe /* iface going up/down etc. */
205:
206: #define RTV_MTU 0x1 /* init or lock _mtu */
207: #define RTV_HOPCOUNT 0x2 /* init or lock _hopcount */
208: #define RTV_EXPIRE 0x4 /* init or lock _hopcount */
209: #define RTV_RPIPE 0x8 /* init or lock _recvpipe */
210: #define RTV_SPIPE 0x10 /* init or lock _sendpipe */
211: #define RTV_SSTHRESH 0x20 /* init or lock _ssthresh */
212: #define RTV_RTT 0x40 /* init or lock _rtt */
213: #define RTV_RTTVAR 0x80 /* init or lock _rttvar */
214:
215: /*
216: * Bitmask values for rtm_addr.
217: */
218: #define RTA_DST 0x1 /* destination sockaddr present */
219: #define RTA_GATEWAY 0x2 /* gateway sockaddr present */
220: #define RTA_NETMASK 0x4 /* netmask sockaddr present */
221: #define RTA_GENMASK 0x8 /* cloning mask sockaddr present */
222: #define RTA_IFP 0x10 /* interface name sockaddr present */
223: #define RTA_IFA 0x20 /* interface addr sockaddr present */
224: #define RTA_AUTHOR 0x40 /* sockaddr for author of redirect */
225: #define RTA_BRD 0x80 /* for NEWADDR, broadcast or p-p dest addr */
226:
227: /*
228: * Index offsets for sockaddr array for alternate internal encoding.
229: */
230: #define RTAX_DST 0 /* destination sockaddr present */
231: #define RTAX_GATEWAY 1 /* gateway sockaddr present */
232: #define RTAX_NETMASK 2 /* netmask sockaddr present */
233: #define RTAX_GENMASK 3 /* cloning mask sockaddr present */
234: #define RTAX_IFP 4 /* interface name sockaddr present */
235: #define RTAX_IFA 5 /* interface addr sockaddr present */
236: #define RTAX_AUTHOR 6 /* sockaddr for author of redirect */
237: #define RTAX_BRD 7 /* for NEWADDR, broadcast or p-p dest addr */
238: #define RTAX_MAX 8 /* size of array to allocate */
239:
240: struct rt_addrinfo {
241: int rti_addrs;
242: struct sockaddr *rti_info[RTAX_MAX];
243: };
244:
245: struct route_cb {
246: int ip_count;
247: int ns_count;
248: int iso_count;
249: int any_count;
250: };
251:
252: #ifdef _KERNEL
253: #define RTFREE(rt) \
254: if ((rt)->rt_refcnt <= 1) \
255: rtfree(rt); \
256: else \
257: (rt)->rt_refcnt--;
258:
259: extern struct route_cb route_cb;
260: extern struct rtstat rtstat;
261: extern struct radix_node_head *rt_tables[AF_MAX+1];
262:
263: struct socket;
264: void route_init __P((void));
265: int route_output __P((struct mbuf *, struct socket *));
266: int route_usrreq __P((struct socket *,
267: int, struct mbuf *, struct mbuf *, struct mbuf *));
268: void rt_ifmsg __P((struct ifnet *));
269: void rt_maskedcopy __P((struct sockaddr *,
270: struct sockaddr *, struct sockaddr *));
271: void rt_missmsg __P((int, struct rt_addrinfo *, int, int));
272: void rt_newaddrmsg __P((int, struct ifaddr *, int, struct rtentry *));
273: int rt_setgate __P((struct rtentry *,
274: struct sockaddr *, struct sockaddr *));
275: void rt_setmetrics __P((u_long, struct rt_metrics *, struct rt_metrics *));
276: void rtable_init __P((void **));
277: void rtalloc __P((struct route *));
278: struct rtentry *
279: rtalloc1 __P((struct sockaddr *, int));
280: void rtfree __P((struct rtentry *));
281: int rtinit __P((struct ifaddr *, int, int));
282: int rtioctl __P((u_long, caddr_t, struct proc *));
283: int rtredirect __P((struct sockaddr *, struct sockaddr *,
284: struct sockaddr *, int, struct sockaddr *, struct rtentry **));
285: int rtrequest __P((int, struct sockaddr *,
286: struct sockaddr *, struct sockaddr *, int, struct rtentry **));
287: #endif /* _KERNEL */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.