New: Problem in joinning a socket to ipv6 multicast address in specific scenario
Subsystems (3)
A message that is not in the archive (sent off-list or not yet received): [email protected]/
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_mreqmaddr6_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.
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
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
@@ -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
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 thanIPV6_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.
Signed-off-by Evgeniy Polyakov <[email protected]>
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.txtQuoted 3 lines · Herbert Xu
OK, this looks like a good change. However, we should also change
NETDEV_UPas 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
@@ -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
Herbert Xu
AppliedQuoted 4 lines · Evgeniy Polyakov
Ok, added
netdev_uptoo.Signed-off-by Evgeniy Polyakov <[email protected]>
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