netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: William Manley <william.manley@youview.com>
To: william.manley@youview.com, netdev@vger.kernel.org,
	bcrl@kvack.org, luky-37@hotmail.com,
	sergei.shtylyov@cogentembedded.com, bhutchings@solarflare.com,
	davem@davemloft.net, hannes@stressinduktion.org
Subject: [PATCH v4 1/3] net: igmp: Reduce Unsolicited report interval to 1s when using IGMPv3
Date: Tue,  6 Aug 2013 19:03:13 +0100	[thread overview]
Message-ID: <1375812195-6575-2-git-send-email-william.manley@youview.com> (raw)
In-Reply-To: <1375812195-6575-1-git-send-email-william.manley@youview.com>

If an IGMP join packet is lost you will not receive data sent to the
multicast group so if no data arrives from that multicast group in a
period of time after the IGMP join a second IGMP join will be sent.  The
delay between joins is the "IGMP Unsolicited Report Interval".

Previously this value was hard coded to be chosen randomly between 0-10s.
This can be too long for some use-cases, such as IPTV as it can cause
channel change to be slow in the presence of packet loss.

The value 10s has come from IGMPv2 RFC2236, which was reduced to 1s in
IGMPv3 RFC3376.  This patch makes the kernel use the 1s value from the
later RFC if we are operating in IGMPv3 mode.  IGMPv2 behaviour is
unaffected.

Tested with Wireshark and a simple program to join a (non-existent)
multicast group.  The distribution of timings for the second join differ
based upon setting /proc/sys/net/ipv4/conf/eth0/force_igmp_version.

Signed-off-by: William Manley <william.manley@youview.com>
---
 net/ipv4/igmp.c |   16 +++++++++++++---
 1 file changed, 13 insertions(+), 3 deletions(-)

diff --git a/net/ipv4/igmp.c b/net/ipv4/igmp.c
index d8c2327..9f0aaea 100644
--- a/net/ipv4/igmp.c
+++ b/net/ipv4/igmp.c
@@ -113,7 +113,8 @@
 
 #define IGMP_V1_Router_Present_Timeout		(400*HZ)
 #define IGMP_V2_Router_Present_Timeout		(400*HZ)
-#define IGMP_Unsolicited_Report_Interval	(10*HZ)
+#define IGMP_V2_Unsolicited_Report_Interval	(10*HZ)
+#define IGMP_V3_Unsolicited_Report_Interval	(1*HZ)
 #define IGMP_Query_Response_Interval		(10*HZ)
 #define IGMP_Unsolicited_Report_Count		2
 
@@ -138,6 +139,14 @@
 	 ((in_dev)->mr_v2_seen && \
 	  time_before(jiffies, (in_dev)->mr_v2_seen)))
 
+static int unsolicited_report_interval(struct in_device *in_dev)
+{
+	if (IGMP_V1_SEEN(in_dev) || IGMP_V2_SEEN(in_dev))
+		return IGMP_V2_Unsolicited_Report_Interval;
+	else /* v3 */
+		return IGMP_V3_Unsolicited_Report_Interval;
+}
+
 static void igmpv3_add_delrec(struct in_device *in_dev, struct ip_mc_list *im);
 static void igmpv3_del_delrec(struct in_device *in_dev, __be32 multiaddr);
 static void igmpv3_clear_delrec(struct in_device *in_dev);
@@ -719,7 +728,8 @@ static void igmp_ifc_timer_expire(unsigned long data)
 	igmpv3_send_cr(in_dev);
 	if (in_dev->mr_ifc_count) {
 		in_dev->mr_ifc_count--;
-		igmp_ifc_start_timer(in_dev, IGMP_Unsolicited_Report_Interval);
+		igmp_ifc_start_timer(in_dev,
+				     unsolicited_report_interval(in_dev));
 	}
 	__in_dev_put(in_dev);
 }
@@ -744,7 +754,7 @@ static void igmp_timer_expire(unsigned long data)
 
 	if (im->unsolicit_count) {
 		im->unsolicit_count--;
-		igmp_start_timer(im, IGMP_Unsolicited_Report_Interval);
+		igmp_start_timer(im, unsolicited_report_interval(in_dev));
 	}
 	im->reporter = 1;
 	spin_unlock(&im->lock);
-- 
1.7.10.4

  reply	other threads:[~2013-08-06 18:04 UTC|newest]

Thread overview: 41+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-07-22 20:43 IGMP Unsolicited Report Interval too long for IGMPv3? William Manley
2013-07-22 21:09 ` Ben Hutchings
2013-07-24 13:38   ` [PATCH] net: igmp: Reduce Unsolicited report interval to 1s when using IGMPv3 William Manley
2013-07-24 13:45     ` William Manley
2013-07-24 14:51     ` Sergei Shtylyov
2013-07-25 12:14   ` [PATCH 1/2] " William Manley
2013-07-25 12:14     ` [PATCH 2/2] net: igmp: Allow user-space configuration of igmp unsolicited report interval William Manley
2013-07-26 16:36       ` Hannes Frederic Sowa
2013-07-29 14:21         ` [PATCH v3 1/2] net: igmp: Reduce Unsolicited report interval to 1s when using IGMPv3 William Manley
2013-07-29 14:21           ` [PATCH v3 2/2] net: igmp: Allow user-space configuration of igmp unsolicited report interval William Manley
2013-07-30  6:14             ` Hannes Frederic Sowa
2013-07-30 23:55               ` David Miller
2013-07-31  6:34                 ` Hannes Frederic Sowa
2013-07-31  9:47                   ` William Manley
2013-08-06 18:03                   ` IGMP Unsolicited report interval patches William Manley
2013-08-06 18:03                     ` William Manley [this message]
2013-08-07  0:45                       ` [PATCH v4 1/3] net: igmp: Reduce Unsolicited report interval to 1s when using IGMPv3 Hannes Frederic Sowa
2013-08-07 13:43                       ` Benjamin LaHaise
2013-08-06 18:03                     ` [PATCH v4 2/3] net: igmp: Don't flush routing cache when force_igmp_version is modified William Manley
2013-08-07  0:45                       ` Hannes Frederic Sowa
2013-08-07 13:43                       ` Benjamin LaHaise
2013-08-06 18:03                     ` [PATCH v4 3/3] net: igmp: Allow user-space configuration of igmp unsolicited report interval William Manley
2013-08-07  1:00                       ` Hannes Frederic Sowa
2013-08-07 13:43                       ` Benjamin LaHaise
2013-08-07  1:03                     ` IGMP Unsolicited report interval patches Hannes Frederic Sowa
2013-08-08  9:01                       ` Hannes Frederic Sowa
2013-08-09 18:28                     ` David Miller
2013-07-31  5:07             ` [PATCH v3 2/2] net: igmp: Allow user-space configuration of igmp unsolicited report interval Bill Fink
2013-07-29 21:34           ` [PATCH v3 1/2] net: igmp: Reduce Unsolicited report interval to 1s when using IGMPv3 Hannes Frederic Sowa
2013-07-26 16:32     ` [PATCH " Hannes Frederic Sowa
2013-07-26 16:39       ` Hannes Frederic Sowa
2013-07-29 14:39         ` William Manley
2013-07-29 14:56           ` Hannes Frederic Sowa
2013-07-22 21:18 ` IGMP Unsolicited Report Interval too long for IGMPv3? Benjamin LaHaise
2013-07-22 21:51   ` Hannes Frederic Sowa
2013-07-25 23:42     ` David Miller
2013-07-26 13:11       ` Benjamin LaHaise
2013-07-26 15:06         ` Hannes Frederic Sowa
2013-07-26 15:15           ` Benjamin LaHaise
2013-07-22 22:06   ` Lukas Tribus
2013-07-22 22:30     ` Hannes Frederic Sowa

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1375812195-6575-2-git-send-email-william.manley@youview.com \
    --to=william.manley@youview.com \
    --cc=bcrl@kvack.org \
    --cc=bhutchings@solarflare.com \
    --cc=davem@davemloft.net \
    --cc=hannes@stressinduktion.org \
    --cc=luky-37@hotmail.com \
    --cc=netdev@vger.kernel.org \
    --cc=sergei.shtylyov@cogentembedded.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).