diff options
author | David Ahern <dsahern@gmail.com> | 2019-05-23 05:28:00 +0200 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2019-05-24 22:26:44 +0200 |
commit | 0fa6efc54780412c3fbd6f6e61a5dfb4ca9bb59c (patch) | |
tree | b92bf370a2f8db1ac26fae30d4113e4e4bbea24a /net | |
parent | ipv6: Make fib6_nh optional at the end of fib6_info (diff) | |
download | linux-0fa6efc54780412c3fbd6f6e61a5dfb4ca9bb59c.tar.xz linux-0fa6efc54780412c3fbd6f6e61a5dfb4ca9bb59c.zip |
ipv6: Refactor ip6_route_del for cached routes
Move the removal of cached routes to a helper, ip6_del_cached_rt, that
can be invoked per nexthop. Rename the existig ip6_del_cached_rt to
__ip6_del_cached_rt since it is called by ip6_del_cached_rt.
Signed-off-by: David Ahern <dsahern@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r-- | net/ipv6/route.c | 36 |
1 files changed, 21 insertions, 15 deletions
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index f248ce807116..fdf598926883 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c @@ -3430,7 +3430,7 @@ out_put: return err; } -static int ip6_del_cached_rt(struct rt6_info *rt, struct fib6_config *cfg) +static int __ip6_del_cached_rt(struct rt6_info *rt, struct fib6_config *cfg) { int rc = -ESRCH; @@ -3446,10 +3446,25 @@ out: return rc; } +static int ip6_del_cached_rt(struct fib6_config *cfg, struct fib6_info *rt, + struct fib6_nh *nh) +{ + struct fib6_result res = { + .f6i = rt, + .nh = nh, + }; + struct rt6_info *rt_cache; + + rt_cache = rt6_find_cached_rt(&res, &cfg->fc_dst, &cfg->fc_src); + if (rt_cache) + return __ip6_del_cached_rt(rt_cache, cfg); + + return 0; +} + static int ip6_route_del(struct fib6_config *cfg, struct netlink_ext_ack *extack) { - struct rt6_info *rt_cache; struct fib6_table *table; struct fib6_info *rt; struct fib6_node *fn; @@ -3474,21 +3489,12 @@ static int ip6_route_del(struct fib6_config *cfg, nh = rt->fib6_nh; if (cfg->fc_flags & RTF_CACHE) { - struct fib6_result res = { - .f6i = rt, - .nh = nh, - }; int rc; - rt_cache = rt6_find_cached_rt(&res, - &cfg->fc_dst, - &cfg->fc_src); - if (rt_cache) { - rc = ip6_del_cached_rt(rt_cache, cfg); - if (rc != -ESRCH) { - rcu_read_unlock(); - return rc; - } + rc = ip6_del_cached_rt(cfg, rt, nh); + if (rc != -ESRCH) { + rcu_read_unlock(); + return rc; } continue; } |