[iproute2] Revert "iproute: "list/flush/save default" selected all of the routes"

Message ID 20180312210301.12757-1-stephen@networkplumber.org
State Superseded
Delegated to: stephen hemminger
Headers show
Series
  • [iproute2] Revert "iproute: "list/flush/save default" selected all of the routes"
Related show

Commit Message

Stephen Hemminger March 12, 2018, 9:03 p.m.
This reverts commit 9135c4d6037ff9f1818507bac0049fc44db8c3d2.

Debian maintainer found that basic command:
	# ip route flush all
No longer worked as expected which breaks user scripts and
expectations. It no longer flushed all IPv4 routes.

Reported-by: Luca Boccassi <bluca@debian.org>
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
 ip/iproute.c | 65 ++++++++++++++++++------------------------------------------
 lib/utils.c  | 13 ++++++++++++
 2 files changed, 32 insertions(+), 46 deletions(-)

Comments

Luca Boccassi March 12, 2018, 9:37 p.m. | #1
On Mon, 2018-03-12 at 14:03 -0700, Stephen Hemminger wrote:
> This reverts commit 9135c4d6037ff9f1818507bac0049fc44db8c3d2.
> 
> Debian maintainer found that basic command:
> 	# ip route flush all
> No longer worked as expected which breaks user scripts and
> expectations. It no longer flushed all IPv4 routes.
> 
> Reported-by: Luca Boccassi <bluca@debian.org>
> Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
> ---
>  ip/iproute.c | 65 ++++++++++++++++++------------------------------
> ------------
>  lib/utils.c  | 13 ++++++++++++
>  2 files changed, 32 insertions(+), 46 deletions(-)

Tested-by: Luca Boccassi <bluca@debian.org>

Thanks, solves the problem. I'll backport it to Debian.

Alexander, reproducing the issue is quite simple - before that commit,
ip route ls all showed all routes, but with the change it started
showing only the default table. Same for ip route flush.
Alexander Zubkov March 13, 2018, 8:46 a.m. | #2
Hello.

May be the better way would be to change how "all"/"any" argument behaves? My original concern was about "default" only. I agree too, that "all" or "any" should work for all routes. But not for the default.

12.03.2018, 22:37, "Luca Boccassi" <bluca@debian.org>:
> On Mon, 2018-03-12 at 14:03 -0700, Stephen Hemminger wrote:
>>  This reverts commit 9135c4d6037ff9f1818507bac0049fc44db8c3d2.
>>
>>  Debian maintainer found that basic command:
>>          # ip route flush all
>>  No longer worked as expected which breaks user scripts and
>>  expectations. It no longer flushed all IPv4 routes.
>>
>>  Reported-by: Luca Boccassi <bluca@debian.org>
>>  Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
>>  ---
>>   ip/iproute.c | 65 ++++++++++++++++++------------------------------
>>  ------------
>>   lib/utils.c  | 13 ++++++++++++
>>   2 files changed, 32 insertions(+), 46 deletions(-)
>
> Tested-by: Luca Boccassi <bluca@debian.org>
>
> Thanks, solves the problem. I'll backport it to Debian.
>
> Alexander, reproducing the issue is quite simple - before that commit,
> ip route ls all showed all routes, but with the change it started
> showing only the default table. Same for ip route flush.
>
> --
> Kind regards,
> Luca Boccassi
Alexander Zubkov March 13, 2018, 11:05 a.m. | #3
Hello again,

The fun thing is that before the commit "ip route ls all" showed all routes, but "ip -[4|6] route ls all" showed only default. So it was broken too, but in other way.
I see parsing of prefix was changed since my patch. So I need several days to propose fix. I think if "ip route ls [all|any]" shows all routes and "ip route ls default" shows only default, everybody will be happy with that?

13.03.2018, 09:46, "Alexander Zubkov" <green@msu.ru>:
> Hello.
>
> May be the better way would be to change how "all"/"any" argument behaves? My original concern was about "default" only. I agree too, that "all" or "any" should work for all routes. But not for the default.
>
> 12.03.2018, 22:37, "Luca Boccassi" <bluca@debian.org>:
>>  On Mon, 2018-03-12 at 14:03 -0700, Stephen Hemminger wrote:
>>>   This reverts commit 9135c4d6037ff9f1818507bac0049fc44db8c3d2.
>>>
>>>   Debian maintainer found that basic command:
>>>           # ip route flush all
>>>   No longer worked as expected which breaks user scripts and
>>>   expectations. It no longer flushed all IPv4 routes.
>>>
>>>   Reported-by: Luca Boccassi <bluca@debian.org>
>>>   Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
>>>   ---
>>>    ip/iproute.c | 65 ++++++++++++++++++------------------------------
>>>   ------------
>>>    lib/utils.c  | 13 ++++++++++++
>>>    2 files changed, 32 insertions(+), 46 deletions(-)
>>
>>  Tested-by: Luca Boccassi <bluca@debian.org>
>>
>>  Thanks, solves the problem. I'll backport it to Debian.
>>
>>  Alexander, reproducing the issue is quite simple - before that commit,
>>  ip route ls all showed all routes, but with the change it started
>>  showing only the default table. Same for ip route flush.
>>
>>  --
>>  Kind regards,
>>  Luca Boccassi
Luca Boccassi March 13, 2018, 12:02 p.m. | #4
On Tue, 2018-03-13 at 12:05 +0100, Alexander Zubkov wrote:
> Hello again,
> 
> The fun thing is that before the commit "ip route ls all" showed all
> routes, but "ip -[4|6] route ls all" showed only default. So it was
> broken too, but in other way.
> I see parsing of prefix was changed since my patch. So I need several
> days to propose fix. I think if "ip route ls [all|any]" shows all
> routes and "ip route ls default" shows only default, everybody will
> be happy with that?

Hi,

My only concern is that behaviour of existing commands that have been
in releases is not changed, otherwise I get bugs raised :-)

Thank you for your work!

> 13.03.2018, 09:46, "Alexander Zubkov" <green@msu.ru>:
> > Hello.
> > 
> > May be the better way would be to change how "all"/"any" argument
> > behaves? My original concern was about "default" only. I agree too,
> > that "all" or "any" should work for all routes. But not for the
> > default.
> > 
> > 12.03.2018, 22:37, "Luca Boccassi" <bluca@debian.org>:
> > >  On Mon, 2018-03-12 at 14:03 -0700, Stephen Hemminger wrote:
> > > >   This reverts commit 9135c4d6037ff9f1818507bac0049fc44db8c3d2.
> > > > 
> > > >   Debian maintainer found that basic command:
> > > >           # ip route flush all
> > > >   No longer worked as expected which breaks user scripts and
> > > >   expectations. It no longer flushed all IPv4 routes.
> > > > 
> > > >   Reported-by: Luca Boccassi <bluca@debian.org>
> > > >   Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
> > > >   ---
> > > >    ip/iproute.c | 65 ++++++++++++++++++----------------------
> > > > --------
> > > >   ------------
> > > >    lib/utils.c  | 13 ++++++++++++
> > > >    2 files changed, 32 insertions(+), 46 deletions(-)
> > > 
> > >  Tested-by: Luca Boccassi <bluca@debian.org>
> > > 
> > >  Thanks, solves the problem. I'll backport it to Debian.
> > > 
> > >  Alexander, reproducing the issue is quite simple - before that
> > > commit,
> > >  ip route ls all showed all routes, but with the change it
> > > started
> > >  showing only the default table. Same for ip route flush.
> > > 
> > >  --
> > >  Kind regards,
> > >  Luca Boccassi
Alexander Zubkov March 13, 2018, 8:12 p.m. | #5
Hi,

I just realized that you need patch for v4.15.0, which is easier to do.
I'll send it as separate message now. I will make patch for the master 
branch, but later.

On 13.03.2018 13:02, Luca Boccassi wrote:
> On Tue, 2018-03-13 at 12:05 +0100, Alexander Zubkov wrote:
>> Hello again,
>>
>> The fun thing is that before the commit "ip route ls all" showed all
>> routes, but "ip -[4|6] route ls all" showed only default. So it was
>> broken too, but in other way.
>> I see parsing of prefix was changed since my patch. So I need several
>> days to propose fix. I think if "ip route ls [all|any]" shows all
>> routes and "ip route ls default" shows only default, everybody will
>> be happy with that?
> 
> Hi,
> 
> My only concern is that behaviour of existing commands that have been
> in releases is not changed, otherwise I get bugs raised :-)
> 
> Thank you for your work!
> 
>> 13.03.2018, 09:46, "Alexander Zubkov" <green@msu.ru>:
>>> Hello.
>>>
>>> May be the better way would be to change how "all"/"any" argument
>>> behaves? My original concern was about "default" only. I agree too,
>>> that "all" or "any" should work for all routes. But not for the
>>> default.
>>>
>>> 12.03.2018, 22:37, "Luca Boccassi" <bluca@debian.org>:
>>>>   On Mon, 2018-03-12 at 14:03 -0700, Stephen Hemminger wrote:
>>>>>    This reverts commit 9135c4d6037ff9f1818507bac0049fc44db8c3d2.
>>>>>
>>>>>    Debian maintainer found that basic command:
>>>>>            # ip route flush all
>>>>>    No longer worked as expected which breaks user scripts and
>>>>>    expectations. It no longer flushed all IPv4 routes.
>>>>>
>>>>>    Reported-by: Luca Boccassi <bluca@debian.org>
>>>>>    Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
>>>>>    ---
>>>>>     ip/iproute.c | 65 ++++++++++++++++++----------------------
>>>>> --------
>>>>>    ------------
>>>>>     lib/utils.c  | 13 ++++++++++++
>>>>>     2 files changed, 32 insertions(+), 46 deletions(-)
>>>>
>>>>   Tested-by: Luca Boccassi <bluca@debian.org>
>>>>
>>>>   Thanks, solves the problem. I'll backport it to Debian.
>>>>
>>>>   Alexander, reproducing the issue is quite simple - before that
>>>> commit,
>>>>   ip route ls all showed all routes, but with the change it
>>>> started
>>>>   showing only the default table. Same for ip route flush.
>>>>
>>>>   --
>>>>   Kind regards,
>>>>   Luca Boccassi
>
Luca Boccassi March 13, 2018, 8:15 p.m. | #6
On Tue, 2018-03-13 at 21:12 +0100, Alexander Zubkov wrote:
> Hi,
> 
> I just realized that you need patch for v4.15.0, which is easier to
> do.
> I'll send it as separate message now. I will make patch for the
> master 
> branch, but later.

Thanks but don't worry about 4.15 - Stephen's revert will be enough for
now. I'm going to push 4.16 as soon as it's out anyway, so you can just
do the changes for master if you wish.

> On 13.03.2018 13:02, Luca Boccassi wrote:
> > On Tue, 2018-03-13 at 12:05 +0100, Alexander Zubkov wrote:
> > > Hello again,
> > > 
> > > The fun thing is that before the commit "ip route ls all" showed
> > > all
> > > routes, but "ip -[4|6] route ls all" showed only default. So it
> > > was
> > > broken too, but in other way.
> > > I see parsing of prefix was changed since my patch. So I need
> > > several
> > > days to propose fix. I think if "ip route ls [all|any]" shows all
> > > routes and "ip route ls default" shows only default, everybody
> > > will
> > > be happy with that?
> > 
> > Hi,
> > 
> > My only concern is that behaviour of existing commands that have
> > been
> > in releases is not changed, otherwise I get bugs raised :-)
> > 
> > Thank you for your work!
> > 
> > > 13.03.2018, 09:46, "Alexander Zubkov" <green@msu.ru>:
> > > > Hello.
> > > > 
> > > > May be the better way would be to change how "all"/"any"
> > > > argument
> > > > behaves? My original concern was about "default" only. I agree
> > > > too,
> > > > that "all" or "any" should work for all routes. But not for the
> > > > default.
> > > > 
> > > > 12.03.2018, 22:37, "Luca Boccassi" <bluca@debian.org>:
> > > > >   On Mon, 2018-03-12 at 14:03 -0700, Stephen Hemminger wrote:
> > > > > >    This reverts commit
> > > > > > 9135c4d6037ff9f1818507bac0049fc44db8c3d2.
> > > > > > 
> > > > > >    Debian maintainer found that basic command:
> > > > > >            # ip route flush all
> > > > > >    No longer worked as expected which breaks user scripts
> > > > > > and
> > > > > >    expectations. It no longer flushed all IPv4 routes.
> > > > > > 
> > > > > >    Reported-by: Luca Boccassi <bluca@debian.org>
> > > > > >    Signed-off-by: Stephen Hemminger <stephen@networkplumber
> > > > > > .org>
> > > > > >    ---
> > > > > >     ip/iproute.c | 65 ++++++++++++++++++-------------------
> > > > > > ---
> > > > > > --------
> > > > > >    ------------
> > > > > >     lib/utils.c  | 13 ++++++++++++
> > > > > >     2 files changed, 32 insertions(+), 46 deletions(-)
> > > > > 
> > > > >   Tested-by: Luca Boccassi <bluca@debian.org>
> > > > > 
> > > > >   Thanks, solves the problem. I'll backport it to Debian.
> > > > > 
> > > > >   Alexander, reproducing the issue is quite simple - before
> > > > > that
> > > > > commit,
> > > > >   ip route ls all showed all routes, but with the change it
> > > > > started
> > > > >   showing only the default table. Same for ip route flush.
> > > > > 
> > > > >   --
> > > > >   Kind regards,
> > > > >   Luca Boccassi
> 
>
Alexander Zubkov March 14, 2018, 8:59 a.m. | #7
Hello,

There was a series of patches by Serhey and specifically this one:
https://git.kernel.org/pub/scm/network/iproute2/iproute2.git/commit/?id=93fa12418dc6f5943692250244be303bb162175b

It drops handling of special prefix names in get_prefix_1(), and in get_addr_1() they always receive family and bytelen. But as I unerstand for any case it was important to keep it with unspecified family for further filtering. As I do not know what is the global idea, I want to discuss it. Because there are options depending on how and where we want to handle those special names. Like keep unspecified family or change filtering logic.

I have added Serhey Popovych in the recepients, so he can give some ideas on what his aim is and help choose better solution.

13.03.2018, 21:12, "Alexander Zubkov" <green@msu.ru>:
> Hi,
>
> I just realized that you need patch for v4.15.0, which is easier to do.
> I'll send it as separate message now. I will make patch for the master
> branch, but later.
>
> On 13.03.2018 13:02, Luca Boccassi wrote:
>>  On Tue, 2018-03-13 at 12:05 +0100, Alexander Zubkov wrote:
>>>  Hello again,
>>>
>>>  The fun thing is that before the commit "ip route ls all" showed all
>>>  routes, but "ip -[4|6] route ls all" showed only default. So it was
>>>  broken too, but in other way.
>>>  I see parsing of prefix was changed since my patch. So I need several
>>>  days to propose fix. I think if "ip route ls [all|any]" shows all
>>>  routes and "ip route ls default" shows only default, everybody will
>>>  be happy with that?
>>
>>  Hi,
>>
>>  My only concern is that behaviour of existing commands that have been
>>  in releases is not changed, otherwise I get bugs raised :-)
>>
>>  Thank you for your work!
>>
>>>  13.03.2018, 09:46, "Alexander Zubkov" <green@msu.ru>:
>>>>  Hello.
>>>>
>>>>  May be the better way would be to change how "all"/"any" argument
>>>>  behaves? My original concern was about "default" only. I agree too,
>>>>  that "all" or "any" should work for all routes. But not for the
>>>>  default.
>>>>
>>>>  12.03.2018, 22:37, "Luca Boccassi" <bluca@debian.org>:
>>>>>    On Mon, 2018-03-12 at 14:03 -0700, Stephen Hemminger wrote:
>>>>>>     This reverts commit 9135c4d6037ff9f1818507bac0049fc44db8c3d2.
>>>>>>
>>>>>>     Debian maintainer found that basic command:
>>>>>>             # ip route flush all
>>>>>>     No longer worked as expected which breaks user scripts and
>>>>>>     expectations. It no longer flushed all IPv4 routes.
>>>>>>
>>>>>>     Reported-by: Luca Boccassi <bluca@debian.org>
>>>>>>     Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
>>>>>>     ---
>>>>>>      ip/iproute.c | 65 ++++++++++++++++++----------------------
>>>>>>  --------
>>>>>>     ------------
>>>>>>      lib/utils.c  | 13 ++++++++++++
>>>>>>      2 files changed, 32 insertions(+), 46 deletions(-)
>>>>>
>>>>>    Tested-by: Luca Boccassi <bluca@debian.org>
>>>>>
>>>>>    Thanks, solves the problem. I'll backport it to Debian.
>>>>>
>>>>>    Alexander, reproducing the issue is quite simple - before that
>>>>>  commit,
>>>>>    ip route ls all showed all routes, but with the change it
>>>>>  started
>>>>>    showing only the default table. Same for ip route flush.
>>>>>
>>>>>    --
>>>>>    Kind regards,
>>>>>    Luca Boccassi
Alexander Zubkov March 14, 2018, 8:26 p.m. | #8
Hello,

For example, it can be fixed in such way (patch is below):
- split handling of default and all/any
- set needed attributes in get_addr: PREFIXLEN_SPECIFIED flag for default
- and AF_UNSPEC for all/any
In this case "ip route show default" shows only default route and "ip 
route show all" shows all routes. And both also work when family (-4 or 
-6) is specified.
Serhey, does it goes in line with what you wanted to achieve? Because I 
do not know - may be there are reasons why all/any should be provided 
with specific family. If you think this solution is suitable, I'll do 
some additional tests and package the patch in a proper way for this 
mailing list.
And I'm unsure if check for AF_DECnet and AF_MPLS should be kept in both 
branches. May be someone have some additional thoughts on that?

--- a/lib/utils.c
+++ b/lib/utils.c
@@ -560,14 +560,23 @@ static int __get_addr_1(inet_prefix *addr, const 
char *name, int family)
  {
  	memset(addr, 0, sizeof(*addr));

-	if (strcmp(name, "default") == 0 ||
-	    strcmp(name, "all") == 0 ||
-	    strcmp(name, "any") == 0) {
+	if (strcmp(name, "default") == 0) {
  		if ((family == AF_DECnet) || (family == AF_MPLS))
  			return -1;
  		addr->family = (family != AF_UNSPEC) ? family : AF_INET;
  		addr->bytelen = af_byte_len(addr->family);
  		addr->bitlen = -2;
+		addr->flags |= PREFIXLEN_SPECIFIED;
+		return 0;
+	}
+
+	if (strcmp(name, "all") == 0 ||
+	    strcmp(name, "any") == 0) {
+		if ((family == AF_DECnet) || (family == AF_MPLS))
+			return -1;
+		addr->family = AF_UNSPEC;
+		addr->bytelen = 0;
+		addr->bitlen = -2;
  		return 0;
  	}

@@ -695,7 +704,7 @@ int get_prefix_1(inet_prefix *dst, char *arg, int 
family)

  	bitlen = af_bit_len(dst->family);

-	flags = PREFIXLEN_SPECIFIED;
+	flags = 0;
  	if (slash) {
  		unsigned int plen;

@@ -706,12 +715,11 @@ int get_prefix_1(inet_prefix *dst, char *arg, int 
family)
  		if (plen > bitlen)
  			return -1;

+		flags |= PREFIXLEN_SPECIFIED;
  		bitlen = plen;
  	} else {
  		if (dst->bitlen == -2)
  			bitlen = 0;
-		else
-			flags = 0;
  	}

  	dst->flags |= flags;


On 14.03.2018 09:59, Alexander Zubkov wrote:
> Hello,
> 
> There was a series of patches by Serhey and specifically this one:
> https://git.kernel.org/pub/scm/network/iproute2/iproute2.git/commit/?id=93fa12418dc6f5943692250244be303bb162175b
> 
> It drops handling of special prefix names in get_prefix_1(), and in get_addr_1() they always receive family and bytelen. But as I unerstand for any case it was important to keep it with unspecified family for further filtering. As I do not know what is the global idea, I want to discuss it. Because there are options depending on how and where we want to handle those special names. Like keep unspecified family or change filtering logic.
> 
> I have added Serhey Popovych in the recepients, so he can give some ideas on what his aim is and help choose better solution.
> 
> 13.03.2018, 21:12, "Alexander Zubkov" <green@msu.ru>:
>> Hi,
>>
>> I just realized that you need patch for v4.15.0, which is easier to do.
>> I'll send it as separate message now. I will make patch for the master
>> branch, but later.
>>
>> On 13.03.2018 13:02, Luca Boccassi wrote:
>>>   On Tue, 2018-03-13 at 12:05 +0100, Alexander Zubkov wrote:
>>>>   Hello again,
>>>>
>>>>   The fun thing is that before the commit "ip route ls all" showed all
>>>>   routes, but "ip -[4|6] route ls all" showed only default. So it was
>>>>   broken too, but in other way.
>>>>   I see parsing of prefix was changed since my patch. So I need several
>>>>   days to propose fix. I think if "ip route ls [all|any]" shows all
>>>>   routes and "ip route ls default" shows only default, everybody will
>>>>   be happy with that?
>>>
>>>   Hi,
>>>
>>>   My only concern is that behaviour of existing commands that have been
>>>   in releases is not changed, otherwise I get bugs raised :-)
>>>
>>>   Thank you for your work!
>>>
>>>>   13.03.2018, 09:46, "Alexander Zubkov" <green@msu.ru>:
>>>>>   Hello.
>>>>>
>>>>>   May be the better way would be to change how "all"/"any" argument
>>>>>   behaves? My original concern was about "default" only. I agree too,
>>>>>   that "all" or "any" should work for all routes. But not for the
>>>>>   default.
>>>>>
>>>>>   12.03.2018, 22:37, "Luca Boccassi" <bluca@debian.org>:
>>>>>>     On Mon, 2018-03-12 at 14:03 -0700, Stephen Hemminger wrote:
>>>>>>>      This reverts commit 9135c4d6037ff9f1818507bac0049fc44db8c3d2.
>>>>>>>
>>>>>>>      Debian maintainer found that basic command:
>>>>>>>              # ip route flush all
>>>>>>>      No longer worked as expected which breaks user scripts and
>>>>>>>      expectations. It no longer flushed all IPv4 routes.
>>>>>>>
>>>>>>>      Reported-by: Luca Boccassi <bluca@debian.org>
>>>>>>>      Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
>>>>>>>      ---
>>>>>>>       ip/iproute.c | 65 ++++++++++++++++++----------------------
>>>>>>>   --------
>>>>>>>      ------------
>>>>>>>       lib/utils.c  | 13 ++++++++++++
>>>>>>>       2 files changed, 32 insertions(+), 46 deletions(-)
>>>>>>
>>>>>>     Tested-by: Luca Boccassi <bluca@debian.org>
>>>>>>
>>>>>>     Thanks, solves the problem. I'll backport it to Debian.
>>>>>>
>>>>>>     Alexander, reproducing the issue is quite simple - before that
>>>>>>   commit,
>>>>>>     ip route ls all showed all routes, but with the change it
>>>>>>   started
>>>>>>     showing only the default table. Same for ip route flush.
>>>>>>
>>>>>>     --
>>>>>>     Kind regards,
>>>>>>     Luca Boccassi
Stephen Hemminger March 27, 2018, 4:01 p.m. | #9
On Wed, 14 Mar 2018 21:26:40 +0100
Alexander Zubkov <green@msu.ru> wrote:

> Hello,
> 
> For example, it can be fixed in such way (patch is below):
> - split handling of default and all/any
> - set needed attributes in get_addr: PREFIXLEN_SPECIFIED flag for default
> - and AF_UNSPEC for all/any
> In this case "ip route show default" shows only default route and "ip 
> route show all" shows all routes. And both also work when family (-4 or 
> -6) is specified.
> Serhey, does it goes in line with what you wanted to achieve? Because I 
> do not know - may be there are reasons why all/any should be provided 
> with specific family. If you think this solution is suitable, I'll do 
> some additional tests and package the patch in a proper way for this 
> mailing list.
> And I'm unsure if check for AF_DECnet and AF_MPLS should be kept in both 
> branches. May be someone have some additional thoughts on that?
> 

I applied this to master.

We can work on the other cases after that.
Alexander Zubkov March 27, 2018, 4:29 p.m. | #10
Hi Stephen,

Looks like the new patch was applied after the revert of original patch and fix patch for 4.15 branch. Which is not correct and I did not test it. This is how patches were designed:
1) your revert patch - rolls back 4.15 branch to old behaviour by reverting the original patch
2) my patch for 4.15 - fixes problem is 4.15 branch, it does not require revert patch, it is an alternative solution for the problem, it is designed solely for version 4.15
3) my patch for master - fixes problem, it requires neither revert patch nor my patch for 4.15, it is standalone patch designed to do things right in master branch

27.03.2018, 18:01, "Stephen Hemminger" <stephen@networkplumber.org>:
> On Wed, 14 Mar 2018 21:26:40 +0100
> Alexander Zubkov <green@msu.ru> wrote:
>
>>  Hello,
>>
>>  For example, it can be fixed in such way (patch is below):
>>  - split handling of default and all/any
>>  - set needed attributes in get_addr: PREFIXLEN_SPECIFIED flag for default
>>  - and AF_UNSPEC for all/any
>>  In this case "ip route show default" shows only default route and "ip
>>  route show all" shows all routes. And both also work when family (-4 or
>>  -6) is specified.
>>  Serhey, does it goes in line with what you wanted to achieve? Because I
>>  do not know - may be there are reasons why all/any should be provided
>>  with specific family. If you think this solution is suitable, I'll do
>>  some additional tests and package the patch in a proper way for this
>>  mailing list.
>>  And I'm unsure if check for AF_DECnet and AF_MPLS should be kept in both
>>  branches. May be someone have some additional thoughts on that?
>
> I applied this to master.
>
> We can work on the other cases after that.
Stephen Hemminger March 27, 2018, 5 p.m. | #11
On Tue, 27 Mar 2018 18:29:31 +0200
Alexander Zubkov <green@msu.ru> wrote:

> Hi Stephen,
> 
> Looks like the new patch was applied after the revert of original patch and fix patch for 4.15 branch. Which is not correct and I did not test it. This is how patches were designed:
> 1) your revert patch - rolls back 4.15 branch to old behaviour by reverting the original patch
> 2) my patch for 4.15 - fixes problem is 4.15 branch, it does not require revert patch, it is an alternative solution for the problem, it is designed solely for version 4.15
> 3) my patch for master - fixes problem, it requires neither revert patch nor my patch for 4.15, it is standalone patch designed to do things right in master branch
> 
> 27.03.2018, 18:01, "Stephen Hemminger" <stephen@networkplumber.org>:
> > On Wed, 14 Mar 2018 21:26:40 +0100
> > Alexander Zubkov <green@msu.ru> wrote:
> >  
> >>  Hello,
> >>
> >>  For example, it can be fixed in such way (patch is below):
> >>  - split handling of default and all/any
> >>  - set needed attributes in get_addr: PREFIXLEN_SPECIFIED flag for default
> >>  - and AF_UNSPEC for all/any
> >>  In this case "ip route show default" shows only default route and "ip
> >>  route show all" shows all routes. And both also work when family (-4 or
> >>  -6) is specified.
> >>  Serhey, does it goes in line with what you wanted to achieve? Because I
> >>  do not know - may be there are reasons why all/any should be provided
> >>  with specific family. If you think this solution is suitable, I'll do
> >>  some additional tests and package the patch in a proper way for this
> >>  mailing list.
> >>  And I'm unsure if check for AF_DECnet and AF_MPLS should be kept in both
> >>  branches. May be someone have some additional thoughts on that?  
> >
> > I applied this to master.
> >
> > We can work on the other cases after that.  

Please send the update back to what works.
Alexander Zubkov March 27, 2018, 5:33 p.m. | #12
master before merging revert + my recent patch (1) should work. Or you mean to prepare patch to change new master to desired state? I can do it.

1) https://git.kernel.org/pub/scm/network/iproute2/iproute2.git/patch/?id=7696f1097f79be2ce5984a8a16103fd17391cac2

27.03.2018, 19:00, "Stephen Hemminger" <stephen@networkplumber.org>:
> On Tue, 27 Mar 2018 18:29:31 +0200
> Alexander Zubkov <green@msu.ru> wrote:
>
>>  Hi Stephen,
>>
>>  Looks like the new patch was applied after the revert of original patch and fix patch for 4.15 branch. Which is not correct and I did not test it. This is how patches were designed:
>>  1) your revert patch - rolls back 4.15 branch to old behaviour by reverting the original patch
>>  2) my patch for 4.15 - fixes problem is 4.15 branch, it does not require revert patch, it is an alternative solution for the problem, it is designed solely for version 4.15
>>  3) my patch for master - fixes problem, it requires neither revert patch nor my patch for 4.15, it is standalone patch designed to do things right in master branch
>>
>>  27.03.2018, 18:01, "Stephen Hemminger" <stephen@networkplumber.org>:
>>  > On Wed, 14 Mar 2018 21:26:40 +0100
>>  > Alexander Zubkov <green@msu.ru> wrote:
>>  >
>>  >>  Hello,
>>  >>
>>  >>  For example, it can be fixed in such way (patch is below):
>>  >>  - split handling of default and all/any
>>  >>  - set needed attributes in get_addr: PREFIXLEN_SPECIFIED flag for default
>>  >>  - and AF_UNSPEC for all/any
>>  >>  In this case "ip route show default" shows only default route and "ip
>>  >>  route show all" shows all routes. And both also work when family (-4 or
>>  >>  -6) is specified.
>>  >>  Serhey, does it goes in line with what you wanted to achieve? Because I
>>  >>  do not know - may be there are reasons why all/any should be provided
>>  >>  with specific family. If you think this solution is suitable, I'll do
>>  >>  some additional tests and package the patch in a proper way for this
>>  >>  mailing list.
>>  >>  And I'm unsure if check for AF_DECnet and AF_MPLS should be kept in both
>>  >>  branches. May be someone have some additional thoughts on that?
>>  >
>>  > I applied this to master.
>>  >
>>  > We can work on the other cases after that.
>
> Please send the update back to what works.
Stephen Hemminger March 27, 2018, 5:58 p.m. | #13
On Tue, 27 Mar 2018 19:33:28 +0200
Alexander Zubkov <green@msu.ru> wrote:

> master before merging revert + my recent patch (1) should work. Or you mean to prepare patch to change new master to desired state? I can do it.
> 
> 1) https://git.kernel.org/pub/scm/network/iproute2/iproute2.git/patch/?id=7696f1097f79be2ce5984a8a16103fd17391cac2
> 
> 27.03.2018, 19:00, "Stephen Hemminger" <stephen@networkplumber.org>:
> > On Tue, 27 Mar 2018 18:29:31 +0200
> > Alexander Zubkov <green@msu.ru> wrote:
> >  
> >>  Hi Stephen,
> >>
> >>  Looks like the new patch was applied after the revert of original patch and fix patch for 4.15 branch. Which is not correct and I did not test it. This is how patches were designed:
> >>  1) your revert patch - rolls back 4.15 branch to old behaviour by reverting the original patch
> >>  2) my patch for 4.15 - fixes problem is 4.15 branch, it does not require revert patch, it is an alternative solution for the problem, it is designed solely for version 4.15
> >>  3) my patch for master - fixes problem, it requires neither revert patch nor my patch for 4.15, it is standalone patch designed to do things right in master branch
> >>
> >>  27.03.2018, 18:01, "Stephen Hemminger" <stephen@networkplumber.org>:  
> >>  > On Wed, 14 Mar 2018 21:26:40 +0100
> >>  > Alexander Zubkov <green@msu.ru> wrote:
> >>  >  
> >>  >>  Hello,
> >>  >>
> >>  >>  For example, it can be fixed in such way (patch is below):
> >>  >>  - split handling of default and all/any
> >>  >>  - set needed attributes in get_addr: PREFIXLEN_SPECIFIED flag for default
> >>  >>  - and AF_UNSPEC for all/any
> >>  >>  In this case "ip route show default" shows only default route and "ip
> >>  >>  route show all" shows all routes. And both also work when family (-4 or
> >>  >>  -6) is specified.
> >>  >>  Serhey, does it goes in line with what you wanted to achieve? Because I
> >>  >>  do not know - may be there are reasons why all/any should be provided
> >>  >>  with specific family. If you think this solution is suitable, I'll do
> >>  >>  some additional tests and package the patch in a proper way for this
> >>  >>  mailing list.
> >>  >>  And I'm unsure if check for AF_DECnet and AF_MPLS should be kept in both
> >>  >>  branches. May be someone have some additional thoughts on that?  
> >>  >
> >>  > I applied this to master.
> >>  >
> >>  > We can work on the other cases after that.  
> >
> > Please send the update back to what works.  

Make patches against current master.
For visible repositories, I prefer to only move forward and not rollback.
So you can send a revert patch than new code if that is easier.

Patch

diff --git a/ip/iproute.c b/ip/iproute.c
index bf886fda9d76..32c93ed5abd9 100644
--- a/ip/iproute.c
+++ b/ip/iproute.c
@@ -191,42 +191,20 @@  static int filter_nlmsg(struct nlmsghdr *n, struct rtattr **tb, int host_len)
 		return 0;
 	if ((filter.tos^r->rtm_tos)&filter.tosmask)
 		return 0;
-	if (filter.rdst.family) {
-		if (r->rtm_family != filter.rdst.family ||
-		    filter.rdst.bitlen > r->rtm_dst_len)
-			return 0;
-	} else if (filter.rdst.flags & PREFIXLEN_SPECIFIED) {
-		if (filter.rdst.bitlen > r->rtm_dst_len)
-			return 0;
-	}
-	if (filter.mdst.family) {
-		if (r->rtm_family != filter.mdst.family ||
-		    (filter.mdst.bitlen >= 0 &&
-		     filter.mdst.bitlen < r->rtm_dst_len))
-			return 0;
-	} else if (filter.mdst.flags & PREFIXLEN_SPECIFIED) {
-		if (filter.mdst.bitlen >= 0 &&
-		    filter.mdst.bitlen < r->rtm_dst_len)
-			return 0;
-	}
-	if (filter.rsrc.family) {
-		if (r->rtm_family != filter.rsrc.family ||
-		    filter.rsrc.bitlen > r->rtm_src_len)
-			return 0;
-	} else if (filter.rsrc.flags & PREFIXLEN_SPECIFIED) {
-		if (filter.rsrc.bitlen > r->rtm_src_len)
-			return 0;
-	}
-	if (filter.msrc.family) {
-		if (r->rtm_family != filter.msrc.family ||
-		    (filter.msrc.bitlen >= 0 &&
-		     filter.msrc.bitlen < r->rtm_src_len))
-			return 0;
-	} else if (filter.msrc.flags & PREFIXLEN_SPECIFIED) {
-		if (filter.msrc.bitlen >= 0 &&
-		    filter.msrc.bitlen < r->rtm_src_len)
-			return 0;
-	}
+	if (filter.rdst.family &&
+	    (r->rtm_family != filter.rdst.family || filter.rdst.bitlen > r->rtm_dst_len))
+		return 0;
+	if (filter.mdst.family &&
+	    (r->rtm_family != filter.mdst.family ||
+	     (filter.mdst.bitlen >= 0 && filter.mdst.bitlen < r->rtm_dst_len)))
+		return 0;
+	if (filter.rsrc.family &&
+	    (r->rtm_family != filter.rsrc.family || filter.rsrc.bitlen > r->rtm_src_len))
+		return 0;
+	if (filter.msrc.family &&
+	    (r->rtm_family != filter.msrc.family ||
+	     (filter.msrc.bitlen >= 0 && filter.msrc.bitlen < r->rtm_src_len)))
+		return 0;
 	if (filter.rvia.family) {
 		int family = r->rtm_family;
 
@@ -243,9 +221,7 @@  static int filter_nlmsg(struct nlmsghdr *n, struct rtattr **tb, int host_len)
 
 	if (tb[RTA_DST])
 		memcpy(&dst.data, RTA_DATA(tb[RTA_DST]), (r->rtm_dst_len+7)/8);
-	if (filter.rsrc.family || filter.msrc.family ||
-	    filter.rsrc.flags & PREFIXLEN_SPECIFIED ||
-	    filter.msrc.flags & PREFIXLEN_SPECIFIED) {
+	if (filter.rsrc.family || filter.msrc.family) {
 		if (tb[RTA_SRC])
 			memcpy(&src.data, RTA_DATA(tb[RTA_SRC]), (r->rtm_src_len+7)/8);
 	}
@@ -265,18 +241,15 @@  static int filter_nlmsg(struct nlmsghdr *n, struct rtattr **tb, int host_len)
 			memcpy(&prefsrc.data, RTA_DATA(tb[RTA_PREFSRC]), host_len/8);
 	}
 
-	if ((filter.rdst.family || filter.rdst.flags & PREFIXLEN_SPECIFIED) &&
-	    inet_addr_match(&dst, &filter.rdst, filter.rdst.bitlen))
+	if (filter.rdst.family && inet_addr_match(&dst, &filter.rdst, filter.rdst.bitlen))
 		return 0;
-	if ((filter.mdst.family || filter.mdst.flags & PREFIXLEN_SPECIFIED) &&
+	if (filter.mdst.family && filter.mdst.bitlen >= 0 &&
 	    inet_addr_match(&dst, &filter.mdst, r->rtm_dst_len))
 		return 0;
 
-	if ((filter.rsrc.family || filter.rsrc.flags & PREFIXLEN_SPECIFIED) &&
-	    inet_addr_match(&src, &filter.rsrc, filter.rsrc.bitlen))
+	if (filter.rsrc.family && inet_addr_match(&src, &filter.rsrc, filter.rsrc.bitlen))
 		return 0;
-	if ((filter.msrc.family || filter.msrc.flags & PREFIXLEN_SPECIFIED) &&
-	    filter.msrc.bitlen >= 0 &&
+	if (filter.msrc.family && filter.msrc.bitlen >= 0 &&
 	    inet_addr_match(&src, &filter.msrc, r->rtm_src_len))
 		return 0;
 
diff --git a/lib/utils.c b/lib/utils.c
index 379739d61246..87b609f2a6bc 100644
--- a/lib/utils.c
+++ b/lib/utils.c
@@ -681,6 +681,19 @@  int get_prefix_1(inet_prefix *dst, char *arg, int family)
 	char *slash;
 	int err, bitlen, flags;
 
+	memset(dst, 0, sizeof(*dst));
+
+	if (strcmp(arg, "default") == 0 ||
+	    strcmp(arg, "any") == 0 ||
+	    strcmp(arg, "all") == 0) {
+		if ((family == AF_DECnet) || (family == AF_MPLS))
+			return -1;
+		dst->family = family;
+		dst->bytelen = 0;
+		dst->bitlen = 0;
+		return 0;
+	}
+
 	slash = strchr(arg, '/');
 	if (slash)
 		*slash = 0;