Module Name:    src
Committed By:   kefren
Date:           Sun May  2 19:17:56 UTC 2010

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

Log Message:
Permit the existence of a route with unlinked ifp and ifa,
enabling this way the posibility to send a packet on an interface with
source address from another interface.


To generate a diff of this commit:
cvs rdiff -u -r1.121 -r1.122 src/sys/net/route.c
cvs rdiff -u -r1.127 -r1.128 src/sys/net/rtsock.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.121 src/sys/net/route.c:1.122
--- src/sys/net/route.c:1.121	Tue Nov  3 00:30:11 2009
+++ src/sys/net/route.c	Sun May  2 19:17:56 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: route.c,v 1.121 2009/11/03 00:30:11 dyoung Exp $	*/
+/*	$NetBSD: route.c,v 1.122 2010/05/02 19:17:56 kefren Exp $	*/
 
 /*-
  * Copyright (c) 1998, 2008 The NetBSD Foundation, Inc.
@@ -93,7 +93,7 @@
 #include "opt_route.h"
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: route.c,v 1.121 2009/11/03 00:30:11 dyoung Exp $");
+__KERNEL_RCSID(0, "$NetBSD: route.c,v 1.122 2010/05/02 19:17:56 kefren Exp $");
 
 #include <sys/param.h>
 #include <sys/sysctl.h>
@@ -490,6 +490,7 @@
 			if (rt != NULL)
 				rtfree(rt);
 			flags |=  RTF_GATEWAY | RTF_DYNAMIC;
+			memset(&info, 0, sizeof(info));
 			info.rti_info[RTAX_DST] = dst;
 			info.rti_info[RTAX_GATEWAY] = gateway;
 			info.rti_info[RTAX_NETMASK] = netmask;
@@ -702,7 +703,7 @@
 	struct rtentry *rt, *crt;
 	struct radix_node *rn;
 	struct radix_node_head *rnh;
-	struct ifaddr *ifa;
+	struct ifaddr *ifa, *ifa2;
 	struct sockaddr_storage maskeddst;
 	const struct sockaddr *dst = info->rti_info[RTAX_DST];
 	const struct sockaddr *gateway = info->rti_info[RTAX_GATEWAY];
@@ -804,7 +805,12 @@
 		}
 		rt_set_ifa(rt, ifa);
 		RT_DPRINTF("rt->_rt_key = %p\n", (void *)rt->_rt_key);
-		rt->rt_ifp = ifa->ifa_ifp;
+		if (info->rti_info[RTAX_IFP] != NULL &&
+		    (ifa2 = ifa_ifwithnet(info->rti_info[RTAX_IFP])) != NULL &&
+		    ifa2->ifa_ifp != NULL)
+			rt->rt_ifp = ifa2->ifa_ifp;
+		else
+			rt->rt_ifp = ifa->ifa_ifp;
 		if (req == RTM_RESOLVE) {
 			rt->rt_rmx = (*ret_nrt)->rt_rmx; /* copy metrics */
 			rt->rt_parent = *ret_nrt;

Index: src/sys/net/rtsock.c
diff -u src/sys/net/rtsock.c:1.127 src/sys/net/rtsock.c:1.128
--- src/sys/net/rtsock.c:1.127	Wed Sep 16 15:23:04 2009
+++ src/sys/net/rtsock.c	Sun May  2 19:17:56 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: rtsock.c,v 1.127 2009/09/16 15:23:04 pooka Exp $	*/
+/*	$NetBSD: rtsock.c,v 1.128 2010/05/02 19:17:56 kefren 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.127 2009/09/16 15:23:04 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rtsock.c,v 1.128 2010/05/02 19:17:56 kefren Exp $");
 
 #include "opt_inet.h"
 #ifdef _KERNEL_OPT
@@ -410,9 +410,13 @@
 			    (ifa = ifa_ifwithnet(info.rti_info[RTAX_IFP])) &&
 			    (ifp = ifa->ifa_ifp) && (info.rti_info[RTAX_IFA] ||
 			    info.rti_info[RTAX_GATEWAY])) {
-				ifa = ifaof_ifpforaddr(info.rti_info[RTAX_IFA] ?
-				    info.rti_info[RTAX_IFA] :
-				    info.rti_info[RTAX_GATEWAY], ifp);
+				if (info.rti_info[RTAX_IFA] == NULL ||
+				    (ifa = ifa_ifwithaddr(
+				    info.rti_info[RTAX_IFA])) == NULL)
+					ifa = ifaof_ifpforaddr(
+					    info.rti_info[RTAX_IFA] ?
+					    info.rti_info[RTAX_IFA] :
+					    info.rti_info[RTAX_GATEWAY], ifp);
 			} else if ((info.rti_info[RTAX_IFA] &&
 			    (ifa = ifa_ifwithaddr(info.rti_info[RTAX_IFA]))) ||
 			    (info.rti_info[RTAX_GATEWAY] &&

Reply via email to