On Tue, 6 Mar 2007, Philip Bellino wrote:

> To all;
> Previously running Linux kernel 2.6.14.3:
>
> In addrconf.c, in the function "ipv6_add_dev",(see below in bold).
> "dev->ip6_ptr = ndev" is set, then "ipv6_mc_init_dev(ndev)" is called
> (mcast.c), which then calls "ipv6_dev_mc_inc" (mcast.c) for the "all
> nodes address".
> This sets "idev = in6_dev_get(dev)" and then tests if it is NULL.
>
> 2.6.14.3 code:
> static struct inet6_dev * ipv6_add_dev(struct net_device *dev)
> {
>       struct inet6_dev *ndev;
> ~~~~
> ~~~
>
>               write_lock_bh(&addrconf_lock);
>               dev->ip6_ptr = ndev;
>               write_unlock_bh(&addrconf_lock);
>
>               ipv6_mc_init_dev(ndev);
>               ndev->tstamp = jiffies;
> #ifdef CONFIG_SYSCTL
>               neigh_sysctl_register(dev, ndev->nd_parms, NET_IPV6,
>                                     NET_IPV6_NEIGH, "ipv6",
>                                     &ndisc_ifinfo_sysctl_change,
>                                     NULL);
>               addrconf_sysctl_register(ndev, &ndev->cnf);
> #endif
>       }
>       return ndev;
> }
>
> "Idev is not NULL, so the all nodes address (FF02::1) is added to the
> list and all is fine.
>
> ************************************************************************
> *****************
>
>
> Now in the 2.6.19.2 linux kernel, the "ipv6_add_dev" routine has
> changed(see below). "dev->ip6_ptr = ndev" is no longer in the code.
> "ipv6_mc_init_dev(ndev)" is called and then a new function
> "rcu_assign_pointer(dev->ip6_ptr, ndev)" is used.
> When this occurs, the call to "ipv6_dev_mc_inc" (in mcast.c) will set
> "idev = in6_dev_get(dev)" and then test if it is NULL.
> It is NULL, so it returns -EINVAL.
>
> 2.6.19.2 code:
> static struct inet6_dev * ipv6_add_dev(struct net_device *dev)
> {
>       struct inet6_dev *ndev;
>
> ~~~~
> ~~~~
>
>       if (netif_carrier_ok(dev))
>               ndev->if_flags |= IF_READY;
>
>
>               ipv6_mc_init_dev(ndev);
>               ndev->tstamp = jiffies;
> #ifdef CONFIG_SYSCTL
>               neigh_sysctl_register(dev, ndev->nd_parms, NET_IPV6,
>                                     NET_IPV6_NEIGH, "ipv6",
>                                     &ndisc_ifinfo_sysctl_change,
>                                     NULL);
>               addrconf_sysctl_register(ndev, &ndev->cnf);
> #endif
>       /* protected by rtnl_lock */
>       rcu_assign_pointer(dev->ip6_ptr, ndev);
>       return ndev;
> }
>
> The all nodes address (FF02::1) is never added to the list.
>
> I have worked around the problem by moving the
> "rcu_assign_pointer(dev->ip6_ptr, ndev)" before the call to
> "ipv6_mc_init_dev(ndev)".
>
> Has anyone else seen this issue?

The IPv6 in 2.6.19 kernel is broken.
https://www.redhat.com/archives/fedora-test-list/2007-February/msg00285.html

Try using Linux Kernel 2.6.20 (or 2.6.20.1)

Regards,
        Janos Mohacsi

_______________________________________________
Users mailing list
Users@ipv6.org
https://lists.ipv6.org/mailman/listinfo/users

Reply via email to