diff options
author | David Ahern <dsa@cumulusnetworks.com> | 2015-08-13 14:59:05 -0600 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-08-13 22:43:21 -0700 |
commit | 30bbaa19500559d7625c65632195413f639b3b97 (patch) | |
tree | f5514050b984975047c683c6a3972c09ff251b97 /net/ipv4/fib_semantics.c | |
parent | 15be405eb2ea943ac5fa2aab7d0ba282e9ef1301 (diff) | |
download | linux-30bbaa19500559d7625c65632195413f639b3b97.tar.gz linux-30bbaa19500559d7625c65632195413f639b3b97.tar.bz2 linux-30bbaa19500559d7625c65632195413f639b3b97.zip |
net: Fix up inet_addr_type checks
Currently inet_addr_type and inet_dev_addr_type expect local addresses
to be in the local table. With the VRF device local routes for devices
associated with a VRF will be in the table associated with the VRF.
Provide an alternate inet_addr lookup to use a specific table rather
than defaulting to the local table.
inet_addr_type_dev_table keeps the same semantics as inet_addr_type but
if the passed in device is enslaved to a VRF then the table for that VRF
is used for the lookup.
Signed-off-by: David Ahern <dsa@cumulusnetworks.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/fib_semantics.c')
-rw-r--r-- | net/ipv4/fib_semantics.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/net/ipv4/fib_semantics.c b/net/ipv4/fib_semantics.c index 558e196bae0f..410ddb67221e 100644 --- a/net/ipv4/fib_semantics.c +++ b/net/ipv4/fib_semantics.c @@ -670,16 +670,18 @@ static int fib_check_nh(struct fib_config *cfg, struct fib_info *fi, struct fib_result res; if (nh->nh_flags & RTNH_F_ONLINK) { + unsigned int addr_type; if (cfg->fc_scope >= RT_SCOPE_LINK) return -EINVAL; - if (inet_addr_type(net, nh->nh_gw) != RTN_UNICAST) - return -EINVAL; dev = __dev_get_by_index(net, nh->nh_oif); if (!dev) return -ENODEV; if (!(dev->flags & IFF_UP)) return -ENETDOWN; + addr_type = inet_addr_type_dev_table(net, dev, nh->nh_gw); + if (addr_type != RTN_UNICAST) + return -EINVAL; if (!netif_carrier_ok(dev)) nh->nh_flags |= RTNH_F_LINKDOWN; nh->nh_dev = dev; |