View | Details | Raw Unified | Return to bug 187549 | Differences between
and this patch

Collapse All | Expand All

(-)sys/net/if.c (-4 / +4 lines)
Lines 1485-1491 Link Here
1485
	info.rti_flags = ifa->ifa_flags | RTF_HOST | RTF_STATIC;
1485
	info.rti_flags = ifa->ifa_flags | RTF_HOST | RTF_STATIC;
1486
	info.rti_info[RTAX_DST] = ia;
1486
	info.rti_info[RTAX_DST] = ia;
1487
	info.rti_info[RTAX_GATEWAY] = (struct sockaddr *)&null_sdl;
1487
	info.rti_info[RTAX_GATEWAY] = (struct sockaddr *)&null_sdl;
1488
	error = rtrequest1_fib(RTM_ADD, &info, &rt, 0);
1488
	error = rtrequest1_fib(RTM_ADD, &info, &rt, ifa->ifa_ifp->if_fib);
1489
1489
1490
	if (error == 0 && rt != NULL) {
1490
	if (error == 0 && rt != NULL) {
1491
		RT_LOCK(rt);
1491
		RT_LOCK(rt);
Lines 1517-1523 Link Here
1517
	info.rti_flags = ifa->ifa_flags | RTF_HOST | RTF_STATIC;
1517
	info.rti_flags = ifa->ifa_flags | RTF_HOST | RTF_STATIC;
1518
	info.rti_info[RTAX_DST] = ia;
1518
	info.rti_info[RTAX_DST] = ia;
1519
	info.rti_info[RTAX_GATEWAY] = (struct sockaddr *)&null_sdl;
1519
	info.rti_info[RTAX_GATEWAY] = (struct sockaddr *)&null_sdl;
1520
	error = rtrequest1_fib(RTM_DELETE, &info, NULL, 0);
1520
	error = rtrequest1_fib(RTM_DELETE, &info, NULL, ifa->ifa_ifp->if_fib);
1521
1521
1522
	if (error != 0)
1522
	if (error != 0)
1523
		log(LOG_DEBUG, "%s: deletion failed: %u\n", __func__, error);
1523
		log(LOG_DEBUG, "%s: deletion failed: %u\n", __func__, error);
Lines 1526-1536 Link Here
1526
}
1526
}
1527
1527
1528
int
1528
int
1529
ifa_switch_loopback_route(struct ifaddr *ifa, struct sockaddr *sa)
1529
ifa_switch_loopback_route(struct ifaddr *ifa, struct sockaddr *sa, int fib)
1530
{
1530
{
1531
	struct rtentry *rt;
1531
	struct rtentry *rt;
1532
1532
1533
	rt = rtalloc1_fib(sa, 0, 0, 0);
1533
	rt = rtalloc1_fib(sa, 0, 0, fib);
1534
	if (rt == NULL) {
1534
	if (rt == NULL) {
1535
		log(LOG_DEBUG, "%s: fail", __func__);
1535
		log(LOG_DEBUG, "%s: fail", __func__);
1536
		return (EHOSTUNREACH);
1536
		return (EHOSTUNREACH);
(-)sys/net/if_var.h (-1 / +1 lines)
Lines 490-496 Link Here
490
490
491
int	ifa_add_loopback_route(struct ifaddr *, struct sockaddr *);
491
int	ifa_add_loopback_route(struct ifaddr *, struct sockaddr *);
492
int	ifa_del_loopback_route(struct ifaddr *, struct sockaddr *);
492
int	ifa_del_loopback_route(struct ifaddr *, struct sockaddr *);
493
int	ifa_switch_loopback_route(struct ifaddr *, struct sockaddr *);
493
int	ifa_switch_loopback_route(struct ifaddr *, struct sockaddr *, int fib);
494
494
495
struct	ifaddr *ifa_ifwithaddr(struct sockaddr *);
495
struct	ifaddr *ifa_ifwithaddr(struct sockaddr *);
496
int		ifa_ifwithaddr_check(struct sockaddr *);
496
int		ifa_ifwithaddr_check(struct sockaddr *);
(-)sys/net/route.c (-1 / +1 lines)
Lines 1536-1542 Link Here
1536
	}
1536
	}
1537
	if (fibnum == RT_ALL_FIBS) {
1537
	if (fibnum == RT_ALL_FIBS) {
1538
		if (rt_add_addr_allfibs == 0 && cmd == (int)RTM_ADD) {
1538
		if (rt_add_addr_allfibs == 0 && cmd == (int)RTM_ADD) {
1539
			startfib = endfib = curthread->td_proc->p_fibnum;
1539
			startfib = endfib = ifa->ifa_ifp->if_fib;
1540
		} else {
1540
		} else {
1541
			startfib = 0;
1541
			startfib = 0;
1542
			endfib = rt_numfibs - 1;
1542
			endfib = rt_numfibs - 1;
(-)sys/netinet/in.c (-1 / +1 lines)
Lines 708-714 Link Here
708
708
709
		if (eia != NULL) {
709
		if (eia != NULL) {
710
			error = ifa_switch_loopback_route((struct ifaddr *)eia,
710
			error = ifa_switch_loopback_route((struct ifaddr *)eia,
711
			    (struct sockaddr *)&target->ia_addr);
711
			    (struct sockaddr *)&target->ia_addr, fibnum);
712
			ifa_free(&eia->ia_ifa);
712
			ifa_free(&eia->ia_ifa);
713
		} else {
713
		} else {
714
			error = ifa_del_loopback_route((struct ifaddr *)target,
714
			error = ifa_del_loopback_route((struct ifaddr *)target,

Return to bug 187549