]> git.proxmox.com Git - mirror_iproute2.git/commitdiff
Revert "iproute: "list/flush/save default" selected all of the routes"
authorStephen Hemminger <stephen@networkplumber.org>
Mon, 12 Mar 2018 20:58:17 +0000 (13:58 -0700)
committerStephen Hemminger <stephen@networkplumber.org>
Mon, 12 Mar 2018 21:02:36 +0000 (14:02 -0700)
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
lib/utils.c

index bf886fda9d761cbb86fe740aadf0d08106854dd5..32c93ed5abd9c1878fc9cde0ea23124682fedf7e 100644 (file)
@@ -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;
 
index 379739d61246dc0d544257a282f164d8bcc17a1d..87b609f2a6bc8a7bd9904dc34388a918cea9ac8e 100644 (file)
@@ -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;