Take steps to hide the radix_node implementation of the forwarding table trunk
authordyoung <dyoung@NetBSD.org>
Thu, 19 Jul 2007 20:48:52 +0000
branchtrunk
changeset 160532 102e2ce77664
parent 160531 8dd2544fcc39
child 160533 b3207483d4e0
Take steps to hide the radix_node implementation of the forwarding table from the forwarding table's users: Introduce rt_walktree() for walking the routing table and applying a function to each rtentry. Replace most rn_walktree() calls with it. Use rt_getkey()/rt_setkey() to get/set a route's destination. Keep a pointer to the sockaddr key in the rtentry, so that rtentry users do not have to grovel in the radix_node for the key. Add a RTM_GET method to rtrequest. Use that instead of radix_node lookups in, e.g., carp(4). Add sys/net/link_proto.c, which supplies sockaddr routines for link-layer socket addresses (sockaddr_dl). Cosmetic: Constify. KNF. Stop open-coding LIST_FOREACH, TAILQ_FOREACH, et cetera. Use NULL instead of 0 for null pointers. Use __arraycount(). Reduce gratuitous parenthesization. Stop using variadic arguments for rip6_output(), it is unnecessary. Remove the unnecessary rtentry member rt_genmask and the code to maintain it, since nothing actually used it. Make rt_maskedcopy() easier to read by using meaningful variable names. Extract a subroutine intern_netmask() for looking up a netmask in the masks table. Start converting backslash-ridden IPv6 macros in sys/netinet6/in6_var.h into inline subroutines that one can read without special eyeglasses. One functional change: when the kernel serves an RTM_GET, RTM_LOCK, or RTM_CHANGE request, it applies the netmask (if supplied) to a destination before searching for it in the forwarding table. I have changed sys/netinet/ip_carp.c, carp_setroute(), to remove the unlawful radix_node knowledge. Apart from the changes to carp(4), netiso, ATM, and strip(4), I have run the changes on three nodes in my wireless routing testbed, which involves IPv4 + IPv6 dynamic routing acrobatics, and it's working beautifully so far.
sys/net/if.c
sys/net/if_strip.c
sys/net/link_proto.c
sys/net/route.c
sys/net/route.h
sys/net/rtsock.c
sys/netinet/if_arp.c
sys/netinet/if_atm.c
sys/netinet/in_pcb.c
sys/netinet/ip_carp.c
sys/netinet/ip_icmp.c
sys/netinet/ip_input.c
sys/netinet/tcp_subr.c
sys/netinet6/icmp6.c
sys/netinet6/in6.c
sys/netinet6/in6_pcb.c
sys/netinet6/in6_var.h
sys/netinet6/ip6_input.c
sys/netinet6/ip6_var.h
sys/netinet6/ip6protosw.h
sys/netinet6/nd6.c
sys/netinet6/nd6.h
sys/netinet6/nd6_nbr.c
sys/netinet6/nd6_rtr.c
sys/netinet6/raw_ip6.c
sys/netiso/clnp_subr.c
sys/netiso/esis.c
sys/netiso/esis.h
sys/netiso/iso_snpac.c
sys/nfs/nfs_boot.c
--- a/sys/net/if.c	Thu Jul 19 20:48:51 2007 +0000
+++ b/sys/net/if.c	Thu Jul 19 20:48:52 2007 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: if.c,v 1.193 2007/07/09 21:10:59 ad Exp $	*/
+/*	$NetBSD: if.c,v 1.194 2007/07/19 20:48:52 dyoung Exp $	*/
 
 /*-
  * Copyright (c) 1999, 2000, 2001 The NetBSD Foundation, Inc.
@@ -97,7 +97,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if.c,v 1.193 2007/07/09 21:10:59 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if.c,v 1.194 2007/07/19 20:48:52 dyoung Exp $");
 
 #include "opt_inet.h"
 
@@ -745,7 +745,7 @@
 
 	/* Delete the entry. */
 	++rt->rt_refcnt;
-	error = rtrequest(RTM_DELETE, rt_key(rt), rt->rt_gateway,
+	error = rtrequest(RTM_DELETE, rt_getkey(rt), rt->rt_gateway,
 	    rt_mask(rt), rt->rt_flags, NULL);
 	KASSERT((rt->rt_flags & RTF_UP) == 0);
 	rt->rt_ifp = NULL;
@@ -897,6 +897,12 @@
 	return error;
 }
 
+static inline int
+equal(const struct sockaddr *sa1, const struct sockaddr *sa2)
+{
+	return sockaddr_cmp(sa1, sa2) == 0;
+}
+
 /*
  * Locate an interface based on a complete address.
  */
@@ -907,9 +913,6 @@
 	struct ifnet *ifp;
 	struct ifaddr *ifa;
 
-#define	equal(a1, a2) \
-  (memcmp((a1), (a2), ((const struct sockaddr *)(a1))->sa_len) == 0)
-
 	IFNET_FOREACH(ifp) {
 		if (ifp->if_output == if_nulloutput)
 			continue;
@@ -1113,11 +1116,11 @@
 link_rtrequest(int cmd, struct rtentry *rt, struct rt_addrinfo *info)
 {
 	struct ifaddr *ifa;
-	struct sockaddr *dst;
+	const struct sockaddr *dst;
 	struct ifnet *ifp;
 
 	if (cmd != RTM_ADD || ((ifa = rt->rt_ifa) == NULL) ||
-	    ((ifp = ifa->ifa_ifp) == NULL) || ((dst = rt_key(rt)) == NULL))
+	    ((ifp = ifa->ifa_ifp) == NULL) || ((dst = rt_getkey(rt)) == NULL))
 		return;
 	if ((ifa = ifaof_ifpforaddr(dst, ifp)) != NULL) {
 		rt_replace_ifa(rt, ifa);
--- a/sys/net/if_strip.c	Thu Jul 19 20:48:51 2007 +0000
+++ b/sys/net/if_strip.c	Thu Jul 19 20:48:52 2007 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_strip.c,v 1.76 2007/07/14 21:02:41 ad Exp $	*/
+/*	$NetBSD: if_strip.c,v 1.77 2007/07/19 20:48:52 dyoung Exp $	*/
 /*	from: NetBSD: if_sl.c,v 1.38 1996/02/13 22:00:23 christos Exp $	*/
 
 /*
@@ -87,7 +87,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_strip.c,v 1.76 2007/07/14 21:02:41 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_strip.c,v 1.77 2007/07/19 20:48:52 dyoung Exp $");
 
 #include "opt_inet.h"
 #include "bpfilter.h"
@@ -761,10 +761,10 @@
 #ifdef DEBUG
 	if (rt) {
 	   	printf("stripout, rt: dst af%d gw af%d",
-		    rt_key(rt)->sa_family, rt->rt_gateway->sa_family);
-		if (rt_key(rt)->sa_family == AF_INET)
+		    rt_getkey(rt)->sa_family, rt->rt_gateway->sa_family);
+		if (rt_getkey(rt)->sa_family == AF_INET)
 		  printf(" dst %x",
-		      satocsin(rt_key(rt))->sin_addr.s_addr);
+		      satocsin(rt_getkey(rt))->sin_addr.s_addr);
 		printf("\n");
 	}
 #endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/net/link_proto.c	Thu Jul 19 20:48:52 2007 +0000
@@ -0,0 +1,160 @@
+/*	$NetBSD: link_proto.c,v 1.1 2007/07/19 20:48:52 dyoung Exp $	*/
+
+/*-
+ * Copyright (c) 1982, 1986, 1993
+ *	The Regents of the University of California.  All rights reserved.
+ *
+ * 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. 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.
+ *
+ * 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.
+ *
+ *	@(#)uipc_proto.c	8.2 (Berkeley) 2/14/95
+ */
+
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: link_proto.c,v 1.1 2007/07/19 20:48:52 dyoung Exp $");
+
+#include <sys/param.h>
+#include <sys/socket.h>
+#include <sys/protosw.h>
+#include <sys/domain.h>
+#include <sys/mbuf.h>
+#include <sys/un.h>
+#include <sys/socketvar.h>
+
+#include <net/if.h>
+#include <net/if_dl.h>
+#include <net/raw_cb.h>
+
+static int sockaddr_dl_cmp(const struct sockaddr *, const struct sockaddr *);
+
+/*
+ * Definitions of protocols supported in the link-layer domain.
+ */
+
+DOMAIN_DEFINE(linkdomain);	/* forward define and add to link set */
+
+POOL_INIT(sockaddr_dl_pool, sizeof(struct sockaddr_dl), 0, 0, 0,
+    "sockaddr_dl_pool", NULL, IPL_NET);
+
+struct domain linkdomain = {
+	.dom_family = AF_LINK,
+	.dom_name = "link",
+	.dom_externalize = NULL,
+	.dom_dispose = NULL,
+	.dom_protosw = NULL,
+	.dom_protoswNPROTOSW = NULL,
+	.dom_sa_pool = &sockaddr_dl_pool,
+	.dom_sa_len = sizeof(struct sockaddr_dl),
+	.dom_sockaddr_cmp = sockaddr_dl_cmp
+};
+
+#define	satocsdl(__sa)	((const struct sockaddr_dl *)(__sa))
+
+/* Compare the field at byte offsets [fieldstart, fieldend) in
+ * two memory regions, [l, l + llen) and [r, r + llen).
+ */
+static inline int
+submemcmp(const void *l, const void *r,
+    const uint_fast8_t llen, const uint_fast8_t rlen,
+    const uint_fast8_t fieldstart, const uint_fast8_t fieldend)
+{
+	uint_fast8_t cmpend, minlen;
+	const uint8_t *lb = l, *rb = r;
+	int rc;
+
+	minlen = MIN(llen, rlen);
+
+	/* The field is missing from one region.  The shorter region is the
+	 * lesser region.
+	 */
+	if (fieldstart >= minlen)
+		return llen - rlen;
+
+	/* Two empty, present fields are always equal. */
+	if (fieldstart > fieldend)
+		return 0;
+
+	cmpend = MIN(fieldend, minlen);
+
+	rc = memcmp(&lb[fieldstart], &rb[fieldstart], cmpend - fieldstart);
+
+	if (rc != 0)
+		return rc;
+	/* If one or both fields are truncated, then the shorter is the lesser
+	 * field.
+	 */
+	if (minlen < fieldend)
+		return llen - rlen;
+	/* Fields are full-length and equal.  The fields are equal. */
+	return 0;
+}
+
+static int
+sockaddr_dl_cmp(const struct sockaddr *sa1, const struct sockaddr *sa2)
+{
+	int rc;
+	const uint_fast8_t indexofs = offsetof(struct sockaddr_dl, sdl_index);
+	const uint_fast8_t nlenofs = offsetof(struct sockaddr_dl, sdl_nlen);
+	uint_fast8_t dataofs = offsetof(struct sockaddr_dl, sdl_data[0]);
+	const struct sockaddr_dl *sdl1, *sdl2;
+
+	sdl1 = satocsdl(sa1);
+	sdl2 = satocsdl(sa2);
+
+	rc = submemcmp(sdl1, sdl2, sdl1->sdl_len, sdl2->sdl_len,
+	    indexofs, nlenofs);
+
+	if (rc != 0)
+		return rc;
+
+	rc = submemcmp(sdl1, sdl2, sdl1->sdl_len, sdl2->sdl_len,
+	    dataofs, dataofs + MIN(sdl1->sdl_nlen, sdl2->sdl_nlen));
+
+	if (rc != 0)
+		return rc;
+
+	if (sdl1->sdl_nlen != sdl2->sdl_nlen)
+		return sdl1->sdl_nlen - sdl2->sdl_nlen;
+
+	dataofs += sdl1->sdl_nlen;
+
+	rc = submemcmp(sdl1, sdl2, sdl1->sdl_len, sdl2->sdl_len,
+	    dataofs, dataofs + MIN(sdl1->sdl_alen, sdl2->sdl_alen));
+
+	if (rc != 0)
+		return rc;
+
+	if (sdl1->sdl_alen != sdl2->sdl_alen)
+		return sdl1->sdl_alen - sdl2->sdl_alen;
+
+	dataofs += sdl1->sdl_alen;
+
+	rc = submemcmp(sdl1, sdl2, sdl1->sdl_len, sdl2->sdl_len,
+	    dataofs, dataofs + MIN(sdl1->sdl_slen, sdl2->sdl_slen));
+
+	if (sdl1->sdl_slen != sdl2->sdl_slen)
+		return sdl1->sdl_slen - sdl2->sdl_slen;
+
+	return sdl1->sdl_len - sdl2->sdl_len;
+}
--- a/sys/net/route.c	Thu Jul 19 20:48:51 2007 +0000
+++ b/sys/net/route.c	Thu Jul 19 20:48:52 2007 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: route.c,v 1.93 2007/07/09 21:11:01 ad Exp $	*/
+/*	$NetBSD: route.c,v 1.94 2007/07/19 20:48:53 dyoung Exp $	*/
 
 /*-
  * Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -100,7 +100,7 @@
 #include "opt_route.h"
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: route.c,v 1.93 2007/07/09 21:11:01 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: route.c,v 1.94 2007/07/19 20:48:53 dyoung Exp $");
 
 #include <sys/param.h>
 #include <sys/sysctl.h>
@@ -187,7 +187,7 @@
 		return ifa;
 #endif
 	else {
-		ifa = (*ifa->ifa_getifa)(ifa, rt_key(rt));
+		ifa = (*ifa->ifa_getifa)(ifa, rt_getkey(rt));
 		rt_replace_ifa(rt, ifa);
 		return ifa;
 	}
@@ -334,7 +334,7 @@
 			}
 			/* Inform listeners of the new route */
 			memset(&info, 0, sizeof(info));
-			info.rti_info[RTAX_DST] = rt_key(rt);
+			info.rti_info[RTAX_DST] = rt_getkey(rt);
 			info.rti_info[RTAX_NETMASK] = rt_mask(rt);
 			info.rti_info[RTAX_GATEWAY] = rt->rt_gateway;
 			if (rt->rt_ifp != NULL) {
@@ -378,7 +378,7 @@
 		rt->rt_ifa = NULL;
 		IFAFREE(ifa);
 		rt->rt_ifp = NULL;
-		Free(rt_key(rt));
+		rt_destroy(rt);
 		pool_put(&rtentry_pool, rt);
 	}
 }
@@ -399,6 +399,12 @@
 	free(ifa, M_IFADDR);
 }
 
+static inline int
+equal(const struct sockaddr *sa1, const struct sockaddr *sa2)
+{
+	return sockaddr_cmp(sa1, sa2) == 0;
+}
+
 /*
  * Force a routing table entry to the specified
  * destination to go through the given gateway.
@@ -430,9 +436,6 @@
 	 * we have a routing loop, perhaps as a result of an interface
 	 * going down recently.
 	 */
-#define	equal(a1, a2) \
-	((a1)->sa_len == (a2)->sa_len && \
-	 memcmp((a1), (a2), (a1)->sa_len) == 0)
 	if (!(flags & RTF_DONE) && rt &&
 	     (!equal(src, rt->rt_gateway) || rt->rt_ifa != ifa))
 		error = EINVAL;
@@ -480,7 +483,7 @@
 			rt->rt_flags |= RTF_MODIFIED;
 			flags |= RTF_MODIFIED;
 			stat = &rtstat.rts_newgateway;
-			rt_setgate(rt, rt_key(rt), gateway);
+			rt_setgate(rt, gateway);
 		}
 	} else
 		error = EHOSTUNREACH;
@@ -519,7 +522,7 @@
 	 * be accurate (and consistent with route_output()).
 	 */
 	memset((void *)&info, 0, sizeof(info));
-	info.rti_info[RTAX_DST] = rt_key(rt);
+	info.rti_info[RTAX_DST] = rt_getkey(rt);
 	info.rti_info[RTAX_NETMASK] = rt_mask(rt);
 	info.rti_info[RTAX_GATEWAY] = rt->rt_gateway;
 	info.rti_flags = rt->rt_flags;
@@ -677,7 +680,7 @@
 	struct radix_node *rn;
 	struct radix_node_head *rnh;
 	struct ifaddr *ifa;
-	struct sockaddr_storage deldst;
+	struct sockaddr_storage maskeddst;
 	const struct sockaddr *dst = info->rti_info[RTAX_DST];
 	const struct sockaddr *gateway = info->rti_info[RTAX_GATEWAY];
 	const struct sockaddr *netmask = info->rti_info[RTAX_NETMASK];
@@ -691,8 +694,9 @@
 	switch (req) {
 	case RTM_DELETE:
 		if (netmask) {
-			rt_maskedcopy(dst, (struct sockaddr *)&deldst, netmask);
-			dst = (struct sockaddr *)&deldst;
+			rt_maskedcopy(dst, (struct sockaddr *)&maskeddst,
+			    netmask);
+			dst = (struct sockaddr *)&maskeddst;
 		}
 		if ((rn = rnh->rnh_lookup(dst, netmask, rnh)) == NULL)
 			senderr(ESRCH);
@@ -735,8 +739,7 @@
 		flags = rt->rt_flags & ~(RTF_CLONING | RTF_STATIC);
 		flags |= RTF_CLONED;
 		gateway = rt->rt_gateway;
-		if ((netmask = rt->rt_genmask) == NULL)
-			flags |= RTF_HOST;
+		flags |= RTF_HOST;
 		goto makeroute;
 
 	case RTM_ADD:
@@ -751,43 +754,70 @@
 		Bzero(rt, sizeof(*rt));
 		rt->rt_flags = RTF_UP | flags;
 		LIST_INIT(&rt->rt_timer);
-		if (rt_setgate(rt, dst, gateway)) {
+		RT_DPRINTF("%s l.%d: rt->_rt_key = %p\n", __func__, __LINE__,
+		    (void *)rt->_rt_key);
+		if (rt_setkey(rt, dst, PR_NOWAIT) == NULL ||
+		    rt_setgate(rt, gateway) != 0) {
 			pool_put(&rtentry_pool, rt);
 			senderr(ENOBUFS);
 		}
+		RT_DPRINTF("%s l.%d: rt->_rt_key = %p\n", __func__, __LINE__,
+		    (void *)rt->_rt_key);
 		if (netmask) {
-			rt_maskedcopy(dst, rt_key(rt), netmask);
-		} else
-			Bcopy(dst, rt_key(rt), dst->sa_len);
+			rt_maskedcopy(dst, (struct sockaddr *)&maskeddst,
+			    netmask);
+			rt_setkey(rt, (struct sockaddr *)&maskeddst, PR_NOWAIT);
+			RT_DPRINTF("%s l.%d: rt->_rt_key = %p\n", __func__,
+			    __LINE__, (void *)rt->_rt_key);
+		} else {
+			rt_setkey(rt, dst, PR_NOWAIT);
+			RT_DPRINTF("%s l.%d: rt->_rt_key = %p\n", __func__,
+			    __LINE__, (void *)rt->_rt_key);
+		}
 		rt_set_ifa(rt, ifa);
+		RT_DPRINTF("%s l.%d: rt->_rt_key = %p\n", __func__,
+		    __LINE__, (void *)rt->_rt_key);
 		rt->rt_ifp = ifa->ifa_ifp;
 		if (req == RTM_RESOLVE) {
 			rt->rt_rmx = (*ret_nrt)->rt_rmx; /* copy metrics */
 			rt->rt_parent = *ret_nrt;
 			rt->rt_parent->rt_refcnt++;
 		}
-		rn = rnh->rnh_addaddr(rt_key(rt), netmask, rnh, rt->rt_nodes);
-		if (rn == NULL && (crt = rtalloc1(rt_key(rt), 0)) != NULL) {
+		RT_DPRINTF("%s l.%d: rt->_rt_key = %p\n", __func__,
+		    __LINE__, (void *)rt->_rt_key);
+		rn = rnh->rnh_addaddr(rt_getkey(rt), netmask, rnh,
+		    rt->rt_nodes);
+		RT_DPRINTF("%s l.%d: rt->_rt_key = %p\n", __func__,
+		    __LINE__, (void *)rt->_rt_key);
+		if (rn == NULL && (crt = rtalloc1(rt_getkey(rt), 0)) != NULL) {
 			/* overwrite cloned route */
 			if ((crt->rt_flags & RTF_CLONED) != 0) {
 				rtdeletemsg(crt);
-				rn = rnh->rnh_addaddr(rt_key(rt),
+				rn = rnh->rnh_addaddr(rt_getkey(rt),
 				    netmask, rnh, rt->rt_nodes);
 			}
 			RTFREE(crt);
+			RT_DPRINTF("%s l.%d: rt->_rt_key = %p\n", __func__,
+			    __LINE__, (void *)rt->_rt_key);
 		}
+		RT_DPRINTF("%s l.%d: rt->_rt_key = %p\n", __func__,
+		    __LINE__, (void *)rt->_rt_key);
 		if (rn == NULL) {
 			IFAFREE(ifa);
 			if ((rt->rt_flags & RTF_CLONED) != 0 && rt->rt_parent)
 				rtfree(rt->rt_parent);
 			if (rt->rt_gwroute)
 				rtfree(rt->rt_gwroute);
-			Free(rt_key(rt));
+			rt_destroy(rt);
 			pool_put(&rtentry_pool, rt);
 			senderr(EEXIST);
 		}
+		RT_DPRINTF("%s l.%d: rt->_rt_key = %p\n", __func__,
+		    __LINE__, (void *)rt->_rt_key);
 		if (ifa->ifa_rtrequest)
 			ifa->ifa_rtrequest(req, rt, info);
+		RT_DPRINTF("%s l.%d: rt->_rt_key = %p\n", __func__,
+		    __LINE__, (void *)rt->_rt_key);
 		if (ret_nrt) {
 			*ret_nrt = rt;
 			rt->rt_refcnt++;
@@ -799,6 +829,11 @@
 		rtflushall(dst->sa_family);
 		break;
 	case RTM_GET:
+		if (netmask != NULL) {
+			rt_maskedcopy(dst, (struct sockaddr *)&maskeddst,
+			    netmask);
+			dst = (struct sockaddr *)&maskeddst;
+		}
 		rn = rnh->rnh_lookup(dst, netmask, rnh);
 		if (rn == NULL || (rn->rn_flags & RNF_ROOT) != 0)
 			senderr(ESRCH);
@@ -815,34 +850,36 @@
 }
 
 int
-rt_setgate( struct rtentry *rt0, const struct sockaddr *dst,
-	const struct sockaddr *gate)
+rt_setgate(struct rtentry *rt, const struct sockaddr *gate)
 {
-	char *new, *old;
-	u_int dlen = ROUNDUP(dst->sa_len), glen = ROUNDUP(gate->sa_len);
-	struct rtentry *rt = rt0;
+	KASSERT(rt != rt->rt_gwroute);
 
-	if (rt->rt_gateway == NULL || glen > ROUNDUP(rt->rt_gateway->sa_len)) {
-		old = (void *)rt_key(rt);
-		R_Malloc(new, void *, dlen + glen);
-		if (new == NULL)
-			return 1;
-		Bzero(new, dlen + glen);
-		rt->rt_nodes->rn_key = new;
-	} else {
-		new = __UNCONST(rt->rt_nodes->rn_key); /*XXXUNCONST*/
-		old = NULL;
-	}
-	Bcopy(gate, (rt->rt_gateway = (struct sockaddr *)(new + dlen)), glen);
-	if (old) {
-		Bcopy(dst, new, dlen);
-		Free(old);
-	}
+	KASSERT(rt->_rt_key != NULL);
+	RT_DPRINTF("%s l.%d: rt->_rt_key = %p\n", __func__,
+	    __LINE__, (void *)rt->_rt_key);
+
 	if (rt->rt_gwroute) {
 		RTFREE(rt->rt_gwroute);
 		rt->rt_gwroute = NULL;
 	}
+	KASSERT(rt->_rt_key != NULL);
+	RT_DPRINTF("%s l.%d: rt->_rt_key = %p\n", __func__,
+	    __LINE__, (void *)rt->_rt_key);
+	if (rt->rt_gateway != NULL)
+		sockaddr_free(rt->rt_gateway);
+	KASSERT(rt->_rt_key != NULL);
+	RT_DPRINTF("%s l.%d: rt->_rt_key = %p\n", __func__,
+	    __LINE__, (void *)rt->_rt_key);
+	if ((rt->rt_gateway = sockaddr_dup(gate, PR_NOWAIT)) == NULL)
+		return ENOMEM;
+	KASSERT(rt->_rt_key != NULL);
+	RT_DPRINTF("%s l.%d: rt->_rt_key = %p\n", __func__,
+	    __LINE__, (void *)rt->_rt_key);
+
 	if (rt->rt_flags & RTF_GATEWAY) {
+		KASSERT(rt->_rt_key != NULL);
+		RT_DPRINTF("%s l.%d: rt->_rt_key = %p\n", __func__,
+		    __LINE__, (void *)rt->_rt_key);
 		rt->rt_gwroute = rtalloc1(gate, 1);
 		/*
 		 * If we switched gateways, grab the MTU from the new
@@ -851,6 +888,9 @@
 		 * Note that, if the MTU of gateway is 0, we will reset the
 		 * MTU of the route to run PMTUD again from scratch. XXX
 		 */
+		KASSERT(rt->_rt_key != NULL);
+		RT_DPRINTF("%s l.%d: rt->_rt_key = %p\n", __func__,
+		    __LINE__, (void *)rt->_rt_key);
 		if (rt->rt_gwroute
 		    && !(rt->rt_rmx.rmx_locks & RTV_MTU)
 		    && rt->rt_rmx.rmx_mtu
@@ -858,6 +898,9 @@
 			rt->rt_rmx.rmx_mtu = rt->rt_gwroute->rt_rmx.rmx_mtu;
 		}
 	}
+	KASSERT(rt->_rt_key != NULL);
+	RT_DPRINTF("%s l.%d: rt->_rt_key = %p\n", __func__,
+	    __LINE__, (void *)rt->_rt_key);
 	return 0;
 }
 
@@ -865,20 +908,19 @@
 rt_maskedcopy(const struct sockaddr *src, struct sockaddr *dst,
 	const struct sockaddr *netmask)
 {
-	const u_char *cp1 = (const u_char *)src;
-	u_char *cp2 = (u_char *)dst;
-	const u_char *cp3 = (const u_char *)netmask;
-	u_char *cplim = cp2 + *cp3;
-	u_char *cplim2 = cp2 + *cp1;
+	const char *netmaskp = &netmask->sa_data[0],
+	           *srcp = &src->sa_data[0];
+	char *dstp = &dst->sa_data[0];
+	const char *maskend = dstp + MIN(netmask->sa_len, src->sa_len);
+	const char *srcend = dstp + src->sa_len;
 
-	*cp2++ = *cp1++; *cp2++ = *cp1++; /* copies sa_len & sa_family */
-	cp3 += 2;
-	if (cplim > cplim2)
-		cplim = cplim2;
-	while (cp2 < cplim)
-		*cp2++ = *cp1++ & *cp3++;
-	if (cp2 < cplim2)
-		memset(cp2, 0, (unsigned)(cplim2 - cp2));
+	dst->sa_len = src->sa_len;
+	dst->sa_family = src->sa_family;
+
+	while (dstp < maskend)
+		*dstp++ = *srcp++ & *netmaskp++;
+	if (dstp < srcend)
+		memset(dstp, 0, (size_t)(srcend - dstp));
 }
 
 /*
@@ -890,7 +932,7 @@
 {
 	struct rtentry *rt;
 	struct sockaddr *dst, *odst;
-	struct sockaddr_storage deldst;
+	struct sockaddr_storage maskeddst;
 	struct rtentry *nrt = NULL;
 	int error;
 	struct rt_addrinfo info;
@@ -900,7 +942,7 @@
 		if ((flags & RTF_HOST) == 0 && ifa->ifa_netmask) {
 			/* Delete subnet route for this interface */
 			odst = dst;
-			dst = (struct sockaddr *)&deldst;
+			dst = (struct sockaddr *)&maskeddst;
 			rt_maskedcopy(odst, dst, ifa->ifa_netmask);
 		}
 		if ((rt = rtalloc1(dst, 0)) != NULL) {
@@ -964,7 +1006,7 @@
 			(*r->rtt_func)(r->rtt_rt, r);			\
 		} else {						\
 			rtrequest((int) RTM_DELETE,			\
-				  (struct sockaddr *)rt_key(r->rtt_rt),	\
+				  rt_getkey(r->rtt_rt),			\
 				  0, 0, 0, 0);				\
 		}							\
 	} while (/*CONSTCOND*/0)
--- a/sys/net/route.h	Thu Jul 19 20:48:51 2007 +0000
+++ b/sys/net/route.h	Thu Jul 19 20:48:52 2007 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: route.h,v 1.56 2007/06/09 03:07:22 dyoung Exp $	*/
+/*	$NetBSD: route.h,v 1.57 2007/07/19 20:48:53 dyoung Exp $	*/
 
 /*
  * Copyright (c) 1980, 1986, 1993
@@ -95,10 +95,7 @@
 #endif
 struct rtentry {
 	struct	radix_node rt_nodes[2];	/* tree glue, and other values */
-/*XXXUNCONST*/
-#define	rt_key(r)	((struct sockaddr *)__UNCONST((r)->rt_nodes->rn_key))
-/*XXXUNCONST*/
-#define	rt_mask(r)	((struct sockaddr *)__UNCONST((r)->rt_nodes->rn_mask))
+#define	rt_mask(r)	((const struct sockaddr *)((r)->rt_nodes->rn_mask))
 	struct	sockaddr *rt_gateway;	/* value */
 	int	rt_flags;		/* up/down?, host/net */
 	int	rt_refcnt;		/* # held references */
@@ -106,14 +103,20 @@
 	struct	ifnet *rt_ifp;		/* the answer: interface to use */
 	struct	ifaddr *rt_ifa;		/* the answer: interface to use */
 	uint32_t rt_ifa_seqno;
-	const struct sockaddr *rt_genmask; /* for generation of cloned routes */
 	void *	rt_llinfo;		/* pointer to link level info cache */
 	struct	rt_metrics rt_rmx;	/* metrics used by rx'ing protocols */
 	struct	rtentry *rt_gwroute;	/* implied entry for gatewayed routes */
 	LIST_HEAD(, rttimer) rt_timer;  /* queue of timeouts for misc funcs */
 	struct	rtentry *rt_parent;	/* parent of cloned route */
+	struct sockaddr *_rt_key;
 };
 
+static inline const struct sockaddr *
+rt_getkey(const struct rtentry *rt)
+{
+	return rt->_rt_key;
+}
+
 /*
  * Following structure necessary for 4.3 compatibility;
  * We should eventually move it to a compat file.
@@ -271,6 +274,12 @@
 
 
 #ifdef _KERNEL
+#if 0
+#define	RT_DPRINTF(__fmt, ...)	do { } while (/*CONSTCOND*/0)
+#else
+#define	RT_DPRINTF(__fmt, ...)	/* do nothing */
+#endif
+
 struct rtwalk {
 	int (*rw_f)(struct rtentry *, void *);
 	void *rw_v;
@@ -292,8 +301,7 @@
 	    struct sockaddr *, const struct sockaddr *);
 void	 rt_missmsg(int, struct rt_addrinfo *, int, int);
 void	 rt_newaddrmsg(int, struct ifaddr *, int, struct rtentry *);
-int	 rt_setgate(struct rtentry *,
-	    const struct sockaddr *, const struct sockaddr *);
+int	 rt_setgate(struct rtentry *, const struct sockaddr *);
 void	 rt_setmetrics(u_long, const struct rt_metrics *, struct rt_metrics *);
 int      rt_timer_add(struct rtentry *,
              void(*)(struct rtentry *, struct rttimer *),
@@ -329,6 +337,31 @@
 struct ifaddr	*rt_get_ifa(struct rtentry *);
 void	rt_replace_ifa(struct rtentry *, struct ifaddr *);
 
+static inline void
+rt_destroy(struct rtentry *rt)
+{
+	if (rt->_rt_key != NULL)
+		sockaddr_free(rt->_rt_key);
+	if (rt->rt_gateway != NULL)
+		sockaddr_free(rt->rt_gateway);
+	rt->_rt_key = rt->rt_gateway = NULL;
+}
+
+static inline const struct sockaddr *
+rt_setkey(struct rtentry *rt, const struct sockaddr *key, int flags)
+{
+	if (rt->_rt_key == key)
+		goto out;
+
+	if (rt->_rt_key != NULL)
+		sockaddr_free(rt->_rt_key);
+	rt->_rt_key = sockaddr_dup(key, flags);
+out:
+	KASSERT(rt->_rt_key != NULL);
+	rt->rt_nodes->rn_key = (const char *)rt->_rt_key;
+	return rt->_rt_key;
+}
+
 struct rtentry *rtfindparent(struct radix_node_head *, struct route *);
 
 #ifdef RTCACHE_DEBUG
--- a/sys/net/rtsock.c	Thu Jul 19 20:48:51 2007 +0000
+++ b/sys/net/rtsock.c	Thu Jul 19 20:48:52 2007 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: rtsock.c,v 1.94 2007/06/09 03:07:22 dyoung Exp $	*/
+/*	$NetBSD: rtsock.c,v 1.95 2007/07/19 20:48:53 dyoung Exp $	*/
 
 /*
  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -61,7 +61,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rtsock.c,v 1.94 2007/06/09 03:07:22 dyoung Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rtsock.c,v 1.95 2007/07/19 20:48:53 dyoung Exp $");
 
 #include "opt_inet.h"
 
@@ -116,7 +116,6 @@
 #define dst	info.rti_info[RTAX_DST]
 #define gate	info.rti_info[RTAX_GATEWAY]
 #define netmask	info.rti_info[RTAX_NETMASK]
-#define genmask	info.rti_info[RTAX_GENMASK]
 #define ifpaddr	info.rti_info[RTAX_IFP]
 #define ifaaddr	info.rti_info[RTAX_IFA]
 #define brdaddr	info.rti_info[RTAX_BRD]
@@ -171,7 +170,7 @@
 	 * and send "safe" commands to the routing socket.
 	 */
 	if (req == PRU_ATTACH) {
-		if (l == 0)
+		if (l == NULL)
 			error = EACCES;
 		else
 			error = raw_attach(so, (int)(long)nam);
@@ -183,7 +182,7 @@
 		if (error) {
 			free((void *)rp, M_PCB);
 			splx(s);
-			return (error);
+			return error;
 		}
 		rt_adjustcount(rp->rcb_proto.sp_protocol, 1);
 		rp->rcb_laddr = &route_src;
@@ -192,22 +191,33 @@
 		so->so_options |= SO_USELOOPBACK;
 	}
 	splx(s);
-	return (error);
+	return error;
+}
+
+static const struct sockaddr *
+intern_netmask(const struct sockaddr *mask)
+{
+	struct radix_node *rn;
+	extern struct radix_node_head *mask_rnhead;
+
+	if (mask != NULL &&
+	    (rn = rn_search(mask, mask_rnhead->rnh_treetop)))
+		mask = (const struct sockaddr *)rn->rn_key;
+
+	return mask;
 }
 
 /*ARGSUSED*/
 int
 route_output(struct mbuf *m, ...)
 {
-	struct rt_msghdr *rtm = 0;
-	struct radix_node *rn = 0;
-	struct rtentry *rt = 0;
-	struct rtentry *saved_nrt = 0;
-	struct radix_node_head *rnh;
+	struct rt_msghdr *rtm = NULL;
+	struct rtentry *rt = NULL;
+	struct rtentry *saved_nrt = NULL;
 	struct rt_addrinfo info;
 	int len, error = 0;
-	struct ifnet *ifp = 0;
-	struct ifaddr *ifa = 0;
+	struct ifnet *ifp = NULL;
+	struct ifaddr *ifa = NULL;
 	struct socket *so;
 	va_list ap;
 	sa_family_t family;
@@ -217,25 +227,25 @@
 	va_end(ap);
 
 #define senderr(e) do { error = e; goto flush;} while (/*CONSTCOND*/ 0)
-	if (m == 0 || ((m->m_len < sizeof(int32_t)) &&
-	   (m = m_pullup(m, sizeof(int32_t))) == 0))
-		return (ENOBUFS);
+	if (m == NULL || ((m->m_len < sizeof(int32_t)) &&
+	   (m = m_pullup(m, sizeof(int32_t))) == NULL))
+		return ENOBUFS;
 	if ((m->m_flags & M_PKTHDR) == 0)
 		panic("route_output");
 	len = m->m_pkthdr.len;
 	if (len < sizeof(*rtm) ||
 	    len != mtod(m, struct rt_msghdr *)->rtm_msglen) {
-		dst = 0;
+		dst = NULL;
 		senderr(EINVAL);
 	}
 	R_Malloc(rtm, struct rt_msghdr *, len);
-	if (rtm == 0) {
-		dst = 0;
+	if (rtm == NULL) {
+		dst = NULL;
 		senderr(ENOBUFS);
 	}
 	m_copydata(m, 0, len, (void *)rtm);
 	if (rtm->rtm_version != RTM_VERSION) {
-		dst = 0;
+		dst = NULL;
 		senderr(EPROTONOSUPPORT);
 	}
 	rtm->rtm_pid = curproc->p_pid;
@@ -250,20 +260,10 @@
 		    inet_ntoa(((const struct sockaddr_in *)dst)->sin_addr));
 	}
 #endif /* RTSOCK_DEBUG */
-	if (dst == 0 || (dst->sa_family >= AF_MAX))
-		senderr(EINVAL);
-	if (gate != 0 && (gate->sa_family >= AF_MAX))
+	if (dst == NULL || (dst->sa_family >= AF_MAX))
 		senderr(EINVAL);
-	if (genmask) {
-		struct radix_node *t;
-		t = rn_addmask(genmask, 0, 1);
-		if (t && genmask->sa_len >= ((const struct sockaddr *)t->rn_key)->sa_len &&
-		    Bcmp((const char *const *)genmask + 1, (const char *const *)t->rn_key + 1,
-		    ((const struct sockaddr *)t->rn_key)->sa_len) - 1)
-			genmask = (const struct sockaddr *)(t->rn_key);
-		else
-			senderr(ENOBUFS);
-	}
+	if (gate != NULL && (gate->sa_family >= AF_MAX))
+		senderr(EINVAL);
 
 	/*
 	 * Verify that the caller has the appropriate privilege; RTM_GET
@@ -276,14 +276,13 @@
 	switch (rtm->rtm_type) {
 
 	case RTM_ADD:
-		if (gate == 0)
+		if (gate == NULL)
 			senderr(EINVAL);
 		error = rtrequest1(rtm->rtm_type, &info, &saved_nrt);
 		if (error == 0 && saved_nrt) {
 			rt_setmetrics(rtm->rtm_inits,
 			    &rtm->rtm_rmx, &saved_nrt->rt_rmx);
 			saved_nrt->rt_refcnt--;
-			saved_nrt->rt_genmask = genmask;
 		}
 		break;
 
@@ -298,39 +297,32 @@
 	case RTM_GET:
 	case RTM_CHANGE:
 	case RTM_LOCK:
-		if ((rnh = rt_tables[dst->sa_family]) == 0) {
-			senderr(EAFNOSUPPORT);
-		}
-		rn = rnh->rnh_lookup(dst, netmask, rnh);
-		if (rn == NULL || (rn->rn_flags & RNF_ROOT) != 0) {
-			senderr(ESRCH);
-		}
-		rt = (struct rtentry *)rn;
-		rt->rt_refcnt++;
+                /* XXX This will mask dst with netmask before
+                 * searching.  It did not used to do that.  --dyoung
+		 */
+		error = rtrequest(RTM_GET, dst, gate, netmask, 0, &rt);
+		if (error != 0)
+			senderr(error);
 		if (rtm->rtm_type != RTM_GET) {/* XXX: too grotty */
-			struct radix_node *rnn;
-			extern struct radix_node_head *mask_rnhead;
+			struct radix_node *rn;
 
-			if (Bcmp(dst, rt_key(rt), dst->sa_len) != 0)
+			if (memcmp(dst, rt_getkey(rt), dst->sa_len) != 0)
 				senderr(ESRCH);
-			if (netmask && (rnn = rn_search(netmask,
-					    mask_rnhead->rnh_treetop)))
-				netmask = (const struct sockaddr *)rnn->rn_key;
-			for (rnn = rt->rt_nodes; rnn; rnn = rnn->rn_dupedkey)
-				if (netmask == (const struct sockaddr *)rnn->rn_mask)
+			netmask = intern_netmask(netmask);
+			for (rn = rt->rt_nodes; rn; rn = rn->rn_dupedkey)
+				if (netmask == (const struct sockaddr *)rn->rn_mask)
 					break;
-			if (rnn == 0)
+			if (rn == NULL)
 				senderr(ETOOMANYREFS);
-			rt = (struct rtentry *)rnn;
+			rt = (struct rtentry *)rn;
 		}
 
 		switch (rtm->rtm_type) {
 		case RTM_GET:
 		report:
-			dst = rt_key(rt);
+			dst = rt_getkey(rt);
 			gate = rt->rt_gateway;
 			netmask = rt_mask(rt);
-			genmask = rt->rt_genmask;
 			if ((rtm->rtm_addrs & (RTA_IFP | RTA_IFA)) == 0)
 				;
 			else if ((ifp = rt->rt_ifp) != NULL) {
@@ -356,24 +348,23 @@
 				if (ifp->if_flags & IFF_POINTOPOINT)
 					brdaddr = rtifa->ifa_dstaddr;
 				else
-					brdaddr = 0;
+					brdaddr = NULL;
 				rtm->rtm_index = ifp->if_index;
 			} else {
-				ifpaddr = 0;
-				ifaaddr = 0;
+				ifpaddr = NULL;
+				ifaaddr = NULL;
 			}
-			(void)rt_msg2(rtm->rtm_type, &info, (void *)0,
-			    (struct walkarg *)0, &len);
+			(void)rt_msg2(rtm->rtm_type, &info, NULL, NULL, &len);
 			if (len > rtm->rtm_msglen) {
 				struct rt_msghdr *new_rtm;
 				R_Malloc(new_rtm, struct rt_msghdr *, len);
-				if (new_rtm == 0)
+				if (new_rtm == NULL)
 					senderr(ENOBUFS);
 				Bcopy(rtm, new_rtm, rtm->rtm_msglen);
 				Free(rtm); rtm = new_rtm;
 			}
 			(void)rt_msg2(rtm->rtm_type, &info, (void *)rtm,
-			    (struct walkarg *)0, 0);
+			    NULL, 0);
 			rtm->rtm_flags = rt->rt_flags;
 			rtm->rtm_rmx = rt->rt_rmx;
 			rtm->rtm_addrs = info.rti_addrs;
@@ -387,7 +378,7 @@
 			 */
 			if ((error = rt_getifa(&info)) != 0)
 				senderr(error);
-			if (gate && rt_setgate(rt, rt_key(rt), gate))
+			if (gate && rt_setgate(rt, gate))
 				senderr(EDQUOT);
 			/* new gateway could require new ifaddr, ifp;
 			   flags may also be different; ifp may be specified
@@ -398,7 +389,7 @@
 				    ifp);
 			else if ((ifaaddr && (ifa = ifa_ifwithaddr(ifaaddr))) ||
 			    (gate && (ifa = ifa_ifwithroute(rt->rt_flags,
-			    rt_key(rt), gate))))
+			    rt_getkey(rt), gate))))
 				ifp = ifa->ifa_ifp;
 			if (ifa) {
 				struct ifaddr *oifa = rt->rt_ifa;
@@ -415,8 +406,6 @@
 			    &rt->rt_rmx);
 			if (rt->rt_ifa && rt->rt_ifa->ifa_rtrequest)
 				rt->rt_ifa->ifa_rtrequest(RTM_ADD, rt, &info);
-			if (genmask)
-				rt->rt_genmask = genmask;
 			/*
 			 * Fall into
 			 */
@@ -443,7 +432,7 @@
 	if (rt)
 		rtfree(rt);
     {
-	struct rawcb *rp = 0;
+	struct rawcb *rp = NULL;
 	/*
 	 * Check to see if we don't want our own messages.
 	 */
@@ -452,7 +441,7 @@
 			if (rtm)
 				Free(rtm);
 			m_freem(m);
-			return (error);
+			return error;
 		}
 		/* There is another listener, so construct message */
 		rp = sotorawcb(so);
@@ -475,7 +464,7 @@
 	if (rp)
 		rp->rcb_proto.sp_family = PF_ROUTE;
     }
-	return (error);
+	return error;
 }
 
 void
@@ -513,10 +502,10 @@
 	/* Check for extra addresses specified, except RTM_GET asking for interface info.  */
 	if (rtmtype == RTM_GET) {
 		if (((rtinfo->rti_addrs & (~((1 << RTAX_IFP) | (1 << RTAX_IFA)))) & (~0 << i)) != 0)
-			return (1);
+			return 1;
 	} else {
 		if ((rtinfo->rti_addrs & (~0 << i)) != 0)
-			return (1);
+			return 1;
 	}
 	/* Check for bad data length.  */
 	if (cp != cplim) {
@@ -529,9 +518,9 @@
 			 */
 			;
 		else
-			return (1);
+			return 1;
 	}
-	return (0);
+	return 0;
 }
 
 static struct mbuf *
@@ -544,8 +533,8 @@
 	int len, dlen;
 
 	m = m_gethdr(M_DONTWAIT, MT_DATA);
-	if (m == 0)
-		return (m);
+	if (m == NULL)
+		return m;
 	MCLAIM(m, &routedomain.dom_mowner);
 	switch (type) {
 
@@ -578,7 +567,7 @@
 		m->m_next = m_get(M_DONTWAIT, MT_DATA);
 		if (m->m_next == NULL) {
 			m_freem(m);
-			return (NULL);
+			return NULL;
 		}
 		MCLAIM(m->m_next, m->m_owner);
 		m->m_pkthdr.len = len;
@@ -587,7 +576,7 @@
 	} else {
 		m->m_pkthdr.len = m->m_len = len;
 	}
-	m->m_pkthdr.rcvif = 0;
+	m->m_pkthdr.rcvif = NULL;
 	m_copyback(m, 0, datalen, data);
 	rtm = mtod(m, struct rt_msghdr *);
 	for (i = 0; i < RTAX_MAX; i++) {
@@ -600,12 +589,12 @@
 	}
 	if (m->m_pkthdr.len != len) {
 		m_freem(m);
-		return (NULL);
+		return NULL;
 	}
 	rtm->rtm_msglen = len;
 	rtm->rtm_version = RTM_VERSION;
 	rtm->rtm_type = type;
-	return (m);
+	return m;
 }
 
 /*
@@ -655,7 +644,7 @@
 	for (i = 0; i < RTAX_MAX; i++) {
 		const struct sockaddr *sa;
 
-		if ((sa = rtinfo->rti_info[i]) == 0)
+		if ((sa = rtinfo->rti_info[i]) == NULL)
 			continue;
 		rtinfo->rti_addrs |= (1 << i);
 		dlen = ROUNDUP(sa->sa_len);
@@ -665,7 +654,7 @@
 		}
 		len += dlen;
 	}
-	if (cp == 0 && w != NULL && !second_time) {
+	if (cp == NULL && w != NULL && !second_time) {
 		struct walkarg *rw = w;
 
 		rw->w_needed += len;
@@ -684,7 +673,7 @@
 				goto again;
 			} else {
 				rw->w_tmemneeded = len;
-				return (ENOBUFS);
+				return ENOBUFS;
 			}
 		}
 	}
@@ -697,7 +686,7 @@
 	}
 	if (lenp)
 		*lenp = len;
-	return (0);
+	return 0;
 }
 
 /*
@@ -719,7 +708,7 @@
 	rtm.rtm_flags = RTF_DONE | flags;
 	rtm.rtm_errno = error;
 	m = rt_msg1(type, rtinfo, (void *)&rtm, sizeof(rtm));
-	if (m == 0)
+	if (m == NULL)
 		return;
 	mtod(m, struct rt_msghdr *)->rtm_addrs = rtinfo->rti_addrs;
 	route_proto.sp_protocol = sa ? sa->sa_family : 0;
@@ -749,7 +738,7 @@
 	ifm.ifm_data = ifp->if_data;
 	ifm.ifm_addrs = 0;
 	m = rt_msg1(RTM_IFINFO, &info, (void *)&ifm, sizeof(ifm));
-	if (m == 0)
+	if (m == NULL)
 		return;
 	route_proto.sp_protocol = 0;
 	raw_input(m, &route_proto, &route_src, &route_dst);
@@ -778,7 +767,7 @@
 	oifm.ifm_data.ifi_lastchange = ifp->if_data.ifi_lastchange;
 	oifm.ifm_addrs = 0;
 	m = rt_msg1(RTM_OIFINFO, &info, (void *)&oifm, sizeof(oifm));
-	if (m == 0)
+	if (m == NULL)
 		return;
 	route_proto.sp_protocol = 0;
 	raw_input(m, &route_proto, &route_src, &route_dst);
@@ -797,7 +786,7 @@
 rt_newaddrmsg(int cmd, struct ifaddr *ifa, int error, struct rtentry *rt)
 {
 	struct rt_addrinfo info;
-	struct sockaddr *sa = NULL;
+	const struct sockaddr *sa = NULL;
 	int pass;
 	struct mbuf *m = NULL;
 	struct ifnet *ifp = ifa->ifa_ifp;
@@ -829,10 +818,10 @@
 		    (cmd == RTM_DELETE && pass == 1)) {
 			struct rt_msghdr rtm;
 
-			if (rt == 0)
+			if (rt == NULL)
 				continue;
 			netmask = rt_mask(rt);
-			dst = sa = rt_key(rt);
+			dst = sa = rt_getkey(rt);
 			gate = rt->rt_gateway;
 			memset(&rtm, 0, sizeof(rtm));
 			rtm.rtm_index = ifp->if_index;
@@ -937,10 +926,9 @@
 	if (w->w_op == NET_RT_FLAGS && !(rt->rt_flags & w->w_arg))
 		return 0;
 	memset(&info, 0, sizeof(info));
-	dst = rt_key(rt);
+	dst = rt_getkey(rt);
 	gate = rt->rt_gateway;
 	netmask = rt_mask(rt);
-	genmask = rt->rt_genmask;
 	if (rt->rt_ifp) {
 		const struct ifaddr *rtifa;
 		ifpaddr = TAILQ_FIRST(&rt->rt_ifp->if_addrlist)->ifa_addr;
@@ -954,7 +942,7 @@
 			brdaddr = rtifa->ifa_dstaddr;
 	}
 	if ((error = rt_msg2(RTM_GET, &info, 0, w, &size)))
-		return (error);
+		return error;
 	if (w->w_where && w->w_tmem && w->w_needed <= 0) {
 		struct rt_msghdr *rtm = (struct rt_msghdr *)w->w_tmem;
 
@@ -970,7 +958,7 @@
 		else
 			w->w_where = (char *)w->w_where + size;
 	}
-	return (error);
+	return error;
 }
 
 static int
@@ -992,20 +980,20 @@
 		switch (type) {
 		case NET_RT_IFLIST:
 			error =
-			    rt_msg2(RTM_IFINFO, &info, (void *)0, w, &len);
+			    rt_msg2(RTM_IFINFO, &info, NULL, w, &len);
 			break;
 #ifdef COMPAT_14
 		case NET_RT_OIFLIST:
 			error =
-			    rt_msg2(RTM_OIFINFO, &info, (void *)0, w, &len);
+			    rt_msg2(RTM_OIFINFO, &info, NULL, w, &len);
 			break;
 #endif
 		default:
 			panic("sysctl_iflist(1)");
 		}
 		if (error)
-			return (error);
-		ifpaddr = 0;
+			return error;
+		ifpaddr = NULL;
 		if (w->w_where && w->w_tmem && w->w_needed <= 0) {
 			switch (type) {
 			case NET_RT_IFLIST: {
@@ -1018,7 +1006,7 @@
 				ifm->ifm_addrs = info.rti_addrs;
 				error = copyout(ifm, w->w_where, len);
 				if (error)
-					return (error);
+					return error;
 				w->w_where = (char *)w->w_where + len;
 				break;
 			}
@@ -1067,7 +1055,7 @@
 				ifm->ifm_addrs = info.rti_addrs;
 				error = copyout(ifm, w->w_where, len);
 				if (error)
-					return (error);
+					return error;
 				w->w_where = (char *)w->w_where + len;
 				break;
 			}
@@ -1083,7 +1071,7 @@
 			netmask = ifa->ifa_netmask;
 			brdaddr = ifa->ifa_dstaddr;
 			if ((error = rt_msg2(RTM_NEWADDR, &info, 0, w, &len)))
-				return (error);
+				return error;
 			if (w->w_where && w->w_tmem && w->w_needed <= 0) {
 				struct ifa_msghdr *ifam;
 
@@ -1094,13 +1082,13 @@
 				ifam->ifam_addrs = info.rti_addrs;
 				error = copyout(w->w_tmem, w->w_where, len);
 				if (error)
-					return (error);
+					return error;
 				w->w_where = (char *)w->w_where + len;
 			}
 		}
-		ifaaddr = netmask = brdaddr = 0;
+		ifaaddr = netmask = brdaddr = NULL;
 	}
-	return (0);
+	return 0;
 }
 
 static int
@@ -1114,12 +1102,12 @@
 	struct	walkarg w;
 
 	if (namelen == 1 && name[0] == CTL_QUERY)
-		return (sysctl_query(SYSCTLFN_CALL(rnode)));
+		return sysctl_query(SYSCTLFN_CALL(rnode));
 
 	if (new)
-		return (EPERM);
+		return EPERM;
 	if (namelen != 3)
-		return (EINVAL);
+		return EINVAL;
 	af = name[0];
 	w.w_tmemneeded = 0;
 	w.w_tmemsize = 0;
@@ -1169,11 +1157,11 @@
 	if (where) {
 		*given = (char *)w.w_where - (char *)where;
 		if (*given < w.w_needed)
-			return (ENOMEM);
+			return ENOMEM;
 	} else {
 		*given = (11 * w.w_needed) / 10;
 	}
-	return (error);
+	return error;
 }
 
 /*
@@ -1198,7 +1186,7 @@
 	.dom_name = "route",
 	.dom_init = route_init,
 	.dom_protosw = routesw,
-	.dom_protoswNPROTOSW = &routesw[sizeof(routesw)/sizeof(routesw[0])],
+	.dom_protoswNPROTOSW = &routesw[__arraycount(routesw)],
 };
 
 SYSCTL_SETUP(sysctl_net_route_setup, "sysctl net.route subtree setup")
--- a/sys/netinet/if_arp.c	Thu Jul 19 20:48:51 2007 +0000
+++ b/sys/netinet/if_arp.c	Thu Jul 19 20:48:52 2007 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_arp.c,v 1.124 2007/07/09 21:11:11 ad Exp $	*/
+/*	$NetBSD: if_arp.c,v 1.125 2007/07/19 20:48:53 dyoung Exp $	*/
 
 /*-
  * Copyright (c) 1998, 2000 The NetBSD Foundation, Inc.
@@ -75,7 +75,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_arp.c,v 1.124 2007/07/09 21:11:11 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_arp.c,v 1.125 2007/07/19 20:48:53 dyoung Exp $");
 
 #include "opt_ddb.h"
 #include "opt_inet.h"
@@ -370,7 +370,7 @@
 			 */
 			arprequest(rt->rt_ifp,
 			    &satocsin(rt->rt_ifa->ifa_addr)->sin_addr,
-			    &satocsin(rt_key(rt))->sin_addr,
+			    &satocsin(rt_getkey(rt))->sin_addr,
 			    LLADDR(rt->rt_ifp->if_sadl));
 		} else if (rt->rt_expire <= time_second)
 			arptfree(la); /* timer has expired; clear */
@@ -462,14 +462,13 @@
 		 * restore cloning bit.
 		 */
 		if ((rt->rt_flags & RTF_HOST) == 0 &&
-		    SIN(rt_mask(rt))->sin_addr.s_addr != 0xffffffff)
+		    satocsin(rt_mask(rt))->sin_addr.s_addr != 0xffffffff)
 			rt->rt_flags |= RTF_CLONING;
 		if (rt->rt_flags & RTF_CLONING) {
 			/*
 			 * Case 1: This route should come from a route to iface.
 			 */
-			rt_setgate(rt, rt_key(rt),
-			    (const struct sockaddr *)&null_sdl);
+			rt_setgate(rt, (const struct sockaddr *)&null_sdl);
 			gate = rt->rt_gateway;
 			SDL(gate)->sdl_type = rt->rt_ifp->if_type;
 			SDL(gate)->sdl_index = rt->rt_ifp->if_index;
@@ -515,8 +514,8 @@
 		/* Announce a new entry if requested. */
 		if (rt->rt_flags & RTF_ANNOUNCE)
 			arprequest(rt->rt_ifp,
-			    &satocsin(rt_key(rt))->sin_addr,
-			    &satocsin(rt_key(rt))->sin_addr,
+			    &satocsin(rt_getkey(rt))->sin_addr,
+			    &satocsin(rt_getkey(rt))->sin_addr,
 			    (u_char *)LLADDR(SDL(gate)));
 		/*FALLTHROUGH*/
 	case RTM_RESOLVE:
@@ -554,7 +553,7 @@
 		rt->rt_flags |= RTF_LLINFO;
 		LIST_INSERT_HEAD(&llinfo_arp, la, la_list);
 
-		INADDR_TO_IA(satocsin(rt_key(rt))->sin_addr, ia);
+		INADDR_TO_IA(satocsin(rt_getkey(rt))->sin_addr, ia);
 		while (ia && ia->ia_ifp != rt->rt_ifp)
 			NEXT_IA_WITH_SAME_ADDR(ia);
 		if (ia) {
@@ -570,7 +569,7 @@
 			 * traffic out to the hardware.
 			 *
 			 * In 4.4BSD, the above "if" statement checked
-			 * rt->rt_ifa against rt_key(rt).  It was changed
+			 * rt->rt_ifa against rt_getkey(rt).  It was changed
 			 * to the current form so that we can provide a
 			 * better support for multiple IPv4 addresses on a
 			 * interface.
@@ -1083,7 +1082,7 @@
 
 		if (mold) {
 			arpstat.as_dfrsent++;
-			(*ifp->if_output)(ifp, mold, rt_key(rt), rt);
+			(*ifp->if_output)(ifp, mold, rt_getkey(rt), rt);
 		}
 	}
 reply:
@@ -1163,8 +1162,7 @@
 		rt->rt_flags &= ~RTF_REJECT;
 		return;
 	}
-	rtrequest(RTM_DELETE, rt_key(rt), (struct sockaddr *)0, rt_mask(rt),
-	    0, (struct rtentry **)0);
+	rtrequest(RTM_DELETE, rt_getkey(rt), NULL, rt_mask(rt), 0, NULL);
 }
 
 /*
@@ -1208,7 +1206,7 @@
 		    in_fmtaddr(*addr), lla_snprintf(ar_sha(ah), ah->ar_hln),
 		    (ifp) ? ifp->if_xname : 0, why);
 		if (rt->rt_refcnt <= 0 && (rt->rt_flags & RTF_CLONED) != 0) {
-			rtrequest(RTM_DELETE, (struct sockaddr *)rt_key(rt),
+			rtrequest(RTM_DELETE, rt_getkey(rt),
 		    	    rt->rt_gateway, rt_mask(rt), rt->rt_flags, 0);
 		}
 	}
@@ -1475,7 +1473,7 @@
 			  rt->rt_flags, rt->rt_refcnt,
 			  rt->rt_use, rt->rt_expire);
 
-	db_printf(" key="); db_print_sa(rt_key(rt));
+	db_printf(" key="); db_print_sa(rt_getkey(rt));
 	db_printf(" mask="); db_print_sa(rt_mask(rt));
 	db_printf(" gw="); db_print_sa(rt->rt_gateway);
 
@@ -1488,8 +1486,6 @@
 	db_printf(" ifa=%p\n", rt->rt_ifa);
 	db_print_ifa(rt->rt_ifa);
 
-	db_printf(" genmask="); db_print_sa(rt->rt_genmask);
-
 	db_printf(" gwroute=%p llinfo=%p\n",
 			  rt->rt_gwroute, rt->rt_llinfo);
 	db_print_llinfo(rt->rt_llinfo);
--- a/sys/netinet/if_atm.c	Thu Jul 19 20:48:51 2007 +0000
+++ b/sys/netinet/if_atm.c	Thu Jul 19 20:48:52 2007 +0000
@@ -1,4 +1,4 @@
-/*      $NetBSD: if_atm.c,v 1.23 2007/03/04 06:03:20 christos Exp $       */
+/*      $NetBSD: if_atm.c,v 1.24 2007/07/19 20:48:54 dyoung Exp $       */
 
 /*
  *
@@ -37,7 +37,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_atm.c,v 1.23 2007/03/04 06:03:20 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_atm.c,v 1.24 2007/07/19 20:48:54 dyoung Exp $");
 
 #include "opt_inet.h"
 #include "opt_natm.h"
@@ -87,7 +87,7 @@
 	struct sockaddr *gate = rt->rt_gateway;
 	struct atm_pseudoioctl api;
 #ifdef NATM
-	struct sockaddr_in *sin;
+	const struct sockaddr_in *sin;
 	struct natmpcb *npcb = NULL;
 	struct atm_pseudohdr *aph;
 #endif
@@ -115,8 +115,7 @@
 		 */
 
 		if ((rt->rt_flags & RTF_HOST) == 0) {
-			rt_setgate(rt, rt_key(rt),
-			    (const struct sockaddr *)&null_sdl);
+			rt_setgate(rt, (const struct sockaddr *)&null_sdl);
 			gate = rt->rt_gateway;
 			SDL(gate)->sdl_type = rt->rt_ifp->if_type;
 			SDL(gate)->sdl_index = rt->rt_ifp->if_index;
@@ -142,7 +141,7 @@
 		 * let native ATM know we are using this VCI/VPI
 		 * (i.e. reserve it)
 		 */
-		sin = (struct sockaddr_in *) rt_key(rt);
+		sin = satocsin(rt_getkey(rt));
 		if (sin->sin_family != AF_INET)
 			goto failed;
 		aph = (struct atm_pseudohdr *) LLADDR(SDL(gate));
@@ -180,8 +179,8 @@
 			rt->rt_flags &= ~RTF_LLINFO;
 		}
 #endif
-		rtrequest(RTM_DELETE, rt_key(rt), (struct sockaddr *)0,
-			rt_mask(rt), 0, (struct rtentry **) 0);
+		rtrequest(RTM_DELETE, rt_getkey(rt), NULL,
+			rt_mask(rt), 0, NULL);
 		break;
 
 	case RTM_DELETE:
--- a/sys/netinet/in_pcb.c	Thu Jul 19 20:48:51 2007 +0000
+++ b/sys/netinet/in_pcb.c	Thu Jul 19 20:48:52 2007 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: in_pcb.c,v 1.117 2007/05/02 20:40:24 dyoung Exp $	*/
+/*	$NetBSD: in_pcb.c,v 1.118 2007/07/19 20:48:54 dyoung Exp $	*/
 
 /*
  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -98,7 +98,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: in_pcb.c,v 1.117 2007/05/02 20:40:24 dyoung Exp $");
+__KERNEL_RCSID(0, "$NetBSD: in_pcb.c,v 1.118 2007/07/19 20:48:54 dyoung Exp $");
 
 #include "opt_inet.h"
 #include "opt_ipsec.h"
@@ -681,7 +681,7 @@
 		info.rti_info[RTAX_NETMASK] = rt_mask(rt);
 		rt_missmsg(RTM_LOSING, &info, rt->rt_flags, 0);
 		if (rt->rt_flags & RTF_DYNAMIC)
-			(void) rtrequest(RTM_DELETE, rt_key(rt),
+			(void) rtrequest(RTM_DELETE, rt_getkey(rt),
 				rt->rt_gateway, rt_mask(rt), rt->rt_flags,
 				NULL);
 		/*
--- a/sys/netinet/ip_carp.c	Thu Jul 19 20:48:51 2007 +0000
+++ b/sys/netinet/ip_carp.c	Thu Jul 19 20:48:52 2007 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: ip_carp.c,v 1.13 2007/07/09 21:11:11 ad Exp $	*/
+/*	$NetBSD: ip_carp.c,v 1.14 2007/07/19 20:48:54 dyoung Exp $	*/
 /*	$OpenBSD: ip_carp.c,v 1.113 2005/11/04 08:11:54 mcbride Exp $	*/
 
 /*
@@ -344,11 +344,7 @@
 		switch (ifa->ifa_addr->sa_family) {
 		case AF_INET: {
 			int count = 0;
-			struct sockaddr sa;
 			struct rtentry *rt;
-			struct radix_node_head *rnh =
-			    rt_tables[ifa->ifa_addr->sa_family];
-			struct radix_node *rn;
 			int hr_otherif, nr_ourif;
 
 			/*
@@ -371,18 +367,21 @@
 			    ifa->ifa_addr, ifa->ifa_netmask,
 			    RTF_HOST, NULL);
 
-			/* Check for our address on another interface */
-			rn = rnh->rnh_matchaddr(ifa->ifa_addr, rnh);
-			rt = (struct rtentry *)rn;
+			rt = NULL;
+			(void)rtrequest(RTM_GET, ifa->ifa_addr, ifa->ifa_addr,
+			    ifa->ifa_netmask, RTF_HOST, &rt);
 			hr_otherif = (rt && rt->rt_ifp != &sc->sc_if &&
 			    rt->rt_flags & (RTF_CLONING|RTF_CLONED));
+			if (rt != NULL) {
+				RTFREE(rt);
+				rt = NULL;
+			}
 
 			/* Check for a network route on our interface */
-			bcopy(ifa->ifa_addr, &sa, sizeof(sa));
-			satosin(&sa)->sin_addr.s_addr = satosin(ifa->ifa_netmask
-			    )->sin_addr.s_addr & satosin(&sa)->sin_addr.s_addr;
-			rn = rnh->rnh_lookup(&sa, ifa->ifa_netmask, rnh);
-			rt = (struct rtentry *)rn;
+
+			rt = NULL;
+			(void)rtrequest(RTM_GET, ifa->ifa_addr, ifa->ifa_addr,
+			    ifa->ifa_netmask, 0, &rt);
 			nr_ourif = (rt && rt->rt_ifp == &sc->sc_if);
 
 			switch (cmd) {
@@ -398,7 +397,8 @@
 				if (!hr_otherif || nr_ourif || !rt) {
 					if (nr_ourif && !(rt->rt_flags &
 					    RTF_CLONING))
-						rtrequest(RTM_DELETE, &sa,
+						rtrequest(RTM_DELETE,
+						    ifa->ifa_addr,
 						    ifa->ifa_addr,
 						    ifa->ifa_netmask, 0, NULL);
 
@@ -416,6 +416,10 @@
 			default:
 				break;
 			}
+			if (rt != NULL) {
+				RTFREE(rt);
+				rt = NULL;
+			}
 			break;
 		}
 
--- a/sys/netinet/ip_icmp.c	Thu Jul 19 20:48:51 2007 +0000
+++ b/sys/netinet/ip_icmp.c	Thu Jul 19 20:48:52 2007 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: ip_icmp.c,v 1.111 2007/03/04 06:03:21 christos Exp $	*/
+/*	$NetBSD: ip_icmp.c,v 1.112 2007/07/19 20:48:54 dyoung Exp $	*/
 
 /*
  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -101,7 +101,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ip_icmp.c,v 1.111 2007/03/04 06:03:21 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ip_icmp.c,v 1.112 2007/07/19 20:48:54 dyoung Exp $");
 
 #include "opt_ipsec.h"
 
@@ -1187,7 +1187,7 @@
 		panic("icmp_mtudisc_timeout:  bad route to timeout");
 	if ((rt->rt_flags & (RTF_DYNAMIC | RTF_HOST)) ==
 	    (RTF_DYNAMIC | RTF_HOST)) {
-		rtrequest((int) RTM_DELETE, (struct sockaddr *)rt_key(rt),
+		rtrequest((int) RTM_DELETE, rt_getkey(rt),
 		    rt->rt_gateway, rt_mask(rt), rt->rt_flags, 0);
 	} else {
 		if ((rt->rt_rmx.rmx_locks & RTV_MTU) == 0) {
@@ -1203,7 +1203,7 @@
 		panic("icmp_redirect_timeout:  bad route to timeout");
 	if ((rt->rt_flags & (RTF_DYNAMIC | RTF_HOST)) ==
 	    (RTF_DYNAMIC | RTF_HOST)) {
-		rtrequest((int) RTM_DELETE, (struct sockaddr *)rt_key(rt),
+		rtrequest((int) RTM_DELETE, rt_getkey(rt),
 		    rt->rt_gateway, rt_mask(rt), rt->rt_flags, 0);
 	}
 }
--- a/sys/netinet/ip_input.c	Thu Jul 19 20:48:51 2007 +0000
+++ b/sys/netinet/ip_input.c	Thu Jul 19 20:48:52 2007 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: ip_input.c,v 1.249 2007/05/02 20:40:25 dyoung Exp $	*/
+/*	$NetBSD: ip_input.c,v 1.250 2007/07/19 20:48:55 dyoung Exp $	*/
 
 /*
  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -98,7 +98,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ip_input.c,v 1.249 2007/05/02 20:40:25 dyoung Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ip_input.c,v 1.250 2007/07/19 20:48:55 dyoung Exp $");
 
 #include "opt_inet.h"
 #include "opt_gateway.h"
@@ -904,9 +904,7 @@
 		 */
 		IPQ_LOCK();
 		hash = IPREASS_HASH(ip->ip_src.s_addr, ip->ip_id);
-		/* XXX LIST_FOREACH(fp, &ipq[hash], ipq_q) */
-		for (fp = LIST_FIRST(&ipq[hash]); fp != NULL;
-		     fp = LIST_NEXT(fp, ipq_q)) {
+		LIST_FOREACH(fp, &ipq[hash], ipq_q) {
 			if (ip->ip_id == fp->ipq_id &&
 			    in_hosteq(ip->ip_src, fp->ipq_src) &&
 			    in_hosteq(ip->ip_dst, fp->ipq_dst) &&
@@ -1895,7 +1893,7 @@
 	 */
 	if (rt->rt_ifp == m->m_pkthdr.rcvif &&
 	    (rt->rt_flags & (RTF_DYNAMIC|RTF_MODIFIED)) == 0 &&
-	    !in_nullhost(satosin(rt_key(rt))->sin_addr) &&
+	    !in_nullhost(satocsin(rt_getkey(rt))->sin_addr) &&
 	    ipsendredirects && !srcrt) {
 		if (rt->rt_ifa &&
 		    (ip->ip_src.s_addr & ifatoia(rt->rt_ifa)->ia_subnetmask) ==
--- a/sys/netinet/tcp_subr.c	Thu Jul 19 20:48:51 2007 +0000
+++ b/sys/netinet/tcp_subr.c	Thu Jul 19 20:48:52 2007 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: tcp_subr.c,v 1.216 2007/07/09 21:11:12 ad Exp $	*/
+/*	$NetBSD: tcp_subr.c,v 1.217 2007/07/19 20:48:55 dyoung Exp $	*/
 
 /*
  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -98,7 +98,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tcp_subr.c,v 1.216 2007/07/09 21:11:12 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tcp_subr.c,v 1.217 2007/07/19 20:48:55 dyoung Exp $");
 
 #include "opt_inet.h"
 #include "opt_ipsec.h"
@@ -1171,7 +1171,7 @@
 	 */
 	if (SEQ_LT(tp->iss + so->so_snd.sb_hiwat * 16, tp->snd_max) &&
 	    ro && (rt = ro->ro_rt) &&
-	    !in_nullhost(satosin(rt_key(rt))->sin_addr)) {
+	    !in_nullhost(satocsin(rt_getkey(rt))->sin_addr)) {
 		u_long i = 0;
 
 		if ((rt->rt_rmx.rmx_locks & RTV_RTT) == 0) {
--- a/sys/netinet6/icmp6.c	Thu Jul 19 20:48:51 2007 +0000
+++ b/sys/netinet6/icmp6.c	Thu Jul 19 20:48:52 2007 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: icmp6.c,v 1.134 2007/06/13 05:03:19 dyoung Exp $	*/
+/*	$NetBSD: icmp6.c,v 1.135 2007/07/19 20:48:55 dyoung Exp $	*/
 /*	$KAME: icmp6.c,v 1.217 2001/06/20 15:03:29 jinmei Exp $	*/
 
 /*
@@ -62,7 +62,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: icmp6.c,v 1.134 2007/06/13 05:03:19 dyoung Exp $");
+__KERNEL_RCSID(0, "$NetBSD: icmp6.c,v 1.135 2007/07/19 20:48:55 dyoung Exp $");
 
 #include "opt_inet.h"
 #include "opt_ipsec.h"
@@ -2726,7 +2726,7 @@
 		panic("icmp6_mtudisc_timeout: bad route to timeout");
 	if ((rt->rt_flags & (RTF_DYNAMIC | RTF_HOST)) ==
 	    (RTF_DYNAMIC | RTF_HOST)) {
-		rtrequest((int) RTM_DELETE, (struct sockaddr *)rt_key(rt),
+		rtrequest((int) RTM_DELETE, rt_getkey(rt),
 		    rt->rt_gateway, rt_mask(rt), rt->rt_flags, 0);
 	} else {
 		if (!(rt->rt_rmx.rmx_locks & RTV_MTU))
@@ -2741,7 +2741,7 @@
 		panic("icmp6_redirect_timeout: bad route to timeout");
 	if ((rt->rt_flags & (RTF_GATEWAY | RTF_DYNAMIC | RTF_HOST)) ==
 	    (RTF_GATEWAY | RTF_DYNAMIC | RTF_HOST)) {
-		rtrequest((int) RTM_DELETE, (struct sockaddr *)rt_key(rt),
+		rtrequest((int) RTM_DELETE, rt_getkey(rt),
 		    rt->rt_gateway, rt_mask(rt), rt->rt_flags, 0);
 	}
 }
--- a/sys/netinet6/in6.c	Thu Jul 19 20:48:51 2007 +0000
+++ b/sys/netinet6/in6.c	Thu Jul 19 20:48:52 2007 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: in6.c,v 1.130 2007/06/28 21:03:47 christos Exp $	*/
+/*	$NetBSD: in6.c,v 1.131 2007/07/19 20:48:56 dyoung Exp $	*/
 /*	$KAME: in6.c,v 1.198 2001/07/18 09:12:38 itojun Exp $	*/
 
 /*
@@ -62,7 +62,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: in6.c,v 1.130 2007/06/28 21:03:47 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: in6.c,v 1.131 2007/07/19 20:48:56 dyoung Exp $");
 
 #include "opt_inet.h"
 #include "opt_pfil_hooks.h"
@@ -1153,7 +1153,7 @@
 		rt = rtalloc1((struct sockaddr *)&mltaddr, 0);
 		if (rt) {
 			if (memcmp(&mltaddr.sin6_addr,
-			    &((struct sockaddr_in6 *)rt_key(rt))->sin6_addr,
+			    &satocsin6(rt_getkey(rt))->sin6_addr,
 			    MLTMASK_LEN)) {
 				RTFREE(rt);
 				rt = NULL;
@@ -1163,8 +1163,8 @@
 				    __func__, rt->rt_ifp, ifp, ifp->if_xname,
 				    ntohs(mltaddr.sin6_addr.s6_addr16[0]),
 				    ntohs(mltaddr.sin6_addr.s6_addr16[1]),
-				    ((struct sockaddr_in6 *)rt_key(rt))->sin6_addr.s6_addr16[0],
-				    ((struct sockaddr_in6 *)rt_key(rt))->sin6_addr.s6_addr16[1]);
+				    satocsin6(rt_getkey(rt))->sin6_addr.s6_addr16[0],
+				    satocsin6(rt_getkey(rt))->sin6_addr.s6_addr16[1]);
 				rt_replace_ifa(rt, &ia->ia_ifa);
 				rt->rt_ifp = ifp;
 			}
@@ -1238,7 +1238,7 @@
 		if (rt) {
 			/* 32bit came from "mltmask" */
 			if (memcmp(&mltaddr.sin6_addr,
-			    &((struct sockaddr_in6 *)rt_key(rt))->sin6_addr,
+			    &satocsin6(rt_getkey(rt))->sin6_addr,
 			    32 / NBBY)) {
 				RTFREE(rt);
 				rt = NULL;
@@ -1248,8 +1248,8 @@
 				    __func__, rt->rt_ifp, ifp, ifp->if_xname,
 				    ntohs(mltaddr.sin6_addr.s6_addr16[0]),
 				    ntohs(mltaddr.sin6_addr.s6_addr16[1]),
-				    ((struct sockaddr_in6 *)rt_key(rt))->sin6_addr.s6_addr16[0],
-				    ((struct sockaddr_in6 *)rt_key(rt))->sin6_addr.s6_addr16[1]);
+				    satocsin6(rt_getkey(rt))->sin6_addr.s6_addr16[0],
+				    satocsin6(rt_getkey(rt))->sin6_addr.s6_addr16[1]);
 				rt_replace_ifa(rt, &ia->ia_ifa);
 				rt->rt_ifp = ifp;
 			}
--- a/sys/netinet6/in6_pcb.c	Thu Jul 19 20:48:51 2007 +0000
+++ b/sys/netinet6/in6_pcb.c	Thu Jul 19 20:48:52 2007 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: in6_pcb.c,v 1.87 2007/05/23 17:15:01 christos Exp $	*/
+/*	$NetBSD: in6_pcb.c,v 1.88 2007/07/19 20:48:56 dyoung Exp $	*/
 /*	$KAME: in6_pcb.c,v 1.84 2001/02/08 18:02:08 itojun Exp $	*/
 
 /*
@@ -62,7 +62,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: in6_pcb.c,v 1.87 2007/05/23 17:15:01 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: in6_pcb.c,v 1.88 2007/07/19 20:48:56 dyoung Exp $");
 
 #include "opt_inet.h"
 #include "opt_ipsec.h"
@@ -794,8 +794,8 @@
 		info.rti_info[RTAX_NETMASK] = rt_mask(rt);
 		rt_missmsg(RTM_LOSING, &info, rt->rt_flags, 0);
 		if (rt->rt_flags & RTF_DYNAMIC) {
-			(void)rtrequest(RTM_DELETE, rt_key(rt), rt->rt_gateway,
-			    rt_mask(rt), rt->rt_flags, NULL);
+			(void)rtrequest(RTM_DELETE, rt_getkey(rt),
+			    rt->rt_gateway, rt_mask(rt), rt->rt_flags, NULL);
 		}
 		rtcache_free(&in6p->in6p_route);
 		/*
--- a/sys/netinet6/in6_var.h	Thu Jul 19 20:48:51 2007 +0000
+++ b/sys/netinet6/in6_var.h	Thu Jul 19 20:48:52 2007 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: in6_var.h,v 1.51 2007/03/07 22:20:04 liamjfoy Exp $	*/
+/*	$NetBSD: in6_var.h,v 1.52 2007/07/19 20:48:56 dyoung Exp $	*/
 /*	$KAME: in6_var.h,v 1.81 2002/06/08 11:16:51 itojun Exp $	*/
 
 /*
@@ -484,20 +484,25 @@
  * Macro for finding the internet address structure (in6_ifaddr) corresponding
  * to a given interface (ifnet structure).
  */
+static inline struct in6_ifaddr *
+ifp_to_ia6(struct ifnet *ifp)
+{
+	struct ifaddr *ifa;
 
-#define IFP_TO_IA6(ifp, ia)				\
-/* struct ifnet *ifp; */				\
-/* struct in6_ifaddr *ia; */				\
-do {									\
-	struct ifaddr *_ifa;						\
-	TAILQ_FOREACH(_ifa, &(ifp)->if_addrlist, ifa_list) {	\
-		if (!_ifa->ifa_addr)					\
-			continue;					\
-		if (_ifa->ifa_addr->sa_family == AF_INET6)		\
-			break;						\
-	}								\
-	(ia) = (struct in6_ifaddr *)_ifa;				\
-} while (/*CONSTCOND*/ 0)
+	TAILQ_FOREACH(ifa, &ifp->if_addrlist, ifa_list) {
+		if (ifa->ifa_addr == NULL)
+			continue;
+		if (ifa->ifa_addr->sa_family == AF_INET6)
+			break;
+	}
+	return (struct in6_ifaddr *)ifa;
+}
+
+#define	IFP_TO_IA6(__ifp, __ia)				\
+do {							\
+	(__ia) = ifp_to_ia6((__ifp));				\
+} while (/*CONSTCOND*/0)
+
 
 #endif /* _KERNEL */
 
@@ -544,22 +549,27 @@
  * returns NULL.
  */
 
-#define IN6_LOOKUP_MULTI(addr, ifp, in6m)			\
-/* struct in6_addr addr; */					\
-/* struct ifnet *ifp; */					\
-/* struct in6_multi *in6m; */					\
+static inline struct in6_multi *
+in6_lookup_multi(struct in6_addr *addr, struct ifnet *ifp)
+{
+	struct in6_multi *in6m;
+	struct in6_ifaddr *ia;
+
+	if ((ia = ifp_to_ia6(ifp)) == NULL)
+	  	return NULL;
+	LIST_FOREACH(in6m, &ia->ia6_multiaddrs, in6m_entry) {
+		if (IN6_ARE_ADDR_EQUAL(&in6m->in6m_addr, addr))
+			break;
+	}
+	return in6m;
+}
+
+#define IN6_LOOKUP_MULTI(__addr, __ifp, __in6m)			\
+/* struct in6_addr __addr; */					\
+/* struct ifnet *__ifp; */					\
+/* struct in6_multi *__in6m; */					\
 do {								\
-	struct in6_ifaddr *_ia;					\
-								\
-	IFP_TO_IA6((ifp), _ia);					\
-	if (_ia == NULL) {					\
-	  	(in6m) = NULL;					\
-		break;						\
-	}							\
-	LIST_FOREACH((in6m), &_ia->ia6_multiaddrs, in6m_entry) {\
-		if (IN6_ARE_ADDR_EQUAL(&(in6m)->in6m_addr, &(addr)))\
-			break;					\
-	}							\
+	(__in6m) = in6_lookup_multi(&(__addr), (__ifp));	\
 } while (/*CONSTCOND*/ 0)
 
 /*
@@ -569,53 +579,80 @@
  * and get the first record.  Both macros return a NULL "in6m" when there
  * are no remaining records.
  */
-#define IN6_NEXT_MULTI(step, in6m)					\
-/* struct in6_multistep step; */					\
-/* struct in6_multi *in6m; */						\
-do {									\
-	if (((in6m) = (step).i_in6m) != NULL) {				\
-		(step).i_in6m = LIST_NEXT((in6m), in6m_entry);		\
-		break;							\
-	}								\
-	while ((step).i_ia != NULL) {					\
-		(in6m) = LIST_FIRST(&(step).i_ia->ia6_multiaddrs);	\
-		(step).i_ia = (step).i_ia->ia_next;			\
-		if ((in6m) != NULL) {					\
-			(step).i_in6m = LIST_NEXT((in6m), in6m_entry);	\
-			break;						\
-		}							\
-	}								\
+static inline struct in6_multi *
+in6_next_multi(struct in6_multistep *step)
+{
+	struct in6_multi *in6m;
+
+	if ((in6m = step->i_in6m) != NULL) {
+		step->i_in6m = LIST_NEXT(in6m, in6m_entry);
+		return in6m;
+	}
+	while (step->i_ia != NULL) {
+		in6m = LIST_FIRST(&step->i_ia->ia6_multiaddrs);
+		step->i_ia = step->i_ia->ia_next;
+		if (in6m != NULL) {
+			step->i_in6m = LIST_NEXT(in6m, in6m_entry);
+			break;
+		}
+	}
+	return in6m;
+}
+
+static inline struct in6_multi *
+in6_first_multi(struct in6_multistep *step)
+{						
+	step->i_ia = in6_ifaddr;		
+	step->i_in6m = NULL;			
+	return in6_next_multi(step);		
+}
+
+#define IN6_NEXT_MULTI(__step, __in6m)		\
+/* struct in6_multistep __step; */		\
+/* struct in6_multi *__in6m; */			\
+do {						\
+	(__in6m) = in6_next_multi(&(__step));	\
 } while (/*CONSTCOND*/ 0)
 
-#define IN6_FIRST_MULTI(step, in6m)		\
-/* struct in6_multistep step; */		\
-/* struct in6_multi *in6m */			\
+#define IN6_FIRST_MULTI(__step, __in6m)		\
+/* struct in6_multistep __step; */		\
+/* struct in6_multi *__in6m */			\
 do {						\
-	(step).i_ia = in6_ifaddr;		\
-	(step).i_in6m = NULL;			\
-	IN6_NEXT_MULTI((step), (in6m));		\
+	(__in6m) = in6_first_multi(&(__step));	\
 } while (/*CONSTCOND*/ 0)
 
 
+#if 0
 /*
  * Macros for looking up the in6_multi_mship record for a given IP6 multicast
  * address on a given interface. If no matching record is found, "imm"
  * returns NULL.
  */
-#define IN6_LOOKUP_MSHIP(addr, ifp, imop, imm)				\
-/* struct in6_addr addr; */						\
-/* struct ifnet *ifp; */						\
-/* struct ip6_moptions *imop */						\
-/* struct in6_multi_mship *imm; */					\
+static inline struct in6_multi_mship *
+in6_lookup_mship(struct in6_addr *addr, struct ifnet *ifp,
+    struct ip6_moptions *imop)
+{
+	struct in6_multi_mship *imm;
+
+	LIST_FOREACH(imm, &imop->im6o_memberships, i6mm_chain) {
+		if (imm->i6mm_maddr->in6m_ifp != ifp)
+		    	continue;
+		if (IN6_ARE_ADDR_EQUAL(&imm->i6mm_maddr->in6m_addr,
+		    addr))
+			break;
+	}
+	return imm;
+}
+
+#define IN6_LOOKUP_MSHIP(__addr, __ifp, __imop, __imm)			\
+/* struct in6_addr __addr; */						\
+/* struct ifnet *__ifp; */						\
+/* struct ip6_moptions *__imop */					\
+/* struct in6_multi_mship *__imm; */					\
 do {									\
-	LIST_FOREACH((imm), &(imop)->im6o_memberships, i6mm_chain) {	\
-		if ((imm)->i6mm_maddr->in6m_ifp != (ifp))		\
-		    	continue;					\
-		if (IN6_ARE_ADDR_EQUAL(&(imm)->i6mm_maddr->in6m_addr,	\
-		    &(addr)))						\
-			break;						\
-	}								\
+	(__imm) = in6_lookup_mship(&(__addr), (__ifp), (__imop));	\
 } while (/*CONSTCOND*/ 0)
+#endif
 
 struct	in6_multi *in6_addmulti(struct in6_addr *, struct ifnet *,
 	int *, int);
--- a/sys/netinet6/ip6_input.c	Thu Jul 19 20:48:51 2007 +0000
+++ b/sys/netinet6/ip6_input.c	Thu Jul 19 20:48:52 2007 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: ip6_input.c,v 1.108 2007/07/09 21:11:12 ad Exp $	*/
+/*	$NetBSD: ip6_input.c,v 1.109 2007/07/19 20:48:56 dyoung Exp $	*/
 /*	$KAME: ip6_input.c,v 1.188 2001/03/29 05:34:31 itojun Exp $	*/
 
 /*
@@ -62,7 +62,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ip6_input.c,v 1.108 2007/07/09 21:11:12 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ip6_input.c,v 1.109 2007/07/19 20:48:56 dyoung Exp $");
 
 #include "opt_inet.h"
 #include "opt_inet6.h"
@@ -490,7 +490,7 @@
 	else
 		ip6stat.ip6s_forward_cachemiss++;
 
-#define rt6_key(r) ((struct sockaddr_in6 *)((r)->rt_nodes->rn_key))
+#define rt6_getkey(__rt) satocsin6(rt_getkey(__rt))
 
 	/*
 	 * Accept the packet if the forwarding interface to the destination
@@ -510,7 +510,7 @@
 	     * the destination and the key of the rtentry has
 	     * already done through looking up the routing table.
 	     */
-	    IN6_ARE_ADDR_EQUAL(&ip6->ip6_dst, &rt6_key(rt)->sin6_addr) &&
+	    IN6_ARE_ADDR_EQUAL(&ip6->ip6_dst, &rt6_getkey(rt)->sin6_addr) &&
 #endif
 	    rt->rt_ifp->if_type == IFT_LOOP) {
 		struct in6_ifaddr *ia6 = (struct in6_ifaddr *)rt->rt_ifa;
--- a/sys/netinet6/ip6_var.h	Thu Jul 19 20:48:51 2007 +0000
+++ b/sys/netinet6/ip6_var.h	Thu Jul 19 20:48:52 2007 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: ip6_var.h,v 1.44 2007/05/17 11:48:42 yamt Exp $	*/
+/*	$NetBSD: ip6_var.h,v 1.45 2007/07/19 20:48:57 dyoung Exp $	*/
 /*	$KAME: ip6_var.h,v 1.33 2000/06/11 14:59:20 jinmei Exp $	*/
 
 /*
@@ -369,7 +369,8 @@
 int	rip6_input(struct mbuf **, int *, int);
 void	rip6_ctlinput(int, const struct sockaddr *, void *);
 int	rip6_ctloutput(int, struct socket *, int, int, struct mbuf **);
-int	rip6_output(struct mbuf *, ...);
+int	rip6_output(struct mbuf *, struct socket *, struct sockaddr_in6 *,
+			 struct mbuf *);
 int	rip6_usrreq(struct socket *,
 	    int, struct mbuf *, struct mbuf *, struct mbuf *, struct lwp *);
 
--- a/sys/netinet6/ip6protosw.h	Thu Jul 19 20:48:51 2007 +0000
+++ b/sys/netinet6/ip6protosw.h	Thu Jul 19 20:48:52 2007 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: ip6protosw.h,v 1.18 2007/02/17 22:34:14 dyoung Exp $	*/
+/*	$NetBSD: ip6protosw.h,v 1.19 2007/07/19 20:48:57 dyoung Exp $	*/
 /*	$KAME: ip6protosw.h,v 1.22 2001/02/08 18:02:08 itojun Exp $	*/
 
 /*
@@ -121,7 +121,8 @@
 	int	(*pr_input)		/* input to protocol (from below) */
 			(struct mbuf **, int *, int);
 	int	(*pr_output)		/* output to protocol (from above) */
-			(struct mbuf *, ...);
+			(struct mbuf *, struct socket *, struct sockaddr_in6 *,
+			 struct mbuf *);
 	void	(*pr_ctlinput)		/* control input (from below) */
 			(int, const struct sockaddr *, void *);
 	int	(*pr_ctloutput)		/* control output (from above) */
--- a/sys/netinet6/nd6.c	Thu Jul 19 20:48:51 2007 +0000
+++ b/sys/netinet6/nd6.c	Thu Jul 19 20:48:52 2007 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: nd6.c,v 1.116 2007/07/09 21:11:13 ad Exp $	*/
+/*	$NetBSD: nd6.c,v 1.117 2007/07/19 20:48:57 dyoung Exp $	*/
 /*	$KAME: nd6.c,v 1.279 2002/06/08 11:16:51 itojun Exp $	*/
 
 /*
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nd6.c,v 1.116 2007/07/09 21:11:13 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nd6.c,v 1.117 2007/07/19 20:48:57 dyoung Exp $");
 
 #include "opt_ipsec.h"
 
@@ -433,7 +433,7 @@
 	if ((ifp = rt->rt_ifp) == NULL)
 		panic("ln->ln_rt->rt_ifp == NULL");
 	ndi = ND_IFINFO(ifp);
-	dst = (struct sockaddr_in6 *)rt_key(rt);
+	dst = satocsin6(rt_getkey(rt));
 
 	/* sanity check */
 	if (rt->rt_llinfo && (struct llinfo_nd6 *)rt->rt_llinfo != ln)
@@ -964,7 +964,7 @@
 nd6_free(struct rtentry *rt, int gc)
 {
 	struct llinfo_nd6 *ln = (struct llinfo_nd6 *)rt->rt_llinfo, *next;
-	struct in6_addr in6 = ((struct sockaddr_in6 *)rt_key(rt))->sin6_addr;
+	struct in6_addr in6 = satocsin6(rt_getkey(rt))->sin6_addr;
 	struct nd_defrouter *dr;
 
 	/*
@@ -978,7 +978,7 @@
 	if (!ip6_forwarding) {
 		int s;
 		s = splsoftnet();
-		dr = defrouter_lookup(&((struct sockaddr_in6 *)rt_key(rt))->sin6_addr,
+		dr = defrouter_lookup(&satocsin6(rt_getkey(rt))->sin6_addr,
 		    rt->rt_ifp);
 
 		if (dr != NULL && dr->expire &&
@@ -1058,7 +1058,7 @@
 	 * caches, and disable the route entry not to be used in already
 	 * cached routes.
 	 */
-	rtrequest(RTM_DELETE, rt_key(rt), (struct sockaddr *)0,
+	rtrequest(RTM_DELETE, rt_getkey(rt), (struct sockaddr *)0,
 	    rt_mask(rt), 0, (struct rtentry **)0);
 
 	return next;
@@ -1126,10 +1126,15 @@
 	struct ifnet *ifp = rt->rt_ifp;
 	struct ifaddr *ifa;
 
+	RT_DPRINTF("%s l.%d: rt->_rt_key = %p\n", __func__,
+	    __LINE__, (void *)rt->_rt_key);
+
 	if ((rt->rt_flags & RTF_GATEWAY) != 0)
 		return;
 
 	if (nd6_need_cache(ifp) == 0 && (rt->rt_flags & RTF_HOST) == 0) {
+		RT_DPRINTF("%s l.%d: rt->_rt_key = %p\n", __func__,
+		    __LINE__, (void *)rt->_rt_key);
 		/*
 		 * This is probably an interface direct route for a link
 		 * which does not need neighbor caches (e.g. fe80::%lo0/64).
@@ -1142,7 +1147,9 @@
 
 	if (req == RTM_RESOLVE &&
 	    (nd6_need_cache(ifp) == 0 || /* stf case */
-	     !nd6_is_addr_neighbor(satocsin6(rt_key(rt)), ifp))) {
+	     !nd6_is_addr_neighbor(satocsin6(rt_getkey(rt)), ifp))) {
+		RT_DPRINTF("%s l.%d: rt->_rt_key = %p\n", __func__,
+		    __LINE__, (void *)rt->_rt_key);
 		/*
 		 * FreeBSD and BSD/OS often make a cloned host route based
 		 * on a less-specific route (e.g. the default route).
@@ -1163,6 +1170,8 @@
 
 	switch (req) {
 	case RTM_ADD:
+		RT_DPRINTF("%s l.%d: rt->_rt_key = %p\n", __func__,
+		    __LINE__, (void *)rt->_rt_key);
 		/*
 		 * There is no backward compatibility :)
 		 *
@@ -1178,16 +1187,21 @@
 			 * treated as on-link but is currently not
 			 * (RTF_LLINFO && !ln case).
 			 */
-			rt_setgate(rt, rt_key(rt),
-				   (const struct sockaddr *)&null_sdl);
+			rt_setgate(rt, (const struct sockaddr *)&null_sdl);
+			RT_DPRINTF("%s l.%d: rt->_rt_key = %p\n", __func__,
+			    __LINE__, (void *)rt->_rt_key);
 			gate = rt->rt_gateway;
 			SDL(gate)->sdl_type = ifp->if_type;
 			SDL(gate)->sdl_index = ifp->if_index;
 			if (ln)
 				nd6_llinfo_settimer(ln, 0);
+			RT_DPRINTF("%s l.%d: rt->_rt_key = %p\n", __func__,
+			    __LINE__, (void *)rt->_rt_key);
 			if ((rt->rt_flags & RTF_CLONING) != 0)
 				break;
 		}
+		RT_DPRINTF("%s l.%d: rt->_rt_key = %p\n", __func__,
+		    __LINE__, (void *)rt->_rt_key);
 		/*
 		 * In IPv4 code, we try to annonuce new RTF_ANNOUNCE entry here.
 		 * We don't do that here since llinfo is not ready yet.
@@ -1210,14 +1224,16 @@
 		/* XXX it does not work */
 		if (rt->rt_flags & RTF_ANNOUNCE)
 			nd6_na_output(ifp,
-			      &SIN6(rt_key(rt))->sin6_addr,
-			      &SIN6(rt_key(rt))->sin6_addr,
+			      &SIN6(rt_getkey(rt))->sin6_addr,
+			      &SIN6(rt_getkey(rt))->sin6_addr,
 			      ip6_forwarding ? ND_NA_FLAG_ROUTER : 0,
 			      1, NULL);
 #endif
 		/* FALLTHROUGH */
 	case RTM_RESOLVE:
 		if ((ifp->if_flags & (IFF_POINTOPOINT | IFF_LOOPBACK)) == 0) {
+			RT_DPRINTF("%s l.%d: rt->_rt_key = %p\n", __func__,
+			    __LINE__, (void *)rt->_rt_key);
 			/*
 			 * Address resolution isn't necessary for a point to
 			 * point link, so we can skip this test for a p2p link.
@@ -1231,19 +1247,27 @@
 			}
 			SDL(gate)->sdl_type = ifp->if_type;
 			SDL(gate)->sdl_index = ifp->if_index;
+			RT_DPRINTF("%s l.%d: rt->_rt_key = %p\n", __func__,
+			    __LINE__, (void *)rt->_rt_key);
 		}
 		if (ln != NULL)
 			break;	/* This happens on a route change */
+		RT_DPRINTF("%s l.%d: rt->_rt_key = %p\n", __func__,
+		    __LINE__, (void *)rt->_rt_key);
 		/*
 		 * Case 2: This route may come from cloning, or a manual route
 		 * add with a LL address.
 		 */
 		R_Malloc(ln, struct llinfo_nd6 *, sizeof(*ln));
 		rt->rt_llinfo = (void *)ln;
+		RT_DPRINTF("%s l.%d: rt->_rt_key = %p\n", __func__,
+		    __LINE__, (void *)rt->_rt_key);
 		if (ln == NULL) {
 			log(LOG_DEBUG, "nd6_rtrequest: malloc failed\n");
 			break;
 		}
+		RT_DPRINTF("%s l.%d: rt->_rt_key = %p\n", __func__,
+		    __LINE__, (void *)rt->_rt_key);
 		nd6_inuse++;
 		nd6_allocated++;
 		bzero(ln, sizeof(*ln));
@@ -1266,18 +1290,24 @@
 			ln->ln_state = ND6_LLINFO_NOSTATE;
 			nd6_llinfo_settimer(ln, 0);
 		}
+		RT_DPRINTF("%s l.%d: rt->_rt_key = %p\n", __func__,
+		    __LINE__, (void *)rt->_rt_key);
 		rt->rt_flags |= RTF_LLINFO;
 		ln->ln_next = llinfo_nd6.ln_next;
 		llinfo_nd6.ln_next = ln;
 		ln->ln_prev = &llinfo_nd6;
 		ln->ln_next->ln_prev = ln;
 
+		RT_DPRINTF("%s l.%d: rt->_rt_key = %p\n", __func__,
+		    __LINE__, (void *)rt->_rt_key);
 		/*
-		 * check if rt_key(rt) is one of my address assigned
+		 * check if rt_getkey(rt) is an address assigned
 		 * to the interface.
 		 */
 		ifa = (struct ifaddr *)in6ifa_ifpwithaddr(rt->rt_ifp,
-		    &SIN6(rt_key(rt))->sin6_addr);
+		    &SIN6(rt_getkey(rt))->sin6_addr);
+		RT_DPRINTF("%s l.%d: rt->_rt_key = %p\n", __func__,
+		    __LINE__, (void *)rt->_rt_key);
 		if (ifa) {
 			void *macp = nd6_ifptomac(ifp);
 			nd6_llinfo_settimer(ln, -1);
@@ -1311,7 +1341,7 @@
 				struct in6_addr llsol;
 				int error;
 
-				llsol = SIN6(rt_key(rt))->sin6_addr;
+				llsol = SIN6(rt_getkey(rt))->sin6_addr;
 				llsol.s6_addr32[0] = htonl(0xff020000);
 				llsol.s6_addr32[1] = 0;
 				llsol.s6_addr32[2] = htonl(1);
@@ -1336,7 +1366,7 @@
 			struct in6_addr llsol;
 			struct in6_multi *in6m;
 
-			llsol = SIN6(rt_key(rt))->sin6_addr;
+			llsol = SIN6(rt_getkey(rt))->sin6_addr;
 			llsol.s6_addr32[0] = htonl(0xff020000);
 			llsol.s6_addr32[1] = 0;
 			llsol.s6_addr32[2] = htonl(1);
@@ -1604,7 +1634,7 @@
 		 * just set the 2nd argument as the 
 		 * 1st one.
 		 */
-		nd6_output(ifp, ifp, m_hold, satocsin6(rt_key(rt)), rt);
+		nd6_output(ifp, ifp, m_hold, satocsin6(rt_getkey(rt)), rt);
 	}
 }
 
--- a/sys/netinet6/nd6.h	Thu Jul 19 20:48:51 2007 +0000
+++ b/sys/netinet6/nd6.h	Thu Jul 19 20:48:52 2007 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: nd6.h,v 1.47 2007/05/17 00:53:26 dyoung Exp $	*/
+/*	$NetBSD: nd6.h,v 1.48 2007/07/19 20:48:57 dyoung Exp $	*/
 /*	$KAME: nd6.h,v 1.95 2002/06/08 11:31:06 itojun Exp $	*/
 
 /*
@@ -431,7 +431,7 @@
 int nd6_prefix_onlink(struct nd_prefix *);
 int nd6_prefix_offlink(struct nd_prefix *);
 void pfxlist_onlink_check(void);
-struct nd_defrouter *defrouter_lookup(struct in6_addr *, struct ifnet *);
+struct nd_defrouter *defrouter_lookup(const struct in6_addr *, struct ifnet *);
 struct nd_prefix *nd6_prefix_lookup(struct nd_prefixctl *);
 int in6_ifdel(struct ifnet *, struct in6_addr *);
 void rt6_flush(struct in6_addr *, struct ifnet *);
--- a/sys/netinet6/nd6_nbr.c	Thu Jul 19 20:48:51 2007 +0000
+++ b/sys/netinet6/nd6_nbr.c	Thu Jul 19 20:48:52 2007 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: nd6_nbr.c,v 1.76 2007/07/09 21:11:13 ad Exp $	*/
+/*	$NetBSD: nd6_nbr.c,v 1.77 2007/07/19 20:48:58 dyoung Exp $	*/
 /*	$KAME: nd6_nbr.c,v 1.61 2001/02/10 16:06:14 jinmei Exp $	*/
 
 /*
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nd6_nbr.c,v 1.76 2007/07/09 21:11:13 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nd6_nbr.c,v 1.77 2007/07/19 20:48:58 dyoung Exp $");
 
 #include "opt_inet.h"
 #include "opt_ipsec.h"
@@ -775,10 +775,10 @@
 			 * update the Destination Cache entries.
 			 */
 			struct nd_defrouter *dr;
-			struct in6_addr *in6;
+			const struct in6_addr *in6;
 			int s;
 
-			in6 = &((struct sockaddr_in6 *)rt_key(rt))->sin6_addr;
+			in6 = &satocsin6(rt_getkey(rt))->sin6_addr;
 
 			/*
 			 * Lock to protect the default router list.
--- a/sys/netinet6/nd6_rtr.c	Thu Jul 19 20:48:51 2007 +0000
+++ b/sys/netinet6/nd6_rtr.c	Thu Jul 19 20:48:52 2007 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: nd6_rtr.c,v 1.65 2007/06/09 03:25:32 dyoung Exp $	*/
+/*	$NetBSD: nd6_rtr.c,v 1.66 2007/07/19 20:48:58 dyoung Exp $	*/
 /*	$KAME: nd6_rtr.c,v 1.95 2001/02/07 08:09:47 itojun Exp $	*/
 
 /*
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nd6_rtr.c,v 1.65 2007/06/09 03:25:32 dyoung Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nd6_rtr.c,v 1.66 2007/07/19 20:48:58 dyoung Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -430,7 +430,7 @@
 	struct rt_addrinfo info;
 
 	bzero((void *)&info, sizeof(info));
-	info.rti_info[RTAX_DST] = rt_key(rt);
+	info.rti_info[RTAX_DST] = rt_getkey(rt);
 	info.rti_info[RTAX_GATEWAY] = rt->rt_gateway;
 	info.rti_info[RTAX_NETMASK] = rt_mask(rt);
 	if (rt->rt_ifp) {
@@ -477,18 +477,16 @@
 }
 
 struct nd_defrouter *
-defrouter_lookup(struct in6_addr *addr, struct ifnet *ifp)
+defrouter_lookup(const struct in6_addr *addr, struct ifnet *ifp)
 {
 	struct nd_defrouter *dr;
 
-	for (dr = TAILQ_FIRST(&nd_defrouter); dr;
-	     dr = TAILQ_NEXT(dr, dr_entry)) {
-		if (dr->ifp == ifp && IN6_ARE_ADDR_EQUAL(addr, &dr->rtaddr)) {
-			return (dr);
-		}
+	TAILQ_FOREACH(dr, &nd_defrouter, dr_entry) {
+		if (dr->ifp == ifp && IN6_ARE_ADDR_EQUAL(addr, &dr->rtaddr))
+			break;
 	}
 
-	return (NULL);		/* search failed */
+	return dr;		/* search failed */
 }
 
 void
@@ -2076,7 +2074,7 @@
 	if ((rt->rt_flags & RTF_HOST) == 0)
 		return (0);
 
-	return (rtrequest(RTM_DELETE, rt_key(rt), rt->rt_gateway,
+	return (rtrequest(RTM_DELETE, rt_getkey(rt), rt->rt_gateway,
 	    rt_mask(rt), rt->rt_flags, 0));
 #undef SIN6
 }
--- a/sys/netinet6/raw_ip6.c	Thu Jul 19 20:48:51 2007 +0000
+++ b/sys/netinet6/raw_ip6.c	Thu Jul 19 20:48:52 2007 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: raw_ip6.c,v 1.85 2007/05/23 17:15:04 christos Exp $	*/
+/*	$NetBSD: raw_ip6.c,v 1.86 2007/07/19 20:48:58 dyoung Exp $	*/
 /*	$KAME: raw_ip6.c,v 1.82 2001/07/23 18:57:56 jinmei Exp $	*/
 
 /*
@@ -62,7 +62,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: raw_ip6.c,v 1.85 2007/05/23 17:15:04 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: raw_ip6.c,v 1.86 2007/07/19 20:48:58 dyoung Exp $");
 
 #include "opt_ipsec.h"
 
@@ -104,8 +104,6 @@
 #include <netipsec/ipsec6.h>
 #endif
 
-#include <machine/stdarg.h>
-
 #include "faith.h"
 #if defined(NFAITH) && 0 < NFAITH
 #include <net/if_faith.h>
@@ -388,17 +386,9 @@
  * Tack on options user may have setup with control call.
  */
 int
-#if __STDC__
-rip6_output(struct mbuf *m, ...)
-#else
-rip6_output(m, va_alist)
-	struct mbuf *m;
-	va_dcl
-#endif
+rip6_output(struct mbuf *m, struct socket *so, struct sockaddr_in6 *dstsock,
+    struct mbuf *control)
 {
-	struct socket *so;
-	struct sockaddr_in6 *dstsock;
-	struct mbuf *control;
 	struct in6_addr *dst;
 	struct ip6_hdr *ip6;
 	struct in6pcb *in6p;
@@ -410,13 +400,6 @@
 	int priv = 0;
 	int scope_ambiguous = 0;
 	struct in6_addr *in6a;
-	va_list ap;
-
-	va_start(ap, m);
-	so = va_arg(ap, struct socket *);
-	dstsock = va_arg(ap, struct sockaddr_in6 *);
-	control = va_arg(ap, struct mbuf *);
-	va_end(ap);
 
 	in6p = sotoin6pcb(so);
 
--- a/sys/netiso/clnp_subr.c	Thu Jul 19 20:48:51 2007 +0000
+++ b/sys/netiso/clnp_subr.c	Thu Jul 19 20:48:52 2007 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: clnp_subr.c,v 1.28 2007/05/02 20:40:28 dyoung Exp $	*/
+/*	$NetBSD: clnp_subr.c,v 1.29 2007/07/19 20:48:59 dyoung Exp $	*/
 
 /*-
  * Copyright (c) 1991, 1993
@@ -59,7 +59,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: clnp_subr.c,v 1.28 2007/05/02 20:40:28 dyoung Exp $");
+__KERNEL_RCSID(0, "$NetBSD: clnp_subr.c,v 1.29 2007/07/19 20:48:59 dyoung Exp $");
 
 #include "opt_iso.h"
 
@@ -644,7 +644,7 @@
 	    rt, line, file);
 #ifdef ARGO_DEBUG
 	printf("route dst is ");
-	dump_isoaddr((struct sockaddr_iso *) rt_key(rt));
+	dump_isoaddr(satocsiso(rt_getkey(rt)));
 #endif
 	return ifp->if_mtu;
 }
--- a/sys/netiso/esis.c	Thu Jul 19 20:48:51 2007 +0000
+++ b/sys/netiso/esis.c	Thu Jul 19 20:48:52 2007 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: esis.c,v 1.46 2007/07/09 21:11:14 ad Exp $	*/
+/*	$NetBSD: esis.c,v 1.47 2007/07/19 20:48:59 dyoung Exp $	*/
 
 /*-
  * Copyright (c) 1991, 1993
@@ -59,7 +59,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: esis.c,v 1.46 2007/07/09 21:11:14 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: esis.c,v 1.47 2007/07/19 20:48:59 dyoung Exp $");
 
 #include "opt_iso.h"
 #ifdef ISO
@@ -361,13 +361,13 @@
 	struct sockaddr_iso siso;
 	struct ifnet   *ifp = inbound_shp->snh_ifp;
 	struct sockaddr_dl *sdl;
-	struct iso_addr *rd_gwnsap;
+	const struct iso_addr *rd_gwnsap;
 
 	if (rt->rt_flags & RTF_GATEWAY) {
 		rd_gwnsap = &satosiso(rt->rt_gateway)->siso_addr;
 		rt = rtalloc1(rt->rt_gateway, 0);
 	} else
-		rd_gwnsap = &satosiso(rt_key(rt))->siso_addr;
+		rd_gwnsap = &satocsiso(rt_getkey(rt))->siso_addr;
 	if (rt == 0 || (sdl = (struct sockaddr_dl *) rt->rt_gateway) == 0 ||
 	    sdl->sdl_family != AF_LINK) {
 		/*
@@ -518,15 +518,14 @@
 esis_insert_addr(
 	void **bufv,		/* ptr to buffer to put address into */
 	int     *len,		/* ptr to length of buffer so far */
-	struct iso_addr *isoa,	/* ptr to address */
+	const struct iso_addr *isoa,	/* ptr to address */
 	struct mbuf *m,		/* determine if there remains space */
 	int     nsellen)
 {
 	char *buf = *bufv;
 	int    newlen, result = 0;
 
-	isoa->isoa_len -= nsellen;
-	newlen = isoa->isoa_len + 1;
+	newlen = isoa->isoa_len - nsellen + 1;
 	if (newlen <= M_TRAILINGSPACE(m)) {
 		memcpy(buf, isoa, newlen);
 		*len += newlen;
@@ -534,7 +533,6 @@
 		m->m_len += newlen;
 		result = 1;
 	}
-	isoa->isoa_len += nsellen;
 	*bufv = buf;
 	return (result);
 }
--- a/sys/netiso/esis.h	Thu Jul 19 20:48:51 2007 +0000
+++ b/sys/netiso/esis.h	Thu Jul 19 20:48:52 2007 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: esis.h,v 1.21 2007/03/04 06:03:32 christos Exp $	*/
+/*	$NetBSD: esis.h,v 1.22 2007/07/19 20:48:59 dyoung Exp $	*/
 
 /*-
  * Copyright (c) 1991, 1993
@@ -134,7 +134,7 @@
 void esis_input (struct mbuf *, ...);
 void esis_rdoutput (struct snpa_hdr *, struct mbuf *, struct clnp_optidx *,
 			struct iso_addr *, struct rtentry *);
-int esis_insert_addr (void **, int *, struct iso_addr *, struct mbuf *,
+int esis_insert_addr (void **, int *, const struct iso_addr *, struct mbuf *,
 			  int);
 void esis_eshinput (struct mbuf *, struct snpa_hdr *);
 void esis_ishinput (struct mbuf *, struct snpa_hdr *);
--- a/sys/netiso/iso_snpac.c	Thu Jul 19 20:48:51 2007 +0000
+++ b/sys/netiso/iso_snpac.c	Thu Jul 19 20:48:52 2007 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: iso_snpac.c,v 1.43 2007/03/04 06:03:32 christos Exp $	*/
+/*	$NetBSD: iso_snpac.c,v 1.44 2007/07/19 20:48:59 dyoung Exp $	*/
 
 /*-
  * Copyright (c) 1991, 1993
@@ -59,7 +59,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: iso_snpac.c,v 1.43 2007/03/04 06:03:32 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: iso_snpac.c,v 1.44 2007/07/19 20:48:59 dyoung Exp $");
 
 #include "opt_iso.h"
 #ifdef ISO
@@ -208,8 +208,8 @@
 			 */
 			if (rt->rt_flags & RTF_CLONING) {
 				iso_setmcasts(ifp, req);
-				rt_setgate(rt, rt_key(rt),
-					   (struct sockaddr *) & blank_dl);
+				rt_setgate(rt,
+				    (const struct sockaddr *)&blank_dl);
 				return;
 			}
 			if (lc != 0)
@@ -391,8 +391,8 @@
 	if (rt && (rt->rt_flags & RTF_UP) &&
 	    (rt->rt_flags & (RTF_DYNAMIC | RTF_MODIFIED))) {
 		RTFREE(rt);
-		rtrequest(RTM_DELETE, rt_key(rt), rt->rt_gateway, rt_mask(rt),
-			  rt->rt_flags, (struct rtentry **) 0);
+		rtrequest(RTM_DELETE, rt_getkey(rt), rt->rt_gateway,
+		    rt_mask(rt), rt->rt_flags, NULL);
 		RTFREE(rt);
 	}
 }
@@ -602,13 +602,13 @@
 	known_is = sc;
 	sc->rt_refcnt++;
 	rt = rtalloc1((struct sockaddr *) & zsi, 0);
-	if (rt == 0)
-		rtrequest(RTM_ADD, sisotosa(&zsi), rt_key(sc), sisotosa(&zmk),
-			  RTF_DYNAMIC | RTF_GATEWAY, 0);
-	else {
+	if (rt == 0) {
+		rtrequest(RTM_ADD, sisotosa(&zsi), rt_getkey(sc),
+		    sisotosa(&zmk), RTF_DYNAMIC | RTF_GATEWAY, 0);
+	} else {
 		if ((rt->rt_flags & RTF_DYNAMIC) &&
 		    (rt->rt_flags & RTF_GATEWAY) && rt_mask(rt)->sa_len == 0)
-			rt_setgate(rt, rt_key(rt), rt_key(sc));
+			rt_setgate(rt, rt_getkey(sc));
 	}
 }
 
--- a/sys/nfs/nfs_boot.c	Thu Jul 19 20:48:51 2007 +0000
+++ b/sys/nfs/nfs_boot.c	Thu Jul 19 20:48:52 2007 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: nfs_boot.c,v 1.67 2007/06/09 02:32:34 dyoung Exp $	*/
+/*	$NetBSD: nfs_boot.c,v 1.68 2007/07/19 20:49:00 dyoung Exp $	*/
 
 /*-
  * Copyright (c) 1995, 1997 The NetBSD Foundation, Inc.
@@ -42,7 +42,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nfs_boot.c,v 1.67 2007/06/09 02:32:34 dyoung Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nfs_boot.c,v 1.68 2007/07/19 20:49:00 dyoung Exp $");
 
 #include "opt_nfs.h"
 #include "opt_tftproot.h"
@@ -98,7 +98,7 @@
 static int md_mount(struct sockaddr_in *mdsin, char *path,
 	struct nfs_args *argp, struct lwp *l);
 
-static int nfs_boot_delroute(struct radix_node *, void *);
+static int nfs_boot_delroute(struct rtentry *, void *);
 static void nfs_boot_defrt(struct in_addr *);
 static  int nfs_boot_getfh(struct nfs_dlmount *ndm, struct lwp *);
 
@@ -536,26 +536,26 @@
 }
 
 static int
-nfs_boot_delroute(struct radix_node *rn, void *w)
+nfs_boot_delroute(struct rtentry *rt, void *w)
 {
-	struct rtentry *rt = (struct rtentry *)rn;
 	int error;
 
-	if (rt->rt_ifp != (struct ifnet *)w)
-		return (0);
+	if ((void *)rt->rt_ifp != w)
+		return 0;
 
-	error = rtrequest(RTM_DELETE, rt_key(rt), NULL, rt_mask(rt), 0, NULL);
-	if (error)
-		printf("nfs_boot: del route, error=%d\n", error);
+	error = rtrequest(RTM_DELETE, rt_getkey(rt), NULL, rt_mask(rt), 0,
+	    NULL);
+	if (error != 0)
+		printf("%s: del route, error=%d\n", __func__, error);
 
-	return (0);
+	return 0;
 }
 
 void
 nfs_boot_flushrt(struct ifnet *ifp)
 {
 
-	rn_walktree(rt_tables[AF_INET], nfs_boot_delroute, ifp);
+	rt_walktree(AF_INET, nfs_boot_delroute, ifp);
 }
 
 /*