aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorGao feng <gaofeng@cn.fujitsu.com>2012-03-19 18:36:10 -0400
committerDavid S. Miller <davem@davemloft.net>2012-03-20 05:39:34 -0400
commit1f85851e17b64cabd089a8a8839dddebc627948c (patch)
treea7a23af86a8241f09cff1602786bd7e26a120d17 /net
parent5c473ed26dba609622c9a625f896f8f59d86066c (diff)
ipv6: fix incorrent ipv6 ipsec packet fragment
Since commit 299b0767(ipv6: Fix IPsec slowpath fragmentation problem) In func ip6_append_data,after call skb_put(skb, fraglen + dst_exthdrlen) the skb->len contains dst_exthdrlen,and we don't reduce dst_exthdrlen at last This will make fraggap>0 in next "while cycle",and cause the size of skb incorrent Fix this by reserve headroom for dst_exthdrlen. Signed-off-by: Gao feng <gaofeng@cn.fujitsu.com> Acked-by: Steffen Klassert <steffen.klassert@secunet.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r--net/ipv6/ip6_output.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c
index 7a98fc2a5d97..b7ca46161cb9 100644
--- a/net/ipv6/ip6_output.c
+++ b/net/ipv6/ip6_output.c
@@ -1414,8 +1414,9 @@ alloc_new_skb:
1414 */ 1414 */
1415 skb->ip_summed = csummode; 1415 skb->ip_summed = csummode;
1416 skb->csum = 0; 1416 skb->csum = 0;
1417 /* reserve for fragmentation */ 1417 /* reserve for fragmentation and ipsec header */
1418 skb_reserve(skb, hh_len+sizeof(struct frag_hdr)); 1418 skb_reserve(skb, hh_len + sizeof(struct frag_hdr) +
1419 dst_exthdrlen);
1419 1420
1420 if (sk->sk_type == SOCK_DGRAM) 1421 if (sk->sk_type == SOCK_DGRAM)
1421 skb_shinfo(skb)->tx_flags = tx_flags; 1422 skb_shinfo(skb)->tx_flags = tx_flags;
@@ -1423,9 +1424,9 @@ alloc_new_skb:
1423 /* 1424 /*
1424 * Find where to start putting bytes 1425 * Find where to start putting bytes
1425 */ 1426 */
1426 data = skb_put(skb, fraglen + dst_exthdrlen); 1427 data = skb_put(skb, fraglen);
1427 skb_set_network_header(skb, exthdrlen + dst_exthdrlen); 1428 skb_set_network_header(skb, exthdrlen);
1428 data += fragheaderlen + dst_exthdrlen; 1429 data += fragheaderlen;
1429 skb->transport_header = (skb->network_header + 1430 skb->transport_header = (skb->network_header +
1430 fragheaderlen); 1431 fragheaderlen);
1431 if (fraggap) { 1432 if (fraggap) {