diff options
Diffstat (limited to 'net/ipv6/udp.c')
-rw-r--r-- | net/ipv6/udp.c | 9 |
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 | ||