svn commit: r364238 - in head/sys: net net/route netinet netinet6 sys

Alexander V. Chernikov melifaro at FreeBSD.org
Fri Aug 14 21:29:59 UTC 2020


Author: melifaro
Date: Fri Aug 14 21:29:56 2020
New Revision: 364238
URL: https://svnweb.freebsd.org/changeset/base/364238

Log:
  Simplify dom_<rtattach|rtdetach>.
  
  Remove unused arguments from dom_rtattach/dom_rtdetach functions and make
    them return/accept 'struct rib_head' instead of 'void **'.
  Declare inet/inet6 implementations in the relevant _var.h headers similar
    to domifattach / domifdetach.
  Add rib_subscribe_internal() function to accept subscriptions to the rnh
    directly.
  
  Differential Revision:	https://reviews.freebsd.org/D26053

Modified:
  head/sys/net/route.c
  head/sys/net/route/route_ctl.c
  head/sys/net/route/route_ctl.h
  head/sys/netinet/in_proto.c
  head/sys/netinet/in_rmx.c
  head/sys/netinet/in_var.h
  head/sys/netinet6/in6_proto.c
  head/sys/netinet6/in6_rmx.c
  head/sys/netinet6/in6_var.h
  head/sys/sys/domain.h

Modified: head/sys/net/route.c
==============================================================================
--- head/sys/net/route.c	Fri Aug 14 18:48:48 2020	(r364237)
+++ head/sys/net/route.c	Fri Aug 14 21:29:56 2020	(r364238)
@@ -227,7 +227,7 @@ vnet_route_init(const void *unused __unused)
 			rnh = rt_tables_get_rnh_ptr(table, fam);
 			if (rnh == NULL)
 				panic("%s: rnh NULL", __func__);
-			dom->dom_rtattach((void **)rnh, 0, table);
+			*rnh = dom->dom_rtattach(table);
 		}
 	}
 }
@@ -256,7 +256,7 @@ vnet_route_uninit(const void *unused __unused)
 			rnh = rt_tables_get_rnh_ptr(table, fam);
 			if (rnh == NULL)
 				panic("%s: rnh NULL", __func__);
-			dom->dom_rtdetach((void **)rnh, 0);
+			dom->dom_rtdetach(*rnh);
 		}
 	}
 

Modified: head/sys/net/route/route_ctl.c
==============================================================================
--- head/sys/net/route/route_ctl.c	Fri Aug 14 18:48:48 2020	(r364237)
+++ head/sys/net/route/route_ctl.c	Fri Aug 14 21:29:56 2020	(r364238)
@@ -817,6 +817,25 @@ rib_notify(struct rib_head *rnh, enum rib_subscription
 	}
 }
 
+static struct rib_subscription *
+allocate_subscription(rib_subscription_cb_t *f, void *arg,
+    enum rib_subscription_type type, bool waitok)
+{
+	struct rib_subscription *rs;
+	int flags = M_ZERO | (waitok ? M_WAITOK : 0);
+
+	rs = malloc(sizeof(struct rib_subscription), M_RTABLE, flags);
+	if (rs == NULL)
+		return (NULL);
+
+	rs->func = f;
+	rs->arg = arg;
+	rs->type = type;
+
+	return (rs);
+}
+
+
 /*
  * Subscribe for the changes in the routing table specified by @fibnum and
  *  @family.
@@ -830,20 +849,33 @@ rib_subscribe(uint32_t fibnum, int family, rib_subscri
 	struct rib_head *rnh;
 	struct rib_subscription *rs;
 	struct epoch_tracker et;
-	int flags = M_ZERO | (waitok ? M_WAITOK : 0);
 
-	rs = malloc(sizeof(struct rib_subscription), M_RTABLE, flags);
-	if (rs == NULL)
+	if ((rs = allocate_subscription(f, arg, type, waitok)) == NULL)
 		return (NULL);
 
 	NET_EPOCH_ENTER(et);
 	KASSERT((fibnum < rt_numfibs), ("%s: bad fibnum", __func__));
 	rnh = rt_tables_get_rnh(fibnum, family);
 
-	rs->func = f;
-	rs->arg = arg;
-	rs->type = type;
+	RIB_WLOCK(rnh);
+	CK_STAILQ_INSERT_TAIL(&rnh->rnh_subscribers, rs, next);
+	RIB_WUNLOCK(rnh);
+	NET_EPOCH_EXIT(et);
 
+	return (rs);
+}
+
+struct rib_subscription *
+rib_subscribe_internal(struct rib_head *rnh, rib_subscription_cb_t *f, void *arg,
+    enum rib_subscription_type type, bool waitok)
+{
+	struct rib_subscription *rs;
+	struct epoch_tracker et;
+
+	if ((rs = allocate_subscription(f, arg, type, waitok)) == NULL)
+		return (NULL);
+
+	NET_EPOCH_ENTER(et);
 	RIB_WLOCK(rnh);
 	CK_STAILQ_INSERT_TAIL(&rnh->rnh_subscribers, rs, next);
 	RIB_WUNLOCK(rnh);

Modified: head/sys/net/route/route_ctl.h
==============================================================================
--- head/sys/net/route/route_ctl.h	Fri Aug 14 18:48:48 2020	(r364237)
+++ head/sys/net/route/route_ctl.h	Fri Aug 14 21:29:56 2020	(r364238)
@@ -79,6 +79,9 @@ typedef void rib_subscription_cb_t(struct rib_head *rn
 struct rib_subscription *rib_subscribe(uint32_t fibnum, int family,
     rib_subscription_cb_t *f, void *arg, enum rib_subscription_type type,
     bool waitok);
+struct rib_subscription *rib_subscribe_internal(struct rib_head *rnh,
+    rib_subscription_cb_t *f, void *arg, enum rib_subscription_type type,
+    bool waitok);
 int rib_unsibscribe(uint32_t fibnum, int family, struct rib_subscription *rs);
 
 #endif

Modified: head/sys/netinet/in_proto.c
==============================================================================
--- head/sys/netinet/in_proto.c	Fri Aug 14 18:48:48 2020	(r364237)
+++ head/sys/netinet/in_proto.c	Fri Aug 14 21:29:56 2020	(r364238)
@@ -294,9 +294,6 @@ IPPROTOSPACER,
 },
 };
 
-extern int in_inithead(void **, int, u_int);
-extern int in_detachhead(void **, int);
-
 struct domain inetdomain = {
 	.dom_family =		AF_INET,
 	.dom_name =		"internet",

Modified: head/sys/netinet/in_rmx.c
==============================================================================
--- head/sys/netinet/in_rmx.c	Fri Aug 14 18:48:48 2020	(r364237)
+++ head/sys/netinet/in_rmx.c	Fri Aug 14 21:29:56 2020	(r364238)
@@ -54,10 +54,6 @@ __FBSDID("$FreeBSD$");
 #include <netinet/ip_icmp.h>
 #include <netinet/ip_var.h>
 
-extern int	in_inithead(void **head, int off, u_int fibnum);
-#ifdef VIMAGE
-extern int	in_detachhead(void **head, int off);
-#endif
 
 static int
 rib4_preadd(u_int fibnum, const struct sockaddr *addr, const struct sockaddr *mask,
@@ -121,38 +117,32 @@ rib4_preadd(u_int fibnum, const struct sockaddr *addr,
 	return (0);
 }
 
-static int _in_rt_was_here;
 /*
  * Initialize our routing tree.
  */
-int
-in_inithead(void **head, int off, u_int fibnum)
+struct rib_head *
+in_inithead(uint32_t fibnum)
 {
 	struct rib_head *rh;
 
 	rh = rt_table_init(32, AF_INET, fibnum);
 	if (rh == NULL)
-		return (0);
+		return (NULL);
 
 	rh->rnh_preadd = rib4_preadd;
 #ifdef	RADIX_MPATH
 	rt_mpath_init_rnh(rh);
 #endif
-	*head = (void *)rh;
 
-	if (_in_rt_was_here == 0 ) {
-		_in_rt_was_here = 1;
-	}
-	return 1;
+	return (rh);
 }
 
 #ifdef VIMAGE
-int
-in_detachhead(void **head, int off)
+void
+in_detachhead(struct rib_head *rh)
 {
 
-	rt_table_destroy((struct rib_head *)(*head));
-	return (1);
+	rt_table_destroy(rh);
 }
 #endif
 

Modified: head/sys/netinet/in_var.h
==============================================================================
--- head/sys/netinet/in_var.h	Fri Aug 14 18:48:48 2020	(r364237)
+++ head/sys/netinet/in_var.h	Fri Aug 14 21:29:56 2020	(r364238)
@@ -436,8 +436,7 @@ inm_rele_locked(struct in_multi_head *inmh, struct in_
 #define MCAST_NOTSMEMBER	2	/* This host excluded source */
 #define MCAST_MUTED		3	/* [deprecated] */
 
-struct	rtentry;
-struct	route;
+struct rib_head;
 struct	ip_moptions;
 
 struct in_multi *inm_lookup_locked(struct ifnet *, const struct in_addr);
@@ -471,6 +470,10 @@ void	in_ifadown(struct ifaddr *ifa, int);
 struct	mbuf	*ip_tryforward(struct mbuf *);
 void	*in_domifattach(struct ifnet *);
 void	in_domifdetach(struct ifnet *, void *);
+struct rib_head *in_inithead(uint32_t fibnum);
+#ifdef VIMAGE
+void	in_detachhead(struct rib_head *rh);
+#endif
 
 #endif /* _KERNEL */
 

Modified: head/sys/netinet6/in6_proto.c
==============================================================================
--- head/sys/netinet6/in6_proto.c	Fri Aug 14 18:48:48 2020	(r364237)
+++ head/sys/netinet6/in6_proto.c	Fri Aug 14 21:29:56 2020	(r364238)
@@ -333,11 +333,6 @@ IP6PROTOSPACER,
 },
 };
 
-extern int in6_inithead(void **, int, u_int);
-#ifdef VIMAGE
-extern int in6_detachhead(void **, int);
-#endif
-
 struct domain inet6domain = {
 	.dom_family =		AF_INET6,
 	.dom_name =		"internet6",

Modified: head/sys/netinet6/in6_rmx.c
==============================================================================
--- head/sys/netinet6/in6_rmx.c	Fri Aug 14 18:48:48 2020	(r364237)
+++ head/sys/netinet6/in6_rmx.c	Fri Aug 14 21:29:56 2020	(r364238)
@@ -101,11 +101,6 @@ __FBSDID("$FreeBSD$");
 #include <netinet/tcp_timer.h>
 #include <netinet/tcp_var.h>
 
-extern int	in6_inithead(void **head, int off, u_int fibnum);
-#ifdef VIMAGE
-extern int	in6_detachhead(void **head, int off);
-#endif
-
 static int
 rib6_preadd(u_int fibnum, const struct sockaddr *addr, const struct sockaddr *mask,
     struct nhop_object *nh)
@@ -147,8 +142,8 @@ rib6_preadd(u_int fibnum, const struct sockaddr *addr,
  * Initialize our routing tree.
  */
 
-int
-in6_inithead(void **head, int off, u_int fibnum)
+struct rib_head *
+in6_inithead(uint32_t fibnum)
 {
 	struct rib_head *rh;
 	struct rib_subscription *rs;
@@ -156,29 +151,26 @@ in6_inithead(void **head, int off, u_int fibnum)
 	rh = rt_table_init(offsetof(struct sockaddr_in6, sin6_addr) << 3,
 	    AF_INET6, fibnum);
 	if (rh == NULL)
-		return (0);
+		return (NULL);
 
 	rh->rnh_preadd = rib6_preadd;
 #ifdef	RADIX_MPATH
 	rt_mpath_init_rnh(rh);
 #endif
-	*head = (void *)rh;
 
-	rs = rib_subscribe(fibnum, AF_INET6, nd6_subscription_cb, NULL,
+	rs = rib_subscribe_internal(rh, nd6_subscription_cb, NULL,
 	    RIB_NOTIFY_IMMEDIATE, true);
 	KASSERT(rs != NULL, ("Unable to subscribe to fib %u\n", fibnum));
 
-	return (1);
+	return (rh);
 }
 
 #ifdef VIMAGE
-int
-in6_detachhead(void **head, int off)
+void
+in6_detachhead(struct rib_head *rh)
 {
 
-	rt_table_destroy((struct rib_head *)(*head));
-
-	return (1);
+	rt_table_destroy(rh);
 }
 #endif
 

Modified: head/sys/netinet6/in6_var.h
==============================================================================
--- head/sys/netinet6/in6_var.h	Fri Aug 14 18:48:48 2020	(r364237)
+++ head/sys/netinet6/in6_var.h	Fri Aug 14 21:29:56 2020	(r364238)
@@ -857,6 +857,7 @@ in6m_rele_locked(struct in6_multi_head *inmh, struct i
 struct ip6_moptions;
 struct sockopt;
 struct inpcbinfo;
+struct rib_head;
 
 /* Multicast KPIs. */
 int	im6o_mc_filter(const struct ip6_moptions *, const struct ifnet *,
@@ -891,6 +892,8 @@ void	in6_savemkludge(struct in6_ifaddr *);
 void	*in6_domifattach(struct ifnet *);
 void	in6_domifdetach(struct ifnet *, void *);
 int	in6_domifmtu(struct ifnet *);
+struct rib_head *in6_inithead(uint32_t fibnum);
+void	in6_detachhead(struct rib_head *rh);
 void	in6_setmaxmtu(void);
 int	in6_if2idlen(struct ifnet *);
 struct in6_ifaddr *in6ifa_ifpforlinklocal(struct ifnet *, int);

Modified: head/sys/sys/domain.h
==============================================================================
--- head/sys/sys/domain.h	Fri Aug 14 18:48:48 2020	(r364237)
+++ head/sys/sys/domain.h	Fri Aug 14 21:29:56 2020	(r364238)
@@ -45,6 +45,7 @@
 struct	mbuf;
 struct	ifnet;
 struct	socket;
+struct	rib_head;
 
 struct domain {
 	int	dom_family;		/* AF_xxx */
@@ -59,10 +60,10 @@ struct domain {
 		(struct socket *);
 	struct	protosw *dom_protosw, *dom_protoswNPROTOSW;
 	struct	domain *dom_next;
-	int	(*dom_rtattach)		/* initialize routing table */
-		(void **, int, u_int);
-	int	(*dom_rtdetach)		/* clean up routing table */
-		(void **, int);
+	struct rib_head *(*dom_rtattach)	/* initialize routing table */
+		(uint32_t);
+	void	(*dom_rtdetach)		/* clean up routing table */
+		(struct rib_head *);
 	void	*(*dom_ifattach)(struct ifnet *);
 	void	(*dom_ifdetach)(struct ifnet *, void *);
 	int	(*dom_ifmtu)(struct ifnet *);


More information about the svn-src-all mailing list