home *** CD-ROM | disk | FTP | other *** search
/ H4CK3R 4 / hacker04 / 04_HACK04.ISO / darwin / darwinx86.iso / usr / include / net / route.h < prev    next >
Encoding:
C/C++ Source or Header  |  2001-09-30  |  12.4 KB  |  323 lines

  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.     u_long    reserved[2];    /* for future use if needed */
  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-bandwidth product */
  88.     u_long    rmx_sendpipe;    /* outbound delay-bandwidth 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.     u_long    rmx_filler[4];    /* will be used for T/TCP later */
  94. };
  95.  
  96. /*
  97.  * rmx_rtt and rmx_rttvar are stored as microseconds;
  98.  * RTTTOPRHZ(rtt) converts to a value suitable for use
  99.  * by a protocol slowtimo counter.
  100.  */
  101. #define    RTM_RTTUNIT    1000000    /* units for rtt, rttvar, as units per sec */
  102. #define    RTTTOPRHZ(r)    ((r) / (RTM_RTTUNIT / PR_SLOWHZ))
  103.  
  104. /*
  105.  * XXX kernel function pointer `rt_output' is visible to applications.
  106.  */
  107. struct mbuf;
  108.  
  109. /*
  110.  * We distinguish between routes to hosts and routes to networks,
  111.  * preferring the former if available.  For each route we infer
  112.  * the interface to use from the gateway address supplied when
  113.  * the route was entered.  Routes that forward packets through
  114.  * gateways are marked so that the output routines know to address the
  115.  * gateway rather than the ultimate destination.
  116.  */
  117. #ifndef RNF_NORMAL
  118. #include <net/radix.h>
  119. #endif
  120. struct rtentry {
  121.     struct    radix_node rt_nodes[2];    /* tree glue, and other values */
  122. #define    rt_key(r)    ((struct sockaddr *)((r)->rt_nodes->rn_key))
  123. #define    rt_mask(r)    ((struct sockaddr *)((r)->rt_nodes->rn_mask))
  124.     struct    sockaddr *rt_gateway;    /* value */
  125.     short    rt_filler;        /* was short flags field */
  126.     short    rt_refcnt;        /* # held references */
  127.     u_long    rt_flags;        /* up/down?, host/net */
  128.     struct    ifnet *rt_ifp;        /* the answer: interface to use */
  129.         u_long  rt_dlt;            /* DLIL dl_tag */
  130.     struct    ifaddr *rt_ifa;        /* the answer: interface to use */
  131.     struct    sockaddr *rt_genmask;    /* for generation of cloned routes */
  132.     caddr_t    rt_llinfo;        /* pointer to link level info cache */
  133.     struct    rt_metrics rt_rmx;    /* metrics used by rx'ing protocols */
  134.     struct    rtentry *rt_gwroute;    /* implied entry for gatewayed routes */
  135.     int    (*rt_output) __P((struct ifnet *, struct mbuf *,
  136.                   struct sockaddr *, struct rtentry *));
  137.                     /* output routine for this (rt,if) */
  138.     struct    rtentry *rt_parent;     /* cloning parent of this route */
  139.     void    *rt_filler2;        /* more filler */
  140. };
  141.  
  142. /*
  143.  * Following structure necessary for 4.3 compatibility;
  144.  * We should eventually move it to a compat file.
  145.  */
  146. struct ortentry {
  147.     u_long    rt_hash;        /* to speed lookups */
  148.     struct    sockaddr rt_dst;    /* key */
  149.     struct    sockaddr rt_gateway;    /* value */
  150.     short    rt_flags;        /* up/down?, host/net */
  151.     short    rt_refcnt;        /* # held references */
  152.     u_long    rt_use;            /* raw # packets forwarded */
  153.     struct    ifnet *rt_ifp;        /* the answer: interface to use */
  154. };
  155.  
  156. #define rt_use rt_rmx.rmx_pksent
  157.  
  158. #define    RTF_UP        0x1        /* route usable */
  159. #define    RTF_GATEWAY    0x2        /* destination is a gateway */
  160. #define    RTF_HOST    0x4        /* host entry (net otherwise) */
  161. #define    RTF_REJECT    0x8        /* host or net unreachable */
  162. #define    RTF_DYNAMIC    0x10        /* created dynamically (by redirect) */
  163. #define    RTF_MODIFIED    0x20        /* modified dynamically (by redirect) */
  164. #define RTF_DONE    0x40        /* message confirmed */
  165. /*            0x80           unused */
  166. #define RTF_CLONING    0x100        /* generate new routes on use */
  167. #define RTF_XRESOLVE    0x200        /* external daemon resolves name */
  168. #define RTF_LLINFO    0x400        /* generated by link layer (e.g. ARP) */
  169. #define RTF_STATIC    0x800        /* manually added */
  170. #define RTF_BLACKHOLE    0x1000        /* just discard pkts (during updates) */
  171. #define RTF_PROTO2    0x4000        /* protocol specific routing flag */
  172. #define RTF_PROTO1    0x8000        /* protocol specific routing flag */
  173.  
  174. #define RTF_PRCLONING    0x10000        /* protocol requires cloning */
  175. #define RTF_WASCLONED    0x20000        /* route generated through cloning */
  176. #define RTF_PROTO3    0x40000        /* protocol specific routing flag */
  177. /*            0x80000           unused */
  178. #define RTF_PINNED    0x100000    /* future use */
  179. #define    RTF_LOCAL    0x200000     /* route represents a local address */
  180. #define    RTF_BROADCAST    0x400000    /* route represents a bcast address */
  181. #define    RTF_MULTICAST    0x800000    /* route represents a mcast address */
  182.                     /* 0x1000000 and up unassigned */
  183.  
  184. /*
  185.  * Routing statistics.
  186.  */
  187. struct    rtstat {
  188.     short    rts_badredirect;    /* bogus redirect calls */
  189.     short    rts_dynamic;        /* routes created by redirects */
  190.     short    rts_newgateway;        /* routes modified by redirects */
  191.     short    rts_unreach;        /* lookups which failed */
  192.     short    rts_wildcard;        /* lookups satisfied by a wildcard */
  193. };
  194. /*
  195.  * Structures for routing messages.
  196.  */
  197. struct rt_msghdr {
  198.     u_short    rtm_msglen;    /* to skip over non-understood messages */
  199.     u_char    rtm_version;    /* future binary compatibility */
  200.     u_char    rtm_type;    /* message type */
  201.     u_short    rtm_index;    /* index for associated ifp */
  202.     int    rtm_flags;    /* flags, incl. kern & message, e.g. DONE */
  203.     int    rtm_addrs;    /* bitmask identifying sockaddrs in msg */
  204.     pid_t    rtm_pid;    /* identify sender */
  205.     int    rtm_seq;    /* for sender to identify action */
  206.     int    rtm_errno;    /* why failed */
  207.     int    rtm_use;    /* from rtentry */
  208.     u_long    rtm_inits;    /* which metrics we are initializing */
  209.     struct    rt_metrics rtm_rmx; /* metrics themselves */
  210. };
  211.  
  212. #define RTM_VERSION    5    /* Up the ante and ignore older versions */
  213.  
  214. /*
  215.  * Message types.
  216.  */
  217. #define RTM_ADD        0x1    /* Add Route */
  218. #define RTM_DELETE    0x2    /* Delete Route */
  219. #define RTM_CHANGE    0x3    /* Change Metrics or flags */
  220. #define RTM_GET        0x4    /* Report Metrics */
  221. #define RTM_LOSING    0x5    /* Kernel Suspects Partitioning */
  222. #define RTM_REDIRECT    0x6    /* Told to use different route */
  223. #define RTM_MISS    0x7    /* Lookup failed on this address */
  224. #define RTM_LOCK    0x8    /* fix specified metrics */
  225. #define RTM_OLDADD    0x9    /* caused by SIOCADDRT */
  226. #define RTM_OLDDEL    0xa    /* caused by SIOCDELRT */
  227. #define RTM_RESOLVE    0xb    /* req to resolve dst to LL addr */
  228. #define RTM_NEWADDR    0xc    /* address being added to iface */
  229. #define RTM_DELADDR    0xd    /* address being removed from iface */
  230. #define RTM_IFINFO    0xe    /* iface going up/down etc. */
  231. #define    RTM_NEWMADDR    0xf    /* mcast group membership being added to if */
  232. #define    RTM_DELMADDR    0x10    /* mcast group membership being deleted */
  233.  
  234. /*
  235.  * Bitmask values for rtm_inits and rmx_locks.
  236.  */
  237. #define RTV_MTU        0x1    /* init or lock _mtu */
  238. #define RTV_HOPCOUNT    0x2    /* init or lock _hopcount */
  239. #define RTV_EXPIRE    0x4    /* init or lock _expire */
  240. #define RTV_RPIPE    0x8    /* init or lock _recvpipe */
  241. #define RTV_SPIPE    0x10    /* init or lock _sendpipe */
  242. #define RTV_SSTHRESH    0x20    /* init or lock _ssthresh */
  243. #define RTV_RTT        0x40    /* init or lock _rtt */
  244. #define RTV_RTTVAR    0x80    /* init or lock _rttvar */
  245.  
  246. /*
  247.  * Bitmask values for rtm_addrs.
  248.  */
  249. #define RTA_DST        0x1    /* destination sockaddr present */
  250. #define RTA_GATEWAY    0x2    /* gateway sockaddr present */
  251. #define RTA_NETMASK    0x4    /* netmask sockaddr present */
  252. #define RTA_GENMASK    0x8    /* cloning mask sockaddr present */
  253. #define RTA_IFP        0x10    /* interface name sockaddr present */
  254. #define RTA_IFA        0x20    /* interface addr sockaddr present */
  255. #define RTA_AUTHOR    0x40    /* sockaddr for author of redirect */
  256. #define RTA_BRD        0x80    /* for NEWADDR, broadcast or p-p dest addr */
  257.  
  258. /*
  259.  * Index offsets for sockaddr array for alternate internal encoding.
  260.  */
  261. #define RTAX_DST    0    /* destination sockaddr present */
  262. #define RTAX_GATEWAY    1    /* gateway sockaddr present */
  263. #define RTAX_NETMASK    2    /* netmask sockaddr present */
  264. #define RTAX_GENMASK    3    /* cloning mask sockaddr present */
  265. #define RTAX_IFP    4    /* interface name sockaddr present */
  266. #define RTAX_IFA    5    /* interface addr sockaddr present */
  267. #define RTAX_AUTHOR    6    /* sockaddr for author of redirect */
  268. #define RTAX_BRD    7    /* for NEWADDR, broadcast or p-p dest addr */
  269. #define RTAX_MAX    8    /* size of array to allocate */
  270.  
  271. struct rt_addrinfo {
  272.     int    rti_addrs;
  273.     struct    sockaddr *rti_info[RTAX_MAX];
  274. };
  275.  
  276. struct route_cb {
  277.     int    ip_count;
  278.     int    ip6_count;
  279.     int    ipx_count;
  280.     int    ns_count;
  281.     int    iso_count;
  282.     int    any_count;
  283. };
  284.  
  285. #ifdef KERNEL
  286. #define    RTFREE(rt) \
  287.     if ((rt)->rt_refcnt <= 1) \
  288.         rtfree(rt); \
  289.     else \
  290.         (rt)->rt_refcnt--;
  291. #define RTHOLD(rt) {                    \
  292.         if (++(rt)->rt_refcnt <= 0)    \
  293.                 panic("RTHOLD");    \
  294. }
  295.  
  296. extern struct route_cb route_cb;
  297. extern struct radix_node_head *rt_tables[AF_MAX+1];
  298.  
  299. struct ifmultiaddr;
  300. struct proc;
  301.  
  302. void     route_init __P((void));
  303. void     rt_ifmsg __P((struct ifnet *));
  304. void     rt_missmsg __P((int, struct rt_addrinfo *, int, int));
  305. void     rt_newaddrmsg __P((int, struct ifaddr *, int, struct rtentry *));
  306. void     rt_newmaddrmsg __P((int, struct ifmultiaddr *));
  307. int     rt_setgate __P((struct rtentry *,
  308.         struct sockaddr *, struct sockaddr *));
  309. void     rtalloc __P((struct route *));
  310. void     rtalloc_ign __P((struct route *, unsigned long));
  311. struct rtentry *
  312.      rtalloc1 __P((struct sockaddr *, int, unsigned long));
  313. void     rtfree __P((struct rtentry *));
  314. int     rtinit __P((struct ifaddr *, int, int));
  315. int     rtioctl __P((int, caddr_t, struct proc *));
  316. void     rtredirect __P((struct sockaddr *, struct sockaddr *,
  317.         struct sockaddr *, int, struct sockaddr *, struct rtentry **));
  318. int     rtrequest __P((int, struct sockaddr *,
  319.         struct sockaddr *, struct sockaddr *, int, struct rtentry **));
  320. #endif
  321.  
  322. #endif
  323.