* [FIX][PATCH] ipv6 addrconf.c : wrong handling of non-ipv6 hardware since 2.6.21
@ 2007-05-17 16:53 Oliver Hartkopp
2007-05-17 17:09 ` Resend: " Oliver Hartkopp
2007-05-17 17:49 ` YOSHIFUJI Hideaki / 吉藤英明
0 siblings, 2 replies; 7+ messages in thread
From: Oliver Hartkopp @ 2007-05-17 16:53 UTC (permalink / raw)
To: davem, yoshfuji; +Cc: netdev
Hello Hideaki, hello David,
since 2.6.21 the new case NETDEV_REGISTER has been added to the big
'switch' in addrconf_notify().
But within this "case NETDEV_REGISTER"-code no check about valid ipv6
networking hardware is done, as it is done in NETDEV_UP, NETDEV_CHANGE
and others.
Please apply the following patch to handle only valid ipv6 networking
hardware inside the addrconf-notifier. This omits the invocation of
ipv6_add_dev(dev) for non ipv6 capable hardware (e.g. with MTUs <
IPV6_MIN_MTU) which leads to an ugly //"IPv6: add_dev failed for %s\n"
kernel warning.//
The patch applies since 2.6.21 and also to the latest 2.6.22-rc1-git5
(with an offset of 78 lines).
Best regards,
Oliver
Signed-off-by: Oliver Hartkopp <socketcan@hartkopp.net>
---
*--- linux-2.6.21/net/ipv6/addrconf.c.orig 2007-05-16
01:43:30.000000000 +0200
+++ linux-2.6.21/net/ipv6/addrconf.c 2007-05-16 02:01:18.000000000 +0200
@@ -2076,15 +2076,6 @@ static void addrconf_dev_config(struct n
ASSERT_RTNL();
- if ((dev->type != ARPHRD_ETHER) &&
- (dev->type != ARPHRD_FDDI) &&
- (dev->type != ARPHRD_IEEE802_TR) &&
- (dev->type != ARPHRD_ARCNET) &&
- (dev->type != ARPHRD_INFINIBAND)) {
- /* Alas, we support only Ethernet autoconfiguration. */
- return;
- }
-
idev = addrconf_add_dev(dev);
if (idev == NULL)
return;
@@ -2172,13 +2163,35 @@ static void addrconf_ip6_tnl_config(stru
ip6_tnl_add_linklocal(idev);
}
+static int ipv6_hwtype(struct net_device *dev)
+{
+ if ((dev->type == ARPHRD_ETHER) ||
+ (dev->type == ARPHRD_LOOPBACK) ||
+#if defined(CONFIG_IPV6_SIT) || defined(CONFIG_IPV6_SIT_MODULE)
+ (dev->type == ARPHRD_SIT) ||
+#endif
+ (dev->type == ARPHRD_TUNNEL6) ||
+ (dev->type == ARPHRD_FDDI) ||
+ (dev->type == ARPHRD_IEEE802_TR) ||
+ (dev->type == ARPHRD_ARCNET) ||
+ (dev->type == ARPHRD_INFINIBAND))
+ return 1;
+
+ return 0;
+}
+
static int addrconf_notify(struct notifier_block *this, unsigned long
event,
void * data)
{
struct net_device *dev = (struct net_device *) data;
- struct inet6_dev *idev = __in6_dev_get(dev);
+ struct inet6_dev *idev;
int run_pending = 0;
+ if (!ipv6_hwtype(dev))
+ return NOTIFY_OK;
+
+ idev = __in6_dev_get(dev);
+
switch(event) {
case NETDEV_REGISTER:
if (!idev) {
*
^ permalink raw reply [flat|nested] 7+ messages in thread
* Resend: [FIX][PATCH] ipv6 addrconf.c : wrong handling of non-ipv6 hardware since 2.6.21
2007-05-17 16:53 [FIX][PATCH] ipv6 addrconf.c : wrong handling of non-ipv6 hardware since 2.6.21 Oliver Hartkopp
@ 2007-05-17 17:09 ` Oliver Hartkopp
2007-05-17 17:49 ` YOSHIFUJI Hideaki / 吉藤英明
1 sibling, 0 replies; 7+ messages in thread
From: Oliver Hartkopp @ 2007-05-17 17:09 UTC (permalink / raw)
To: davem, yoshfuji; +Cc: netdev
Sorry. I had a problem with my mailer that disrupted the patch ...
--------------------------
Hello Hideaki, hello David,
since 2.6.21 the new case NETDEV_REGISTER has been added to the big
'switch' in addrconf_notify().
But within this "case NETDEV_REGISTER"-code no check about valid ipv6
networking hardware is done, as it is done in NETDEV_UP, NETDEV_CHANGE
and others.
Please apply the following patch to handle only valid ipv6 networking
hardware inside the addrconf-notifier. This omits the invocation of
ipv6_add_dev(dev) for non ipv6 capable hardware (e.g. with MTUs <
IPV6_MIN_MTU) which leads to an ugly "IPv6: add_dev failed for %s\n"
kernel warning.
The patch applies since 2.6.21 and also to the latest 2.6.22-rc1-git5
(with an offset of 78 lines).
Best regards,
Oliver
Signed-off-by: Oliver Hartkopp <socketcan@hartkopp.net>
---
--- linux-2.6.21/net/ipv6/addrconf.c.orig 2007-05-16
01:43:30.000000000 +0200
+++ linux-2.6.21/net/ipv6/addrconf.c 2007-05-16 02:01:18.000000000 +0200
@@ -2076,15 +2076,6 @@ static void addrconf_dev_config(struct n
ASSERT_RTNL();
- if ((dev->type != ARPHRD_ETHER) &&
- (dev->type != ARPHRD_FDDI) &&
- (dev->type != ARPHRD_IEEE802_TR) &&
- (dev->type != ARPHRD_ARCNET) &&
- (dev->type != ARPHRD_INFINIBAND)) {
- /* Alas, we support only Ethernet autoconfiguration. */
- return;
- }
-
idev = addrconf_add_dev(dev);
if (idev == NULL)
return;
@@ -2172,13 +2163,35 @@ static void addrconf_ip6_tnl_config(stru
ip6_tnl_add_linklocal(idev);
}
+static int ipv6_hwtype(struct net_device *dev)
+{
+ if ((dev->type == ARPHRD_ETHER) ||
+ (dev->type == ARPHRD_LOOPBACK) ||
+#if defined(CONFIG_IPV6_SIT) || defined(CONFIG_IPV6_SIT_MODULE)
+ (dev->type == ARPHRD_SIT) ||
+#endif
+ (dev->type == ARPHRD_TUNNEL6) ||
+ (dev->type == ARPHRD_FDDI) ||
+ (dev->type == ARPHRD_IEEE802_TR) ||
+ (dev->type == ARPHRD_ARCNET) ||
+ (dev->type == ARPHRD_INFINIBAND))
+ return 1;
+
+ return 0;
+}
+
static int addrconf_notify(struct notifier_block *this, unsigned long
event,
void * data)
{
struct net_device *dev = (struct net_device *) data;
- struct inet6_dev *idev = __in6_dev_get(dev);
+ struct inet6_dev *idev;
int run_pending = 0;
+ if (!ipv6_hwtype(dev))
+ return NOTIFY_OK;
+
+ idev = __in6_dev_get(dev);
+
switch(event) {
case NETDEV_REGISTER:
if (!idev) {
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [FIX][PATCH] ipv6 addrconf.c : wrong handling of non-ipv6 hardware since 2.6.21
2007-05-17 16:53 [FIX][PATCH] ipv6 addrconf.c : wrong handling of non-ipv6 hardware since 2.6.21 Oliver Hartkopp
2007-05-17 17:09 ` Resend: " Oliver Hartkopp
@ 2007-05-17 17:49 ` YOSHIFUJI Hideaki / 吉藤英明
2007-05-17 20:41 ` Oliver Hartkopp
2007-05-17 21:10 ` [FIX][PATCH] ipv6 addrconf.c REMOVED #if patch Oliver Hartkopp
1 sibling, 2 replies; 7+ messages in thread
From: YOSHIFUJI Hideaki / 吉藤英明 @ 2007-05-17 17:49 UTC (permalink / raw)
To: socketcan; +Cc: davem, netdev, yoshfuji
In article <464C886F.50703@hartkopp.net> (at Thu, 17 May 2007 18:53:03 +0200), Oliver Hartkopp <socketcan@hartkopp.net> says:
> +static int ipv6_hwtype(struct net_device *dev)
> +{
> + if ((dev->type == ARPHRD_ETHER) ||
> + (dev->type == ARPHRD_LOOPBACK) ||
> +#if defined(CONFIG_IPV6_SIT) || defined(CONFIG_IPV6_SIT_MODULE)
> + (dev->type == ARPHRD_SIT) ||
> +#endif
> + (dev->type == ARPHRD_TUNNEL6) ||
> + (dev->type == ARPHRD_FDDI) ||
> + (dev->type == ARPHRD_IEEE802_TR) ||
> + (dev->type == ARPHRD_ARCNET) ||
> + (dev->type == ARPHRD_INFINIBAND))
> + return 1;
> +
> + return 0;
> +}
> +
Please remove #if, or please provide for other
dependencies as well (e.g., CONFIG_IPV6_TUNNEL etc.)
Otherwise, I would agree.
--
YOSHIFUJI Hideaki @ USAGI Project <yoshfuji@linux-ipv6.org>
GPG-FP : 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [FIX][PATCH] ipv6 addrconf.c : wrong handling of non-ipv6 hardware since 2.6.21
2007-05-17 17:49 ` YOSHIFUJI Hideaki / 吉藤英明
@ 2007-05-17 20:41 ` Oliver Hartkopp
2007-05-17 21:10 ` [FIX][PATCH] ipv6 addrconf.c REMOVED #if patch Oliver Hartkopp
1 sibling, 0 replies; 7+ messages in thread
From: Oliver Hartkopp @ 2007-05-17 20:41 UTC (permalink / raw)
To: YOSHIFUJI Hideaki / 吉藤英明; +Cc: davem, netdev
YOSHIFUJI Hideaki / 吉藤英明 schrieb:
> In article <464C886F.50703@hartkopp.net> (at Thu, 17 May 2007 18:53:03 +0200), Oliver Hartkopp <socketcan@hartkopp.net> says:
>
>
>> +static int ipv6_hwtype(struct net_device *dev)
>> +{
>> + if ((dev->type == ARPHRD_ETHER) ||
>> + (dev->type == ARPHRD_LOOPBACK) ||
>> +#if defined(CONFIG_IPV6_SIT) || defined(CONFIG_IPV6_SIT_MODULE)
>> + (dev->type == ARPHRD_SIT) ||
>> +#endif
>> + (dev->type == ARPHRD_TUNNEL6) ||
>> + (dev->type == ARPHRD_FDDI) ||
>> + (dev->type == ARPHRD_IEEE802_TR) ||
>> + (dev->type == ARPHRD_ARCNET) ||
>> + (dev->type == ARPHRD_INFINIBAND))
>> + return 1;
>> +
>> + return 0;
>> +}
>> +
>>
>
> Please remove #if, or please provide for other
> dependencies as well (e.g., CONFIG_IPV6_TUNNEL etc.)
>
> Otherwise, I would agree.
>
>
Hello Hideaki,
thanks for your (positive) feedback.
Indeed ARPHRD_SIT is the only hardware type that's explicitely #if 'ed
in the addrconf.c code. Any other ARPHRD_* is not conditional to any
CONFIGs. E.g. there is no #ifdef CONFIG_IPV6_TUNNEL arround the other
ARPHRD_TUNNEL6 stuff in addrconf.c.
So the current patch meets the exact functional extension to the other
code, where only ARPHRD_SIT is in #if 's.
Of course it is no problem to remove the #if defined(CONFIG_IPV6_SIT)
... but this would be the only place in the code then.
Are you sure, that you really want have a divergent codestyle only here
in ipv6_hwtype()?
If so i can post it of course.
Best Regards,
Oliver
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [FIX][PATCH] ipv6 addrconf.c REMOVED #if patch
2007-05-17 17:49 ` YOSHIFUJI Hideaki / 吉藤英明
2007-05-17 20:41 ` Oliver Hartkopp
@ 2007-05-17 21:10 ` Oliver Hartkopp
2007-05-21 18:20 ` Urs Thuermann
1 sibling, 1 reply; 7+ messages in thread
From: Oliver Hartkopp @ 2007-05-17 21:10 UTC (permalink / raw)
To: YOSHIFUJI Hideaki / 吉藤英明; +Cc: davem, netdev
YOSHIFUJI Hideaki / 吉藤英明 wrote:
> Please remove #if, or please provide for other
> dependencies as well (e.g., CONFIG_IPV6_TUNNEL etc.)
>
> Otherwise, I would agree.
>
>
Yep - you were right. It looks better like this as ARPHRD_SIT is defined
in if_arp.h in any CONFIG_* case ...
Best regards & tnx,
Oliver
--- linux-2.6.21/net/ipv6/addrconf.c.orig 2007-05-18
00:54:54.000000000 +0200
+++ linux-2.6.21/net/ipv6/addrconf.c 2007-05-18 00:57:11.000000000 +0200
@@ -2076,15 +2076,6 @@ static void addrconf_dev_config(struct n
ASSERT_RTNL();
- if ((dev->type != ARPHRD_ETHER) &&
- (dev->type != ARPHRD_FDDI) &&
- (dev->type != ARPHRD_IEEE802_TR) &&
- (dev->type != ARPHRD_ARCNET) &&
- (dev->type != ARPHRD_INFINIBAND)) {
- /* Alas, we support only Ethernet autoconfiguration. */
- return;
- }
-
idev = addrconf_add_dev(dev);
if (idev == NULL)
return;
@@ -2172,13 +2163,33 @@ static void addrconf_ip6_tnl_config(stru
ip6_tnl_add_linklocal(idev);
}
+static int ipv6_hwtype(struct net_device *dev)
+{
+ if ((dev->type == ARPHRD_ETHER) ||
+ (dev->type == ARPHRD_LOOPBACK) ||
+ (dev->type == ARPHRD_SIT) ||
+ (dev->type == ARPHRD_TUNNEL6) ||
+ (dev->type == ARPHRD_FDDI) ||
+ (dev->type == ARPHRD_IEEE802_TR) ||
+ (dev->type == ARPHRD_ARCNET) ||
+ (dev->type == ARPHRD_INFINIBAND))
+ return 1;
+
+ return 0;
+}
+
static int addrconf_notify(struct notifier_block *this, unsigned long
event,
void * data)
{
struct net_device *dev = (struct net_device *) data;
- struct inet6_dev *idev = __in6_dev_get(dev);
+ struct inet6_dev *idev;
int run_pending = 0;
+ if (!ipv6_hwtype(dev))
+ return NOTIFY_OK;
+
+ idev = __in6_dev_get(dev);
+
switch(event) {
case NETDEV_REGISTER:
if (!idev) {
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [FIX][PATCH] ipv6 addrconf.c REMOVED #if patch
2007-05-17 21:10 ` [FIX][PATCH] ipv6 addrconf.c REMOVED #if patch Oliver Hartkopp
@ 2007-05-21 18:20 ` Urs Thuermann
2007-05-23 21:35 ` David Miller
0 siblings, 1 reply; 7+ messages in thread
From: Urs Thuermann @ 2007-05-21 18:20 UTC (permalink / raw)
To: YOSHIFUJI Hideaki; +Cc: Oliver Hartkopp, davem, netdev
Oliver Hartkopp <socketcan@hartkopp.net> writes:
> Yep - you were right. It looks better like this as ARPHRD_SIT is
> defined in if_arp.h in any CONFIG_* case ...
Oliver asked me to resend the patch with a sane mailer that doesn't
mangle white-space and line breaks. So here it is.
This patch makes the netdevice notifier for IPv6 ignore all events on
non-IPv6 capable devices.
Signed-off-by: Oliver Hartkopp <socketcan@hartkopp.net>
Signed-off-by: Urs Thuermann <urs@isnogud.escape.de>
urs
--- /usr/src/linux-2.6.21/net/ipv6/addrconf.c.orig 2007-05-21 19:47:36.000000000 +0200
+++ /usr/src/linux-2.6.21/net/ipv6/addrconf.c 2007-05-21 19:54:30.000000000 +0200
@@ -2076,15 +2076,6 @@
ASSERT_RTNL();
- if ((dev->type != ARPHRD_ETHER) &&
- (dev->type != ARPHRD_FDDI) &&
- (dev->type != ARPHRD_IEEE802_TR) &&
- (dev->type != ARPHRD_ARCNET) &&
- (dev->type != ARPHRD_INFINIBAND)) {
- /* Alas, we support only Ethernet autoconfiguration. */
- return;
- }
-
idev = addrconf_add_dev(dev);
if (idev == NULL)
return;
@@ -2172,13 +2163,33 @@
ip6_tnl_add_linklocal(idev);
}
+static int ipv6_hwtype(struct net_device *dev)
+{
+ if ((dev->type == ARPHRD_ETHER) ||
+ (dev->type == ARPHRD_LOOPBACK) ||
+ (dev->type == ARPHRD_SIT) ||
+ (dev->type == ARPHRD_TUNNEL6) ||
+ (dev->type == ARPHRD_FDDI) ||
+ (dev->type == ARPHRD_IEEE802_TR) ||
+ (dev->type == ARPHRD_ARCNET) ||
+ (dev->type == ARPHRD_INFINIBAND))
+ return 1;
+
+ return 0;
+}
+
static int addrconf_notify(struct notifier_block *this, unsigned long event,
void * data)
{
struct net_device *dev = (struct net_device *) data;
- struct inet6_dev *idev = __in6_dev_get(dev);
+ struct inet6_dev *idev;
int run_pending = 0;
+ if (!ipv6_hwtype(dev))
+ return NOTIFY_OK;
+
+ idev = __in6_dev_get(dev);
+
switch(event) {
case NETDEV_REGISTER:
if (!idev) {
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [FIX][PATCH] ipv6 addrconf.c REMOVED #if patch
2007-05-21 18:20 ` Urs Thuermann
@ 2007-05-23 21:35 ` David Miller
0 siblings, 0 replies; 7+ messages in thread
From: David Miller @ 2007-05-23 21:35 UTC (permalink / raw)
To: urs; +Cc: yoshfuji, socketcan, netdev
From: Urs Thuermann <urs@isnogud.escape.de>
Date: 21 May 2007 20:20:51 +0200
> Oliver Hartkopp <socketcan@hartkopp.net> writes:
>
> > Yep - you were right. It looks better like this as ARPHRD_SIT is
> > defined in if_arp.h in any CONFIG_* case ...
>
> Oliver asked me to resend the patch with a sane mailer that doesn't
> mangle white-space and line breaks. So here it is.
>
> This patch makes the netdevice notifier for IPv6 ignore all events on
> non-IPv6 capable devices.
>
> Signed-off-by: Oliver Hartkopp <socketcan@hartkopp.net>
> Signed-off-by: Urs Thuermann <urs@isnogud.escape.de>
Patch applied, thank you.
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2007-05-23 21:35 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2007-05-17 16:53 [FIX][PATCH] ipv6 addrconf.c : wrong handling of non-ipv6 hardware since 2.6.21 Oliver Hartkopp
2007-05-17 17:09 ` Resend: " Oliver Hartkopp
2007-05-17 17:49 ` YOSHIFUJI Hideaki / 吉藤英明
2007-05-17 20:41 ` Oliver Hartkopp
2007-05-17 21:10 ` [FIX][PATCH] ipv6 addrconf.c REMOVED #if patch Oliver Hartkopp
2007-05-21 18:20 ` Urs Thuermann
2007-05-23 21:35 ` David Miller
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.