root/net/route.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


    1 /*      $OpenBSD: route.h,v 1.46 2006/06/18 11:47:45 pascoe Exp $       */
    2 /*      $NetBSD: route.h,v 1.9 1996/02/13 22:00:49 christos Exp $       */
    3 
    4 /*
    5  * Copyright (c) 1980, 1986, 1993
    6  *      The Regents of the University of California.  All rights reserved.
    7  *
    8  * Redistribution and use in source and binary forms, with or without
    9  * modification, are permitted provided that the following conditions
   10  * are met:
   11  * 1. Redistributions of source code must retain the above copyright
   12  *    notice, this list of conditions and the following disclaimer.
   13  * 2. Redistributions in binary form must reproduce the above copyright
   14  *    notice, this list of conditions and the following disclaimer in the
   15  *    documentation and/or other materials provided with the distribution.
   16  * 3. Neither the name of the University nor the names of its contributors
   17  *    may be used to endorse or promote products derived from this software
   18  *    without specific prior written permission.
   19  *
   20  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
   21  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   22  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   23  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
   24  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   25  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   26  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   27  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   28  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   29  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   30  * SUCH DAMAGE.
   31  *
   32  *      @(#)route.h     8.3 (Berkeley) 4/19/94
   33  */
   34 
   35 #ifndef _NET_ROUTE_H_
   36 #define _NET_ROUTE_H_
   37 
   38 #include <sys/queue.h>
   39 
   40 /*
   41  * Kernel resident routing tables.
   42  * 
   43  * The routing tables are initialized when interface addresses
   44  * are set by making entries for all directly connected interfaces.
   45  */
   46 
   47 /*
   48  * A route consists of a destination address and a reference
   49  * to a routing entry.  These are often held by protocols
   50  * in their control blocks, e.g. inpcb.
   51  */
   52 struct route {
   53         struct  rtentry *ro_rt;
   54         struct  sockaddr ro_dst;
   55 };
   56 
   57 /*
   58  * These numbers are used by reliable protocols for determining
   59  * retransmission behavior and are included in the routing structure.
   60  */
   61 struct rt_kmetrics {
   62         u_long  rmx_locks;      /* Kernel must leave these values alone */
   63         u_long  rmx_mtu;        /* MTU for this path */
   64         u_long  rmx_expire;     /* lifetime for route, e.g. redirect */
   65         u_long  rmx_pksent;     /* packets sent using this route */
   66 };
   67 
   68 /*
   69  * Huge version for userland compatibility.
   70  */
   71 struct rt_metrics {
   72         u_long  rmx_locks;      /* Kernel must leave these values alone */
   73         u_long  rmx_mtu;        /* MTU for this path */
   74         u_long  rmx_hopcount;   /* max hops expected */
   75         u_long  rmx_expire;     /* lifetime for route, e.g. redirect */
   76         u_long  rmx_recvpipe;   /* inbound delay-bandwidth product */
   77         u_long  rmx_sendpipe;   /* outbound delay-bandwidth product */
   78         u_long  rmx_ssthresh;   /* outbound gateway buffer limit (deprecated) */
   79         u_long  rmx_rtt;        /* estimated round trip time (deprecated) */
   80         u_long  rmx_rttvar;     /* estimated rtt variance (deprecated) */
   81         u_long  rmx_pksent;     /* packets sent using this route */
   82 };
   83 /* XXX overloading some values that are no longer used. */
   84 #define rmx_refcnt rmx_rttvar   /* # held references only used by sysctl */
   85 #define rmx_rt_tableid rmx_rtt  /* routing table ID */
   86 
   87 /*
   88  * rmx_rtt and rmx_rttvar are stored as microseconds;
   89  * RTTTOPRHZ(rtt) converts to a value suitable for use
   90  * by a protocol slowtimo counter.
   91  */
   92 #define RTM_RTTUNIT     1000000 /* units for rtt, rttvar, as units per sec */
   93 #define RTTTOPRHZ(r)    ((r) / (RTM_RTTUNIT / PR_SLOWHZ))
   94 
   95 /*
   96  * We distinguish between routes to hosts and routes to networks,
   97  * preferring the former if available.  For each route we infer
   98  * the interface to use from the gateway address supplied when
   99  * the route was entered.  Routes that forward packets through
  100  * gateways are marked so that the output routines know to address the
  101  * gateway rather than the ultimate destination.
  102  */
  103 #ifndef RNF_NORMAL
  104 #include <net/radix.h>
  105 #include <net/radix_mpath.h>
  106 #endif
  107 struct rtentry {
  108         struct  radix_node rt_nodes[2]; /* tree glue, and other values */
  109 #define rt_key(r)       ((struct sockaddr *)((r)->rt_nodes->rn_key))
  110 #define rt_mask(r)      ((struct sockaddr *)((r)->rt_nodes->rn_mask))
  111         struct  sockaddr *rt_gateway;   /* value */
  112         u_int   rt_flags;               /* up/down?, host/net */
  113         int     rt_refcnt;              /* # held references */
  114         struct  ifnet *rt_ifp;          /* the answer: interface to use */
  115         struct  ifaddr *rt_ifa;         /* the answer: interface to use */
  116         struct  sockaddr *rt_genmask;   /* for generation of cloned routes */
  117         caddr_t rt_llinfo;              /* pointer to link level info cache */
  118         struct  rt_kmetrics rt_rmx;     /* metrics used by rx'ing protocols */
  119         struct  rtentry *rt_gwroute;    /* implied entry for gatewayed routes */
  120         struct  rtentry *rt_parent;     /* If cloned, parent of this route. */
  121         LIST_HEAD(, rttimer) rt_timer;  /* queue of timeouts for misc funcs */
  122         u_int16_t rt_labelid;           /* route label ID */
  123 };
  124 #define rt_use  rt_rmx.rmx_pksent
  125 
  126 #define RTF_UP          0x1             /* route usable */
  127 #define RTF_GATEWAY     0x2             /* destination is a gateway */
  128 #define RTF_HOST        0x4             /* host entry (net otherwise) */
  129 #define RTF_REJECT      0x8             /* host or net unreachable */
  130 #define RTF_DYNAMIC     0x10            /* created dynamically (by redirect) */
  131 #define RTF_MODIFIED    0x20            /* modified dynamically (by redirect) */
  132 #define RTF_DONE        0x40            /* message confirmed */
  133 #define RTF_MASK        0x80            /* subnet mask present */
  134 #define RTF_CLONING     0x100           /* generate new routes on use */
  135 #define RTF_XRESOLVE    0x200           /* external daemon resolves name */
  136 #define RTF_LLINFO      0x400           /* generated by ARP or ESIS */
  137 #define RTF_STATIC      0x800           /* manually added */
  138 #define RTF_BLACKHOLE   0x1000          /* just discard pkts (during updates) */
  139 #define RTF_PROTO3      0x2000          /* protocol specific routing flag */
  140 #define RTF_PROTO2      0x4000          /* protocol specific routing flag */
  141 #define RTF_PROTO1      0x8000          /* protocol specific routing flag */
  142 #define RTF_CLONED      0x10000         /* this is a cloned route */
  143 #define RTF_SOURCE      0x20000         /* this route has a source selector */
  144 #define RTF_MPATH       0x40000         /* multipath route or operation */
  145 #define RTF_JUMBO       0x80000         /* try to use jumbo frames */
  146 
  147 /* mask of RTF flags that are allowed to be modified by RTM_CHANGE */
  148 #define RTF_FMASK       \
  149     (RTF_JUMBO | RTF_PROTO1 | RTF_PROTO2 | RTF_PROTO3 | RTF_BLACKHOLE | \
  150      RTF_REJECT | RTF_STATIC)
  151 
  152 #ifndef _KERNEL
  153 /* obsoleted */
  154 #define RTF_TUNNEL      0x100000        /* Tunnelling bit. */
  155 #endif
  156 
  157 /*
  158  * Routing statistics.
  159  */
  160 struct  rtstat {
  161         u_int32_t rts_badredirect;      /* bogus redirect calls */
  162         u_int32_t rts_dynamic;          /* routes created by redirects */
  163         u_int32_t rts_newgateway;       /* routes modified by redirects */
  164         u_int32_t rts_unreach;          /* lookups which failed */
  165         u_int32_t rts_wildcard;         /* lookups satisfied by a wildcard */
  166 };
  167 
  168 /*
  169  * Structures for routing messages.
  170  */
  171 struct rt_msghdr {
  172         u_short rtm_msglen;     /* to skip over non-understood messages */
  173         u_char  rtm_version;    /* future binary compatibility */
  174         u_char  rtm_type;       /* message type */
  175         u_short rtm_index;      /* index for associated ifp */
  176         int     rtm_flags;      /* flags, incl. kern & message, e.g. DONE */
  177         int     rtm_addrs;      /* bitmask identifying sockaddrs in msg */
  178         pid_t   rtm_pid;        /* identify sender */
  179         int     rtm_seq;        /* for sender to identify action */
  180         int     rtm_errno;      /* why failed */
  181         int     rtm_use;        /* deprecated use rtm_rmx->rmx_pksent */
  182 #define rtm_fmask       rtm_use /* bitmask used in RTM_CHANGE message */
  183         u_long  rtm_inits;      /* which metrics we are initializing */
  184         struct  rt_metrics rtm_rmx; /* metrics themselves */
  185 };
  186 /* overload no longer used field */
  187 #define rtm_tableid     rtm_rmx.rmx_rt_tableid
  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_RESOLVE     0xb     /* req to resolve dst to LL addr */
  200 #define RTM_NEWADDR     0xc     /* address being added to iface */
  201 #define RTM_DELADDR     0xd     /* address being removed from iface */
  202 #define RTM_IFINFO      0xe     /* iface going up/down etc. */
  203 #define RTM_IFANNOUNCE  0xf     /* iface arrival/departure */
  204 
  205 #define RTV_MTU         0x1     /* init or lock _mtu */
  206 #define RTV_HOPCOUNT    0x2     /* init or lock _hopcount */
  207 #define RTV_EXPIRE      0x4     /* init or lock _hopcount */
  208 #define RTV_RPIPE       0x8     /* init or lock _recvpipe */
  209 #define RTV_SPIPE       0x10    /* init or lock _sendpipe */
  210 #define RTV_SSTHRESH    0x20    /* init or lock _ssthresh */
  211 #define RTV_RTT         0x40    /* init or lock _rtt */
  212 #define RTV_RTTVAR      0x80    /* init or lock _rttvar */
  213 
  214 /*
  215  * Bitmask values for rtm_addr.
  216  */
  217 #define RTA_DST         0x1     /* destination sockaddr present */
  218 #define RTA_GATEWAY     0x2     /* gateway sockaddr present */
  219 #define RTA_NETMASK     0x4     /* netmask sockaddr present */
  220 #define RTA_GENMASK     0x8     /* cloning mask sockaddr present */
  221 #define RTA_IFP         0x10    /* interface name sockaddr present */
  222 #define RTA_IFA         0x20    /* interface addr sockaddr present */
  223 #define RTA_AUTHOR      0x40    /* sockaddr for author of redirect */
  224 #define RTA_BRD         0x80    /* for NEWADDR, broadcast or p-p dest addr */
  225 #define RTA_SRC         0x100   /* source sockaddr present */
  226 #define RTA_SRCMASK     0x200   /* source netmask present */
  227 #define RTA_LABEL       0x400   /* route label present */
  228 
  229 /*
  230  * Index offsets for sockaddr array for alternate internal encoding.
  231  */
  232 #define RTAX_DST        0       /* destination sockaddr present */
  233 #define RTAX_GATEWAY    1       /* gateway sockaddr present */
  234 #define RTAX_NETMASK    2       /* netmask sockaddr present */
  235 #define RTAX_GENMASK    3       /* cloning mask sockaddr present */
  236 #define RTAX_IFP        4       /* interface name sockaddr present */
  237 #define RTAX_IFA        5       /* interface addr sockaddr present */
  238 #define RTAX_AUTHOR     6       /* sockaddr for author of redirect */
  239 #define RTAX_BRD        7       /* for NEWADDR, broadcast or p-p dest addr */
  240 #define RTAX_SRC        8       /* source sockaddr present */
  241 #define RTAX_SRCMASK    9       /* source netmask present */
  242 #define RTAX_LABEL      10      /* route label present */
  243 #define RTAX_MAX        11      /* size of array to allocate */
  244 
  245 struct rt_addrinfo {
  246         int     rti_addrs;
  247         struct  sockaddr *rti_info[RTAX_MAX];
  248         int     rti_flags;
  249         struct  ifaddr *rti_ifa;
  250         struct  ifnet *rti_ifp;
  251         struct  rt_msghdr *rti_rtm;
  252 };
  253 
  254 struct route_cb {
  255         int     ip_count;
  256         int     ip6_count;
  257         int     any_count;
  258 };
  259 
  260 /* 
  261  * This structure, and the prototypes for the rt_timer_{init,remove_all,
  262  * add,timer} functions all used with the kind permission of BSDI.
  263  * These allow functions to be called for routes at specific times.
  264  */
  265 
  266 struct rttimer {
  267         TAILQ_ENTRY(rttimer)    rtt_next;  /* entry on timer queue */
  268         LIST_ENTRY(rttimer)     rtt_link;  /* multiple timers per rtentry */
  269         struct rttimer_queue    *rtt_queue;/* back pointer to queue */
  270         struct rtentry          *rtt_rt;   /* Back pointer to the route */
  271         void                    (*rtt_func)(struct rtentry *, 
  272                                                  struct rttimer *);
  273         time_t                  rtt_time; /* When this timer was registered */
  274 };
  275 
  276 struct rttimer_queue {
  277         long                            rtq_timeout;
  278         unsigned long                   rtq_count;
  279         TAILQ_HEAD(, rttimer)           rtq_head;
  280         LIST_ENTRY(rttimer_queue)       rtq_link;
  281 };
  282 
  283 #define RTLABEL_LEN     32
  284 
  285 struct sockaddr_rtlabel {
  286         u_int8_t        sr_len;                 /* total length */
  287         sa_family_t     sr_family;              /* address family */
  288         char            sr_label[RTLABEL_LEN];
  289 };
  290 
  291 #define RT_TABLEID_MAX  255
  292 
  293 #ifdef _KERNEL
  294 const char      *rtlabel_id2name(u_int16_t);
  295 u_int16_t        rtlabel_name2id(char *);
  296 void             rtlabel_unref(u_int16_t);
  297 
  298 #define RTFREE(rt) do { \
  299         if ((rt)->rt_refcnt <= 1) \
  300                 rtfree(rt); \
  301         else \
  302                 (rt)->rt_refcnt--; \
  303 } while (0)
  304 
  305 /*
  306  * Values for additional argument to rtalloc_noclone() and rtalloc2()
  307  */
  308 #define ALL_CLONING 0
  309 #define ONNET_CLONING 1
  310 #define NO_CLONING 2
  311 
  312 extern struct route_cb route_cb;
  313 extern struct rtstat rtstat;
  314 extern const struct sockaddr_rtin rt_defmask4;
  315 
  316 struct  socket;
  317 void     route_init(void);
  318 int      rtable_add(u_int);
  319 int      rtable_exists(u_int);
  320 int      route_output(struct mbuf *, ...);
  321 int      route_usrreq(struct socket *, int, struct mbuf *,
  322                            struct mbuf *, struct mbuf *);
  323 void     rt_ifmsg(struct ifnet *);
  324 void     rt_ifannouncemsg(struct ifnet *, int);
  325 void     rt_maskedcopy(struct sockaddr *,
  326             struct sockaddr *, struct sockaddr *);
  327 void     rt_missmsg(int, struct rt_addrinfo *, int, struct ifnet *, int,
  328             u_int);
  329 void     rt_newaddrmsg(int, struct ifaddr *, int, struct rtentry *);
  330 int      rt_setgate(struct rtentry *, struct sockaddr *,
  331             struct sockaddr *, u_int);
  332 void     rt_setmetrics(u_long, struct rt_metrics *, struct rt_kmetrics *);
  333 void     rt_getmetrics(struct rt_kmetrics *, struct rt_metrics *);
  334 int      rt_timer_add(struct rtentry *,
  335              void(*)(struct rtentry *, struct rttimer *),
  336              struct rttimer_queue *);
  337 void     rt_timer_init(void);
  338 struct rttimer_queue *
  339          rt_timer_queue_create(u_int);
  340 void     rt_timer_queue_change(struct rttimer_queue *, long);
  341 void     rt_timer_queue_destroy(struct rttimer_queue *, int);
  342 void     rt_timer_remove_all(struct rtentry *);
  343 unsigned long   rt_timer_count(struct rttimer_queue *);
  344 void     rt_timer_timer(void *);
  345 void     rtalloc(struct route *);
  346 #ifdef SMALL_KERNEL
  347 #define rtalloc_mpath(r, s, t)  rtalloc(r)
  348 #endif
  349 struct rtentry *
  350          rtalloc1(struct sockaddr *, int, u_int);
  351 void     rtalloc_noclone(struct route *, int);
  352 struct rtentry *
  353          rtalloc2(struct sockaddr *, int, int);
  354 void     rtfree(struct rtentry *);
  355 int      rt_getifa(struct rt_addrinfo *);
  356 int      rtinit(struct ifaddr *, int, int);
  357 int      rtioctl(u_long, caddr_t, struct proc *);
  358 void     rtredirect(struct sockaddr *, struct sockaddr *,
  359                          struct sockaddr *, int, struct sockaddr *,
  360                          struct rtentry **);
  361 int      rtrequest(int, struct sockaddr *,
  362                         struct sockaddr *, struct sockaddr *, int,
  363                         struct rtentry **, u_int);
  364 int      rtrequest1(int, struct rt_addrinfo *, struct rtentry **, u_int);
  365 void     rt_if_remove(struct ifnet *);
  366 
  367 struct radix_node_head  *rt_gettable(sa_family_t, u_int);
  368 struct radix_node       *rt_lookup(struct sockaddr *, struct sockaddr *, int);
  369 #endif /* _KERNEL */
  370 #endif /* _NET_ROUTE_H_ */

/* [<][>][^][v][top][bottom][index][help] */