netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* possible bug in IPv6 MLD retransmissions
@ 2013-05-17  3:24 Flavio Leitner
  2013-05-18 17:31 ` Hannes Frederic Sowa
  0 siblings, 1 reply; 11+ messages in thread
From: Flavio Leitner @ 2013-05-17  3:24 UTC (permalink / raw)
  To: netdev; +Cc: Hideaki YOSHIFUJI, David Miller

Hi,

A tcpdump captured while adding an IPv6 link-local address shows
two MLD reports. One with source ``::'' and another with the permanent
address.

Well, if you increase dad_retransmits from 1 to 10, for instance,
then both MLD reports are sent with source address ``::'' which
according with specs should be ignored by the routers.

* 4759.429868           :: -> ff02::16     ICMPv6 90 Multicast Listener
  Report Message v2
4759.890934           :: -> ff02::1:ffe5:a8aa ICMPv6 78 Neighbor
  Solicitation for fe80::f2de:f1ff:fee5:a8aa
4760.893868           :: -> ff02::1:ffe5:a8aa ICMPv6 78 Neighbor
  Solicitation for fe80::f2de:f1ff:fee5:a8aa
4761.895867           :: -> ff02::1:ffe5:a8aa ICMPv6 78 Neighbor
  Solicitation for fe80::f2de:f1ff:fee5:a8aa
4762.897873           :: -> ff02::1:ffe5:a8aa ICMPv6 78 Neighbor
  Solicitation for fe80::f2de:f1ff:fee5:a8aa
4763.899868           :: -> ff02::1:ffe5:a8aa ICMPv6 78 Neighbor
  Solicitation for fe80::f2de:f1ff:fee5:a8aa
* 4764.237923           :: -> ff02::16     ICMPv6 90 Multicast Listener
  Report Message v2
4764.901866           :: -> ff02::1:ffe5:a8aa ICMPv6 78 Neighbor
  Solicitation for fe80::f2de:f1ff:fee5:a8aa
4765.903878           :: -> ff02::1:ffe5:a8aa ICMPv6 78 Neighbor
  Solicitation for fe80::f2de:f1ff:fee5:a8aa
4766.905867           :: -> ff02::1:ffe5:a8aa ICMPv6 78 Neighbor
  Solicitation for fe80::f2de:f1ff:fee5:a8aa
4767.907864           :: -> ff02::1:ffe5:a8aa ICMPv6 78 Neighbor
  Solicitation for fe80::f2de:f1ff:fee5:a8aa
4768.909865           :: -> ff02::1:ffe5:a8aa ICMPv6 78 Neighbor
  Solicitation for fe80::f2de:f1ff:fee5:a8aa
4769.911919 fe80::f2de:f1ff:fee5:a8aa -> ff02::2      ICMPv6 70 Router
  Solicitation from f0:de:f1:e5:a8:a9
4773.917868 fe80::f2de:f1ff:fee5:a8aa -> ff02::2      ICMPv6 70 Router
  Solicitation from f0:de:f1:e5:a8:a9
4777.925855 fe80::f2de:f1ff:fee5:a8aa -> ff02::2      ICMPv6 70 Router
  Solicitation from f0:de:f1:e5:a8:a9

Therefore, I believe this is a bug in IPv6 MLD because it should
sent at least 2 MLD reports after DAD is completed.
The specs says:

rfc3810
5.2.13. Source Addresses for Reports

   An MLDv2 Report MUST be sent with a valid IPv6 link-local source
   address, or the unspecified address (::), if the sending interface
   has not acquired a valid link-local address yet.  Sending reports
   with the unspecified address is allowed to support the use of IP
   multicast in the Neighbor Discovery Protocol [RFC2461].  For
   stateless autoconfiguration, as defined in [RFC2462], a node is
   required to join several IPv6 multicast groups, in order to perform
   Duplicate Address Detection (DAD).  Prior to DAD, the only address
   the reporting node has for the sending interface is a tentative one,
   which cannot be used for communication.  Thus, the unspecified
   address must be used.

   On the other hand, routers MUST silently discard a message that is
   not sent with a valid link-local address, without taking any action
   on the contents of the packet.  Thus, a Report is discarded if the
   router cannot identify the source address of the packet as belonging
   to a link connected to the interface on which the packet was
   received.  A Report sent with the unspecified address is also
   discarded by the router.  This enhances security, as unidentified
   reporting nodes cannot influence the state of the MLDv2 router(s).
   Nevertheless, the reporting node has modified its listening state for
   multicast addresses that are contained in the Multicast Address
   Records of the Report message.  From now on, it will treat packets
   sent to those multicast addresses according to this new listening
   state.  ***Once a valid link-local address is available, a node
SHOULD
   generate new MLDv2 Report messages for all multicast addresses joined
   on the interface****.
...

Does that make any sense?
Thanks,
-- 
fbl

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: possible bug in IPv6 MLD retransmissions
  2013-05-17  3:24 possible bug in IPv6 MLD retransmissions Flavio Leitner
@ 2013-05-18 17:31 ` Hannes Frederic Sowa
  2013-05-21 15:06   ` Flavio Leitner
  0 siblings, 1 reply; 11+ messages in thread
From: Hannes Frederic Sowa @ 2013-05-18 17:31 UTC (permalink / raw)
  To: fleitner; +Cc: netdev, Hideaki YOSHIFUJI, David Miller

On Fri, May 17, 2013 at 12:24:49AM -0300, Flavio Leitner wrote:
> A tcpdump captured while adding an IPv6 link-local address shows
> two MLD reports. One with source ``::'' and another with the permanent
> address.
> 
> Well, if you increase dad_retransmits from 1 to 10, for instance,
> then both MLD reports are sent with source address ``::'' which
> according with specs should be ignored by the routers.
>
> [...]
>
> Therefore, I believe this is a bug in IPv6 MLD because it should
> sent at least 2 MLD reports after DAD is completed.
> The specs says:
>
> [..]
>
> Does that make any sense?

Yes, this is unfortunate. RFC3590 clarifies this also for MLDv1 messages.

Could you try following patch I just came up with?

[PATCH RFC] ipv6: resend MLD report if a link-local address completes DAD

RFC3590/RFC3810 specifies we should resend MLD reports as soon as a
valid link-local address is available. This patch always resends MLD
reports if a link-local address completes dad (even a valid one was
already available).

Reported-by: Flavio Leitner <fleitner@redhat.com>
Cc: Hideaki YOSHIFUJI <yoshfuji@linux-ipv6.org>
Signed-off-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
---
 include/net/addrconf.h |  2 ++
 net/ipv6/addrconf.c    |  9 ++++++++-
 net/ipv6/mcast.c       | 16 ++++++++++++++++
 3 files changed, 26 insertions(+), 1 deletion(-)

diff --git a/include/net/addrconf.h b/include/net/addrconf.h
index 84a6440..0ec342c 100644
--- a/include/net/addrconf.h
+++ b/include/net/addrconf.h
@@ -155,6 +155,8 @@ extern bool ipv6_chk_mcast_addr(struct net_device *dev,
 				const struct in6_addr *group,
 				const struct in6_addr *src_addr);
 
+extern void ipv6_mc_resend_report(struct inet6_dev *idev);
+
 /*
  * identify MLD packets for MLD filter exceptions
  */
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
index d1ab6ab..c292723 100644
--- a/net/ipv6/addrconf.c
+++ b/net/ipv6/addrconf.c
@@ -3272,6 +3272,7 @@ out:
 static void addrconf_dad_completed(struct inet6_ifaddr *ifp)
 {
 	struct net_device *dev = ifp->idev->dev;
+	int type = ipv6_addr_type(&ifp->addr);
 
 	/*
 	 *	Configure the address for reception. Now it is valid.
@@ -3279,6 +3280,12 @@ static void addrconf_dad_completed(struct inet6_ifaddr *ifp)
 
 	ipv6_ifa_notify(RTM_NEWADDR, ifp);
 
+	/* While dad is in progress mld report's source address is in6_addrany.
+	 * Resend with proper ll now.
+	 */
+	if (type & IPV6_ADDR_LINKLOCAL)
+		ipv6_mc_resend_report(ifp->idev);
+
 	/* If added prefix is link local and we are prepared to process
 	   router advertisements, start sending router solicitations.
 	 */
@@ -3286,7 +3293,7 @@ static void addrconf_dad_completed(struct inet6_ifaddr *ifp)
 	if (ipv6_accept_ra(ifp->idev) &&
 	    ifp->idev->cnf.rtr_solicits > 0 &&
 	    (dev->flags&IFF_LOOPBACK) == 0 &&
-	    (ipv6_addr_type(&ifp->addr) & IPV6_ADDR_LINKLOCAL)) {
+	    (type & IPV6_ADDR_LINKLOCAL)) {
 		/*
 		 *	If a host as already performed a random delay
 		 *	[...] as part of DAD [...] there is no need
diff --git a/net/ipv6/mcast.c b/net/ipv6/mcast.c
index bfa6cc3..5e3b62f 100644
--- a/net/ipv6/mcast.c
+++ b/net/ipv6/mcast.c
@@ -1814,6 +1814,22 @@ err_out:
 	goto out;
 }
 
+void ipv6_mc_resend_report(struct inet6_dev *idev)
+{
+	if (MLD_V1_SEEN(idev)) {
+		struct ifmcaddr6 *mcaddr;
+		read_lock_bh(&idev->lock);
+		for (mcaddr = idev->mc_list; mcaddr; mcaddr = mcaddr->next) {
+			if (!(mcaddr->mca_flags & MAF_NOREPORT))
+				igmp6_send(&mcaddr->mca_addr, idev->dev,
+					   ICMPV6_MGM_REPORT);
+		}
+		read_unlock_bh(&idev->lock);
+	} else {
+		mld_send_report(idev, NULL);
+	}
+}
+
 static int ip6_mc_del1_src(struct ifmcaddr6 *pmc, int sfmode,
 	const struct in6_addr *psfsrc)
 {
-- 
1.8.1.4

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: possible bug in IPv6 MLD retransmissions
  2013-05-18 17:31 ` Hannes Frederic Sowa
@ 2013-05-21 15:06   ` Flavio Leitner
  2013-05-22  0:40     ` Hannes Frederic Sowa
  0 siblings, 1 reply; 11+ messages in thread
From: Flavio Leitner @ 2013-05-21 15:06 UTC (permalink / raw)
  To: Hannes Frederic Sowa; +Cc: netdev, Hideaki YOSHIFUJI, David Miller

On Sat, May 18, 2013 at 07:31:05PM +0200, Hannes Frederic Sowa wrote:
> On Fri, May 17, 2013 at 12:24:49AM -0300, Flavio Leitner wrote:
> > A tcpdump captured while adding an IPv6 link-local address shows
> > two MLD reports. One with source ``::'' and another with the permanent
> > address.
> > 
> > Well, if you increase dad_retransmits from 1 to 10, for instance,
> > then both MLD reports are sent with source address ``::'' which
> > according with specs should be ignored by the routers.
> >
> > [...]
> >
> > Therefore, I believe this is a bug in IPv6 MLD because it should
> > sent at least 2 MLD reports after DAD is completed.
> > The specs says:
> >
> > [..]
> >
> > Does that make any sense?
> 
> Yes, this is unfortunate. RFC3590 clarifies this also for MLDv1 messages.
> 
> Could you try following patch I just came up with?

It does work, but it would be better to send [Robustness Variable]
times, right?
thanks!

[PATCH] ipv6: resend MLD report if a link-local address completes DAD

RFC3590/RFC3810 specifies we should resend MLD reports as soon as a
valid link-local address is available. This patch always resends MLD
reports if a link-local address completes dad (even a valid one was
already available).

Reported-by: Flavio Leitner <fleitner@redhat.com>
Cc: Hideaki YOSHIFUJI <yoshfuji@linux-ipv6.org>
Signed-off-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
Signed-off-by: Flavio Leitner <fbl@redhat.com>
---
 include/net/addrconf.h |  1 +
 include/net/if_inet6.h |  2 ++
 net/ipv6/addrconf.c    |  9 ++++++++-
 net/ipv6/mcast.c       | 47 +++++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 58 insertions(+), 1 deletion(-)

diff --git a/include/net/addrconf.h b/include/net/addrconf.h
index 84a6440..ddd331c 100644
--- a/include/net/addrconf.h
+++ b/include/net/addrconf.h
@@ -155,6 +155,7 @@ extern bool ipv6_chk_mcast_addr(struct net_device *dev,
 				const struct in6_addr *group,
 				const struct in6_addr *src_addr);
 
+extern void ipv6_mc_dad_complete(struct inet6_dev *idev);
 /*
  * identify MLD packets for MLD filter exceptions
  */
diff --git a/include/net/if_inet6.h b/include/net/if_inet6.h
index 100fb8c..5c195b1 100644
--- a/include/net/if_inet6.h
+++ b/include/net/if_inet6.h
@@ -172,10 +172,12 @@ struct inet6_dev {
 	unsigned char		mc_qrv;
 	unsigned char		mc_gq_running;
 	unsigned char		mc_ifc_count;
+	unsigned char		mc_dad_count;
 	unsigned long		mc_v1_seen;
 	unsigned long		mc_maxdelay;
 	struct timer_list	mc_gq_timer;	/* general query timer */
 	struct timer_list	mc_ifc_timer;	/* interface change timer */
+	struct timer_list	mc_dad_timer;	/* dad complete mc timer */
 
 	struct ifacaddr6	*ac_list;
 	rwlock_t		lock;
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
index d1ab6ab..800222b 100644
--- a/net/ipv6/addrconf.c
+++ b/net/ipv6/addrconf.c
@@ -3272,6 +3272,7 @@ out:
 static void addrconf_dad_completed(struct inet6_ifaddr *ifp)
 {
 	struct net_device *dev = ifp->idev->dev;
+	int type = ipv6_addr_type(&ifp->addr);
 
 	/*
 	 *	Configure the address for reception. Now it is valid.
@@ -3279,6 +3280,12 @@ static void addrconf_dad_completed(struct inet6_ifaddr *ifp)
 
 	ipv6_ifa_notify(RTM_NEWADDR, ifp);
 
+	/* While dad is in progress mld report's source address is in6_addrany.
+	 * Resend with proper ll now.
+	 */
+	if (type & IPV6_ADDR_LINKLOCAL)
+		ipv6_mc_dad_complete(ifp->idev);
+
 	/* If added prefix is link local and we are prepared to process
 	   router advertisements, start sending router solicitations.
 	 */
@@ -3286,7 +3293,7 @@ static void addrconf_dad_completed(struct inet6_ifaddr *ifp)
 	if (ipv6_accept_ra(ifp->idev) &&
 	    ifp->idev->cnf.rtr_solicits > 0 &&
 	    (dev->flags&IFF_LOOPBACK) == 0 &&
-	    (ipv6_addr_type(&ifp->addr) & IPV6_ADDR_LINKLOCAL)) {
+	    (type & IPV6_ADDR_LINKLOCAL)) {
 		/*
 		 *	If a host as already performed a random delay
 		 *	[...] as part of DAD [...] there is no need
diff --git a/net/ipv6/mcast.c b/net/ipv6/mcast.c
index bfa6cc3..9941ff7 100644
--- a/net/ipv6/mcast.c
+++ b/net/ipv6/mcast.c
@@ -999,6 +999,14 @@ static void mld_ifc_start_timer(struct inet6_dev *idev, int delay)
 		in6_dev_hold(idev);
 }
 
+static void mld_dad_start_timer(struct inet6_dev *idev, int delay)
+{
+	int tv = net_random() % delay;
+
+	if (!mod_timer(&idev->mc_dad_timer, jiffies+tv+2))
+		in6_dev_hold(idev);
+}
+
 /*
  *	IGMP handling (alias multicast ICMPv6 messages)
  */
@@ -1814,6 +1822,41 @@ err_out:
 	goto out;
 }
 
+void ipv6_mc_dad_complete(struct inet6_dev *idev)
+{
+	idev->mc_dad_count = idev->mc_qrv;
+	mld_dad_start_timer(idev, 1);
+}
+
+static void mld_resend_report(struct inet6_dev *idev)
+{
+	if (MLD_V1_SEEN(idev)) {
+		struct ifmcaddr6 *mcaddr;
+		read_lock_bh(&idev->lock);
+		for (mcaddr = idev->mc_list; mcaddr; mcaddr = mcaddr->next) {
+			if (!(mcaddr->mca_flags & MAF_NOREPORT))
+				igmp6_send(&mcaddr->mca_addr, idev->dev,
+					   ICMPV6_MGM_REPORT);
+		}
+		read_unlock_bh(&idev->lock);
+	} else {
+		mld_send_report(idev, NULL);
+	}
+}
+
+static void mld_dad_timer_expire(unsigned long data)
+{
+	struct inet6_dev *idev = (struct inet6_dev *)data;
+
+	mld_resend_report(idev);
+	if (idev->mc_dad_count) {
+		idev->mc_dad_count--;
+		if (idev->mc_dad_count)
+			mld_dad_start_timer(idev, idev->mc_maxdelay);
+	}
+	__in6_dev_put(idev);
+}
+
 static int ip6_mc_del1_src(struct ifmcaddr6 *pmc, int sfmode,
 	const struct in6_addr *psfsrc)
 {
@@ -2231,6 +2274,8 @@ void ipv6_mc_down(struct inet6_dev *idev)
 	idev->mc_gq_running = 0;
 	if (del_timer(&idev->mc_gq_timer))
 		__in6_dev_put(idev);
+	if (del_timer(&idev->mc_dad_timer))
+		__in6_dev_put(idev);
 
 	for (i = idev->mc_list; i; i=i->next)
 		igmp6_group_dropped(i);
@@ -2267,6 +2312,8 @@ void ipv6_mc_init_dev(struct inet6_dev *idev)
 	idev->mc_ifc_count = 0;
 	setup_timer(&idev->mc_ifc_timer, mld_ifc_timer_expire,
 			(unsigned long)idev);
+	setup_timer(&idev->mc_dad_timer, mld_dad_timer_expire,
+			(unsigned long)idev);
 	idev->mc_qrv = MLD_QRV_DEFAULT;
 	idev->mc_maxdelay = IGMP6_UNSOLICITED_IVAL;
 	idev->mc_v1_seen = 0;
-- 
1.8.1.4

 

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: possible bug in IPv6 MLD retransmissions
  2013-05-21 15:06   ` Flavio Leitner
@ 2013-05-22  0:40     ` Hannes Frederic Sowa
  2013-05-22 11:30       ` David Stevens
  0 siblings, 1 reply; 11+ messages in thread
From: Hannes Frederic Sowa @ 2013-05-22  0:40 UTC (permalink / raw)
  To: netdev, Hideaki YOSHIFUJI, David Miller

On Tue, May 21, 2013 at 12:06:16PM -0300, Flavio Leitner wrote:
> On Sat, May 18, 2013 at 07:31:05PM +0200, Hannes Frederic Sowa wrote:
> > On Fri, May 17, 2013 at 12:24:49AM -0300, Flavio Leitner wrote:
> > > A tcpdump captured while adding an IPv6 link-local address shows
> > > two MLD reports. One with source ``::'' and another with the permanent
> > > address.
> > > 
> > > Well, if you increase dad_retransmits from 1 to 10, for instance,
> > > then both MLD reports are sent with source address ``::'' which
> > > according with specs should be ignored by the routers.
> > >
> > > [...]
> > >
> > > Therefore, I believe this is a bug in IPv6 MLD because it should
> > > sent at least 2 MLD reports after DAD is completed.
> > > The specs says:
> > >
> > > [..]
> > >
> > > Does that make any sense?
> > 
> > Yes, this is unfortunate. RFC3590 clarifies this also for MLDv1 messages.
> > 
> > Could you try following patch I just came up with?
> 
> It does work, but it would be better to send [Robustness Variable]
> times, right?

Sure, this is the more robust approach.

Patch is tested and seems fine:

Acked-by: Hannes Frederic Sowa <hannes@stressinduktion.org>

I tried to track if we actually used the unspecified address to send out
mld reports, but doing this correctly (multiple link-local addresses in
dad state) needed a bit of ugly lock handling and the code got bloated. So
I do think it is not worth the effort.

Thanks,

  Hannes

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: possible bug in IPv6 MLD retransmissions
  2013-05-22  0:40     ` Hannes Frederic Sowa
@ 2013-05-22 11:30       ` David Stevens
  2013-05-22 12:51         ` Hannes Frederic Sowa
                           ` (2 more replies)
  0 siblings, 3 replies; 11+ messages in thread
From: David Stevens @ 2013-05-22 11:30 UTC (permalink / raw)
  To: Hannes Frederic Sowa
  Cc: David Miller, netdev, netdev-owner, Hideaki YOSHIFUJI

First, I wouldn't call this a "bug"; it is listed as a "SHOULD", not a 
"MUST",  so
it is not required for compliance, though it is a good feature to add.

Second, I think doing this on all LL addresses unconditionally isn't a 
good
idea. If some configuration is using thousands of LL addrs for reasons of 
their
own, they would suddenly be blasted with unexpected MLD reports where
they have none now. I don't see why tracking it would be such a problem --
if nothing else, you could simply add a counter for the number of valid LL 
addrs
incremented on DAD completion, and send these whenever it transitions from 
0 to 1.

                                                +-DLS

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: possible bug in IPv6 MLD retransmissions
  2013-05-22 11:30       ` David Stevens
@ 2013-05-22 12:51         ` Hannes Frederic Sowa
  2013-05-22 17:27         ` Flavio Leitner
  2013-05-23 20:21         ` Hannes Frederic Sowa
  2 siblings, 0 replies; 11+ messages in thread
From: Hannes Frederic Sowa @ 2013-05-22 12:51 UTC (permalink / raw)
  To: David Stevens; +Cc: David Miller, netdev, netdev-owner, Hideaki YOSHIFUJI

On Wed, May 22, 2013 at 07:30:39AM -0400, David Stevens wrote:
> First, I wouldn't call this a "bug"; it is listed as a "SHOULD", not a 
> "MUST",  so
> it is not required for compliance, though it is a good feature to add.

Ok.

> Second, I think doing this on all LL addresses unconditionally isn't a 
> good
> idea. If some configuration is using thousands of LL addrs for reasons of 
> their
> own, they would suddenly be blasted with unexpected MLD reports where
> they have none now. I don't see why tracking it would be such a problem --
> if nothing else, you could simply add a counter for the number of valid LL 
> addrs
> incremented on DAD completion, and send these whenever it transitions from 
> 0 to 1.

I understand your concerns and will revisit the patch and check if a
dad_completed_counter would simplify the code.

Thanks,

  Hannes

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: possible bug in IPv6 MLD retransmissions
  2013-05-22 11:30       ` David Stevens
  2013-05-22 12:51         ` Hannes Frederic Sowa
@ 2013-05-22 17:27         ` Flavio Leitner
  2013-05-22 18:24           ` David Stevens
  2013-05-23 20:21         ` Hannes Frederic Sowa
  2 siblings, 1 reply; 11+ messages in thread
From: Flavio Leitner @ 2013-05-22 17:27 UTC (permalink / raw)
  To: David Stevens
  Cc: Hannes Frederic Sowa, David Miller, netdev, netdev-owner,
	Hideaki YOSHIFUJI

On Wed, May 22, 2013 at 07:30:39AM -0400, David Stevens wrote:
> First, I wouldn't call this a "bug"; it is listed as a "SHOULD", not a 
> "MUST",  so
> it is not required for compliance, though it is a good feature to add.
> 
> Second, I think doing this on all LL addresses unconditionally isn't a 
> good
> idea. If some configuration is using thousands of LL addrs for reasons of 
> their
> own, they would suddenly be blasted with unexpected MLD reports where
> they have none now. I don't see why tracking it would be such a problem --
> if nothing else, you could simply add a counter for the number of valid LL 
> addrs
> incremented on DAD completion, and send these whenever it transitions from 
> 0 to 1.

It becomes a bug (and that's why I started with 'possible') if dad
completes after the two MLD reports sent with ``::'' source, because
routers will ignore those initial reports and the system is left out.

Thanks,
-- 
fbl

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: possible bug in IPv6 MLD retransmissions
  2013-05-22 17:27         ` Flavio Leitner
@ 2013-05-22 18:24           ` David Stevens
  2013-05-22 21:21             ` Flavio Leitner
  0 siblings, 1 reply; 11+ messages in thread
From: David Stevens @ 2013-05-22 18:24 UTC (permalink / raw)
  To: Flavio Leitner
  Cc: David Miller, Hannes Frederic Sowa, netdev, netdev-owner,
	Hideaki YOSHIFUJI

Flavio Leitner <fbl@redhat.com> wrote on 05/22/2013 01:27:11 PM:

> It becomes a bug (and that's why I started with 'possible') if dad
> completes after the two MLD reports sent with ``::'' source, because
> routers will ignore those initial reports and the system is left out.

No, unsolicited reports are not necessary for MLD. If there are no
other listeners for a group, the reports will be triggered within
one query interval after a valid LL addr is there.

                                                                +-DLS

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: possible bug in IPv6 MLD retransmissions
  2013-05-22 18:24           ` David Stevens
@ 2013-05-22 21:21             ` Flavio Leitner
  0 siblings, 0 replies; 11+ messages in thread
From: Flavio Leitner @ 2013-05-22 21:21 UTC (permalink / raw)
  To: David Stevens
  Cc: David Miller, Hannes Frederic Sowa, netdev, netdev-owner,
	Hideaki YOSHIFUJI

On Wed, May 22, 2013 at 02:24:34PM -0400, David Stevens wrote:
> Flavio Leitner <fbl@redhat.com> wrote on 05/22/2013 01:27:11 PM:
> 
> > It becomes a bug (and that's why I started with 'possible') if dad
> > completes after the two MLD reports sent with ``::'' source, because
> > routers will ignore those initial reports and the system is left out.
> 
> No, unsolicited reports are not necessary for MLD. If there are no
> other listeners for a group, the reports will be triggered within
> one query interval after a valid LL addr is there.

Agreed that they aren't necessary, but I also don't think it's
a good solution to wait for the query interval.

-- 
fbl

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: possible bug in IPv6 MLD retransmissions
  2013-05-22 11:30       ` David Stevens
  2013-05-22 12:51         ` Hannes Frederic Sowa
  2013-05-22 17:27         ` Flavio Leitner
@ 2013-05-23 20:21         ` Hannes Frederic Sowa
  2013-06-23 14:18           ` Hannes Frederic Sowa
  2 siblings, 1 reply; 11+ messages in thread
From: Hannes Frederic Sowa @ 2013-05-23 20:21 UTC (permalink / raw)
  To: David Stevens; +Cc: David Miller, netdev, netdev-owner, Hideaki YOSHIFUJI

On Wed, May 22, 2013 at 07:30:39AM -0400, David Stevens wrote:
> Second, I think doing this on all LL addresses unconditionally isn't a 
> good
> idea. If some configuration is using thousands of LL addrs for reasons of 
> their
> own, they would suddenly be blasted with unexpected MLD reports where
> they have none now. I don't see why tracking it would be such a problem --
> if nothing else, you could simply add a counter for the number of valid LL 
> addrs
> incremented on DAD completion, and send these whenever it transitions from 
> 0 to 1.

While testing some code, I noticed that we seem to have a similar
problem with the generation of router soliciations. We send out
MAX_RTR_SOLICITATIONS for each link-local address dad completion.

So the tracking could have some more users and I will move it to
addrconf.c. I'll hope I cope with all the tiny races I found in my last
version. :)

Greetings,

  Hannes

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: possible bug in IPv6 MLD retransmissions
  2013-05-23 20:21         ` Hannes Frederic Sowa
@ 2013-06-23 14:18           ` Hannes Frederic Sowa
  0 siblings, 0 replies; 11+ messages in thread
From: Hannes Frederic Sowa @ 2013-06-23 14:18 UTC (permalink / raw)
  To: David Stevens, David Miller, netdev, netdev-owner,
	Hideaki YOSHIFUJI

On Thu, May 23, 2013 at 10:21:56PM +0200, Hannes Frederic Sowa wrote:
> On Wed, May 22, 2013 at 07:30:39AM -0400, David Stevens wrote:
> > Second, I think doing this on all LL addresses unconditionally isn't a 
> > good
> > idea. If some configuration is using thousands of LL addrs for reasons of 
> > their
> > own, they would suddenly be blasted with unexpected MLD reports where
> > they have none now. I don't see why tracking it would be such a problem --
> > if nothing else, you could simply add a counter for the number of valid LL 
> > addrs
> > incremented on DAD completion, and send these whenever it transitions from 
> > 0 to 1.
> 
> While testing some code, I noticed that we seem to have a similar
> problem with the generation of router soliciations. We send out
> MAX_RTR_SOLICITATIONS for each link-local address dad completion.
> 
> So the tracking could have some more users and I will move it to
> addrconf.c. I'll hope I cope with all the tiny races I found in my last
> version. :)

Sorry, I could not finish this patch before I got distracted with other
things. I had a look at it again yesterday and came up with the following
plan:

a) split up router advertisment and dad timer
b) remove src-argument from ndisc_send_rs and calculate it from the ll
   addresses of the interface when sending the RS
c) introduce ll_dad_completion counter
d) rebase the above patch onto this utilising the ll_dad_completion counter

Does this plan sound solid?

I plan to send out a patch for a) today.

Greetings,

  Hannes

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2013-06-23 14:18 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-05-17  3:24 possible bug in IPv6 MLD retransmissions Flavio Leitner
2013-05-18 17:31 ` Hannes Frederic Sowa
2013-05-21 15:06   ` Flavio Leitner
2013-05-22  0:40     ` Hannes Frederic Sowa
2013-05-22 11:30       ` David Stevens
2013-05-22 12:51         ` Hannes Frederic Sowa
2013-05-22 17:27         ` Flavio Leitner
2013-05-22 18:24           ` David Stevens
2013-05-22 21:21             ` Flavio Leitner
2013-05-23 20:21         ` Hannes Frederic Sowa
2013-06-23 14:18           ` Hannes Frederic Sowa

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).