Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 8 Dec 2015 07:47:01 +0000 (UTC)
From:      "Andrey V. Elsukov" <ae@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-9@freebsd.org
Subject:   svn commit: r291991 - stable/9/sys/netinet
Message-ID:  <201512080747.tB87l1qR079486@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: ae
Date: Tue Dec  8 07:47:01 2015
New Revision: 291991
URL: https://svnweb.freebsd.org/changeset/base/291991

Log:
  MFC r291579:
    In the same way fix the problem described in r291578 for IGMPv3.
  
    In case when router has a lot of multicast groups, the reply can take
    several packets due to MTU limitation.
    Also we have a limit IGMP_MAX_RESPONSE_BURST == 4, that limits the number
    of packets we send in one shot. Then we recalculate the timer value and
    schedule the remaining packets for sending.
    The problem is that when we call igmp_v3_dispatch_general_query() to send
    remaining packets, we queue new reply in the same mbuf queue. And when
    number of packets is bigger than IGMP_MAX_RESPONSE_BURST, we get endless
    reply of IGMPv3 reports.
    To fix this, add the check for remaining packets in the queue.

Modified:
  stable/9/sys/netinet/igmp.c
Directory Properties:
  stable/9/sys/   (props changed)

Modified: stable/9/sys/netinet/igmp.c
==============================================================================
--- stable/9/sys/netinet/igmp.c	Tue Dec  8 07:43:12 2015	(r291990)
+++ stable/9/sys/netinet/igmp.c	Tue Dec  8 07:47:01 2015	(r291991)
@@ -3326,6 +3326,15 @@ igmp_v3_dispatch_general_query(struct ig
 	KASSERT(igi->igi_version == IGMP_VERSION_3,
 	    ("%s: called when version %d", __func__, igi->igi_version));
 
+	/*
+	 * Check that there are some packets queued. If so, send them first.
+	 * For large number of groups the reply to general query can take
+	 * many packets, we should finish sending them before starting of
+	 * queuing the new reply.
+	 */
+	if (igi->igi_gq.ifq_head != NULL)
+		goto send;
+
 	ifp = igi->igi_ifp;
 
 	IF_ADDR_RLOCK(ifp);
@@ -3361,6 +3370,7 @@ igmp_v3_dispatch_general_query(struct ig
 	}
 	IF_ADDR_RUNLOCK(ifp);
 
+send:
 	loop = (igi->igi_flags & IGIF_LOOPBACK) ? 1 : 0;
 	igmp_dispatch_queue(&igi->igi_gq, IGMP_MAX_RESPONSE_BURST, loop);
 



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