iproute2/ip
Xin Long 74af8dd962 ip route: restore route entries in correct order
Sometimes we cannot restore route entries, because in kernel
  [1] fib_check_nh()
  [2] fib_valid_prefsrc()
cause some routes to depend on existence of others while adding.

For example, we saved all the routes, and flushed all tables
  [a] default via 192.168.122.1 dev eth0
  [b] 192.168.122.0/24 dev eth0 src 192.168.122.21
  [c] broadcast 127.0.0.0 dev lo table local src 127.0.0.1
  [d] local 127.0.0.0/8 dev lo table local  src 127.0.0.1
  [e] local 127.0.0.1 dev lo table local src 127.0.0.1
  [f] broadcast 127.255.255.255 dev lo table local src 127.0.0.1
  [g] broadcast 192.168.122.0 dev eth0 table local src 192.168.122.21
  [h] local 192.168.122.21 dev eth0 table local src 192.168.122.21
  [i] broadcast 192.168.122.255 dev eth0 table local src 192.168.122.21

  Now start to restore them:
    If we want to add [a], we have to add [b] first, as [1] and
    'via 192.168.122.1' in [a].
    If we want to add [b], we have to add [h] first, as [2] and
    'src 192.168.122.21' in [b].

  So the correct order to restore should be like:
    [e][h] -> [b][c][d][f][g][i] -> [a]

This patch fixes it by traversing the file 3 times, it only restores
part of them in each run according to the following conditions, to
make sure every entry can be restored successfully.
  1. !gw && (!fib_prefsrc || fib_prefsrc == cfg->fc_dst)
  2. !gw && (fib_prefsrc != cfg->fc_dst)
  3. gw

Signed-off-by: Xin Long <lucien.xin@gmail.com>
Acked-by: Phil Sutter <phil@nwl.cc>
2016-07-15 11:34:10 -07:00
..
.gitignore Another .gitignore file. 2006-08-08 12:11:23 -07:00
Makefile ip: add MACsec support 2016-06-08 09:35:29 -07:00
ifcfg Remove trailing whitespace 2006-12-05 10:10:22 -08:00
ip.c ip: add MACsec support 2016-06-08 09:35:29 -07:00
ip6tunnel.c utils: make rt_addr_n2a() non-reentrant by default 2016-03-27 10:37:34 -07:00
ip_common.h ip vrf: Add ipvrf_get_table 2016-07-06 21:28:31 -07:00
ipaddress.c ip link/addr: Add support for vrf keyword 2016-07-06 21:28:31 -07:00
ipaddrlabel.c lib/utils: introduce format_host_rta() 2016-03-27 10:37:35 -07:00
ipfou.c utils: add get_be{16, 32, 64}, use them where possible 2016-06-08 09:30:37 -07:00
ipl2tp.c utils: provide get_hex to read a hex digit from a char 2016-06-08 09:30:41 -07:00
iplink.c ip: link style cleanup 2016-07-15 11:31:20 -07:00
iplink_bond.c lib/utils: introduce rt_addr_n2a_rta() 2016-03-27 10:37:35 -07:00
iplink_bond_slave.c ip: code cleanup 2016-03-21 11:52:19 -07:00
iplink_bridge.c iplink: bridge: remove unnecessary returns 2016-02-21 12:00:47 -08:00
iplink_bridge_slave.c ip: code cleanup 2016-03-21 11:52:19 -07:00
iplink_can.c ip: code cleanup 2016-03-21 11:52:19 -07:00
iplink_geneve.c geneve: fix IPv6 remote address reporting 2016-05-13 14:31:55 -07:00
iplink_hsr.c Added support for selection of new HSR version 2016-05-31 12:09:29 -07:00
iplink_ipoib.c ip: code cleanup 2016-03-21 11:52:19 -07:00
iplink_ipvlan.c ip: code cleanup 2016-03-21 11:52:19 -07:00
iplink_macvlan.c ip: code cleanup 2016-03-21 11:52:19 -07:00
iplink_vlan.c ip: code cleanup 2016-03-21 11:52:19 -07:00
iplink_vrf.c ip vrf: Add ipvrf_get_table 2016-07-06 21:28:31 -07:00
iplink_vxlan.c utils: add get_be{16, 32, 64}, use them where possible 2016-06-08 09:30:37 -07:00
ipmacsec.c ip: add MACsec support 2016-06-08 09:35:29 -07:00
ipmaddr.c make format_host non-reentrant by default 2016-03-27 10:37:34 -07:00
ipmonitor.c ip: code cleanup 2016-03-21 11:52:19 -07:00
ipmroute.c lib/utils: introduce rt_addr_n2a_rta() 2016-03-27 10:37:35 -07:00
ipneigh.c ip neigh: Add support for keyword 2016-07-06 21:28:31 -07:00
ipnetconf.c netconf: add support for ignore route attribute 2016-03-21 12:16:25 -07:00
ipnetns.c include: add linked list implementation from kernel 2016-03-27 10:56:11 -07:00
ipntable.c ip: code cleanup 2016-03-21 11:52:19 -07:00
ipprefix.c lib/utils: introduce rt_addr_n2a_rta() 2016-03-27 10:37:35 -07:00
iproute.c ip route: restore route entries in correct order 2016-07-15 11:34:10 -07:00
iproute_lwtunnel.c utils: add get_be{16, 32, 64}, use them where possible 2016-06-08 09:30:37 -07:00
iproute_lwtunnel.h lwtunnel: Add encapsulation support to ip route 2015-10-16 16:13:22 -07:00
iprule.c lib/utils: introduce rt_addr_n2a_rta() 2016-03-27 10:37:35 -07:00
iptoken.c ip, token: add del command 2016-05-31 12:10:29 -07:00
iptunnel.c utils: make rt_addr_n2a() non-reentrant by default 2016-03-27 10:37:34 -07:00
iptuntap.c ip: code cleanup 2016-03-21 11:52:19 -07:00
ipxfrm.c utils: add get_be{16, 32, 64}, use them where possible 2016-06-08 09:30:37 -07:00
link_gre.c ip link gre: print only relevant info in external mode 2016-05-06 11:49:08 -07:00
link_gre6.c make format_host non-reentrant by default 2016-03-27 10:37:34 -07:00
link_ip6tnl.c lib/utils: introduce rt_addr_n2a_rta() 2016-03-27 10:37:35 -07:00
link_iptnl.c make format_host non-reentrant by default 2016-03-27 10:37:34 -07:00
link_veth.c ip: code cleanup 2016-03-21 11:52:19 -07:00
link_vti.c make format_host non-reentrant by default 2016-03-27 10:37:34 -07:00
link_vti6.c make format_host non-reentrant by default 2016-03-27 10:37:34 -07:00
routef ip/routef lifesaver 2007-07-10 18:29:20 -07:00
routel (Logical change 1.3) 2004-04-15 20:56:59 +00:00
rtm_map.c ip, realms: also allow to pass in raw realms value 2015-10-22 23:40:51 -07:00
rtmon.c ip: code cleanup 2016-03-21 11:52:19 -07:00
rtpr (Logical change 1.3) 2004-04-15 20:56:59 +00:00
static-syms.c Fix build when shared libraries are disabled 2013-03-13 08:29:59 -07:00
tcp_metrics.c ip/tcp_metrics: Simplify process_msg a bit 2016-06-27 11:00:54 -07:00
tunnel.c ip: code cleanup 2016-03-21 11:52:19 -07:00
tunnel.h ip{,6}tunnel: have a shared stats parser/printer 2015-12-18 11:46:21 -08:00
xfrm.h Fix FSF address in file headers 2013-12-06 15:05:07 -08:00
xfrm_monitor.c utils: make rt_addr_n2a() non-reentrant by default 2016-03-27 10:37:34 -07:00
xfrm_policy.c ip: code cleanup 2016-03-21 11:52:19 -07:00
xfrm_state.c utils: add get_be{16, 32, 64}, use them where possible 2016-06-08 09:30:37 -07:00