For consistency.  While here, clean up two malloc calls.

The hand-rolled list queue(3) is replacing here is singly linked
but used an extra pointer in rti_delete() to get O(n) deletion.
I kept the O(n) deletion by using LIST.  If the extra space needed
for LIST is unacceptable I can use SLIST instead.

ok as-is?

Index: sys/netinet/igmp.c
===================================================================
RCS file: /cvs/src/sys/netinet/igmp.c,v
retrieving revision 1.72
diff -u -p -r1.72 igmp.c
--- sys/netinet/igmp.c  20 Nov 2017 10:35:24 -0000      1.72
+++ sys/netinet/igmp.c  17 Oct 2018 23:18:38 -0000
@@ -99,7 +99,7 @@
 int *igmpctl_vars[IGMPCTL_MAXID] = IGMPCTL_VARS;
 
 int            igmp_timers_are_running;
-static struct router_info *rti_head;
+static LIST_HEAD(, router_info) rti_head;
 static struct mbuf *router_alert;
 struct cpumem *igmpcounters;
 
@@ -116,7 +116,7 @@ igmp_init(void)
        struct ipoption *ra;
 
        igmp_timers_are_running = 0;
-       rti_head = 0;
+       LIST_INIT(&rti_head);
 
        igmpcounters = counters_alloc(igps_ncounters);
        router_alert = m_get(M_DONTWAIT, MT_DATA);
@@ -150,7 +150,7 @@ rti_fill(struct in_multi *inm)
 {
        struct router_info *rti;
 
-       for (rti = rti_head; rti != 0; rti = rti->rti_next) {
+       LIST_FOREACH(rti, &rti_head, rti_list) {
                if (rti->rti_ifidx == inm->inm_ifidx) {
                        inm->inm_rti = rti;
                        if (rti->rti_type == IGMP_v1_ROUTER)
@@ -160,14 +160,12 @@ rti_fill(struct in_multi *inm)
                }
        }
 
-       rti = (struct router_info *)malloc(sizeof(struct router_info),
-                                          M_MRTABLE, M_NOWAIT);
+       rti = malloc(sizeof(*rti), M_MRTABLE, M_NOWAIT);
        if (rti == NULL)
                return (-1);
        rti->rti_ifidx = inm->inm_ifidx;
        rti->rti_type = IGMP_v2_ROUTER;
-       rti->rti_next = rti_head;
-       rti_head = rti;
+       LIST_INSERT_HEAD(&rti_head, rti, rti_list);
        inm->inm_rti = rti;
        return (IGMP_v2_HOST_MEMBERSHIP_REPORT);
 }
@@ -178,34 +176,31 @@ rti_find(struct ifnet *ifp)
        struct router_info *rti;
 
        KERNEL_ASSERT_LOCKED();
-       for (rti = rti_head; rti != 0; rti = rti->rti_next) {
+       LIST_FOREACH(rti, &rti_head, rti_list) {
                if (rti->rti_ifidx == ifp->if_index)
                        return (rti);
        }
 
-       rti = (struct router_info *)malloc(sizeof(struct router_info),
-                                          M_MRTABLE, M_NOWAIT);
+       rti = malloc(sizeof(*rti), M_MRTABLE, M_NOWAIT);
        if (rti == NULL)
                return (NULL);
        rti->rti_ifidx = ifp->if_index;
        rti->rti_type = IGMP_v2_ROUTER;
-       rti->rti_next = rti_head;
-       rti_head = rti;
+       LIST_INSERT_HEAD(&rti_head, rti, rti_list);
        return (rti);
 }
 
 void
 rti_delete(struct ifnet *ifp)
 {
-       struct router_info *rti, **prti = &rti_head;
+       struct router_info *rti, *trti;
 
-       for (rti = rti_head; rti != 0; rti = rti->rti_next) {
+       LIST_FOREACH_SAFE(rti, &rti_head, rti_list, trti) {
                if (rti->rti_ifidx == ifp->if_index) {
-                       *prti = rti->rti_next;
+                       LIST_REMOVE(rti, rti_list);
                        free(rti, M_MRTABLE, sizeof(*rti));
                        break;
                }
-               prti = &rti->rti_next;
        }
 }
 
@@ -608,7 +603,7 @@ igmp_slowtimo(void)
 
        NET_LOCK();
 
-       for (rti = rti_head; rti != 0; rti = rti->rti_next) {
+       LIST_FOREACH(rti, &rti_head, rti_list) {
                if (rti->rti_type == IGMP_v1_ROUTER &&
                    ++rti->rti_age >= IGMP_AGE_THRESHOLD) {
                        rti->rti_type = IGMP_v2_ROUTER;
Index: sys/netinet/in_var.h
===================================================================
RCS file: /cvs/src/sys/netinet/in_var.h,v
retrieving revision 1.40
diff -u -p -r1.40 in_var.h
--- sys/netinet/in_var.h        29 May 2017 14:36:22 -0000      1.40
+++ sys/netinet/in_var.h        17 Oct 2018 23:18:38 -0000
@@ -102,7 +102,7 @@ struct router_info {
        unsigned int    rti_ifidx;
        int             rti_type;       /* type of router on this interface */
        int             rti_age;        /* time since last v1 query */
-       struct  router_info *rti_next;
+       LIST_ENTRY(router_info) rti_list;
 };
 
 #ifdef _KERNEL

Reply via email to