--- /dev/null
+Description: Revert "iproute: "list/flush/save default" selected all of the routes"
+ # ip route flush all
+ No longer worked as expected which breaks user scripts and
+ expectations. It no longer flushed all IPv4 routes.
+Bug: https://bugs.debian.og/891511
+Forwarded: not-needed
+Origin: upstream
+Applied-Upstream: https://patchwork.ozlabs.org/patch/884882/
+Author: Stephen Hemminger <stephen@networkplumber.org>
+Last-Update: 2018-03-12
+--- a/ip/iproute.c
++++ b/ip/iproute.c
+@@ -191,42 +191,20 @@
+ 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 @@
+
+ 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 @@
+ 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;
+
+--- a/lib/utils.c
++++ b/lib/utils.c
+@@ -658,7 +658,6 @@
+ dst->family = family;
+ dst->bytelen = 0;
+ dst->bitlen = 0;
+- dst->flags |= PREFIXLEN_SPECIFIED;
+ return 0;
+ }
+