BSD 4_4_Lite2 release
[unix-history] / usr / src / sys / net / route.h
index 1e8d4f9..95a8eff 100644 (file)
@@ -1,10 +1,36 @@
 /*
 /*
- * Copyright (c) 1980, 1986 Regents of the University of California.
- * All rights reserved.
+ * Copyright (c) 1980, 1986, 1993
+ *     The Regents of the University of California.  All rights reserved.
  *
  *
- * %sccs.include.redist.c%
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
  *
  *
- *     @(#)route.h     7.11 (Berkeley) %G%
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *     @(#)route.h     8.5 (Berkeley) 2/8/95
  */
 
 /*
  */
 
 /*
@@ -38,6 +64,7 @@ struct rt_metrics {
        u_long  rmx_ssthresh;   /* outbound gateway buffer limit */
        u_long  rmx_rtt;        /* estimated round trip time */
        u_long  rmx_rttvar;     /* estimated rtt variance */
        u_long  rmx_ssthresh;   /* outbound gateway buffer limit */
        u_long  rmx_rtt;        /* estimated round trip time */
        u_long  rmx_rttvar;     /* estimated rtt variance */
+       u_long  rmx_pksent;     /* packets sent using this route */
 };
 
 /*
 };
 
 /*
@@ -56,7 +83,9 @@ struct rt_metrics {
  * gateways are marked so that the output routines know to address the
  * gateway rather than the ultimate destination.
  */
  * gateways are marked so that the output routines know to address the
  * gateway rather than the ultimate destination.
  */
-#include "radix.h"
+#ifndef RNF_NORMAL
+#include <net/radix.h>
+#endif
 struct rtentry {
        struct  radix_node rt_nodes[2]; /* tree glue, and other values */
 #define        rt_key(r)       ((struct sockaddr *)((r)->rt_nodes->rn_key))
 struct rtentry {
        struct  radix_node rt_nodes[2]; /* tree glue, and other values */
 #define        rt_key(r)       ((struct sockaddr *)((r)->rt_nodes->rn_key))
@@ -70,7 +99,7 @@ struct rtentry {
        struct  sockaddr *rt_genmask;   /* for generation of cloned routes */
        caddr_t rt_llinfo;              /* pointer to link level info cache */
        struct  rt_metrics rt_rmx;      /* metrics used by rx'ing protocols */
        struct  sockaddr *rt_genmask;   /* for generation of cloned routes */
        caddr_t rt_llinfo;              /* pointer to link level info cache */
        struct  rt_metrics rt_rmx;      /* metrics used by rx'ing protocols */
-       short   rt_idle;                /* easy to tell llayer still live */
+       struct  rtentry *rt_gwroute;    /* implied entry for gatewayed routes */
 };
 
 /*
 };
 
 /*
@@ -87,9 +116,10 @@ struct ortentry {
        struct  ifnet *rt_ifp;          /* the answer: interface to use */
 };
 
        struct  ifnet *rt_ifp;          /* the answer: interface to use */
 };
 
-#define        RTF_UP          0x1             /* route useable */
+#define        RTF_UP          0x1             /* route usable */
 #define        RTF_GATEWAY     0x2             /* destination is a gateway */
 #define        RTF_HOST        0x4             /* host entry (net otherwise) */
 #define        RTF_GATEWAY     0x2             /* destination is a gateway */
 #define        RTF_HOST        0x4             /* host entry (net otherwise) */
+#define        RTF_REJECT      0x8             /* host or net unreachable */
 #define        RTF_DYNAMIC     0x10            /* created dynamically (by redirect) */
 #define        RTF_MODIFIED    0x20            /* modified dynamically (by redirect) */
 #define RTF_DONE       0x40            /* message confirmed */
 #define        RTF_DYNAMIC     0x10            /* created dynamically (by redirect) */
 #define        RTF_MODIFIED    0x20            /* modified dynamically (by redirect) */
 #define RTF_DONE       0x40            /* message confirmed */
@@ -97,6 +127,10 @@ struct ortentry {
 #define RTF_CLONING    0x100           /* generate new routes on use */
 #define RTF_XRESOLVE   0x200           /* external daemon resolves name */
 #define RTF_LLINFO     0x400           /* generated by ARP or ESIS */
 #define RTF_CLONING    0x100           /* generate new routes on use */
 #define RTF_XRESOLVE   0x200           /* external daemon resolves name */
 #define RTF_LLINFO     0x400           /* generated by ARP or ESIS */
+#define RTF_STATIC     0x800           /* manually added */
+#define RTF_BLACKHOLE  0x1000          /* just discard pkts (during updates) */
+#define RTF_PROTO2     0x4000          /* protocol specific routing flag */
+#define RTF_PROTO1     0x8000          /* protocol specific routing flag */
 
 
 /*
 
 
 /*
@@ -114,26 +148,20 @@ struct    rtstat {
  */
 struct rt_msghdr {
        u_short rtm_msglen;     /* to skip over non-understood messages */
  */
 struct rt_msghdr {
        u_short rtm_msglen;     /* to skip over non-understood messages */
-       u_char  rtm_version;    /* future binary compatability */
+       u_char  rtm_version;    /* future binary compatibility */
        u_char  rtm_type;       /* message type */
        u_short rtm_index;      /* index for associated ifp */
        u_char  rtm_type;       /* message type */
        u_short rtm_index;      /* index for associated ifp */
-       pid_t   rtm_pid;        /* identify sender */
+       int     rtm_flags;      /* flags, incl. kern & message, e.g. DONE */
        int     rtm_addrs;      /* bitmask identifying sockaddrs in msg */
        int     rtm_addrs;      /* bitmask identifying sockaddrs in msg */
+       pid_t   rtm_pid;        /* identify sender */
        int     rtm_seq;        /* for sender to identify action */
        int     rtm_errno;      /* why failed */
        int     rtm_seq;        /* for sender to identify action */
        int     rtm_errno;      /* why failed */
-       int     rtm_flags;      /* flags, incl. kern & message, e.g. DONE */
        int     rtm_use;        /* from rtentry */
        u_long  rtm_inits;      /* which metrics we are initializing */
        struct  rt_metrics rtm_rmx; /* metrics themselves */
 };
 
        int     rtm_use;        /* from rtentry */
        u_long  rtm_inits;      /* which metrics we are initializing */
        struct  rt_metrics rtm_rmx; /* metrics themselves */
 };
 
-struct route_cb {
-       int     ip_count;
-       int     ns_count;
-       int     iso_count;
-       int     any_count;
-};
-#define RTM_VERSION    2       /* Up the ante and ignore older versions */
+#define RTM_VERSION    3       /* Up the ante and ignore older versions */
 
 #define RTM_ADD                0x1     /* Add Route */
 #define RTM_DELETE     0x2     /* Delete Route */
 
 #define RTM_ADD                0x1     /* Add Route */
 #define RTM_DELETE     0x2     /* Delete Route */
@@ -146,6 +174,9 @@ struct route_cb {
 #define RTM_OLDADD     0x9     /* caused by SIOCADDRT */
 #define RTM_OLDDEL     0xa     /* caused by SIOCDELRT */
 #define RTM_RESOLVE    0xb     /* req to resolve dst to LL addr */
 #define RTM_OLDADD     0x9     /* caused by SIOCADDRT */
 #define RTM_OLDDEL     0xa     /* caused by SIOCDELRT */
 #define RTM_RESOLVE    0xb     /* req to resolve dst to LL addr */
+#define RTM_NEWADDR    0xc     /* address being added to iface */
+#define RTM_DELADDR    0xd     /* address being removed from iface */
+#define RTM_IFINFO     0xe     /* iface going up/down etc. */
 
 #define RTV_MTU                0x1     /* init or lock _mtu */
 #define RTV_HOPCOUNT   0x2     /* init or lock _hopcount */
 
 #define RTV_MTU                0x1     /* init or lock _mtu */
 #define RTV_HOPCOUNT   0x2     /* init or lock _hopcount */
@@ -156,6 +187,9 @@ struct route_cb {
 #define RTV_RTT                0x40    /* init or lock _rtt */
 #define RTV_RTTVAR     0x80    /* init or lock _rttvar */
 
 #define RTV_RTT                0x40    /* init or lock _rtt */
 #define RTV_RTTVAR     0x80    /* init or lock _rttvar */
 
+/*
+ * Bitmask values for rtm_addr.
+ */
 #define RTA_DST                0x1     /* destination sockaddr present */
 #define RTA_GATEWAY    0x2     /* gateway sockaddr present */
 #define RTA_NETMASK    0x4     /* netmask sockaddr present */
 #define RTA_DST                0x1     /* destination sockaddr present */
 #define RTA_GATEWAY    0x2     /* gateway sockaddr present */
 #define RTA_NETMASK    0x4     /* netmask sockaddr present */
@@ -163,10 +197,32 @@ struct route_cb {
 #define RTA_IFP                0x10    /* interface name sockaddr present */
 #define RTA_IFA                0x20    /* interface addr sockaddr present */
 #define RTA_AUTHOR     0x40    /* sockaddr for author of redirect */
 #define RTA_IFP                0x10    /* interface name sockaddr present */
 #define RTA_IFA                0x20    /* interface addr sockaddr present */
 #define RTA_AUTHOR     0x40    /* sockaddr for author of redirect */
+#define RTA_BRD                0x80    /* for NEWADDR, broadcast or p-p dest addr */
 
 
-#ifdef KERNEL
-struct route_cb route_cb;
-#endif
+/*
+ * Index offsets for sockaddr array for alternate internal encoding.
+ */
+#define RTAX_DST       0       /* destination sockaddr present */
+#define RTAX_GATEWAY   1       /* gateway sockaddr present */
+#define RTAX_NETMASK   2       /* netmask sockaddr present */
+#define RTAX_GENMASK   3       /* cloning mask sockaddr present */
+#define RTAX_IFP       4       /* interface name sockaddr present */
+#define RTAX_IFA       5       /* interface addr sockaddr present */
+#define RTAX_AUTHOR    6       /* sockaddr for author of redirect */
+#define RTAX_BRD       7       /* for NEWADDR, broadcast or p-p dest addr */
+#define RTAX_MAX       8       /* size of array to allocate */
+
+struct rt_addrinfo {
+       int     rti_addrs;
+       struct  sockaddr *rti_info[RTAX_MAX];
+};
+
+struct route_cb {
+       int     ip_count;
+       int     ns_count;
+       int     iso_count;
+       int     any_count;
+};
 
 #ifdef KERNEL
 #define        RTFREE(rt) \
 
 #ifdef KERNEL
 #define        RTFREE(rt) \
@@ -175,18 +231,33 @@ struct route_cb route_cb;
        else \
                (rt)->rt_refcnt--;
 
        else \
                (rt)->rt_refcnt--;
 
-#ifdef GATEWAY
-#define        RTHASHSIZ       64
-#else
-#define        RTHASHSIZ       8
-#endif
-#if    (RTHASHSIZ & (RTHASHSIZ - 1)) == 0
-#define RTHASHMOD(h)   ((h) & (RTHASHSIZ - 1))
-#else
-#define RTHASHMOD(h)   ((h) % RTHASHSIZ)
-#endif
-struct mbuf *rthost[RTHASHSIZ];
-struct mbuf *rtnet[RTHASHSIZ];
+struct route_cb route_cb;
 struct rtstat  rtstat;
 struct rtstat  rtstat;
-struct rtentry *rtalloc1();
+struct radix_node_head *rt_tables[AF_MAX+1];
+
+struct socket;
+
+void    route_init __P((void));
+int     route_output __P((struct mbuf *, struct socket *));
+int     route_usrreq __P((struct socket *,
+           int, struct mbuf *, struct mbuf *, struct mbuf *));
+void    rt_ifmsg __P((struct ifnet *));
+void    rt_maskedcopy __P((struct sockaddr *,
+           struct sockaddr *, struct sockaddr *));
+void    rt_missmsg __P((int, struct rt_addrinfo *, int, int));
+void    rt_newaddrmsg __P((int, struct ifaddr *, int, struct rtentry *));
+int     rt_setgate __P((struct rtentry *,
+           struct sockaddr *, struct sockaddr *));
+void    rt_setmetrics __P((u_long, struct rt_metrics *, struct rt_metrics *));
+void    rtable_init __P((void **));
+void    rtalloc __P((struct route *));
+struct rtentry *
+        rtalloc1 __P((struct sockaddr *, int));
+void    rtfree __P((struct rtentry *));
+int     rtinit __P((struct ifaddr *, int, int));
+int     rtioctl __P((u_long, caddr_t, struct proc *));
+int     rtredirect __P((struct sockaddr *, struct sockaddr *,
+           struct sockaddr *, int, struct sockaddr *, struct rtentry **));
+int     rtrequest __P((int, struct sockaddr *,
+           struct sockaddr *, struct sockaddr *, int, struct rtentry **));
 #endif
 #endif