Skip to contentSkip to conversation

New: Problem in joinning a socket to ipv6 multicast address in specific scenario

Bugme-new Applied Andrew Morton 3 participants 6 messages Nov 23, 2007 – Nov 30, 2007 1 message not in the archive

Subsystems (3)
lore
Share & tools
lore

A message that is not in the archive (sent off-list or not yet received): [email protected]/

#1 lore raw
Quoted 73 lines · On Thu, 22 Nov 2007 11:02:04 -0800 (PST) [email protected] wrote:

http://bugzilla.kernel.org/show_bug.cgi?id=9440

Summary: Problem in joinning a socket to ipv6 multicast address
in specific scenario
Product: Networking
Version: 2.5
KernelVersion: 2.6
Platform: All
OS/Version: Linux
Tree: Mainline
Status: NEW
Severity: high
Priority: P1
Component: IPV6
AssignedTo: [email protected]
ReportedBy: [email protected]

Hi,
I have a problem in joinning a socket to multicast address in the following scenario (maybe kernel bug):

1. I am changing the mtu size of the eth device to a small size - "ifconfig eth1 mtu 100"

2. After that i am resizing the mtu for it's orginal size - "ifconfig eth1 mtu 1500"

3. Now i am running a program i wrote in c that opens a dgram socket (sock_fd[i] = socket(test_data->protocol, SOCK_DGRAM, 0);) and join it to multicast ipv6 address.
if i am running this program after steps 1+2 i get the following error:
"Resource temporarily unavailable" when trying to join the socket to the multicast ipv6 address by the
system call :

struct ipv6_mreq maddr6_group;
...
setsockopt(sock_fd,

       IPPROTO_IPV6,
       IPV6_JOIN_GROUP,
       (char *)&maddr6_group,
       sizeof(maddr6_group));

but if i am running my program after reset of the driver (before steps 1+2) it is working fine.
if i am trying to run the program and join a socket to ipv4 multicast address (instead of ipv6) i get no errors - this doesn't work only when trying to join to ipv6 multicast address.

I got this error in broadcom device ("Broadcom Corporation NetXtreme BCM5721 Gigabit Ethernet PCI Express (rev 21)") but i don't think this is a bug in broadcom driver,
because i tried it on differnt devices, in some devices i got the following error instead: "Invalid argument" with the same multicast address. As i said before if i am trying to join a socket to multicast ipv6 address before resizing the mtu size it is working fine, all the problems are after step 1+2.

All my tries were OS:
1. SLES10.0 - 2.6.16.21-0.8-smp
2. REDHAT5.0 - 2.6.18-8.el5 #1 SMP.

I am waiting for an answer,
thanks a lot,
Aviad Yehezkel.

Signature · 3 lines
Configure bugmail: http://bugzilla.kernel.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug, or are watching someone who is.
#2 lore raw
Quoted 7 lines · Andrew Morton
Quoted 7 lines

3. Now i am running a program i wrote in c that opens a dgram socket (sock_fd[i] = socket(test_data->protocol, SOCK_DGRAM, 0);) and join it to multicast ipv6 address.
if i am running this program after steps 1+2 i get the following error:
"Resource temporarily unavailable" when trying to join the socket to the multicast ipv6 address by the
system call :

Could you provide a test application?
Given it is small and can be ran without external dependencies, it will be fixed way much faster.

Thanks.

Signature · 1 line
	Evgeniy Polyakov
#3 lore raw

Hi.

Avaid provided test application, so bug got fixed.

IPv6 addrconf removes ipv6 inner device from netdev each time cmu changes and new value is less than IPV6_MIN_MTU (1280 bytes). When mtu is changed and new value is greater than IPV6_MIN_MTU, it does not add ipv6 addresses and inner device bac.

This patch fixes that.

Tested with Avaid's application, which works ok now.

net/ipv6/addrconf.c +7 -1
index 567664e..4f7e46c 100644
@@ -2357,12 +2358,18 @@ static int addrconf_notify(struct notifier_block *this, unsigned long event,
 		break;
 
 	case NETDEV_CHANGEMTU:
-		if ( idev && dev->mtu >= IPV6_MIN_MTU) {
+		if (idev && dev->mtu >= IPV6_MIN_MTU) {
 			rt6_mtu_change(dev, dev->mtu);
 			idev->cnf.mtu6 = dev->mtu;
 			break;
 		}
 
+		if (!idev && dev->mtu >= IPV6_MIN_MTU) {
+			idev = ipv6_add_dev(dev);
+			if (idev)
+				break;
+		}
+
 		/* MTU falled under IPV6_MIN_MTU. Stop IPv6 on this interface. */
 
 	case NETDEV_DOWN:
Signature · 1 line
	Evgeniy Polyakov
#4 lore raw
Quoted 9 lines · Evgeniy Polyakov

Hi.

Avaid provided test application, so bug got fixed.

IPv6 addrconf removes ipv6 inner device from netdev each time cmu changes and new value is less than IPV6_MIN_MTU (1280 bytes). When mtu is changed and new value is greater than IPV6_MIN_MTU, it does not add ipv6 addresses and inner device bac.

Quoted 5 lines

This patch fixes that.

Tested with Avaid's application, which works ok now.

OK, this looks like a good change. However, we should also change NETDEV_UP as well to recreate idev if it isn't there and the MTU is big enough.

Thanks,

Signature · 4 lines
Visit Openswan at http://www.openswan.org/
Email: Herbert Xu ~{PmV>HI~} <[email protected]>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt
#5 lore raw
Quoted 3 lines · Herbert Xu

OK, this looks like a good change. However, we should also change NETDEV_UP as well to recreate idev if it isn't there and the MTU is big enough.

Ok, added netdev_up too.

net/ipv6/addrconf.c +10 -1
index 567664e..e8c3475 100644
@@ -2293,6 +2293,9 @@ static int addrconf_notify(struct notifier_block *this, unsigned long event,
 				break;
 			}
 
+			if (!idev && dev->mtu >= IPV6_MIN_MTU)
+				idev = ipv6_add_dev(dev);
+
 			if (idev)
 				idev->if_flags |= IF_READY;
 		} else {
@@ -2357,12 +2360,18 @@ static int addrconf_notify(struct notifier_block *this, unsigned long event,
 		break;
 
 	case NETDEV_CHANGEMTU:
-		if ( idev && dev->mtu >= IPV6_MIN_MTU) {
+		if (idev && dev->mtu >= IPV6_MIN_MTU) {
 			rt6_mtu_change(dev, dev->mtu);
 			idev->cnf.mtu6 = dev->mtu;
 			break;
 		}
 
+		if (!idev && dev->mtu >= IPV6_MIN_MTU) {
+			idev = ipv6_add_dev(dev);
+			if (idev)
+				break;
+		}
+
 		/* MTU falled under IPV6_MIN_MTU. Stop IPv6 on this interface. */
 
 	case NETDEV_DOWN:
Signature · 1 line
	Evgeniy Polyakov
Applied
#6 lore raw
Quoted 4 lines · Evgeniy Polyakov

Ok, added netdev_up too.

Applied to net-2.6. Thanks Evgeniy!

Signature · 4 lines
Visit Openswan at http://www.openswan.org/
Email: Herbert Xu ~{PmV>HI~} <[email protected]>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt