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