home *** CD-ROM | disk | FTP | other *** search
/ Aminet 18 / aminetcdnumber181997.iso / Aminet / dev / gcc / ixemulsrc.lha / ixemul / include / net / route.h < prev    next >
C/C++ Source or Header  |  1996-12-11  |  11KB  |  265 lines

  1. /*    $NetBSD: route.h,v 1.8 1995/03/26 20:30:19 jtc Exp $    */
  2.  
  3. /*
  4.  * Copyright (c) 1980, 1986, 1993
  5.  *    The Regents of the University of California.  All rights reserved.
  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. All advertising materials mentioning features or use of this software
  16.  *    must display the following acknowledgement:
  17.  *    This product includes software developed by the University of
  18.  *    California, Berkeley and its contributors.
  19.  * 4. Neither the name of the University nor the names of its contributors
  20.  *    may be used to endorse or promote products derived from this software
  21.  *    without specific prior written permission.
  22.  *
  23.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  24.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  25.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  26.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  27.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  28.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  29.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  30.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  31.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  32.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  33.  * SUCH DAMAGE.
  34.  *
  35.  *    @(#)route.h    8.3 (Berkeley) 4/19/94
  36.  */
  37.  
  38. /*
  39.  * Kernel resident routing tables.
  40.  * 
  41.  * The routing tables are initialized when interface addresses
  42.  * are set by making entries for all directly connected interfaces.
  43.  */
  44.  
  45. /*
  46.  * A route consists of a destination address and a reference
  47.  * to a routing entry.  These are often held by protocols
  48.  * in their control blocks, e.g. inpcb.
  49.  */
  50. struct route {
  51.     struct    rtentry *ro_rt;
  52.     struct    sockaddr ro_dst;
  53. };
  54.  
  55. /*
  56.  * These numbers are used by reliable protocols for determining
  57.  * retransmission behavior and are included in the routing structure.
  58.  */
  59. struct rt_metrics {
  60.     u_long    rmx_locks;    /* Kernel must leave these values alone */
  61.     u_long    rmx_mtu;    /* MTU for this path */
  62.     u_long    rmx_hopcount;    /* max hops expected */
  63.     u_long    rmx_expire;    /* lifetime for route, e.g. redirect */
  64.     u_long    rmx_recvpipe;    /* inbound delay-bandwith product */
  65.     u_long    rmx_sendpipe;    /* outbound delay-bandwith product */
  66.     u_long    rmx_ssthresh;    /* outbound gateway buffer limit */
  67.     u_long    rmx_rtt;    /* estimated round trip time */
  68.     u_long    rmx_rttvar;    /* estimated rtt variance */
  69.     u_long    rmx_pksent;    /* packets sent using this route */
  70. };
  71.  
  72. /*
  73.  * rmx_rtt and rmx_rttvar are stored as microseconds;
  74.  * RTTTOPRHZ(rtt) converts to a value suitable for use
  75.  * by a protocol slowtimo counter.
  76.  */
  77. #define    RTM_RTTUNIT    1000000    /* units for rtt, rttvar, as units per sec */
  78. #define    RTTTOPRHZ(r)    ((r) / (RTM_RTTUNIT / PR_SLOWHZ))
  79.  
  80. /*
  81.  * We distinguish between routes to hosts and routes to networks,
  82.  * preferring the former if available.  For each route we infer
  83.  * the interface to use from the gateway address supplied when
  84.  * the route was entered.  Routes that forward packets through
  85.  * gateways are marked so that the output routines know to address the
  86.  * gateway rather than the ultimate destination.
  87.  */
  88. #ifndef RNF_NORMAL
  89. #include <net/radix.h>
  90. #endif
  91. struct rtentry {
  92.     struct    radix_node rt_nodes[2];    /* tree glue, and other values */
  93. #define    rt_key(r)    ((struct sockaddr *)((r)->rt_nodes->rn_key))
  94. #define    rt_mask(r)    ((struct sockaddr *)((r)->rt_nodes->rn_mask))
  95.     struct    sockaddr *rt_gateway;    /* value */
  96.     short    rt_flags;        /* up/down?, host/net */
  97.     short    rt_refcnt;        /* # held references */
  98.     u_long    rt_use;            /* raw # packets forwarded */
  99.     struct    ifnet *rt_ifp;        /* the answer: interface to use */
  100.     struct    ifaddr *rt_ifa;        /* the answer: interface to use */
  101.     struct    sockaddr *rt_genmask;    /* for generation of cloned routes */
  102.     caddr_t    rt_llinfo;        /* pointer to link level info cache */
  103.     struct    rt_metrics rt_rmx;    /* metrics used by rx'ing protocols */
  104.     struct    rtentry *rt_gwroute;    /* implied entry for gatewayed routes */
  105. };
  106.  
  107. /*
  108.  * Following structure necessary for 4.3 compatibility;
  109.  * We should eventually move it to a compat file.
  110.  */
  111. struct ortentry {
  112.     u_int32_t rt_hash;        /* to speed lookups */
  113.     struct sockaddr rt_dst;        /* key */
  114.     struct sockaddr rt_gateway;    /* value */
  115.     int16_t      rt_flags;        /* up/down?, host/net */
  116.     int16_t      rt_refcnt;        /* # held references */
  117.     u_int32_t rt_use;        /* raw # packets forwarded */
  118.     struct ifnet *rt_ifp;        /* the answer: interface to use */
  119. };
  120.  
  121. #define    RTF_UP        0x1        /* route usable */
  122. #define    RTF_GATEWAY    0x2        /* destination is a gateway */
  123. #define    RTF_HOST    0x4        /* host entry (net otherwise) */
  124. #define    RTF_REJECT    0x8        /* host or net unreachable */
  125. #define    RTF_DYNAMIC    0x10        /* created dynamically (by redirect) */
  126. #define    RTF_MODIFIED    0x20        /* modified dynamically (by redirect) */
  127. #define RTF_DONE    0x40        /* message confirmed */
  128. #define RTF_MASK    0x80        /* subnet mask present */
  129. #define RTF_CLONING    0x100        /* generate new routes on use */
  130. #define RTF_XRESOLVE    0x200        /* external daemon resolves name */
  131. #define RTF_LLINFO    0x400        /* generated by ARP or ESIS */
  132. #define RTF_STATIC    0x800        /* manually added */
  133. #define RTF_BLACKHOLE    0x1000        /* just discard pkts (during updates) */
  134. #define RTF_PROTO2    0x4000        /* protocol specific routing flag */
  135. #define RTF_PROTO1    0x8000        /* protocol specific routing flag */
  136.  
  137.  
  138. /*
  139.  * Routing statistics.
  140.  */
  141. struct    rtstat {
  142.     short    rts_badredirect;    /* bogus redirect calls */
  143.     short    rts_dynamic;        /* routes created by redirects */
  144.     short    rts_newgateway;        /* routes modified by redirects */
  145.     short    rts_unreach;        /* lookups which failed */
  146.     short    rts_wildcard;        /* lookups satisfied by a wildcard */
  147. };
  148. /*
  149.  * Structures for routing messages.
  150.  */
  151. struct rt_msghdr {
  152.     u_short    rtm_msglen;    /* to skip over non-understood messages */
  153.     u_char    rtm_version;    /* future binary compatibility */
  154.     u_char    rtm_type;    /* message type */
  155.     u_short    rtm_index;    /* index for associated ifp */
  156.     int    rtm_flags;    /* flags, incl. kern & message, e.g. DONE */
  157.     int    rtm_addrs;    /* bitmask identifying sockaddrs in msg */
  158.     pid_t    rtm_pid;    /* identify sender */
  159.     int    rtm_seq;    /* for sender to identify action */
  160.     int    rtm_errno;    /* why failed */
  161.     int    rtm_use;    /* from rtentry */
  162.     u_long    rtm_inits;    /* which metrics we are initializing */
  163.     struct    rt_metrics rtm_rmx; /* metrics themselves */
  164. };
  165.  
  166. #define RTM_VERSION    3    /* Up the ante and ignore older versions */
  167.  
  168. #define RTM_ADD        0x1    /* Add Route */
  169. #define RTM_DELETE    0x2    /* Delete Route */
  170. #define RTM_CHANGE    0x3    /* Change Metrics or flags */
  171. #define RTM_GET        0x4    /* Report Metrics */
  172. #define RTM_LOSING    0x5    /* Kernel Suspects Partitioning */
  173. #define RTM_REDIRECT    0x6    /* Told to use different route */
  174. #define RTM_MISS    0x7    /* Lookup failed on this address */
  175. #define RTM_LOCK    0x8    /* fix specified metrics */
  176. #define RTM_OLDADD    0x9    /* caused by SIOCADDRT */
  177. #define RTM_OLDDEL    0xa    /* caused by SIOCDELRT */
  178. #define RTM_RESOLVE    0xb    /* req to resolve dst to LL addr */
  179. #define RTM_NEWADDR    0xc    /* address being added to iface */
  180. #define RTM_DELADDR    0xd    /* address being removed from iface */
  181. #define RTM_IFINFO    0xe    /* iface going up/down etc. */
  182.  
  183. #define RTV_MTU        0x1    /* init or lock _mtu */
  184. #define RTV_HOPCOUNT    0x2    /* init or lock _hopcount */
  185. #define RTV_EXPIRE    0x4    /* init or lock _hopcount */
  186. #define RTV_RPIPE    0x8    /* init or lock _recvpipe */
  187. #define RTV_SPIPE    0x10    /* init or lock _sendpipe */
  188. #define RTV_SSTHRESH    0x20    /* init or lock _ssthresh */
  189. #define RTV_RTT        0x40    /* init or lock _rtt */
  190. #define RTV_RTTVAR    0x80    /* init or lock _rttvar */
  191.  
  192. /*
  193.  * Bitmask values for rtm_addr.
  194.  */
  195. #define RTA_DST        0x1    /* destination sockaddr present */
  196. #define RTA_GATEWAY    0x2    /* gateway sockaddr present */
  197. #define RTA_NETMASK    0x4    /* netmask sockaddr present */
  198. #define RTA_GENMASK    0x8    /* cloning mask sockaddr present */
  199. #define RTA_IFP        0x10    /* interface name sockaddr present */
  200. #define RTA_IFA        0x20    /* interface addr sockaddr present */
  201. #define RTA_AUTHOR    0x40    /* sockaddr for author of redirect */
  202. #define RTA_BRD        0x80    /* for NEWADDR, broadcast or p-p dest addr */
  203.  
  204. /*
  205.  * Index offsets for sockaddr array for alternate internal encoding.
  206.  */
  207. #define RTAX_DST    0    /* destination sockaddr present */
  208. #define RTAX_GATEWAY    1    /* gateway sockaddr present */
  209. #define RTAX_NETMASK    2    /* netmask sockaddr present */
  210. #define RTAX_GENMASK    3    /* cloning mask sockaddr present */
  211. #define RTAX_IFP    4    /* interface name sockaddr present */
  212. #define RTAX_IFA    5    /* interface addr sockaddr present */
  213. #define RTAX_AUTHOR    6    /* sockaddr for author of redirect */
  214. #define RTAX_BRD    7    /* for NEWADDR, broadcast or p-p dest addr */
  215. #define RTAX_MAX    8    /* size of array to allocate */
  216.  
  217. struct rt_addrinfo {
  218.     int    rti_addrs;
  219.     struct    sockaddr *rti_info[RTAX_MAX];
  220. };
  221.  
  222. struct route_cb {
  223.     int    ip_count;
  224.     int    ns_count;
  225.     int    iso_count;
  226.     int    any_count;
  227. };
  228.  
  229. #ifdef _KERNEL
  230. #define    RTFREE(rt) \
  231.     if ((rt)->rt_refcnt <= 1) \
  232.         rtfree(rt); \
  233.     else \
  234.         (rt)->rt_refcnt--;
  235.  
  236. struct    route_cb route_cb;
  237. struct    rtstat    rtstat;
  238. struct    radix_node_head *rt_tables[AF_MAX+1];
  239.  
  240. struct    socket;
  241. void     route_init __P((void));
  242. int     route_output __P((struct mbuf *, struct socket *));
  243. int     route_usrreq __P((struct socket *,
  244.         int, struct mbuf *, struct mbuf *, struct mbuf *));
  245. void     rt_ifmsg __P((struct ifnet *));
  246. void     rt_maskedcopy __P((struct sockaddr *,
  247.         struct sockaddr *, struct sockaddr *));
  248. void     rt_missmsg __P((int, struct rt_addrinfo *, int, int));
  249. void     rt_newaddrmsg __P((int, struct ifaddr *, int, struct rtentry *));
  250. int     rt_setgate __P((struct rtentry *,
  251.         struct sockaddr *, struct sockaddr *));
  252. void     rt_setmetrics __P((u_long, struct rt_metrics *, struct rt_metrics *));
  253. void     rtable_init __P((void **));
  254. void     rtalloc __P((struct route *));
  255. struct rtentry *
  256.      rtalloc1 __P((struct sockaddr *, int));
  257. void     rtfree __P((struct rtentry *));
  258. int     rtinit __P((struct ifaddr *, int, int));
  259. int     rtioctl __P((u_long, caddr_t, struct proc *));
  260. int     rtredirect __P((struct sockaddr *, struct sockaddr *,
  261.         struct sockaddr *, int, struct sockaddr *, struct rtentry **));
  262. int     rtrequest __P((int, struct sockaddr *,
  263.         struct sockaddr *, struct sockaddr *, int, struct rtentry **));
  264. #endif /* _KERNEL */
  265.