From owner-svn-src-head@freebsd.org Sun Jul 12 11:24:25 2020 Return-Path: Delivered-To: svn-src-head@mailman.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.nyi.freebsd.org (Postfix) with ESMTP id 104EC360828; Sun, 12 Jul 2020 11:24:25 +0000 (UTC) (envelope-from melifaro@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4B4PZ06bnXz4RNK; Sun, 12 Jul 2020 11:24:24 +0000 (UTC) (envelope-from melifaro@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id C61C42383B; Sun, 12 Jul 2020 11:24:24 +0000 (UTC) (envelope-from melifaro@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 06CBOOpZ084080; Sun, 12 Jul 2020 11:24:24 GMT (envelope-from melifaro@FreeBSD.org) Received: (from melifaro@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 06CBONPG084075; Sun, 12 Jul 2020 11:24:23 GMT (envelope-from melifaro@FreeBSD.org) Message-Id: <202007121124.06CBONPG084075@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: melifaro set sender to melifaro@FreeBSD.org using -f From: "Alexander V. Chernikov" Date: Sun, 12 Jul 2020 11:24:23 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r363128 - in head/sys: net net/route netinet6 X-SVN-Group: head X-SVN-Commit-Author: melifaro X-SVN-Commit-Paths: in head/sys: net net/route netinet6 X-SVN-Commit-Revision: 363128 X-SVN-Commit-Repository: base MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.33 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 12 Jul 2020 11:24:25 -0000 Author: melifaro Date: Sun Jul 12 11:24:23 2020 New Revision: 363128 URL: https://svnweb.freebsd.org/changeset/base/363128 Log: Switch inet6 default route subscription to the new rib subscription api. Old subscription model allowed only single customer. Switch inet6 to the new subscription api and eliminate the old model. Differential Revision: https://reviews.freebsd.org/D25615 Modified: head/sys/net/if_var.h head/sys/net/route/route_ctl.c head/sys/netinet6/in6_rmx.c head/sys/netinet6/nd6.c head/sys/netinet6/nd6.h head/sys/netinet6/nd6_rtr.c Modified: head/sys/net/if_var.h ============================================================================== --- head/sys/net/if_var.h Sun Jul 12 11:18:09 2020 (r363127) +++ head/sys/net/if_var.h Sun Jul 12 11:24:23 2020 (r363128) @@ -61,8 +61,6 @@ */ struct rtentry; /* ifa_rtrequest */ -struct nhop_object; /* ifa_rtrequest */ -struct rt_addrinfo; /* ifa_rtrequest */ struct socket; struct carp_if; struct carp_softc; @@ -551,9 +549,6 @@ struct ifaddr { struct ifnet *ifa_ifp; /* back-pointer to interface */ struct carp_softc *ifa_carp; /* pointer to CARP data */ CK_STAILQ_ENTRY(ifaddr) ifa_link; /* queue macro glue */ - void (*ifa_rtrequest) /* check or clean routes (+ or -)'d */ - (int, struct rtentry *, struct nhop_object *, - struct rt_addrinfo *); u_short ifa_flags; /* mostly rt_flags for cloning */ #define IFA_ROUTE RTF_UP /* route installed */ #define IFA_RTSELF RTF_HOST /* loopback route to self installed */ Modified: head/sys/net/route/route_ctl.c ============================================================================== --- head/sys/net/route/route_ctl.c Sun Jul 12 11:18:09 2020 (r363127) +++ head/sys/net/route/route_ctl.c Sun Jul 12 11:24:23 2020 (r363128) @@ -79,7 +79,6 @@ struct rib_subscription { static void rib_notify(struct rib_head *rnh, enum rib_subscription_type type, struct rib_cmd_info *rc); -static void rt_notifydelete(struct rtentry *rt, struct rt_addrinfo *info); static void destroy_subscription_epoch(epoch_context_t ctx); static struct rib_head * @@ -275,10 +274,8 @@ add_route(struct rib_head *rnh, struct rt_addrinfo *in if ((rn != NULL) || (rt_old != NULL)) rib_notify(rnh, RIB_NOTIFY_DELAYED, rc); - if (rt_old != NULL) { - rt_notifydelete(rt_old, info); + if (rt_old != NULL) rtfree(rt_old); - } /* * If it still failed to go into the tree, @@ -290,13 +287,6 @@ add_route(struct rib_head *rnh, struct rt_addrinfo *in return (EEXIST); } - /* - * If this protocol has something to add to this then - * allow it to do that as well. - */ - if (ifa->ifa_rtrequest) - ifa->ifa_rtrequest(RTM_ADD, rt, rt->rt_nhop, info); - RT_UNLOCK(rt); return (0); @@ -432,7 +422,6 @@ del_route(struct rib_head *rnh, struct rt_addrinfo *in return (error); rib_notify(rnh, RIB_NOTIFY_DELAYED, rc); - rt_notifydelete(rt, info); /* * If the caller wants it, then it can have it, @@ -554,15 +543,9 @@ change_route_one(struct rib_head *rnh, struct rt_addri RT_LOCK(rt); /* Provide notification to the protocols.*/ - if ((nh_orig->nh_ifa != nh->nh_ifa) && nh_orig->nh_ifa->ifa_rtrequest) - nh_orig->nh_ifa->ifa_rtrequest(RTM_DELETE, rt, nh_orig, info); - rt->rt_nhop = nh; rt_setmetrics(info, rt); - if ((nh_orig->nh_ifa != nh->nh_ifa) && nh_orig->nh_ifa->ifa_rtrequest) - nh_orig->nh_ifa->ifa_rtrequest(RTM_DELETE, rt, nh_orig, info); - /* Finalize notification */ rc->rc_rt = rt; rc->rc_nh_old = nh_orig; @@ -641,19 +624,6 @@ rib_action(uint32_t fibnum, int action, struct rt_addr } -static void -rt_notifydelete(struct rtentry *rt, struct rt_addrinfo *info) -{ - struct ifaddr *ifa; - - /* - * give the protocol a chance to keep things in sync. - */ - ifa = rt->rt_nhop->nh_ifa; - if (ifa != NULL && ifa->ifa_rtrequest != NULL) - ifa->ifa_rtrequest(RTM_DELETE, rt, rt->rt_nhop, info); -} - struct rt_delinfo { struct rt_addrinfo info; @@ -748,8 +718,6 @@ rib_walk_del(u_int fibnum, int family, rt_filter_f_t * /* TODO std rt -> rt_addrinfo export */ di.info.rti_info[RTAX_DST] = rt_key(rt); di.info.rti_info[RTAX_NETMASK] = rt_mask(rt); - - rt_notifydelete(rt, &di.info); if (report) rt_routemsg(RTM_DELETE, rt, rt->rt_nhop->nh_ifp, 0, Modified: head/sys/netinet6/in6_rmx.c ============================================================================== --- head/sys/netinet6/in6_rmx.c Sun Jul 12 11:18:09 2020 (r363127) +++ head/sys/netinet6/in6_rmx.c Sun Jul 12 11:24:23 2020 (r363128) @@ -150,6 +150,7 @@ rib6_preadd(u_int fibnum, const struct sockaddr *addr, int in6_inithead(void **head, int off, u_int fibnum) { + struct epoch_tracker et; struct rib_head *rh; rh = rt_table_init(offsetof(struct sockaddr_in6, sin6_addr) << 3, @@ -162,6 +163,13 @@ in6_inithead(void **head, int off, u_int fibnum) rt_mpath_init_rnh(rh); #endif *head = (void *)rh; + + NET_EPOCH_ENTER(et); + if (rib_subscribe(fibnum, AF_INET6, nd6_subscription_cb, NULL, + RIB_NOTIFY_IMMEDIATE, M_NOWAIT) == NULL) + log(LOG_ERR, "in6_inithead(): unable to subscribe to fib %u\n", + fibnum); + NET_EPOCH_EXIT(et); return (1); } Modified: head/sys/netinet6/nd6.c ============================================================================== --- head/sys/netinet6/nd6.c Sun Jul 12 11:18:09 2020 (r363127) +++ head/sys/netinet6/nd6.c Sun Jul 12 11:24:23 2020 (r363128) @@ -62,7 +62,7 @@ __FBSDID("$FreeBSD$"); #include #include #include -#include +#include #include #include @@ -138,8 +138,6 @@ static void nd6_free_redirect(const struct llentry *); static void nd6_llinfo_timer(void *); static void nd6_llinfo_settimer_locked(struct llentry *, long); static void clear_llinfo_pqueue(struct llentry *); -static void nd6_rtrequest(int, struct rtentry *, struct nhop_object *, - struct rt_addrinfo *); static int nd6_resolve_slow(struct ifnet *, int, struct mbuf *, const struct sockaddr_in6 *, u_char *, uint32_t *, struct llentry **); static int nd6_need_cache(struct ifnet *); @@ -1580,39 +1578,24 @@ nd6_free_redirect(const struct llentry *ln) } /* - * Rejuvenate this function for routing operations related - * processing. + * Updates status of the default router route. */ void -nd6_rtrequest(int req, struct rtentry *rt, struct nhop_object *nh, - struct rt_addrinfo *info) +nd6_subscription_cb(struct rib_head *rnh, struct rib_cmd_info *rc, void *arg) { - struct sockaddr_in6 *gateway; struct nd_defrouter *dr; + struct nhop_object *nh; - gateway = &nh->gw6_sa; + if (rc->rc_cmd == RTM_DELETE) { + nh = rc->rc_nh_old; - switch (req) { - case RTM_ADD: - break; - - case RTM_DELETE: - /* - * Only indirect routes are interesting. - */ - if ((nh->nh_flags & NHF_GATEWAY) == 0) - return; - /* - * check for default route - */ if (nh->nh_flags & NHF_DEFAULT) { - dr = defrouter_lookup(&gateway->sin6_addr, nh->nh_ifp); + dr = defrouter_lookup(&nh->gw6_sa.sin6_addr, nh->nh_ifp); if (dr != NULL) { dr->installed = 0; defrouter_rele(dr); } } - break; } } @@ -2532,7 +2515,6 @@ nd6_add_ifa_lle(struct in6_ifaddr *ia) if (nd6_need_cache(ifp) == 0) return (0); - ia->ia_ifa.ifa_rtrequest = nd6_rtrequest; dst = (struct sockaddr *)&ia->ia_addr; ln = lltable_alloc_entry(LLTABLE6(ifp), LLE_IFADDR, dst); if (ln == NULL) Modified: head/sys/netinet6/nd6.h ============================================================================== --- head/sys/netinet6/nd6.h Sun Jul 12 11:18:09 2020 (r363127) +++ head/sys/netinet6/nd6.h Sun Jul 12 11:24:23 2020 (r363128) @@ -385,6 +385,11 @@ void nd6_rem_ifa_lle(struct in6_ifaddr *, int); int nd6_output_ifp(struct ifnet *, struct ifnet *, struct mbuf *, struct sockaddr_in6 *, struct route *); +struct rib_head; +struct rib_cmd_info; +void nd6_subscription_cb(struct rib_head *rnh, struct rib_cmd_info *rc, + void *arg); + /* nd6_nbr.c */ void nd6_na_input(struct mbuf *, int, int); void nd6_na_output(struct ifnet *, const struct in6_addr *, Modified: head/sys/netinet6/nd6_rtr.c ============================================================================== --- head/sys/netinet6/nd6_rtr.c Sun Jul 12 11:18:09 2020 (r363127) +++ head/sys/netinet6/nd6_rtr.c Sun Jul 12 11:24:23 2020 (r363128) @@ -2014,10 +2014,6 @@ nd6_prefix_onlink_rtrequest(struct nd_prefix *pr, stru u_long rtflags; int error, a_failure, fibnum, maxfib; - /* - * in6_ifinit() sets nd6_rtrequest to ifa_rtrequest for all ifaddrs. - * ifa->ifa_rtrequest = nd6_rtrequest; - */ bzero(&mask6, sizeof(mask6)); mask6.sin6_len = sizeof(mask6); mask6.sin6_addr = pr->ndpr_mask;