diff options
Diffstat (limited to 'sys/net')
| -rw-r--r-- | sys/net/if_mpe.c | 10 | ||||
| -rw-r--r-- | sys/net/if_mpw.c | 10 | ||||
| -rw-r--r-- | sys/net/route.c | 65 | ||||
| -rw-r--r-- | sys/net/route.h | 6 |
4 files changed, 49 insertions, 42 deletions
diff --git a/sys/net/if_mpe.c b/sys/net/if_mpe.c index a3862e67be3..c6a260ad9ed 100644 --- a/sys/net/if_mpe.c +++ b/sys/net/if_mpe.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if_mpe.c,v 1.80 2019/02/11 00:11:24 dlg Exp $ */ +/* $OpenBSD: if_mpe.c,v 1.81 2019/02/13 23:47:42 dlg Exp $ */ /* * Copyright (c) 2008 Pierre-Yves Ritschard <pyr@spootnik.org> @@ -130,7 +130,7 @@ mpe_clone_destroy(struct ifnet *ifp) if (sc->sc_smpls.smpls_label) { rt_ifa_del(&sc->sc_ifa, RTF_MPLS, - smplstosa(&sc->sc_smpls)); + smplstosa(&sc->sc_smpls), 0); } if_detach(ifp); @@ -316,12 +316,12 @@ mpe_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) if (sc->sc_smpls.smpls_label) { /* remove old MPLS route */ rt_ifa_del(&sc->sc_ifa, RTF_MPLS, - smplstosa(&sc->sc_smpls)); + smplstosa(&sc->sc_smpls), 0); } /* add new MPLS route */ sc->sc_smpls.smpls_label = shim.shim_label; error = rt_ifa_add(&sc->sc_ifa, RTF_MPLS|RTF_LOCAL, - smplstosa(&sc->sc_smpls)); + smplstosa(&sc->sc_smpls), 0); if (error) { sc->sc_smpls.smpls_label = 0; break; @@ -333,7 +333,7 @@ mpe_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) if (ifr->ifr_rdomainid != ifp->if_rdomain) { if (sc->sc_smpls.smpls_label) { rt_ifa_add(&sc->sc_ifa, RTF_MPLS, - smplstosa(&sc->sc_smpls)); + smplstosa(&sc->sc_smpls), 0); } } /* return with ENOTTY so that the parent handler finishes */ diff --git a/sys/net/if_mpw.c b/sys/net/if_mpw.c index f58729c8530..36a95040b65 100644 --- a/sys/net/if_mpw.c +++ b/sys/net/if_mpw.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if_mpw.c,v 1.33 2019/02/11 00:11:24 dlg Exp $ */ +/* $OpenBSD: if_mpw.c,v 1.34 2019/02/13 23:47:42 dlg Exp $ */ /* * Copyright (c) 2015 Rafael Zalamena <rzalamena@openbsd.org> @@ -120,7 +120,7 @@ mpw_clone_destroy(struct ifnet *ifp) if (sc->sc_smpls.smpls_label) { rt_ifa_del(&sc->sc_ifa, RTF_MPLS, - smplstosa(&sc->sc_smpls)); + smplstosa(&sc->sc_smpls), 0); } ether_ifdetach(ifp); @@ -166,7 +166,7 @@ mpw_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) sin = (struct sockaddr_in *) &imr.imr_nexthop; if (sin->sin_addr.s_addr == 0) { if (rt_ifa_del(&sc->sc_ifa, RTF_MPLS, - smplstosa(&sc->sc_smpls)) == 0) + smplstosa(&sc->sc_smpls), 0) == 0) sc->sc_smpls.smpls_label = 0; memset(&sc->sc_rshim, 0, sizeof(sc->sc_rshim)); @@ -195,11 +195,11 @@ mpw_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) if (sc->sc_smpls.smpls_label != imr.imr_lshim.shim_label) { if (sc->sc_smpls.smpls_label) rt_ifa_del(&sc->sc_ifa, RTF_MPLS, - smplstosa(&sc->sc_smpls)); + smplstosa(&sc->sc_smpls), 0); sc->sc_smpls.smpls_label = imr.imr_lshim.shim_label; error = rt_ifa_add(&sc->sc_ifa, RTF_MPLS|RTF_LOCAL, - smplstosa(&sc->sc_smpls)); + smplstosa(&sc->sc_smpls), 0); if (error != 0) { sc->sc_smpls.smpls_label = 0; break; diff --git a/sys/net/route.c b/sys/net/route.c index 657e507a4e4..b42c51698a4 100644 --- a/sys/net/route.c +++ b/sys/net/route.c @@ -1,4 +1,4 @@ -/* $OpenBSD: route.c,v 1.380 2019/02/10 22:32:26 dlg Exp $ */ +/* $OpenBSD: route.c,v 1.381 2019/02/13 23:47:42 dlg Exp $ */ /* $NetBSD: route.c,v 1.14 1996/02/13 22:00:46 christos Exp $ */ /* @@ -1030,13 +1030,13 @@ rt_maskedcopy(struct sockaddr *src, struct sockaddr *dst, } int -rt_ifa_add(struct ifaddr *ifa, int flags, struct sockaddr *dst) +rt_ifa_add(struct ifaddr *ifa, int flags, struct sockaddr *dst, + unsigned int rdomain) { struct ifnet *ifp = ifa->ifa_ifp; struct rtentry *rt; struct sockaddr_rtlabel sa_rl; struct rt_addrinfo info; - unsigned int rtableid = ifp->if_rdomain; uint8_t prio = ifp->if_priority + RTP_STATIC; int error; @@ -1048,14 +1048,16 @@ rt_ifa_add(struct ifaddr *ifa, int flags, struct sockaddr *dst) info.rti_info[RTAX_GATEWAY] = sdltosa(ifp->if_sadl); else info.rti_info[RTAX_GATEWAY] = ifa->ifa_addr; - info.rti_info[RTAX_LABEL] = rtlabel_id2sa(ifp->if_rtlabelid, &sa_rl); + + KASSERT(rdomain == rtable_l2(rdomain)); + if (rdomain == rtable_l2(ifp->if_rtlabelid)) { + info.rti_info[RTAX_LABEL] = + rtlabel_id2sa(ifp->if_rtlabelid, &sa_rl); + } #ifdef MPLS - if ((flags & RTF_MPLS) == RTF_MPLS) { + if ((flags & RTF_MPLS) == RTF_MPLS) info.rti_mpls = MPLS_OP_POP; - /* MPLS routes only exist in rdomain 0 */ - rtableid = 0; - } #endif /* MPLS */ if ((flags & RTF_HOST) == 0) @@ -1067,7 +1069,7 @@ rt_ifa_add(struct ifaddr *ifa, int flags, struct sockaddr *dst) if (flags & RTF_CONNECTED) prio = ifp->if_priority + RTP_CONNECTED; - error = rtrequest(RTM_ADD, &info, prio, &rt, rtableid); + error = rtrequest(RTM_ADD, &info, prio, &rt, rdomain); if (error == 0) { /* * A local route is created for every address configured @@ -1076,14 +1078,15 @@ rt_ifa_add(struct ifaddr *ifa, int flags, struct sockaddr *dst) */ if (flags & RTF_LOCAL) rtm_addr(RTM_NEWADDR, ifa); - rtm_send(rt, RTM_ADD, 0, rtableid); + rtm_send(rt, RTM_ADD, 0, rdomain); rtfree(rt); } return (error); } int -rt_ifa_del(struct ifaddr *ifa, int flags, struct sockaddr *dst) +rt_ifa_del(struct ifaddr *ifa, int flags, struct sockaddr *dst, + unsigned int rdomain) { struct ifnet *ifp = ifa->ifa_ifp; struct rtentry *rt; @@ -1091,16 +1094,9 @@ rt_ifa_del(struct ifaddr *ifa, int flags, struct sockaddr *dst) struct sockaddr *deldst; struct rt_addrinfo info; struct sockaddr_rtlabel sa_rl; - unsigned int rtableid = ifp->if_rdomain; uint8_t prio = ifp->if_priority + RTP_STATIC; int error; -#ifdef MPLS - if ((flags & RTF_MPLS) == RTF_MPLS) - /* MPLS routes only exist in rdomain 0 */ - rtableid = 0; -#endif /* MPLS */ - if ((flags & RTF_HOST) == 0 && ifa->ifa_netmask) { m = m_get(M_DONTWAIT, MT_SONAME); if (m == NULL) @@ -1116,7 +1112,12 @@ rt_ifa_del(struct ifaddr *ifa, int flags, struct sockaddr *dst) info.rti_info[RTAX_DST] = dst; if ((flags & RTF_LLINFO) == 0) info.rti_info[RTAX_GATEWAY] = ifa->ifa_addr; - info.rti_info[RTAX_LABEL] = rtlabel_id2sa(ifp->if_rtlabelid, &sa_rl); + + KASSERT(rdomain == rtable_l2(rdomain)); + if (rdomain == rtable_l2(ifp->if_rtlabelid)) { + info.rti_info[RTAX_LABEL] = + rtlabel_id2sa(ifp->if_rtlabelid, &sa_rl); + } if ((flags & RTF_HOST) == 0) info.rti_info[RTAX_NETMASK] = ifa->ifa_netmask; @@ -1127,9 +1128,9 @@ rt_ifa_del(struct ifaddr *ifa, int flags, struct sockaddr *dst) if (flags & RTF_CONNECTED) prio = ifp->if_priority + RTP_CONNECTED; - error = rtrequest_delete(&info, prio, ifp, &rt, rtableid); + error = rtrequest_delete(&info, prio, ifp, &rt, rdomain); if (error == 0) { - rtm_send(rt, RTM_DELETE, 0, rtableid); + rtm_send(rt, RTM_DELETE, 0, rdomain); if (flags & RTF_LOCAL) rtm_addr(RTM_DELADDR, ifa); rtfree(rt); @@ -1145,6 +1146,7 @@ rt_ifa_del(struct ifaddr *ifa, int flags, struct sockaddr *dst) int rt_ifa_addlocal(struct ifaddr *ifa) { + struct ifnet *ifp = ifa->ifa_ifp; struct rtentry *rt; u_int flags = RTF_HOST|RTF_LOCAL; int error = 0; @@ -1171,13 +1173,15 @@ rt_ifa_addlocal(struct ifaddr *ifa) break; } - if (!ISSET(ifa->ifa_ifp->if_flags, (IFF_LOOPBACK|IFF_POINTOPOINT))) + if (!ISSET(ifp->if_flags, (IFF_LOOPBACK|IFF_POINTOPOINT))) flags |= RTF_LLINFO; /* If there is no local entry, allocate one. */ - rt = rtalloc(ifa->ifa_addr, 0, ifa->ifa_ifp->if_rdomain); - if (rt == NULL || ISSET(rt->rt_flags, flags) != flags) - error = rt_ifa_add(ifa, flags | RTF_MPATH, ifa->ifa_addr); + rt = rtalloc(ifa->ifa_addr, 0, ifp->if_rdomain); + if (rt == NULL || ISSET(rt->rt_flags, flags) != flags) { + error = rt_ifa_add(ifa, flags | RTF_MPATH, ifa->ifa_addr, + ifp->if_rdomain); + } rtfree(rt); return (error); @@ -1189,6 +1193,7 @@ rt_ifa_addlocal(struct ifaddr *ifa) int rt_ifa_dellocal(struct ifaddr *ifa) { + struct ifnet *ifp = ifa->ifa_ifp; struct rtentry *rt; u_int flags = RTF_HOST|RTF_LOCAL; int error = 0; @@ -1213,7 +1218,7 @@ rt_ifa_dellocal(struct ifaddr *ifa) break; } - if (!ISSET(ifa->ifa_ifp->if_flags, (IFF_LOOPBACK|IFF_POINTOPOINT))) + if (!ISSET(ifp->if_flags, (IFF_LOOPBACK|IFF_POINTOPOINT))) flags |= RTF_LLINFO; /* @@ -1224,9 +1229,11 @@ rt_ifa_dellocal(struct ifaddr *ifa) * a subnet-router anycast address on an interface attached * to a shared medium. */ - rt = rtalloc(ifa->ifa_addr, 0, ifa->ifa_ifp->if_rdomain); - if (rt != NULL && ISSET(rt->rt_flags, flags) == flags) - error = rt_ifa_del(ifa, flags, ifa->ifa_addr); + rt = rtalloc(ifa->ifa_addr, 0, ifp->if_rdomain); + if (rt != NULL && ISSET(rt->rt_flags, flags) == flags) { + error = rt_ifa_del(ifa, flags, ifa->ifa_addr, + ifp->if_rdomain); + } rtfree(rt); return (error); diff --git a/sys/net/route.h b/sys/net/route.h index b145964dc55..41aa5a1ace7 100644 --- a/sys/net/route.h +++ b/sys/net/route.h @@ -1,4 +1,4 @@ -/* $OpenBSD: route.h,v 1.173 2018/11/12 16:36:54 krw Exp $ */ +/* $OpenBSD: route.h,v 1.174 2019/02/13 23:47:42 dlg Exp $ */ /* $NetBSD: route.h,v 1.9 1996/02/13 22:00:49 christos Exp $ */ /* @@ -455,8 +455,8 @@ struct rtentry *rtalloc(struct sockaddr *, int, unsigned int); void rtref(struct rtentry *); void rtfree(struct rtentry *); -int rt_ifa_add(struct ifaddr *, int, struct sockaddr *); -int rt_ifa_del(struct ifaddr *, int, struct sockaddr *); +int rt_ifa_add(struct ifaddr *, int, struct sockaddr *, unsigned int); +int rt_ifa_del(struct ifaddr *, int, struct sockaddr *, unsigned int); void rt_ifa_purge(struct ifaddr *); int rt_ifa_addlocal(struct ifaddr *); int rt_ifa_dellocal(struct ifaddr *); |
