From: Willem de Bruijn <will...@google.com>

UDP GSO delays final datagram construction to the GSO layer. This
conflicts with protocol transformations.

Fixes: bec1f6f69736 ("udp: generate gso with UDP_SEGMENT")
CC: Michal Kubecek <mkube...@suse.cz>
Signed-off-by: Willem de Bruijn <will...@google.com>
---
 net/ipv4/udp.c | 3 ++-
 net/ipv6/udp.c | 3 ++-
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c
index ff4d4ba67735..d71f1f3e1155 100644
--- a/net/ipv4/udp.c
+++ b/net/ipv4/udp.c
@@ -788,7 +788,8 @@ static int udp_send_skb(struct sk_buff *skb, struct flowi4 
*fl4,
                        return -EINVAL;
                if (sk->sk_no_check_tx)
                        return -EINVAL;
-               if (skb->ip_summed != CHECKSUM_PARTIAL || is_udplite)
+               if (skb->ip_summed != CHECKSUM_PARTIAL || is_udplite ||
+                   dst_xfrm(skb_dst(skb)))
                        return -EIO;
 
                skb_shinfo(skb)->gso_size = cork->gso_size;
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c
index 2839c1bd1e58..426c9d2b418d 100644
--- a/net/ipv6/udp.c
+++ b/net/ipv6/udp.c
@@ -1053,7 +1053,8 @@ static int udp_v6_send_skb(struct sk_buff *skb, struct 
flowi6 *fl6,
                        return -EINVAL;
                if (udp_sk(sk)->no_check6_tx)
                        return -EINVAL;
-               if (skb->ip_summed != CHECKSUM_PARTIAL || is_udplite)
+               if (skb->ip_summed != CHECKSUM_PARTIAL || is_udplite ||
+                   dst_xfrm(skb_dst(skb)))
                        return -EIO;
 
                skb_shinfo(skb)->gso_size = cork->gso_size;
-- 
2.17.0.441.gb46fe60e1d-goog

Reply via email to