There is no need to have a rttimer queue per rdomain. The rttimer itself
is rdomain aware and so this just make everything more complicated for no
gain.

This diff just drops back to a single queue and initializes the queues in
ip_init() and the IPv6 counterpart. I have no mrouter setup to test this
but it compiles and I see no reason why it would not work.

-- 
:wq Claudio

Index: netinet/ip_input.c
===================================================================
RCS file: /cvs/src/sys/netinet/ip_input.c,v
retrieving revision 1.367
diff -u -p -r1.367 ip_input.c
--- netinet/ip_input.c  20 Apr 2022 09:38:26 -0000      1.367
+++ netinet/ip_input.c  27 Apr 2022 09:43:24 -0000
@@ -108,6 +108,7 @@ int ip_frags = 0;
 
 #ifdef MROUTING
 extern int ip_mrtproto;
+extern struct rttimer_queue *mrouterq;
 #endif
 
 const struct sysctl_bounded_args ipctl_vars[] = {
@@ -223,6 +224,9 @@ ip_init(void)
        arpinit();
 #ifdef IPSEC
        ipsec_init();
+#endif
+#ifdef MROUTING
+       mrouterq = rt_timer_queue_create(MCAST_EXPIRE_FREQUENCY);
 #endif
 }
 
Index: netinet/ip_mroute.c
===================================================================
RCS file: /cvs/src/sys/netinet/ip_mroute.c,v
retrieving revision 1.131
diff -u -p -r1.131 ip_mroute.c
--- netinet/ip_mroute.c 15 Dec 2021 17:21:08 -0000      1.131
+++ netinet/ip_mroute.c 27 Apr 2022 09:43:36 -0000
@@ -96,7 +96,7 @@ int mcast_debug = 1;
  * except for netstat or debugging purposes.
  */
 struct socket  *ip_mrouter[RT_TABLEID_MAX + 1];
-struct rttimer_queue *mrouterq[RT_TABLEID_MAX + 1];
+struct rttimer_queue *mrouterq;
 uint64_t        mrt_count[RT_TABLEID_MAX + 1];
 int            ip_mrtproto = IGMP_DVMRP;    /* for netstat only */
 
@@ -515,12 +515,10 @@ ip_mrouter_init(struct socket *so, struc
        if (*v != 1)
                return (EINVAL);
 
-       if (ip_mrouter[rtableid] != NULL ||
-           mrouterq[rtableid] != NULL)
+       if (ip_mrouter[rtableid] != NULL)
                return (EADDRINUSE);
 
        ip_mrouter[rtableid] = so;
-       mrouterq[rtableid] = rt_timer_queue_create(MCAST_EXPIRE_FREQUENCY);
 
        return (0);
 }
@@ -572,8 +570,6 @@ ip_mrouter_done(struct socket *so)
 
        mrt_api_config = 0;
 
-       rt_timer_queue_destroy(mrouterq[rtableid]);
-       mrouterq[rtableid] = NULL;
        ip_mrouter[rtableid] = NULL;
        mrt_count[rtableid] = 0;
 
@@ -799,8 +795,7 @@ mfc_expire_route(struct rtentry *rt, str
        /* Not expired, add it back to the queue. */
        if (mfc->mfc_expire == 0) {
                mfc->mfc_expire = 1;
-               rt_timer_add(rt, mfc_expire_route, mrouterq[rtableid],
-                   rtableid);
+               rt_timer_add(rt, mfc_expire_route, mrouterq, rtableid);
                return;
        }
 
@@ -834,8 +829,7 @@ mfc_add_route(struct ifnet *ifp, struct 
 
        rt->rt_llinfo = (caddr_t)mfc;
 
-       rt_timer_add(rt, mfc_expire_route, mrouterq[rtableid],
-           rtableid);
+       rt_timer_add(rt, mfc_expire_route, mrouterq, rtableid);
 
        mfc->mfc_parent = mfccp->mfcc_parent;
        mfc->mfc_pkt_cnt = 0;
Index: netinet6/ip6_input.c
===================================================================
RCS file: /cvs/src/sys/netinet6/ip6_input.c,v
retrieving revision 1.241
diff -u -p -r1.241 ip6_input.c
--- netinet6/ip6_input.c        20 Apr 2022 09:38:26 -0000      1.241
+++ netinet6/ip6_input.c        27 Apr 2022 09:47:07 -0000
@@ -130,6 +130,10 @@ static void ip6_send_dispatch(void *);
 static struct task ip6send_task =
        TASK_INITIALIZER(ip6_send_dispatch, &ip6send_mq);
 
+#ifdef MROUTING
+extern struct rttimer_queue *mrouter6q;
+#endif
+
 /*
  * IP6 initialization: fill in IP6 protocol switch table.
  * All protocols not implemented in kernel go to raw IP6 protocol handler.
@@ -158,6 +162,9 @@ ip6_init(void)
        mq_init(&ip6send_mq, 64, IPL_SOFTNET);
 
        ip6counters = counters_alloc(ip6s_ncounters);
+#ifdef MROUTING
+       mrouter6q = rt_timer_queue_create(MCAST_EXPIRE_TIMEOUT);
+#endif
 }
 
 void
Index: netinet6/ip6_mroute.c
===================================================================
RCS file: /cvs/src/sys/netinet6/ip6_mroute.c,v
retrieving revision 1.127
diff -u -p -r1.127 ip6_mroute.c
--- netinet6/ip6_mroute.c       15 Dec 2021 17:21:08 -0000      1.127
+++ netinet6/ip6_mroute.c       27 Apr 2022 09:47:49 -0000
@@ -130,7 +130,7 @@ void phyint_send6(struct ifnet *, struct
  * except for netstat or debugging purposes.
  */
 struct socket  *ip6_mrouter[RT_TABLEID_MAX + 1];
-struct rttimer_queue *mrouter6q[RT_TABLEID_MAX + 1];
+struct rttimer_queue *mrouter6q;
 int            ip6_mrouter_ver = 0;
 int            ip6_mrtproto;    /* for netstat only */
 struct mrt6stat        mrt6stat;
@@ -138,8 +138,6 @@ struct mrt6stat     mrt6stat;
 #define NO_RTE_FOUND   0x1
 #define RTE_FOUND      0x2
 
-#define                MCAST_EXPIRE_TIMEOUT 30         /* seconds */
-
 /*
  * Macros to compute elapsed time efficiently
  * Borrowed from Van Jacobson's scheduling code
@@ -494,7 +492,6 @@ ip6_mrouter_init(struct socket *so, int 
 
        ip6_mrouter[rtableid] = so;
        ip6_mrouter_ver = cmd;
-       mrouter6q[rtableid] = rt_timer_queue_create(MCAST_EXPIRE_TIMEOUT);
 
        return (0);
 }
@@ -544,10 +541,8 @@ ip6_mrouter_done(struct socket *so)
                ip6_mrouter_detach(ifp);
        }
 
-       rt_timer_queue_destroy(mrouter6q[rtableid]);
        ip6_mrouter[inp->inp_rtableid] = NULL;
        ip6_mrouter_ver = 0;
-       mrouter6q[rtableid] = NULL;
 
        return 0;
 }
@@ -682,7 +677,7 @@ mf6c_add_route(struct ifnet *ifp, struct
        }
 
        rt->rt_llinfo = (caddr_t)mf6c;
-       rt_timer_add(rt, mf6c_expire_route, mrouter6q[rtableid], rtableid);
+       rt_timer_add(rt, mf6c_expire_route, mrouter6q, rtableid);
        mf6c->mf6c_parent = mf6cc->mf6cc_parent;
        rtfree(rt);
 
@@ -1010,8 +1005,7 @@ mf6c_expire_route(struct rtentry *rt, st
 
        if (mf6c->mf6c_expire == 0) {
                mf6c->mf6c_expire = 1;
-               rt_timer_add(rt, mf6c_expire_route, mrouter6q[rtableid],
-                   rtableid);
+               rt_timer_add(rt, mf6c_expire_route, mrouter6q, rtableid);
                return;
        }
 
Index: netinet6/ip6_mroute.h
===================================================================
RCS file: /cvs/src/sys/netinet6/ip6_mroute.h,v
retrieving revision 1.20
diff -u -p -r1.20 ip6_mroute.h
--- netinet6/ip6_mroute.h       16 May 2017 08:50:18 -0000      1.20
+++ netinet6/ip6_mroute.h       27 Apr 2022 09:49:39 -0000
@@ -191,6 +191,9 @@ struct sioc_mif_req6 {
 };
 
 #if defined(_KERNEL)
+/* How frequent should we look for expired entries (in seconds). */
+#define        MCAST_EXPIRE_TIMEOUT    30
+
 /*
  * The kernel's multicast-interface structure.
  */

Reply via email to