|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. ! 3: * ! 4: * @APPLE_LICENSE_HEADER_START@ ! 5: * ! 6: * The contents of this file constitute Original Code as defined in and ! 7: * are subject to the Apple Public Source License Version 1.1 (the ! 8: * "License"). You may not use this file except in compliance with the ! 9: * License. Please obtain a copy of the License at ! 10: * http://www.apple.com/publicsource and read it before using this file. ! 11: * ! 12: * This Original Code and all software distributed under the License are ! 13: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER ! 14: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, ! 15: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, ! 16: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the ! 17: * License for the specific language governing rights and limitations ! 18: * under the License. ! 19: * ! 20: * @APPLE_LICENSE_HEADER_END@ ! 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: */ ! 56: ! 57: #ifndef _NET_ROUTE_H_ ! 58: #define _NET_ROUTE_H_ ! 59: ! 60: /* ! 61: * Kernel resident routing tables. ! 62: * ! 63: * The routing tables are initialized when interface addresses ! 64: * are set by making entries for all directly connected interfaces. ! 65: */ ! 66: ! 67: /* ! 68: * A route consists of a destination address and a reference ! 69: * to a routing entry. These are often held by protocols ! 70: * in their control blocks, e.g. inpcb. ! 71: */ ! 72: struct route { ! 73: struct rtentry *ro_rt; ! 74: struct sockaddr ro_dst; ! 75: }; ! 76: ! 77: /* ! 78: * These numbers are used by reliable protocols for determining ! 79: * retransmission behavior and are included in the routing structure. ! 80: */ ! 81: struct rt_metrics { ! 82: u_long rmx_locks; /* Kernel must leave these values alone */ ! 83: u_long rmx_mtu; /* MTU for this path */ ! 84: u_long rmx_hopcount; /* max hops expected */ ! 85: u_long rmx_expire; /* lifetime for route, e.g. redirect */ ! 86: u_long rmx_recvpipe; /* inbound delay-bandwidth product */ ! 87: u_long rmx_sendpipe; /* outbound delay-bandwidth product */ ! 88: u_long rmx_ssthresh; /* outbound gateway buffer limit */ ! 89: u_long rmx_rtt; /* estimated round trip time */ ! 90: u_long rmx_rttvar; /* estimated rtt variance */ ! 91: u_long rmx_pksent; /* packets sent using this route */ ! 92: u_long rmx_filler[4]; /* will be used for T/TCP later */ ! 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: * XXX kernel function pointer `rt_output' is visible to applications. ! 105: */ ! 106: struct mbuf; ! 107: ! 108: /* ! 109: * We distinguish between routes to hosts and routes to networks, ! 110: * preferring the former if available. For each route we infer ! 111: * the interface to use from the gateway address supplied when ! 112: * the route was entered. Routes that forward packets through ! 113: * gateways are marked so that the output routines know to address the ! 114: * gateway rather than the ultimate destination. ! 115: */ ! 116: #ifndef RNF_NORMAL ! 117: #include <net/radix.h> ! 118: #endif ! 119: struct rtentry { ! 120: struct radix_node rt_nodes[2]; /* tree glue, and other values */ ! 121: #define rt_key(r) ((struct sockaddr *)((r)->rt_nodes->rn_key)) ! 122: #define rt_mask(r) ((struct sockaddr *)((r)->rt_nodes->rn_mask)) ! 123: struct sockaddr *rt_gateway; /* value */ ! 124: short rt_filler; /* was short flags field */ ! 125: short rt_refcnt; /* # held references */ ! 126: u_long rt_flags; /* up/down?, host/net */ ! 127: struct ifnet *rt_ifp; /* the answer: interface to use */ ! 128: u_long rt_dlt; /* DLIL dl_tag */ ! 129: struct ifaddr *rt_ifa; /* the answer: interface to use */ ! 130: struct sockaddr *rt_genmask; /* for generation of cloned routes */ ! 131: caddr_t rt_llinfo; /* pointer to link level info cache */ ! 132: struct rt_metrics rt_rmx; /* metrics used by rx'ing protocols */ ! 133: struct rtentry *rt_gwroute; /* implied entry for gatewayed routes */ ! 134: int (*rt_output) __P((struct ifnet *, struct mbuf *, ! 135: struct sockaddr *, struct rtentry *)); ! 136: /* output routine for this (rt,if) */ ! 137: struct rtentry *rt_parent; /* cloning parent of this route */ ! 138: void *rt_filler2; /* more filler */ ! 139: }; ! 140: ! 141: /* ! 142: * Following structure necessary for 4.3 compatibility; ! 143: * We should eventually move it to a compat file. ! 144: */ ! 145: struct ortentry { ! 146: u_long rt_hash; /* to speed lookups */ ! 147: struct sockaddr rt_dst; /* key */ ! 148: struct sockaddr rt_gateway; /* value */ ! 149: short rt_flags; /* up/down?, host/net */ ! 150: short rt_refcnt; /* # held references */ ! 151: u_long rt_use; /* raw # packets forwarded */ ! 152: struct ifnet *rt_ifp; /* the answer: interface to use */ ! 153: }; ! 154: ! 155: #define rt_use rt_rmx.rmx_pksent ! 156: ! 157: #define RTF_UP 0x1 /* route usable */ ! 158: #define RTF_GATEWAY 0x2 /* destination is a gateway */ ! 159: #define RTF_HOST 0x4 /* host entry (net otherwise) */ ! 160: #define RTF_REJECT 0x8 /* host or net unreachable */ ! 161: #define RTF_DYNAMIC 0x10 /* created dynamically (by redirect) */ ! 162: #define RTF_MODIFIED 0x20 /* modified dynamically (by redirect) */ ! 163: #define RTF_DONE 0x40 /* message confirmed */ ! 164: /* 0x80 unused */ ! 165: #define RTF_CLONING 0x100 /* generate new routes on use */ ! 166: #define RTF_XRESOLVE 0x200 /* external daemon resolves name */ ! 167: #define RTF_LLINFO 0x400 /* generated by link layer (e.g. ARP) */ ! 168: #define RTF_STATIC 0x800 /* manually added */ ! 169: #define RTF_BLACKHOLE 0x1000 /* just discard pkts (during updates) */ ! 170: #define RTF_PROTO2 0x4000 /* protocol specific routing flag */ ! 171: #define RTF_PROTO1 0x8000 /* protocol specific routing flag */ ! 172: ! 173: #define RTF_PRCLONING 0x10000 /* protocol requires cloning */ ! 174: #define RTF_WASCLONED 0x20000 /* route generated through cloning */ ! 175: #define RTF_PROTO3 0x40000 /* protocol specific routing flag */ ! 176: /* 0x80000 unused */ ! 177: #define RTF_PINNED 0x100000 /* future use */ ! 178: #define RTF_LOCAL 0x200000 /* route represents a local address */ ! 179: #define RTF_BROADCAST 0x400000 /* route represents a bcast address */ ! 180: #define RTF_MULTICAST 0x800000 /* route represents a mcast address */ ! 181: /* 0x1000000 and up unassigned */ ! 182: ! 183: /* ! 184: * Routing statistics. ! 185: */ ! 186: struct rtstat { ! 187: short rts_badredirect; /* bogus redirect calls */ ! 188: short rts_dynamic; /* routes created by redirects */ ! 189: short rts_newgateway; /* routes modified by redirects */ ! 190: short rts_unreach; /* lookups which failed */ ! 191: short rts_wildcard; /* lookups satisfied by a wildcard */ ! 192: }; ! 193: /* ! 194: * Structures for routing messages. ! 195: */ ! 196: struct rt_msghdr { ! 197: u_short rtm_msglen; /* to skip over non-understood messages */ ! 198: u_char rtm_version; /* future binary compatibility */ ! 199: u_char rtm_type; /* message type */ ! 200: u_short rtm_index; /* index for associated ifp */ ! 201: int rtm_flags; /* flags, incl. kern & message, e.g. DONE */ ! 202: int rtm_addrs; /* bitmask identifying sockaddrs in msg */ ! 203: pid_t rtm_pid; /* identify sender */ ! 204: int rtm_seq; /* for sender to identify action */ ! 205: int rtm_errno; /* why failed */ ! 206: int rtm_use; /* from rtentry */ ! 207: u_long rtm_inits; /* which metrics we are initializing */ ! 208: struct rt_metrics rtm_rmx; /* metrics themselves */ ! 209: }; ! 210: ! 211: #define RTM_VERSION 5 /* Up the ante and ignore older versions */ ! 212: ! 213: /* ! 214: * Message types. ! 215: */ ! 216: #define RTM_ADD 0x1 /* Add Route */ ! 217: #define RTM_DELETE 0x2 /* Delete Route */ ! 218: #define RTM_CHANGE 0x3 /* Change Metrics or flags */ ! 219: #define RTM_GET 0x4 /* Report Metrics */ ! 220: #define RTM_LOSING 0x5 /* Kernel Suspects Partitioning */ ! 221: #define RTM_REDIRECT 0x6 /* Told to use different route */ ! 222: #define RTM_MISS 0x7 /* Lookup failed on this address */ ! 223: #define RTM_LOCK 0x8 /* fix specified metrics */ ! 224: #define RTM_OLDADD 0x9 /* caused by SIOCADDRT */ ! 225: #define RTM_OLDDEL 0xa /* caused by SIOCDELRT */ ! 226: #define RTM_RESOLVE 0xb /* req to resolve dst to LL addr */ ! 227: #define RTM_NEWADDR 0xc /* address being added to iface */ ! 228: #define RTM_DELADDR 0xd /* address being removed from iface */ ! 229: #define RTM_IFINFO 0xe /* iface going up/down etc. */ ! 230: #define RTM_NEWMADDR 0xf /* mcast group membership being added to if */ ! 231: #define RTM_DELMADDR 0x10 /* mcast group membership being deleted */ ! 232: ! 233: /* ! 234: * Bitmask values for rtm_inits and rmx_locks. ! 235: */ ! 236: #define RTV_MTU 0x1 /* init or lock _mtu */ ! 237: #define RTV_HOPCOUNT 0x2 /* init or lock _hopcount */ ! 238: #define RTV_EXPIRE 0x4 /* init or lock _expire */ ! 239: #define RTV_RPIPE 0x8 /* init or lock _recvpipe */ ! 240: #define RTV_SPIPE 0x10 /* init or lock _sendpipe */ ! 241: #define RTV_SSTHRESH 0x20 /* init or lock _ssthresh */ ! 242: #define RTV_RTT 0x40 /* init or lock _rtt */ ! 243: #define RTV_RTTVAR 0x80 /* init or lock _rttvar */ ! 244: ! 245: /* ! 246: * Bitmask values for rtm_addrs. ! 247: */ ! 248: #define RTA_DST 0x1 /* destination sockaddr present */ ! 249: #define RTA_GATEWAY 0x2 /* gateway sockaddr present */ ! 250: #define RTA_NETMASK 0x4 /* netmask sockaddr present */ ! 251: #define RTA_GENMASK 0x8 /* cloning mask sockaddr present */ ! 252: #define RTA_IFP 0x10 /* interface name sockaddr present */ ! 253: #define RTA_IFA 0x20 /* interface addr sockaddr present */ ! 254: #define RTA_AUTHOR 0x40 /* sockaddr for author of redirect */ ! 255: #define RTA_BRD 0x80 /* for NEWADDR, broadcast or p-p dest addr */ ! 256: ! 257: /* ! 258: * Index offsets for sockaddr array for alternate internal encoding. ! 259: */ ! 260: #define RTAX_DST 0 /* destination sockaddr present */ ! 261: #define RTAX_GATEWAY 1 /* gateway sockaddr present */ ! 262: #define RTAX_NETMASK 2 /* netmask sockaddr present */ ! 263: #define RTAX_GENMASK 3 /* cloning mask sockaddr present */ ! 264: #define RTAX_IFP 4 /* interface name sockaddr present */ ! 265: #define RTAX_IFA 5 /* interface addr sockaddr present */ ! 266: #define RTAX_AUTHOR 6 /* sockaddr for author of redirect */ ! 267: #define RTAX_BRD 7 /* for NEWADDR, broadcast or p-p dest addr */ ! 268: #define RTAX_MAX 8 /* size of array to allocate */ ! 269: ! 270: struct rt_addrinfo { ! 271: int rti_addrs; ! 272: struct sockaddr *rti_info[RTAX_MAX]; ! 273: }; ! 274: ! 275: struct route_cb { ! 276: int ip_count; ! 277: int ipx_count; ! 278: int ns_count; ! 279: int iso_count; ! 280: int any_count; ! 281: }; ! 282: ! 283: #ifdef KERNEL ! 284: #define RTFREE(rt) \ ! 285: if ((rt)->rt_refcnt <= 1) \ ! 286: rtfree(rt); \ ! 287: else \ ! 288: (rt)->rt_refcnt--; ! 289: #define RTHOLD(rt) { \ ! 290: if (++(rt)->rt_refcnt <= 0) \ ! 291: panic("RTHOLD"); \ ! 292: } ! 293: ! 294: extern struct route_cb route_cb; ! 295: extern struct radix_node_head *rt_tables[AF_MAX+1]; ! 296: ! 297: struct ifmultiaddr; ! 298: struct proc; ! 299: ! 300: void route_init __P((void)); ! 301: void rt_ifmsg __P((struct ifnet *)); ! 302: void rt_missmsg __P((int, struct rt_addrinfo *, int, int)); ! 303: void rt_newaddrmsg __P((int, struct ifaddr *, int, struct rtentry *)); ! 304: void rt_newmaddrmsg __P((int, struct ifmultiaddr *)); ! 305: int rt_setgate __P((struct rtentry *, ! 306: struct sockaddr *, struct sockaddr *)); ! 307: void rtalloc __P((struct route *)); ! 308: void rtalloc_ign __P((struct route *, unsigned long)); ! 309: struct rtentry * ! 310: rtalloc1 __P((struct sockaddr *, int, unsigned long)); ! 311: void rtfree __P((struct rtentry *)); ! 312: int rtinit __P((struct ifaddr *, int, int)); ! 313: int rtioctl __P((int, caddr_t, struct proc *)); ! 314: void rtredirect __P((struct sockaddr *, struct sockaddr *, ! 315: struct sockaddr *, int, struct sockaddr *, struct rtentry **)); ! 316: int rtrequest __P((int, struct sockaddr *, ! 317: struct sockaddr *, struct sockaddr *, int, struct rtentry **)); ! 318: #endif ! 319: ! 320: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.