svn commit: r355322 - in head/sys: netinet netinet6

Hans Petter Selasky hselasky at FreeBSD.org
Tue Dec 3 08:47:00 UTC 2019


Author: hselasky
Date: Tue Dec  3 08:46:59 2019
New Revision: 355322
URL: https://svnweb.freebsd.org/changeset/base/355322

Log:
  Use refcount from "in_joingroup_locked()" when joining multicast
  groups. Do not acquire additional references. This makes the IPv4 IGMP
  code in line with the IPv6 MLD code.
  
  Background:
  The IPv4 multicast code puts an extra reference on the in_multi struct
  when joining groups.  This becomes visible when using daemons like
  igmpproxy from ports, that multicast entries do not disappear from the
  output of ifmcstat(8) when multicast streams are disconnected.
  
  This fixes a regression issue after r349762.
  
  While at it factor the ip_mfilter_insert() and ip6_mfilter_insert() calls
  to avoid repeated "is_new" check.
  
  Differential Revision:	https://reviews.freebsd.org/D22595
  Tested by:	Guido van Rooij <guido at gvr.org>
  Reviewed by:	rgrimes (network)
  MFC after:	1 week
  Sponsored by:	Mellanox Technologies

Modified:
  head/sys/netinet/in_mcast.c
  head/sys/netinet6/in6_mcast.c

Modified: head/sys/netinet/in_mcast.c
==============================================================================
--- head/sys/netinet/in_mcast.c	Tue Dec  3 07:22:16 2019	(r355321)
+++ head/sys/netinet/in_mcast.c	Tue Dec  3 08:46:59 2019	(r355322)
@@ -2211,7 +2211,11 @@ inp_join_group(struct inpcb *inp, struct sockopt *sopt
                             __func__);
 			goto out_inp_locked;
 		}
-		inm_acquire(imf->imf_inm);
+		/*
+		 * NOTE: Refcount from in_joingroup_locked()
+		 * is protecting membership.
+		 */
+		ip_mfilter_insert(&imo->imo_head, imf);
 	} else {
 		CTR1(KTR_IGMPV3, "%s: merge inm state", __func__);
 		IN_MULTI_LIST_LOCK();
@@ -2235,8 +2239,6 @@ inp_join_group(struct inpcb *inp, struct sockopt *sopt
 			goto out_inp_locked;
 		}
 	}
-	if (is_new)
-		ip_mfilter_insert(&imo->imo_head, imf);
 
 	imf_commit(imf);
 	imf = NULL;

Modified: head/sys/netinet6/in6_mcast.c
==============================================================================
--- head/sys/netinet6/in6_mcast.c	Tue Dec  3 07:22:16 2019	(r355321)
+++ head/sys/netinet6/in6_mcast.c	Tue Dec  3 08:46:59 2019	(r355322)
@@ -2111,6 +2111,7 @@ in6p_join_group(struct inpcb *inp, struct sockopt *sop
 		 * NOTE: Refcount from in6_joingroup_locked()
 		 * is protecting membership.
 		 */
+		ip6_mfilter_insert(&imo->im6o_head, imf);
 	} else {
 		CTR1(KTR_MLD, "%s: merge inm state", __func__);
 		IN6_MULTI_LIST_LOCK();
@@ -2135,9 +2136,6 @@ in6p_join_group(struct inpcb *inp, struct sockopt *sop
 			goto out_in6p_locked;
 		}
 	}
-
-	if (is_new)
-		ip6_mfilter_insert(&imo->im6o_head, imf);
 
 	im6f_commit(imf);
 	imf = NULL;


More information about the svn-src-all mailing list