add Berkeley header
[unix-history] / usr / src / sys / net / route.h
index 54fdb54..7d1e083 100644 (file)
@@ -1,44 +1,87 @@
-/*     route.h 4.5     82/03/30        */
-
 /*
 /*
- * Structure of kernel resident routing
- * data base.  Assumption is user routing
- * daemon maintains this data base based
- * on routing information it gleans from
- * gateway protocols it listens to (e.g. GGP).
+ * Copyright (c) 1980, 1986 Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that this notice is preserved and that due credit is given
+ * to the University of California at Berkeley. The name of the University
+ * may not be used to endorse or promote products derived from this
+ * software without specific prior written permission. This software
+ * is provided ``as is'' without express or implied warranty.
  *
  *
- * TO ADD:
- *     more statistics -- smooth usage figures
+ *     @(#)route.h     7.3 (Berkeley) %G%
  */
  */
-struct rtentry {
-       u_long  rt_hash[2];             /* [0] for net, [1] for host */
-       struct  sockaddr rt_dst;        /* match value */
-       struct  sockaddr rt_gateway;    /* who to forward to */
-       short   rt_flags;               /* see below */
-       short   rt_refcnt;              /* # held references */
-       u_long  rt_use;                 /* raw # packets forwarded */
-       struct  ifnet *rt_ifp;          /* interface to use */
-};
 
 
+/*
+ * Kernel resident routing tables.
+ * 
+ * The routing tables are initialized when interface addresses
+ * are set by making entries for all directly connected interfaces.
+ */
+
+/*
+ * A route consists of a destination address and a reference
+ * to a routing entry.  These are often held by protocols
+ * in their control blocks, e.g. inpcb.
+ */
 struct route {
        struct  rtentry *ro_rt;
        struct  sockaddr ro_dst;
 struct route {
        struct  rtentry *ro_rt;
        struct  sockaddr ro_dst;
-       caddr_t ro_pcb;                 /* back pointer? */
 };
 
 /*
 };
 
 /*
- * Flags and host/network status.
+ * We distinguish between routes to hosts and routes to networks,
+ * preferring the former if available.  For each route we infer
+ * the interface to use from the gateway address supplied when
+ * the route was entered.  Routes that forward packets through
+ * gateways are marked so that the output routines know to address the
+ * gateway rather than the ultimate destination.
  */
  */
+struct rtentry {
+       u_long  rt_hash;                /* to speed lookups */
+       struct  sockaddr rt_dst;        /* key */
+       struct  sockaddr rt_gateway;    /* value */
+       short   rt_flags;               /* up/down?, host/net */
+       short   rt_refcnt;              /* # held references */
+       u_long  rt_use;                 /* raw # packets forwarded */
+       struct  ifnet *rt_ifp;          /* the answer: interface to use */
+};
+
 #define        RTF_UP          0x1             /* route useable */
 #define        RTF_UP          0x1             /* route useable */
-#define        RTF_DIRECT      0x2             /* destination is a neighbor */
+#define        RTF_GATEWAY     0x2             /* destination is a gateway */
+#define        RTF_HOST        0x4             /* host entry (net otherwise) */
+#define        RTF_DYNAMIC     0x10            /* created dynamically (by redirect) */
+#define        RTF_MODIFIED    0x20            /* modified dynamically (by redirect) */
 
 
-#ifdef KERNEL
 /*
 /*
- * Lookup are hashed by a key.  Each hash bucket
- * consists of a linked list of mbuf's
- * containing routing entries.  Dead entries are
- * reclaimed along with mbufs.
+ * Routing statistics.
  */
  */
-#define        RTHASHSIZ       16
-struct mbuf *routehash[RTHASHSIZ];
+struct rtstat {
+       short   rts_badredirect;        /* bogus redirect calls */
+       short   rts_dynamic;            /* routes created by redirects */
+       short   rts_newgateway;         /* routes modified by redirects */
+       short   rts_unreach;            /* lookups which failed */
+       short   rts_wildcard;           /* lookups satisfied by a wildcard */
+};
+
+#ifdef KERNEL
+#define        RTFREE(rt) \
+       if ((rt)->rt_refcnt == 1) \
+               rtfree(rt); \
+       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 rtstat  rtstat;
 #endif
 #endif