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
This commit is contained in:
Alan Somers 2014-04-24 17:23:16 +00:00
parent 08a7cce543
commit 0489b8916e
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=264887
5 changed files with 7 additions and 8 deletions

View File

@ -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);

View File

@ -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 *);

View File

@ -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;

View File

@ -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,

View File

@ -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"