summaryrefslogtreecommitdiffstats
path: root/net/ipv6/udp.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/ipv6/udp.c')
-rw-r--r--net/ipv6/udp.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c
index aae4938f3dea..6324d3a8cb53 100644
--- a/net/ipv6/udp.c
+++ b/net/ipv6/udp.c
@@ -1109,6 +1109,7 @@ static int udp_v6_send_skb(struct sk_buff *skb, struct flowi6 *fl6,
1109 __wsum csum = 0; 1109 __wsum csum = 0;
1110 int offset = skb_transport_offset(skb); 1110 int offset = skb_transport_offset(skb);
1111 int len = skb->len - offset; 1111 int len = skb->len - offset;
1112 int datalen = len - sizeof(*uh);
1112 1113
1113 /* 1114 /*
1114 * Create a UDP header 1115 * Create a UDP header
@@ -1141,8 +1142,12 @@ static int udp_v6_send_skb(struct sk_buff *skb, struct flowi6 *fl6,
1141 return -EIO; 1142 return -EIO;
1142 } 1143 }
1143 1144
1144 skb_shinfo(skb)->gso_size = cork->gso_size; 1145 if (datalen > cork->gso_size) {
1145 skb_shinfo(skb)->gso_type = SKB_GSO_UDP_L4; 1146 skb_shinfo(skb)->gso_size = cork->gso_size;
1147 skb_shinfo(skb)->gso_type = SKB_GSO_UDP_L4;
1148 skb_shinfo(skb)->gso_segs = DIV_ROUND_UP(datalen,
1149 cork->gso_size);
1150 }
1146 goto csum_partial; 1151 goto csum_partial;
1147 } 1152 }
1148 1153