summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorasomers <asomers@FreeBSD.org>2014-04-24 17:23:16 +0000
committerasomers <asomers@FreeBSD.org>2014-04-24 17:23:16 +0000
commit6e7494c7e1c3c8d00265fe530a28384c7ccdee68 (patch)
tree177ae04a4097c8f57e0c87e2c91602006082918b
parent61397be4e94b19058e284c012b1cc474897b0050 (diff)
downloadFreeBSD-src-6e7494c7e1c3c8d00265fe530a28384c7ccdee68.zip
FreeBSD-src-6e7494c7e1c3c8d00265fe530a28384c7ccdee68.tar.gz
Fix host and network routes for new interfaces when net.add_addr_allfibs=0
sys/net/route.c In rtinit1, use the interface fib instead of the process fib. The latter wasn't very useful because ifconfig(8) is usually invoked with the default process fib. Changing ifconfig(8) to use setfib(2) would be redundant, because it already sets the interface fib. tests/sys/netinet/fibs_test.sh Clear the expected ATF failure sys/net/if.c Pass the interface fib in calls to rtrequest1_fib and rtalloc1_fib sys/netinet/in.c sys/net/if_var.h Add a fibnum argument to ifa_switch_loopback_route, a subroutine of in_scrubprefix. Pass it the interface fib. PR: kern/187549 Reviewed by: melifaro MFC after: 3 weeks Sponsored by: Spectra Logic Corporation
-rw-r--r--sys/net/if.c8
-rw-r--r--sys/net/if_var.h2
-rw-r--r--sys/net/route.c2
-rw-r--r--sys/netinet/in.c2
-rwxr-xr-xtests/sys/netinet/fibs_test.sh1
5 files changed, 7 insertions, 8 deletions
diff --git a/sys/net/if.c b/sys/net/if.c
index a24b341..a223422 100644
--- a/sys/net/if.c
+++ b/sys/net/if.c
@@ -1485,7 +1485,7 @@ ifa_add_loopback_route(struct ifaddr *ifa, struct sockaddr *ia)
info.rti_flags = ifa->ifa_flags | RTF_HOST | RTF_STATIC;
info.rti_info[RTAX_DST] = ia;
info.rti_info[RTAX_GATEWAY] = (struct sockaddr *)&null_sdl;
- error = rtrequest1_fib(RTM_ADD, &info, &rt, 0);
+ error = rtrequest1_fib(RTM_ADD, &info, &rt, ifa->ifa_ifp->if_fib);
if (error == 0 && rt != NULL) {
RT_LOCK(rt);
@@ -1517,7 +1517,7 @@ ifa_del_loopback_route(struct ifaddr *ifa, struct sockaddr *ia)
info.rti_flags = ifa->ifa_flags | RTF_HOST | RTF_STATIC;
info.rti_info[RTAX_DST] = ia;
info.rti_info[RTAX_GATEWAY] = (struct sockaddr *)&null_sdl;
- error = rtrequest1_fib(RTM_DELETE, &info, NULL, 0);
+ error = rtrequest1_fib(RTM_DELETE, &info, NULL, ifa->ifa_ifp->if_fib);
if (error != 0)
log(LOG_DEBUG, "%s: deletion failed: %u\n", __func__, error);
@@ -1526,11 +1526,11 @@ ifa_del_loopback_route(struct ifaddr *ifa, struct sockaddr *ia)
}
int
-ifa_switch_loopback_route(struct ifaddr *ifa, struct sockaddr *sa)
+ifa_switch_loopback_route(struct ifaddr *ifa, struct sockaddr *sa, int fib)
{
struct rtentry *rt;
- rt = rtalloc1_fib(sa, 0, 0, 0);
+ rt = rtalloc1_fib(sa, 0, 0, fib);
if (rt == NULL) {
log(LOG_DEBUG, "%s: fail", __func__);
return (EHOSTUNREACH);
diff --git a/sys/net/if_var.h b/sys/net/if_var.h
index e65063d..1cdc0b3 100644
--- a/sys/net/if_var.h
+++ b/sys/net/if_var.h
@@ -490,7 +490,7 @@ struct ifnet *ifunit_ref(const char *);
int ifa_add_loopback_route(struct ifaddr *, struct sockaddr *);
int ifa_del_loopback_route(struct ifaddr *, struct sockaddr *);
-int ifa_switch_loopback_route(struct ifaddr *, struct sockaddr *);
+int ifa_switch_loopback_route(struct ifaddr *, struct sockaddr *, int fib);
struct ifaddr *ifa_ifwithaddr(struct sockaddr *);
int ifa_ifwithaddr_check(struct sockaddr *);
diff --git a/sys/net/route.c b/sys/net/route.c
index 748b0ca..d6847c8 100644
--- a/sys/net/route.c
+++ b/sys/net/route.c
@@ -1536,7 +1536,7 @@ rtinit1(struct ifaddr *ifa, int cmd, int flags, int fibnum)
}
if (fibnum == RT_ALL_FIBS) {
if (rt_add_addr_allfibs == 0 && cmd == (int)RTM_ADD) {
- startfib = endfib = curthread->td_proc->p_fibnum;
+ startfib = endfib = ifa->ifa_ifp->if_fib;
} else {
startfib = 0;
endfib = rt_numfibs - 1;
diff --git a/sys/netinet/in.c b/sys/netinet/in.c
index bb8873b..9216e4b 100644
--- a/sys/netinet/in.c
+++ b/sys/netinet/in.c
@@ -708,7 +708,7 @@ in_scrubprefix(struct in_ifaddr *target, u_int flags)
if (eia != NULL) {
error = ifa_switch_loopback_route((struct ifaddr *)eia,
- (struct sockaddr *)&target->ia_addr);
+ (struct sockaddr *)&target->ia_addr, fibnum);
ifa_free(&eia->ia_ifa);
} else {
error = ifa_del_loopback_route((struct ifaddr *)target,
diff --git a/tests/sys/netinet/fibs_test.sh b/tests/sys/netinet/fibs_test.sh
index d12ec44..d6756bd 100755
--- a/tests/sys/netinet/fibs_test.sh
+++ b/tests/sys/netinet/fibs_test.sh
@@ -116,7 +116,6 @@ loopback_and_network_routes_on_nondefault_fib_head()
loopback_and_network_routes_on_nondefault_fib_body()
{
- atf_expect_fail "kern/187549 Host and network routes for a new interface appear in the wrong FIB"
# Configure the TAP interface to use an RFC5737 nonrouteable address
# and a non-default fib
ADDR="192.0.2.2"
OpenPOWER on IntegriCloud