mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-18 02:46:06 +00:00
net/ipv6: Fix updates to prefix route
Sowmini reported that a recent commit broke prefix routes for linklocal addresses. The newly added modify_prefix_route is attempting to add a new prefix route when the ifp priority does not match the route metric however the check needs to account for the default priority. In addition, the route add fails because the route already exists, and then the delete removes the one that exists. Flip the order to do the delete first. Fixes: 8308f3ff1753 ("net/ipv6: Add support for specifying metric of connected routes") Reported-by: Sowmini Varadhan <sowmini.varadhan@oracle.com> Tested-by: Sowmini Varadhan <sowmini.varadhan@oracle.com> Signed-off-by: David Ahern <dsahern@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
d14b56f508
commit
e7c7faa936
@ -4528,6 +4528,7 @@ static int modify_prefix_route(struct inet6_ifaddr *ifp,
|
||||
unsigned long expires, u32 flags)
|
||||
{
|
||||
struct fib6_info *f6i;
|
||||
u32 prio;
|
||||
|
||||
f6i = addrconf_get_prefix_route(&ifp->addr,
|
||||
ifp->prefix_len,
|
||||
@ -4536,13 +4537,15 @@ static int modify_prefix_route(struct inet6_ifaddr *ifp,
|
||||
if (!f6i)
|
||||
return -ENOENT;
|
||||
|
||||
if (f6i->fib6_metric != ifp->rt_priority) {
|
||||
prio = ifp->rt_priority ? : IP6_RT_PRIO_ADDRCONF;
|
||||
if (f6i->fib6_metric != prio) {
|
||||
/* delete old one */
|
||||
ip6_del_rt(dev_net(ifp->idev->dev), f6i);
|
||||
|
||||
/* add new one */
|
||||
addrconf_prefix_route(&ifp->addr, ifp->prefix_len,
|
||||
ifp->rt_priority, ifp->idev->dev,
|
||||
expires, flags, GFP_KERNEL);
|
||||
/* delete old one */
|
||||
ip6_del_rt(dev_net(ifp->idev->dev), f6i);
|
||||
} else {
|
||||
if (!expires)
|
||||
fib6_clean_expires(f6i);
|
||||
|
Loading…
x
Reference in New Issue
Block a user