diff options
author | David S. Miller <davem@davemloft.net> | 2018-10-18 00:51:14 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2018-10-18 00:51:14 -0400 |
commit | dc6d0f0b4340ef6814d5345dbeaa5e909395dd1d (patch) | |
tree | 8446305611f6d7e76b1470f1ca91f8bdb822b7bf | |
parent | 0ac1077e3a549bf8d35971613e2be05bdbb41a00 (diff) | |
parent | 6b4f92af3d59e882d3ba04c44a815266890d188f (diff) |
Merge branch 'geneve-vxlan-mtu'
Stefano Brivio says:
====================
geneve, vxlan: Don't set exceptions if skb->len < mtu
This series fixes the exception abuse described in 2/2, and 1/2
is just a preparatory change to make 2/2 less ugly.
====================
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/geneve.c | 14 | ||||
-rw-r--r-- | drivers/net/vxlan.c | 12 | ||||
-rw-r--r-- | include/net/dst.h | 10 |
3 files changed, 15 insertions, 21 deletions
diff --git a/drivers/net/geneve.c b/drivers/net/geneve.c index 6acb6b5718b9..493cd382b8aa 100644 --- a/drivers/net/geneve.c +++ b/drivers/net/geneve.c | |||
@@ -830,12 +830,8 @@ static int geneve_xmit_skb(struct sk_buff *skb, struct net_device *dev, | |||
830 | if (IS_ERR(rt)) | 830 | if (IS_ERR(rt)) |
831 | return PTR_ERR(rt); | 831 | return PTR_ERR(rt); |
832 | 832 | ||
833 | if (skb_dst(skb)) { | 833 | skb_tunnel_check_pmtu(skb, &rt->dst, |
834 | int mtu = dst_mtu(&rt->dst) - GENEVE_IPV4_HLEN - | 834 | GENEVE_IPV4_HLEN + info->options_len); |
835 | info->options_len; | ||
836 | |||
837 | skb_dst_update_pmtu(skb, mtu); | ||
838 | } | ||
839 | 835 | ||
840 | sport = udp_flow_src_port(geneve->net, skb, 1, USHRT_MAX, true); | 836 | sport = udp_flow_src_port(geneve->net, skb, 1, USHRT_MAX, true); |
841 | if (geneve->collect_md) { | 837 | if (geneve->collect_md) { |
@@ -876,11 +872,7 @@ static int geneve6_xmit_skb(struct sk_buff *skb, struct net_device *dev, | |||
876 | if (IS_ERR(dst)) | 872 | if (IS_ERR(dst)) |
877 | return PTR_ERR(dst); | 873 | return PTR_ERR(dst); |
878 | 874 | ||
879 | if (skb_dst(skb)) { | 875 | skb_tunnel_check_pmtu(skb, dst, GENEVE_IPV6_HLEN + info->options_len); |
880 | int mtu = dst_mtu(dst) - GENEVE_IPV6_HLEN - info->options_len; | ||
881 | |||
882 | skb_dst_update_pmtu(skb, mtu); | ||
883 | } | ||
884 | 876 | ||
885 | sport = udp_flow_src_port(geneve->net, skb, 1, USHRT_MAX, true); | 877 | sport = udp_flow_src_port(geneve->net, skb, 1, USHRT_MAX, true); |
886 | if (geneve->collect_md) { | 878 | if (geneve->collect_md) { |
diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c index 2b8da2b7e721..27bd586b94b0 100644 --- a/drivers/net/vxlan.c +++ b/drivers/net/vxlan.c | |||
@@ -2194,11 +2194,7 @@ static void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev, | |||
2194 | } | 2194 | } |
2195 | 2195 | ||
2196 | ndst = &rt->dst; | 2196 | ndst = &rt->dst; |
2197 | if (skb_dst(skb)) { | 2197 | skb_tunnel_check_pmtu(skb, ndst, VXLAN_HEADROOM); |
2198 | int mtu = dst_mtu(ndst) - VXLAN_HEADROOM; | ||
2199 | |||
2200 | skb_dst_update_pmtu(skb, mtu); | ||
2201 | } | ||
2202 | 2198 | ||
2203 | tos = ip_tunnel_ecn_encap(tos, old_iph, skb); | 2199 | tos = ip_tunnel_ecn_encap(tos, old_iph, skb); |
2204 | ttl = ttl ? : ip4_dst_hoplimit(&rt->dst); | 2200 | ttl = ttl ? : ip4_dst_hoplimit(&rt->dst); |
@@ -2235,11 +2231,7 @@ static void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev, | |||
2235 | goto out_unlock; | 2231 | goto out_unlock; |
2236 | } | 2232 | } |
2237 | 2233 | ||
2238 | if (skb_dst(skb)) { | 2234 | skb_tunnel_check_pmtu(skb, ndst, VXLAN6_HEADROOM); |
2239 | int mtu = dst_mtu(ndst) - VXLAN6_HEADROOM; | ||
2240 | |||
2241 | skb_dst_update_pmtu(skb, mtu); | ||
2242 | } | ||
2243 | 2235 | ||
2244 | tos = ip_tunnel_ecn_encap(tos, old_iph, skb); | 2236 | tos = ip_tunnel_ecn_encap(tos, old_iph, skb); |
2245 | ttl = ttl ? : ip6_dst_hoplimit(ndst); | 2237 | ttl = ttl ? : ip6_dst_hoplimit(ndst); |
diff --git a/include/net/dst.h b/include/net/dst.h index 7f735e76ca73..6cf0870414c7 100644 --- a/include/net/dst.h +++ b/include/net/dst.h | |||
@@ -527,4 +527,14 @@ static inline void skb_dst_update_pmtu(struct sk_buff *skb, u32 mtu) | |||
527 | dst->ops->update_pmtu(dst, NULL, skb, mtu); | 527 | dst->ops->update_pmtu(dst, NULL, skb, mtu); |
528 | } | 528 | } |
529 | 529 | ||
530 | static inline void skb_tunnel_check_pmtu(struct sk_buff *skb, | ||
531 | struct dst_entry *encap_dst, | ||
532 | int headroom) | ||
533 | { | ||
534 | u32 encap_mtu = dst_mtu(encap_dst); | ||
535 | |||
536 | if (skb->len > encap_mtu - headroom) | ||
537 | skb_dst_update_pmtu(skb, encap_mtu - headroom); | ||
538 | } | ||
539 | |||
530 | #endif /* _NET_DST_H */ | 540 | #endif /* _NET_DST_H */ |