Module Name:    src
Committed By:   roy
Date:           Wed Oct  7 09:44:26 UTC 2015

Modified Files:
        src/sys/net: route.c

Log Message:
Remove rt_ifa_localrequest().
In it's place, use rtrequest1() inside rt_ifa_addlocal() and
rtdeletemsg() inside rt_ifa_remlocal().

This removes the need for INET/INET6 specific code and allows
greater control over the creation of the local address route.


To generate a diff of this commit:
cvs rdiff -u -r1.151 -r1.152 src/sys/net/route.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/net/route.c
diff -u src/sys/net/route.c:1.151 src/sys/net/route.c:1.152
--- src/sys/net/route.c:1.151	Thu Sep  3 02:04:31 2015
+++ src/sys/net/route.c	Wed Oct  7 09:44:26 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: route.c,v 1.151 2015/09/03 02:04:31 ozaki-r Exp $	*/
+/*	$NetBSD: route.c,v 1.152 2015/10/07 09:44:26 roy Exp $	*/
 
 /*-
  * Copyright (c) 1998, 2008 The NetBSD Foundation, Inc.
@@ -96,7 +96,7 @@
 #endif
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: route.c,v 1.151 2015/09/03 02:04:31 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: route.c,v 1.152 2015/10/07 09:44:26 roy Exp $");
 
 #include <sys/param.h>
 #ifdef RTFLUSH_DEBUG
@@ -1106,52 +1106,6 @@ rtinit(struct ifaddr *ifa, int cmd, int 
 	return error;
 }
 
-static const struct in_addr inmask32 = {.s_addr = INADDR_BROADCAST};
-
-/* Subroutine for rt_ifa_addlocal() and rt_ifa_remlocal() */
-static int
-rt_ifa_localrequest(int cmd, struct ifaddr *ifa)
-{
-	struct sockaddr *all1_sa;
-	struct sockaddr_in all1_sin;
-#ifdef INET6
-	struct sockaddr_in6 all1_sin6;
-#endif
-	struct rtentry *nrt = NULL;
-	int flags, e;
-
-	switch(ifa->ifa_addr->sa_family) {
-	case AF_INET:
-		sockaddr_in_init(&all1_sin, &inmask32, 0);
-		all1_sa = (struct sockaddr *)&all1_sin;
-		break;
-#ifdef INET6
-	case AF_INET6:
-		sockaddr_in6_init(&all1_sin6, &in6mask128, 0, 0, 0);
-		all1_sa = (struct sockaddr *)&all1_sin6;
-		break;
-#endif
-	default:
-		return 0;
-	}
-
-	flags = RTF_UP | RTF_HOST | RTF_LOCAL;
-	if (!(ifa->ifa_ifp->if_flags & (IFF_LOOPBACK | IFF_POINTOPOINT)))
-		flags |= RTF_LLINFO;
-	e = rtrequest(cmd, ifa->ifa_addr, ifa->ifa_addr, all1_sa, flags, &nrt);
-
-	/* Make sure rt_ifa be equal to IFA, the second argument of the
-	 * function. */
-	if (cmd == RTM_ADD && nrt && ifa != nrt->rt_ifa)
-		rt_replace_ifa(nrt, ifa);
-
-	rt_newaddrmsg(cmd, ifa, e, nrt);
-	if (nrt != NULL)
-		rtfree(nrt);
-
-	return e;
-}
-
 /*
  * Create a local route entry for the address.
  * Announce the addition of the address and the route to the routing socket.
@@ -1166,8 +1120,26 @@ rt_ifa_addlocal(struct ifaddr *ifa)
 	rt = rtalloc1(ifa->ifa_addr, 0);
 	if (rt == NULL || (rt->rt_flags & RTF_HOST) == 0 ||
 	    (rt->rt_ifp->if_flags & IFF_LOOPBACK) == 0)
-		e = rt_ifa_localrequest(RTM_ADD, ifa);
-	else {
+	{
+		struct rt_addrinfo info;
+		struct rtentry *nrt;
+
+		memset(&info, 0, sizeof(info));
+		info.rti_flags = RTF_HOST | RTF_LOCAL;
+		if (!(ifa->ifa_ifp->if_flags & (IFF_LOOPBACK|IFF_POINTOPOINT)))
+			info.rti_flags |= RTF_LLINFO;
+		info.rti_info[RTAX_DST] = ifa->ifa_addr;
+		info.rti_info[RTAX_GATEWAY] =
+		    (const struct sockaddr *)ifa->ifa_ifp->if_sadl;
+		info.rti_ifa = ifa;
+		nrt = NULL;
+		e = rtrequest1(RTM_ADD, &info, &nrt);
+		if (nrt && ifa != nrt->rt_ifa)
+			rt_replace_ifa(nrt, ifa);
+		rt_newaddrmsg(RTM_ADD, ifa, e, nrt);
+		if (nrt != NULL)
+			rtfree(nrt);
+	} else {
 		e = 0;
 		rt_newaddrmsg(RTM_NEWADDR, ifa, 0, NULL);
 	}
@@ -1204,9 +1176,10 @@ rt_ifa_remlocal(struct ifaddr *ifa, stru
 		 * ifaddr of another interface, I believe it is safest to
 		 * delete the route.
 		 */
-		if (alt_ifa == NULL)
-			e = rt_ifa_localrequest(RTM_DELETE, ifa);
-		else {
+		if (alt_ifa == NULL) {
+			e = rtdeletemsg(rt);
+			rt_newaddrmsg(RTM_DELADDR, ifa, 0, NULL);
+		} else {
 			rt_replace_ifa(rt, alt_ifa);
 			rt_newmsg(RTM_CHANGE, rt);
 		}

Reply via email to