diff options
Diffstat (limited to 'net/ipv4/route.c')
| -rw-r--r-- | net/ipv4/route.c | 36 | 
1 files changed, 21 insertions, 15 deletions
diff --git a/net/ipv4/route.c b/net/ipv4/route.c index b6a6f18c3dd1..7dcce724c78b 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c @@ -635,6 +635,7 @@ 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_uses_gateway = 1;  		rt->rt_gw_family = AF_INET;  		rt->rt_gw4 = fnhe->fnhe_gw;  	} @@ -1313,7 +1314,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_gw_family && mtu > 576) +		if (rt->rt_uses_gateway && mtu > 576)  			mtu = 576;  	} @@ -1569,6 +1570,7 @@ static void rt_set_nexthop(struct rtable *rt, __be32 daddr,  		struct fib_nh_common *nhc = FIB_RES_NHC(*res);  		if (nhc->nhc_gw_family && nhc->nhc_scope == RT_SCOPE_LINK) { +			rt->rt_uses_gateway = 1;  			rt->rt_gw_family = nhc->nhc_gw_family;  			/* only INET and INET6 are supported */  			if (likely(nhc->nhc_gw_family == AF_INET)) @@ -1634,6 +1636,7 @@ struct rtable *rt_dst_alloc(struct net_device *dev,  		rt->rt_iif = 0;  		rt->rt_pmtu = 0;  		rt->rt_mtu_locked = 0; +		rt->rt_uses_gateway = 0;  		rt->rt_gw_family = 0;  		rt->rt_gw4 = 0;  		INIT_LIST_HEAD(&rt->rt_uncached); @@ -2694,6 +2697,7 @@ 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_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; @@ -2778,21 +2782,23 @@ 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_gw_family == AF_INET && -	    nla_put_in_addr(skb, RTA_GATEWAY, rt->rt_gw4)) { -		goto nla_put_failure; -	} else if (rt->rt_gw_family == AF_INET6) { -		int alen = sizeof(struct in6_addr); -		struct nlattr *nla; -		struct rtvia *via; - -		nla = nla_reserve(skb, RTA_VIA, alen + 2); -		if (!nla) +	if (rt->rt_uses_gateway) { +		if (rt->rt_gw_family == AF_INET && +		    nla_put_in_addr(skb, RTA_GATEWAY, rt->rt_gw4)) {  			goto nla_put_failure; - -		via = nla_data(nla); -		via->rtvia_family = AF_INET6; -		memcpy(via->rtvia_addr, &rt->rt_gw6, alen); +		} else if (rt->rt_gw_family == AF_INET6) { +			int alen = sizeof(struct in6_addr); +			struct nlattr *nla; +			struct rtvia *via; + +			nla = nla_reserve(skb, RTA_VIA, alen + 2); +			if (!nla) +				goto nla_put_failure; + +			via = nla_data(nla); +			via->rtvia_family = AF_INET6; +			memcpy(via->rtvia_addr, &rt->rt_gw6, alen); +		}  	}  	expires = rt->dst.expires;  |