All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] ipv6: Add IFA_F_DADFAILED flag
@ 2009-09-05  1:38 Brian Haley
  2009-09-08 13:57 ` Jens Rosenboom
  2009-09-11 19:38 ` David Miller
  0 siblings, 2 replies; 9+ messages in thread
From: Brian Haley @ 2009-09-05  1:38 UTC (permalink / raw)
  To: david Miller; +Cc: netdev, YOSHIFUJI Hideaki

[Note: if this is accepted I'll send out a patch for iproute,
 if you'd prefer to not use the last ifa_flag I'll send a
 much larger patch that does this differently :) ]


Add IFA_F_DADFAILED flag to denote an IPv6 address that has
failed Duplicate Address Detection, that way tools like
/sbin/ip can be more informative.

3: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qlen 1000
    inet6 2001:db8::1/64 scope global tentative dadfailed 
       valid_lft forever preferred_lft forever

Signed-off-by: Brian Haley <brian.haley@hp.com>
---

diff --git a/include/linux/if_addr.h b/include/linux/if_addr.h
index a60c821..fd97404 100644
--- a/include/linux/if_addr.h
+++ b/include/linux/if_addr.h
@@ -41,6 +41,7 @@ enum
 
 #define	IFA_F_NODAD		0x02
 #define IFA_F_OPTIMISTIC	0x04
+#define IFA_F_DADFAILED		0x08
 #define	IFA_F_HOMEADDRESS	0x10
 #define IFA_F_DEPRECATED	0x20
 #define IFA_F_TENTATIVE		0x40
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
index 43b3c9f..6532966 100644
--- a/net/ipv6/addrconf.c
+++ b/net/ipv6/addrconf.c
@@ -1376,7 +1376,7 @@ static void addrconf_dad_stop(struct inet6_ifaddr *ifp)
 	if (ifp->flags&IFA_F_PERMANENT) {
 		spin_lock_bh(&ifp->lock);
 		addrconf_del_timer(ifp);
-		ifp->flags |= IFA_F_TENTATIVE;
+		ifp->flags |= IFA_F_DADFAILED;
 		spin_unlock_bh(&ifp->lock);
 		in6_ifa_put(ifp);
 #ifdef CONFIG_IPV6_PRIVACY

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

* Re: [PATCH] ipv6: Add IFA_F_DADFAILED flag
  2009-09-05  1:38 [PATCH] ipv6: Add IFA_F_DADFAILED flag Brian Haley
@ 2009-09-08 13:57 ` Jens Rosenboom
  2009-09-08 15:18   ` Brian Haley
  2009-09-11 19:38 ` David Miller
  1 sibling, 1 reply; 9+ messages in thread
From: Jens Rosenboom @ 2009-09-08 13:57 UTC (permalink / raw)
  To: Brian Haley; +Cc: david Miller, netdev, YOSHIFUJI Hideaki

On Fri, 2009-09-04 at 21:38 -0400, Brian Haley wrote:
> [Note: if this is accepted I'll send out a patch for iproute,
>  if you'd prefer to not use the last ifa_flag I'll send a
>  much larger patch that does this differently :) ]
> 
> 
> Add IFA_F_DADFAILED flag to denote an IPv6 address that has
> failed Duplicate Address Detection, that way tools like
> /sbin/ip can be more informative.
> 
> 3: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qlen 1000
>     inet6 2001:db8::1/64 scope global tentative dadfailed 
>        valid_lft forever preferred_lft forever
> 
> Signed-off-by: Brian Haley <brian.haley@hp.com>
> ---
> 
> diff --git a/include/linux/if_addr.h b/include/linux/if_addr.h
> index a60c821..fd97404 100644
> --- a/include/linux/if_addr.h
> +++ b/include/linux/if_addr.h
> @@ -41,6 +41,7 @@ enum
>  
>  #define	IFA_F_NODAD		0x02
>  #define IFA_F_OPTIMISTIC	0x04
> +#define IFA_F_DADFAILED		0x08
>  #define	IFA_F_HOMEADDRESS	0x10
>  #define IFA_F_DEPRECATED	0x20
>  #define IFA_F_TENTATIVE		0x40
> diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
> index 43b3c9f..6532966 100644
> --- a/net/ipv6/addrconf.c
> +++ b/net/ipv6/addrconf.c
> @@ -1376,7 +1376,7 @@ static void addrconf_dad_stop(struct inet6_ifaddr *ifp)
>  	if (ifp->flags&IFA_F_PERMANENT) {
>  		spin_lock_bh(&ifp->lock);
>  		addrconf_del_timer(ifp);
> -		ifp->flags |= IFA_F_TENTATIVE;
> +		ifp->flags |= IFA_F_DADFAILED;

I think you still have to set IFA_F_TENTATIVE here, too, otherwise
ipv6_dev_get_saddr() will use this address. 		


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

* Re: [PATCH] ipv6: Add IFA_F_DADFAILED flag
  2009-09-08 13:57 ` Jens Rosenboom
@ 2009-09-08 15:18   ` Brian Haley
  2009-09-08 15:43     ` Jens Rosenboom
  0 siblings, 1 reply; 9+ messages in thread
From: Brian Haley @ 2009-09-08 15:18 UTC (permalink / raw)
  To: Jens Rosenboom; +Cc: david Miller, netdev, YOSHIFUJI Hideaki

Jens Rosenboom wrote:
>> --- a/net/ipv6/addrconf.c
>> +++ b/net/ipv6/addrconf.c
>> @@ -1376,7 +1376,7 @@ static void addrconf_dad_stop(struct inet6_ifaddr *ifp)
>>  	if (ifp->flags&IFA_F_PERMANENT) {
>>  		spin_lock_bh(&ifp->lock);
>>  		addrconf_del_timer(ifp);
>> -		ifp->flags |= IFA_F_TENTATIVE;
>> +		ifp->flags |= IFA_F_DADFAILED;
> 
> I think you still have to set IFA_F_TENTATIVE here, too, otherwise
> ipv6_dev_get_saddr() will use this address. 		

The tentative bit is still set from when this address was added back
in ipv6_add_addr() from what I can tell, re-setting it here is actually
unnecessary.  At least /sbin/ip was still showing it set during my
testing.

-Brian


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

* Re: [PATCH] ipv6: Add IFA_F_DADFAILED flag
  2009-09-08 15:18   ` Brian Haley
@ 2009-09-08 15:43     ` Jens Rosenboom
  2009-09-10  0:41       ` Brian Haley
  0 siblings, 1 reply; 9+ messages in thread
From: Jens Rosenboom @ 2009-09-08 15:43 UTC (permalink / raw)
  To: Brian Haley; +Cc: david Miller, netdev, YOSHIFUJI Hideaki

On Tue, 2009-09-08 at 11:18 -0400, Brian Haley wrote:
> Jens Rosenboom wrote:
> >> --- a/net/ipv6/addrconf.c
> >> +++ b/net/ipv6/addrconf.c
> >> @@ -1376,7 +1376,7 @@ static void addrconf_dad_stop(struct inet6_ifaddr *ifp)
> >>  	if (ifp->flags&IFA_F_PERMANENT) {
> >>  		spin_lock_bh(&ifp->lock);
> >>  		addrconf_del_timer(ifp);
> >> -		ifp->flags |= IFA_F_TENTATIVE;
> >> +		ifp->flags |= IFA_F_DADFAILED;
> > 
> > I think you still have to set IFA_F_TENTATIVE here, too, otherwise
> > ipv6_dev_get_saddr() will use this address. 		
> 
> The tentative bit is still set from when this address was added back
> in ipv6_add_addr() from what I can tell, re-setting it here is actually
> unnecessary.  At least /sbin/ip was still showing it set during my
> testing.

There is the possibility of a race when the dad_timer expires at the
same time the NA triggering DAD failure is received. There isn't a big
chance to see that during real world testing, though.


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

* Re: [PATCH] ipv6: Add IFA_F_DADFAILED flag
  2009-09-08 15:43     ` Jens Rosenboom
@ 2009-09-10  0:41       ` Brian Haley
  2009-09-10 16:11         ` Jens Rosenboom
  0 siblings, 1 reply; 9+ messages in thread
From: Brian Haley @ 2009-09-10  0:41 UTC (permalink / raw)
  To: Jens Rosenboom; +Cc: david Miller, netdev, YOSHIFUJI Hideaki

Jens Rosenboom wrote:
> On Tue, 2009-09-08 at 11:18 -0400, Brian Haley wrote:
>> Jens Rosenboom wrote:
>>>> --- a/net/ipv6/addrconf.c
>>>> +++ b/net/ipv6/addrconf.c
>>>> @@ -1376,7 +1376,7 @@ static void addrconf_dad_stop(struct inet6_ifaddr *ifp)
>>>>  	if (ifp->flags&IFA_F_PERMANENT) {
>>>>  		spin_lock_bh(&ifp->lock);
>>>>  		addrconf_del_timer(ifp);
>>>> -		ifp->flags |= IFA_F_TENTATIVE;
>>>> +		ifp->flags |= IFA_F_DADFAILED;
>>> I think you still have to set IFA_F_TENTATIVE here, too, otherwise
>>> ipv6_dev_get_saddr() will use this address. 		
>> The tentative bit is still set from when this address was added back
>> in ipv6_add_addr() from what I can tell, re-setting it here is actually
>> unnecessary.  At least /sbin/ip was still showing it set during my
>> testing.
> 
> There is the possibility of a race when the dad_timer expires at the
> same time the NA triggering DAD failure is received. There isn't a big
> chance to see that during real world testing, though.

Ok, how does this look?  I changed it to set the tentative flag as it did
before, plus clear the dad_failed flag if the device got restarted,
triggering DAD to happen again for any tentative address, that was an
oversight on my part.

I'd still like to know if using this last ifa_flag is going to be an issue,
I actually finished a similar patch that uses a new IFA_ADDRFLAGS structure
to pass in/out this additional info.

-Brian


diff --git a/include/linux/if_addr.h b/include/linux/if_addr.h
index a60c821..fd97404 100644
--- a/include/linux/if_addr.h
+++ b/include/linux/if_addr.h
@@ -41,6 +41,7 @@ enum
 
 #define	IFA_F_NODAD		0x02
 #define IFA_F_OPTIMISTIC	0x04
+#define IFA_F_DADFAILED		0x08
 #define	IFA_F_HOMEADDRESS	0x10
 #define IFA_F_DEPRECATED	0x20
 #define IFA_F_TENTATIVE		0x40
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
index 43b3c9f..c9b3690 100644
--- a/net/ipv6/addrconf.c
+++ b/net/ipv6/addrconf.c
@@ -1371,12 +1371,14 @@ struct inet6_ifaddr *ipv6_get_ifaddr(struct net *net, const struct in6_addr *add
 
 /* Gets referenced address, destroys ifaddr */
 
-static void addrconf_dad_stop(struct inet6_ifaddr *ifp)
+static void addrconf_dad_stop(struct inet6_ifaddr *ifp, int dad_failed)
 {
 	if (ifp->flags&IFA_F_PERMANENT) {
 		spin_lock_bh(&ifp->lock);
 		addrconf_del_timer(ifp);
 		ifp->flags |= IFA_F_TENTATIVE;
+		if (dad_failed)
+			ifp->flags |= IFA_F_DADFAILED;
 		spin_unlock_bh(&ifp->lock);
 		in6_ifa_put(ifp);
 #ifdef CONFIG_IPV6_PRIVACY
@@ -1422,7 +1424,7 @@ void addrconf_dad_failure(struct inet6_ifaddr *ifp)
 		}
 	}
 
-	addrconf_dad_stop(ifp);
+	addrconf_dad_stop(ifp, 1);
 }
 
 /* Join to solicited addr multicast group. */
@@ -2778,7 +2780,7 @@ static void addrconf_dad_start(struct inet6_ifaddr *ifp, u32 flags)
 	    idev->cnf.accept_dad < 1 ||
 	    !(ifp->flags&IFA_F_TENTATIVE) ||
 	    ifp->flags & IFA_F_NODAD) {
-		ifp->flags &= ~(IFA_F_TENTATIVE|IFA_F_OPTIMISTIC);
+		ifp->flags &= ~(IFA_F_TENTATIVE|IFA_F_OPTIMISTIC|IFA_F_DADFAILED);
 		spin_unlock_bh(&ifp->lock);
 		read_unlock_bh(&idev->lock);
 
@@ -2795,7 +2797,7 @@ static void addrconf_dad_start(struct inet6_ifaddr *ifp, u32 flags)
 		 * - otherwise, kill it.
 		 */
 		in6_ifa_hold(ifp);
-		addrconf_dad_stop(ifp);
+		addrconf_dad_stop(ifp, 0);
 		return;
 	}
 
@@ -2829,7 +2831,7 @@ static void addrconf_dad_timer(unsigned long data)
 		 * DAD was successful
 		 */
 
-		ifp->flags &= ~(IFA_F_TENTATIVE|IFA_F_OPTIMISTIC);
+		ifp->flags &= ~(IFA_F_TENTATIVE|IFA_F_OPTIMISTIC|IFA_F_DADFAILED);
 		spin_unlock_bh(&ifp->lock);
 		read_unlock_bh(&idev->lock);
 

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

* Re: [PATCH] ipv6: Add IFA_F_DADFAILED flag
  2009-09-10  0:41       ` Brian Haley
@ 2009-09-10 16:11         ` Jens Rosenboom
  2009-09-10 19:14           ` Brian Haley
  0 siblings, 1 reply; 9+ messages in thread
From: Jens Rosenboom @ 2009-09-10 16:11 UTC (permalink / raw)
  To: Brian Haley; +Cc: david Miller, netdev, YOSHIFUJI Hideaki

On Wed, 2009-09-09 at 20:41 -0400, Brian Haley wrote:
> Jens Rosenboom wrote:
> > On Tue, 2009-09-08 at 11:18 -0400, Brian Haley wrote:
> >> Jens Rosenboom wrote:
> >>>> --- a/net/ipv6/addrconf.c
> >>>> +++ b/net/ipv6/addrconf.c
> >>>> @@ -1376,7 +1376,7 @@ static void addrconf_dad_stop(struct inet6_ifaddr *ifp)
> >>>>  	if (ifp->flags&IFA_F_PERMANENT) {
> >>>>  		spin_lock_bh(&ifp->lock);
> >>>>  		addrconf_del_timer(ifp);
> >>>> -		ifp->flags |= IFA_F_TENTATIVE;
> >>>> +		ifp->flags |= IFA_F_DADFAILED;
> >>> I think you still have to set IFA_F_TENTATIVE here, too, otherwise
> >>> ipv6_dev_get_saddr() will use this address. 		
> >> The tentative bit is still set from when this address was added back
> >> in ipv6_add_addr() from what I can tell, re-setting it here is actually
> >> unnecessary.  At least /sbin/ip was still showing it set during my
> >> testing.
> > 
> > There is the possibility of a race when the dad_timer expires at the
> > same time the NA triggering DAD failure is received. There isn't a big
> > chance to see that during real world testing, though.
> 
> Ok, how does this look?  I changed it to set the tentative flag as it did
> before, plus clear the dad_failed flag if the device got restarted,
> triggering DAD to happen again for any tentative address, that was an
> oversight on my part.

Looks fine to me so far, can you also send the patch for userspace? That
would making testing this a bit easier. ;-)

> I'd still like to know if using this last ifa_flag is going to be an issue,
> I actually finished a similar patch that uses a new IFA_ADDRFLAGS structure
> to pass in/out this additional info.

IMHO you should stick to this version, if any future feature needs
another bit, it may happen also to need two of them and so will need a
new structure then anyway, but why not keep it simple for now?


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

* Re: [PATCH] ipv6: Add IFA_F_DADFAILED flag
  2009-09-10 16:11         ` Jens Rosenboom
@ 2009-09-10 19:14           ` Brian Haley
  2009-12-02  0:01             ` Stephen Hemminger
  0 siblings, 1 reply; 9+ messages in thread
From: Brian Haley @ 2009-09-10 19:14 UTC (permalink / raw)
  To: Jens Rosenboom; +Cc: david Miller, netdev, YOSHIFUJI Hideaki

Hi Jens,

Jens Rosenboom wrote:
>> Ok, how does this look?  I changed it to set the tentative flag as it did
>> before, plus clear the dad_failed flag if the device got restarted,
>> triggering DAD to happen again for any tentative address, that was an
>> oversight on my part.
> 
> Looks fine to me so far, can you also send the patch for userspace? That
> would making testing this a bit easier. ;-)

Iproute2 patch below, I'll re-post both once you have a chance to test.

>> I'd still like to know if using this last ifa_flag is going to be an issue,
>> I actually finished a similar patch that uses a new IFA_ADDRFLAGS structure
>> to pass in/out this additional info.
> 
> IMHO you should stick to this version, if any future feature needs
> another bit, it may happen also to need two of them and so will need a
> new structure then anyway, but why not keep it simple for now?

I'll leave it for now, I might just post as an RFC to get some feedback on it.

Thanks,

-Brian


diff --git a/include/linux/if_addr.h b/include/linux/if_addr.h
index a60c821..fd97404 100644
--- a/include/linux/if_addr.h
+++ b/include/linux/if_addr.h
@@ -41,6 +41,7 @@ enum
 
 #define	IFA_F_NODAD		0x02
 #define IFA_F_OPTIMISTIC	0x04
+#define IFA_F_DADFAILED		0x08
 #define	IFA_F_HOMEADDRESS	0x10
 #define IFA_F_DEPRECATED	0x20
 #define IFA_F_TENTATIVE		0x40
diff --git a/ip/ipaddress.c b/ip/ipaddress.c
index 267ecb3..97c7a8b 100644
--- a/ip/ipaddress.c
+++ b/ip/ipaddress.c
@@ -508,6 +508,10 @@ int print_addrinfo(const struct sockaddr_nl *who, struct nlmsghdr *n,
 		fprintf(fp, "dynamic ");
 	} else
 		ifa->ifa_flags &= ~IFA_F_PERMANENT;
+	if (ifa->ifa_flags&IFA_F_DADFAILED) {
+		ifa->ifa_flags &= ~IFA_F_DADFAILED;
+		fprintf(fp, "dadfailed ");
+	}
 	if (ifa->ifa_flags)
 		fprintf(fp, "flags %02x ", ifa->ifa_flags);
 	if (rta_tb[IFA_LABEL])

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

* Re: [PATCH] ipv6: Add IFA_F_DADFAILED flag
  2009-09-05  1:38 [PATCH] ipv6: Add IFA_F_DADFAILED flag Brian Haley
  2009-09-08 13:57 ` Jens Rosenboom
@ 2009-09-11 19:38 ` David Miller
  1 sibling, 0 replies; 9+ messages in thread
From: David Miller @ 2009-09-11 19:38 UTC (permalink / raw)
  To: brian.haley; +Cc: netdev, yoshfuji

From: Brian Haley <brian.haley@hp.com>
Date: Fri, 04 Sep 2009 21:38:07 -0400

> [Note: if this is accepted I'll send out a patch for iproute,
>  if you'd prefer to not use the last ifa_flag I'll send a
>  much larger patch that does this differently :) ]
> 
> 
> Add IFA_F_DADFAILED flag to denote an IPv6 address that has
> failed Duplicate Address Detection, that way tools like
> /sbin/ip can be more informative.
> 
> 3: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qlen 1000
>     inet6 2001:db8::1/64 scope global tentative dadfailed 
>        valid_lft forever preferred_lft forever
> 
> Signed-off-by: Brian Haley <brian.haley@hp.com>

I applied the most recent iteration of this patch using
the above commit message, thanks Brian.

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

* Re: [PATCH] ipv6: Add IFA_F_DADFAILED flag
  2009-09-10 19:14           ` Brian Haley
@ 2009-12-02  0:01             ` Stephen Hemminger
  0 siblings, 0 replies; 9+ messages in thread
From: Stephen Hemminger @ 2009-12-02  0:01 UTC (permalink / raw)
  To: Brian Haley; +Cc: Jens Rosenboom, david Miller, netdev, YOSHIFUJI Hideaki

On Thu, 10 Sep 2009 15:14:22 -0400
Brian Haley <brian.haley@hp.com> wrote:

> Hi Jens,
> 
> Jens Rosenboom wrote:
> >> Ok, how does this look?  I changed it to set the tentative flag as it did
> >> before, plus clear the dad_failed flag if the device got restarted,
> >> triggering DAD to happen again for any tentative address, that was an
> >> oversight on my part.
> > 
> > Looks fine to me so far, can you also send the patch for userspace? That
> > would making testing this a bit easier. ;-)
> 
> Iproute2 patch below, I'll re-post both once you have a chance to test.
> 
> >> I'd still like to know if using this last ifa_flag is going to be an issue,
> >> I actually finished a similar patch that uses a new IFA_ADDRFLAGS structure
> >> to pass in/out this additional info.
> > 
> > IMHO you should stick to this version, if any future feature needs
> > another bit, it may happen also to need two of them and so will need a
> > new structure then anyway, but why not keep it simple for now?
> 
> I'll leave it for now, I might just post as an RFC to get some feedback on it.
> 
> Thanks,
> 
> -Brian
> 
> 
> diff --git a/include/linux/if_addr.h b/include/linux/if_addr.h
> index a60c821..fd97404 100644
> --- a/include/linux/if_addr.h
> +++ b/include/linux/if_addr.h
> @@ -41,6 +41,7 @@ enum
>  
>  #define	IFA_F_NODAD		0x02
>  #define IFA_F_OPTIMISTIC	0x04
> +#define IFA_F_DADFAILED		0x08
>  #define	IFA_F_HOMEADDRESS	0x10
>  #define IFA_F_DEPRECATED	0x20
>  #define IFA_F_TENTATIVE		0x40
> diff --git a/ip/ipaddress.c b/ip/ipaddress.c
> index 267ecb3..97c7a8b 100644
> --- a/ip/ipaddress.c
> +++ b/ip/ipaddress.c
> @@ -508,6 +508,10 @@ int print_addrinfo(const struct sockaddr_nl *who, struct nlmsghdr *n,
>  		fprintf(fp, "dynamic ");
>  	} else
>  		ifa->ifa_flags &= ~IFA_F_PERMANENT;
> +	if (ifa->ifa_flags&IFA_F_DADFAILED) {
> +		ifa->ifa_flags &= ~IFA_F_DADFAILED;
> +		fprintf(fp, "dadfailed ");
> +	}
>  	if (ifa->ifa_flags)
>  		fprintf(fp, "flags %02x ", ifa->ifa_flags);
>  	if (rta_tb[IFA_LABEL])

Applied to iproute (for 2.6.32) with original message changelog

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

end of thread, other threads:[~2009-12-02  0:01 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-09-05  1:38 [PATCH] ipv6: Add IFA_F_DADFAILED flag Brian Haley
2009-09-08 13:57 ` Jens Rosenboom
2009-09-08 15:18   ` Brian Haley
2009-09-08 15:43     ` Jens Rosenboom
2009-09-10  0:41       ` Brian Haley
2009-09-10 16:11         ` Jens Rosenboom
2009-09-10 19:14           ` Brian Haley
2009-12-02  0:01             ` Stephen Hemminger
2009-09-11 19:38 ` 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.