ipv4: Prepare rtable for IPv6 gateway
To allow the gateway to be either an IPv4 or IPv6 address, remove rt_uses_gateway from rtable and replace with rt_gw_family. If rt_gw_family is set it implies rt_uses_gateway. Rename rt_gateway to rt_gw4 to represent the IPv4 version. Signed-off-by: David Ahern <dsahern@gmail.com> Reviewed-by: Ido Schimmel <idosch@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
bdf0046771
commit
1550c17193
@@ -434,14 +434,13 @@ static struct neighbour *ipv4_neigh_lookup(const struct dst_entry *dst,
|
||||
struct sk_buff *skb,
|
||||
const void *daddr)
|
||||
{
|
||||
const struct rtable *rt = container_of(dst, struct rtable, dst);
|
||||
struct net_device *dev = dst->dev;
|
||||
const __be32 *pkey = daddr;
|
||||
const struct rtable *rt;
|
||||
struct neighbour *n;
|
||||
|
||||
rt = (const struct rtable *) dst;
|
||||
if (rt->rt_gateway)
|
||||
pkey = (const __be32 *) &rt->rt_gateway;
|
||||
if (rt->rt_gw_family == AF_INET)
|
||||
pkey = (const __be32 *) &rt->rt_gw4;
|
||||
else if (skb)
|
||||
pkey = &ip_hdr(skb)->daddr;
|
||||
|
||||
@@ -453,13 +452,12 @@ static struct neighbour *ipv4_neigh_lookup(const struct dst_entry *dst,
|
||||
|
||||
static void ipv4_confirm_neigh(const struct dst_entry *dst, const void *daddr)
|
||||
{
|
||||
const struct rtable *rt = container_of(dst, struct rtable, dst);
|
||||
struct net_device *dev = dst->dev;
|
||||
const __be32 *pkey = daddr;
|
||||
const struct rtable *rt;
|
||||
|
||||
rt = (const struct rtable *)dst;
|
||||
if (rt->rt_gateway)
|
||||
pkey = (const __be32 *)&rt->rt_gateway;
|
||||
if (rt->rt_gw_family == AF_INET)
|
||||
pkey = (const __be32 *)&rt->rt_gw4;
|
||||
else if (!daddr ||
|
||||
(rt->rt_flags &
|
||||
(RTCF_MULTICAST | RTCF_BROADCAST | RTCF_LOCAL)))
|
||||
@@ -629,8 +627,8 @@ static void fill_route_from_fnhe(struct rtable *rt, struct fib_nh_exception *fnh
|
||||
|
||||
if (fnhe->fnhe_gw) {
|
||||
rt->rt_flags |= RTCF_REDIRECTED;
|
||||
rt->rt_gateway = fnhe->fnhe_gw;
|
||||
rt->rt_uses_gateway = 1;
|
||||
rt->rt_gw_family = AF_INET;
|
||||
rt->rt_gw4 = fnhe->fnhe_gw;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -747,7 +745,7 @@ static void __ip_do_redirect(struct rtable *rt, struct sk_buff *skb, struct flow
|
||||
return;
|
||||
}
|
||||
|
||||
if (rt->rt_gateway != old_gw)
|
||||
if (rt->rt_gw_family != AF_INET || rt->rt_gw4 != old_gw)
|
||||
return;
|
||||
|
||||
in_dev = __in_dev_get_rcu(dev);
|
||||
@@ -1282,7 +1280,7 @@ static unsigned int ipv4_mtu(const struct dst_entry *dst)
|
||||
mtu = READ_ONCE(dst->dev->mtu);
|
||||
|
||||
if (unlikely(ip_mtu_locked(dst))) {
|
||||
if (rt->rt_uses_gateway && mtu > 576)
|
||||
if (rt->rt_gw_family && mtu > 576)
|
||||
mtu = 576;
|
||||
}
|
||||
|
||||
@@ -1410,8 +1408,10 @@ static bool rt_bind_exception(struct rtable *rt, struct fib_nh_exception *fnhe,
|
||||
orig = NULL;
|
||||
}
|
||||
fill_route_from_fnhe(rt, fnhe);
|
||||
if (!rt->rt_gateway)
|
||||
rt->rt_gateway = daddr;
|
||||
if (!rt->rt_gw4) {
|
||||
rt->rt_gw4 = daddr;
|
||||
rt->rt_gw_family = AF_INET;
|
||||
}
|
||||
|
||||
if (do_cache) {
|
||||
dst_hold(&rt->dst);
|
||||
@@ -1538,8 +1538,8 @@ static void rt_set_nexthop(struct rtable *rt, __be32 daddr,
|
||||
struct fib_nh *nh = container_of(nhc, struct fib_nh, nh_common);
|
||||
|
||||
if (nh->fib_nh_gw4 && nh->fib_nh_scope == RT_SCOPE_LINK) {
|
||||
rt->rt_gateway = nh->fib_nh_gw4;
|
||||
rt->rt_uses_gateway = 1;
|
||||
rt->rt_gw4 = nh->fib_nh_gw4;
|
||||
rt->rt_gw_family = AF_INET;
|
||||
}
|
||||
ip_dst_init_metrics(&rt->dst, fi->fib_metrics);
|
||||
|
||||
@@ -1557,8 +1557,10 @@ static void rt_set_nexthop(struct rtable *rt, __be32 daddr,
|
||||
* However, if we are unsuccessful at storing this
|
||||
* route into the cache we really need to set it.
|
||||
*/
|
||||
if (!rt->rt_gateway)
|
||||
rt->rt_gateway = daddr;
|
||||
if (!rt->rt_gw4) {
|
||||
rt->rt_gw_family = AF_INET;
|
||||
rt->rt_gw4 = daddr;
|
||||
}
|
||||
rt_add_uncached_list(rt);
|
||||
}
|
||||
} else
|
||||
@@ -1591,8 +1593,8 @@ struct rtable *rt_dst_alloc(struct net_device *dev,
|
||||
rt->rt_iif = 0;
|
||||
rt->rt_pmtu = 0;
|
||||
rt->rt_mtu_locked = 0;
|
||||
rt->rt_gateway = 0;
|
||||
rt->rt_uses_gateway = 0;
|
||||
rt->rt_gw_family = 0;
|
||||
rt->rt_gw4 = 0;
|
||||
INIT_LIST_HEAD(&rt->rt_uncached);
|
||||
|
||||
rt->dst.output = ip_output;
|
||||
@@ -2595,8 +2597,9 @@ struct dst_entry *ipv4_blackhole_route(struct net *net, struct dst_entry *dst_or
|
||||
rt->rt_genid = rt_genid_ipv4(net);
|
||||
rt->rt_flags = ort->rt_flags;
|
||||
rt->rt_type = ort->rt_type;
|
||||
rt->rt_gateway = ort->rt_gateway;
|
||||
rt->rt_uses_gateway = ort->rt_uses_gateway;
|
||||
rt->rt_gw_family = ort->rt_gw_family;
|
||||
if (rt->rt_gw_family == AF_INET)
|
||||
rt->rt_gw4 = ort->rt_gw4;
|
||||
|
||||
INIT_LIST_HEAD(&rt->rt_uncached);
|
||||
}
|
||||
@@ -2675,8 +2678,8 @@ static int rt_fill_info(struct net *net, __be32 dst, __be32 src,
|
||||
if (nla_put_in_addr(skb, RTA_PREFSRC, fl4->saddr))
|
||||
goto nla_put_failure;
|
||||
}
|
||||
if (rt->rt_uses_gateway &&
|
||||
nla_put_in_addr(skb, RTA_GATEWAY, rt->rt_gateway))
|
||||
if (rt->rt_gw_family == AF_INET &&
|
||||
nla_put_in_addr(skb, RTA_GATEWAY, rt->rt_gw4))
|
||||
goto nla_put_failure;
|
||||
|
||||
expires = rt->dst.expires;
|
||||
|
Reference in New Issue
Block a user