-/* 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;
- 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_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