Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 23 Jun 2021 08:14:27 GMT
From:      Wojciech Macek <wma@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: 17ac6d94dbc0 - main - ip_mroute: initialize vif ifnet properly
Message-ID:  <202106230814.15N8ERvj009160@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by wma:

URL: https://cgit.FreeBSD.org/src/commit/?id=17ac6d94dbc03e3723acec1acfb004f789b9a033

commit 17ac6d94dbc03e3723acec1acfb004f789b9a033
Author:     Wojciech Macek <wma@FreeBSD.org>
AuthorDate: 2021-06-02 06:46:29 +0000
Commit:     Wojciech Macek <wma@FreeBSD.org>
CommitDate: 2021-06-23 08:13:52 +0000

    ip_mroute: initialize vif ifnet properly
    
    Use if_alloc to ensure all fields of ifnet are allocated
    properly
    
    Reported by:   Damien Deville
    Sponsored by:  Stormshield
    Obtained from: Semihalf
    Reviewed by:   mw
    Differential revision: https://reviews.freebsd.org/D30608
---
 sys/netinet/ip_mroute.c | 15 +++++++++------
 1 file changed, 9 insertions(+), 6 deletions(-)

diff --git a/sys/netinet/ip_mroute.c b/sys/netinet/ip_mroute.c
index ee0c886f9f3d..72100b84fd59 100644
--- a/sys/netinet/ip_mroute.c
+++ b/sys/netinet/ip_mroute.c
@@ -103,6 +103,7 @@ __FBSDID("$FreeBSD$");
 
 #include <net/if.h>
 #include <net/if_var.h>
+#include <net/if_types.h>
 #include <net/netisr.h>
 #include <net/route.h>
 #include <net/vnet.h>
@@ -290,7 +291,7 @@ static struct pim_encap_pimhdr pim_encap_pimhdr = {
 
 VNET_DEFINE_STATIC(vifi_t, reg_vif_num) = VIFI_INVALID;
 #define	V_reg_vif_num		VNET(reg_vif_num)
-VNET_DEFINE_STATIC(struct ifnet, multicast_register_if);
+VNET_DEFINE_STATIC(struct ifnet *, multicast_register_if);
 #define	V_multicast_register_if	VNET(multicast_register_if)
 
 /*
@@ -944,11 +945,10 @@ add_vif(struct vifctl *vifcp)
 	MRW_WUNLOCK();
 	return EOPNOTSUPP;
     } else if (vifcp->vifc_flags & VIFF_REGISTER) {
-	ifp = &V_multicast_register_if;
+	ifp = V_multicast_register_if = if_alloc(IFT_LOOP);
 	CTR2(KTR_IPMF, "%s: add register vif for ifp %p", __func__, ifp);
 	if (V_reg_vif_num == VIFI_INVALID) {
-	    if_initname(&V_multicast_register_if, "register_vif", 0);
-	    V_multicast_register_if.if_flags = IFF_LOOPBACK;
+	    if_initname(V_multicast_register_if, "register_vif", 0);
 	    V_reg_vif_num = vifcp->vifc_vifi;
 	}
     } else {		/* Make sure the interface supports multicast */
@@ -1012,8 +1012,11 @@ del_vif_locked(vifi_t vifi)
     if (!(vifp->v_flags & (VIFF_TUNNEL | VIFF_REGISTER)))
 	if_allmulti(vifp->v_ifp, 0);
 
-    if (vifp->v_flags & VIFF_REGISTER)
+    if (vifp->v_flags & VIFF_REGISTER) {
 	V_reg_vif_num = VIFI_INVALID;
+	if_free(V_multicast_register_if);
+	V_multicast_register_if = NULL;
+    }
 
     mtx_destroy(&vifp->v_spin);
 
@@ -1568,7 +1571,7 @@ ip_mdq(struct mbuf *m, struct ifnet *ifp, struct mfc *rt, vifi_t xmt_vif)
 	 */
 	if (V_pim_assert_enabled && (vifi < V_numvifs) &&
 	    V_viftable[vifi].v_ifp) {
-	    if (ifp == &V_multicast_register_if)
+	    if (ifp == V_multicast_register_if)
 		PIMSTAT_INC(pims_rcv_registers_wrongiif);
 
 	    /* Get vifi for the incoming packet */



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202106230814.15N8ERvj009160>