diff options
Diffstat (limited to 'net/ipv6/xfrm6_mode_transport.c')
-rw-r--r-- | net/ipv6/xfrm6_mode_transport.c | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/net/ipv6/xfrm6_mode_transport.c b/net/ipv6/xfrm6_mode_transport.c index c026bfea820a..65c166b5d72c 100644 --- a/net/ipv6/xfrm6_mode_transport.c +++ b/net/ipv6/xfrm6_mode_transport.c | |||
@@ -20,10 +20,11 @@ | |||
20 | * space for the encapsulation header. | 20 | * space for the encapsulation header. |
21 | * | 21 | * |
22 | * On exit, skb->h will be set to the start of the encapsulation header to be | 22 | * On exit, skb->h will be set to the start of the encapsulation header to be |
23 | * filled in by x->type->output and skb->nh will be set to the nextheader field | 23 | * filled in by x->type->output and the mac header will be set to the |
24 | * of the extension header directly preceding the encapsulation header, or in | 24 | * nextheader field of the extension header directly preceding the |
25 | * its absence, that of the top IP header. The value of skb->data will always | 25 | * encapsulation header, or in its absence, that of the top IP header. |
26 | * point to the top IP header. | 26 | * The value of skb->data and the network header will always point to the |
27 | * top IP header. | ||
27 | */ | 28 | */ |
28 | static int xfrm6_transport_output(struct xfrm_state *x, struct sk_buff *skb) | 29 | static int xfrm6_transport_output(struct xfrm_state *x, struct sk_buff *skb) |
29 | { | 30 | { |
@@ -35,8 +36,8 @@ static int xfrm6_transport_output(struct xfrm_state *x, struct sk_buff *skb) | |||
35 | iph = ipv6_hdr(skb); | 36 | iph = ipv6_hdr(skb); |
36 | 37 | ||
37 | hdr_len = x->type->hdr_offset(x, skb, &prevhdr); | 38 | hdr_len = x->type->hdr_offset(x, skb, &prevhdr); |
38 | skb_set_network_header(skb, | 39 | skb_set_mac_header(skb, (prevhdr - x->props.header_len) - skb->data); |
39 | (prevhdr - x->props.header_len) - skb->data); | 40 | skb_reset_network_header(skb); |
40 | skb_set_transport_header(skb, hdr_len); | 41 | skb_set_transport_header(skb, hdr_len); |
41 | memmove(skb->data, iph, hdr_len); | 42 | memmove(skb->data, iph, hdr_len); |
42 | return 0; | 43 | return 0; |