]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - net/ipv4/route.c
udp: only do GSO if # of segs > 1
[linux.git] / net / ipv4 / route.c
index b6a6f18c3dd144d2feb4b1841845bca5535092fc..7dcce724c78bd6bfbffb66671d594803031b13b6 100644 (file)
@@ -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;