From: Brian Haley <brian.haley@hp.com>
To: Ben Greear <greearb@candelatech.com>
Cc: netdev@vger.kernel.org
Subject: Re: [iproute2] iproute2: Fix 'addr flush secondary' logic.
Date: Thu, 12 Aug 2010 15:00:58 -0400 [thread overview]
Message-ID: <4C6444EA.1070704@hp.com> (raw)
In-Reply-To: <4C6328A8.4070703@candelatech.com>
On 08/11/2010 06:48 PM, Ben Greear wrote:
> Looks like the code was broken in several different places.
>
> * It ran only a single filter if there were multiple.
> * Don't want to flush in a loop if you are doing primary
> because otherwise promoted seconaries will get deleted
> for each additional loop (10 in upstream code).
> * No idea what a while (0); statement at the end of a for
> loop does, but I don't think it needed to be there!
>
> The attached patch makes it work for me, supporting
> flushing primary or secondary addresses.
> diff --git a/ip/ipaddress.c b/ip/ipaddress.c
> index 5f0789c..803df17 100644
> --- a/ip/ipaddress.c
> +++ b/ip/ipaddress.c
> @@ -637,7 +637,7 @@ int print_addrinfo_primary(const struct sockaddr_nl *who, struct nlmsghdr *n,
> {
> struct ifaddrmsg *ifa = NLMSG_DATA(n);
>
> - if (!ifa->ifa_flags & IFA_F_SECONDARY)
> + if (ifa->ifa_flags & IFA_F_SECONDARY)
return 0;
This should be:
if (!(ifa->ifa_flags & IFA_F_SECONDARY))
as this function does the opposite of what it seems.
> @@ -648,7 +648,7 @@ int print_addrinfo_secondary(const struct sockaddr_nl *who, struct nlmsghdr *n,
> {
> struct ifaddrmsg *ifa = NLMSG_DATA(n);
>
> - if (ifa->ifa_flags & IFA_F_SECONDARY)
> + if (!(ifa->ifa_flags & IFA_F_SECONDARY))
return 0;
>From testing, the original code here was correct.
> @@ -865,6 +865,13 @@ static int ipaddr_list_or_flush(int argc, char **argv, int flush)
> printf("\n*** Round %d, deleting %d addresses ***\n", round, filter.flushed);
> fflush(stdout);
> }
> +
> + /* If we are flushing, and specifying primary, then we want to flush only a single round.
> + * Otherwise, we'll start flushing secondaries that were promoted to primaries
> + */
> + if (!(filter.flags & IFA_F_SECONDARY) && (filter.flagmask & IFA_F_SECONDARY)) {
> + return 0;
> + }
This doesn't seem to do anything, I see all my IPv4 addresses flushed if I
run 'ip -4 -s a flush primary dev eth2'. And it says it only deleted one
when it deleted two addresses :-/ Also, if it did work, it should really goto
a few lines above so it prints the summary stats:
if (filter.flushed == 0) {
flush_done:
if (show_stats) {
Even when I corrected the lines above, it didn't work:
# ip -4 a s dev eth2
2: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
inet 192.168.6.4/24 brd 192.168.6.255 scope global eth2
# ip a a 192.168.6.100/24 brd + dev eth2
# ip -4 a s dev eth2
2: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
inet 192.168.6.4/24 brd 192.168.6.255 scope global eth2
inet 192.168.6.100/24 brd 192.168.6.255 scope global secondary eth2
# ./ip -4 -s -s -o a flush primary dev eth2
2: eth2 inet 192.168.6.4/24 brd 192.168.6.255 scope global eth2
*** Round 1, deleting 1 addresses ***
[missing *** Flush is complete after 1 round ***]
# ip -4 a s dev eth2
[nothing]
Where did my .100 secondary address go? Now this will bug me until I figure
out why. Maybe it's because I'm booted to 2.6.32.
> diff --git a/lib/libnetlink.c b/lib/libnetlink.c
> index cfeb894..d18e8a0 100644
Can you give an example of how you tested this double filter change? My
distro /sbin/ip seemed to work just fine.
> - if (status) {
> + if (msglen) {
> fprintf(stderr, "!!!Remnant of size %d\n", status);
> exit(1);
> }
Should the arg to the fprintf() be msglen too?
-Brian
next prev parent reply other threads:[~2010-08-12 19:01 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-08-11 17:19 [iproute2] iproute2: Fix 'addr flush secondary' logic Ben Greear
2010-08-11 20:41 ` Brian Haley
2010-08-11 20:53 ` Ben Greear
2010-08-11 22:48 ` Ben Greear
2010-08-12 19:00 ` Brian Haley [this message]
2010-08-12 19:10 ` Ben Greear
2010-08-13 19:49 ` Ben Greear
2010-08-16 15:58 ` Brian Haley
2010-08-16 17:01 ` Ben Greear
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4C6444EA.1070704@hp.com \
--to=brian.haley@hp.com \
--cc=greearb@candelatech.com \
--cc=netdev@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).