diff options
Diffstat (limited to 'net/ipv6')
-rw-r--r-- | net/ipv6/esp6.c | 3 | ||||
-rw-r--r-- | net/ipv6/ipcomp6.c | 19 | ||||
-rw-r--r-- | net/ipv6/mip6.c | 2 | ||||
-rw-r--r-- | net/ipv6/xfrm6_mode_beet.c | 2 | ||||
-rw-r--r-- | net/ipv6/xfrm6_mode_tunnel.c | 4 | ||||
-rw-r--r-- | net/ipv6/xfrm6_output.c | 4 | ||||
-rw-r--r-- | net/ipv6/xfrm6_tunnel.c | 5 |
7 files changed, 11 insertions, 28 deletions
diff --git a/net/ipv6/esp6.c b/net/ipv6/esp6.c index a64295d164ea..9eb928598351 100644 --- a/net/ipv6/esp6.c +++ b/net/ipv6/esp6.c | |||
@@ -43,7 +43,6 @@ | |||
43 | static int esp6_output(struct xfrm_state *x, struct sk_buff *skb) | 43 | static int esp6_output(struct xfrm_state *x, struct sk_buff *skb) |
44 | { | 44 | { |
45 | int err; | 45 | int err; |
46 | struct ipv6hdr *top_iph; | ||
47 | struct ip_esp_hdr *esph; | 46 | struct ip_esp_hdr *esph; |
48 | struct crypto_blkcipher *tfm; | 47 | struct crypto_blkcipher *tfm; |
49 | struct blkcipher_desc desc; | 48 | struct blkcipher_desc desc; |
@@ -85,9 +84,7 @@ static int esp6_output(struct xfrm_state *x, struct sk_buff *skb) | |||
85 | pskb_put(skb, trailer, clen - skb->len); | 84 | pskb_put(skb, trailer, clen - skb->len); |
86 | 85 | ||
87 | skb_push(skb, -skb_network_offset(skb)); | 86 | skb_push(skb, -skb_network_offset(skb)); |
88 | top_iph = ipv6_hdr(skb); | ||
89 | esph = ip_esp_hdr(skb); | 87 | esph = ip_esp_hdr(skb); |
90 | top_iph->payload_len = htons(skb->len + alen - sizeof(*top_iph)); | ||
91 | *(skb_tail_pointer(trailer) - 1) = *skb_mac_header(skb); | 88 | *(skb_tail_pointer(trailer) - 1) = *skb_mac_header(skb); |
92 | *skb_mac_header(skb) = IPPROTO_ESP; | 89 | *skb_mac_header(skb) = IPPROTO_ESP; |
93 | 90 | ||
diff --git a/net/ipv6/ipcomp6.c b/net/ipv6/ipcomp6.c index 8f3f32faaf4c..28fc8edfdc3a 100644 --- a/net/ipv6/ipcomp6.c +++ b/net/ipv6/ipcomp6.c | |||
@@ -119,20 +119,15 @@ out: | |||
119 | static int ipcomp6_output(struct xfrm_state *x, struct sk_buff *skb) | 119 | static int ipcomp6_output(struct xfrm_state *x, struct sk_buff *skb) |
120 | { | 120 | { |
121 | int err; | 121 | int err; |
122 | struct ipv6hdr *top_iph; | ||
123 | struct ip_comp_hdr *ipch; | 122 | struct ip_comp_hdr *ipch; |
124 | struct ipcomp_data *ipcd = x->data; | 123 | struct ipcomp_data *ipcd = x->data; |
125 | int plen, dlen; | 124 | int plen, dlen; |
126 | u8 *start, *scratch; | 125 | u8 *start, *scratch; |
127 | struct crypto_comp *tfm; | 126 | struct crypto_comp *tfm; |
128 | int cpu; | 127 | int cpu; |
129 | int hdr_len; | ||
130 | |||
131 | skb_push(skb, -skb_network_offset(skb)); | ||
132 | hdr_len = skb_transport_offset(skb); | ||
133 | 128 | ||
134 | /* check whether datagram len is larger than threshold */ | 129 | /* check whether datagram len is larger than threshold */ |
135 | if ((skb->len - hdr_len) < ipcd->threshold) { | 130 | if (skb->len < ipcd->threshold) { |
136 | goto out_ok; | 131 | goto out_ok; |
137 | } | 132 | } |
138 | 133 | ||
@@ -140,9 +135,9 @@ static int ipcomp6_output(struct xfrm_state *x, struct sk_buff *skb) | |||
140 | goto out_ok; | 135 | goto out_ok; |
141 | 136 | ||
142 | /* compression */ | 137 | /* compression */ |
143 | plen = skb->len - hdr_len; | 138 | plen = skb->len; |
144 | dlen = IPCOMP_SCRATCH_SIZE; | 139 | dlen = IPCOMP_SCRATCH_SIZE; |
145 | start = skb_transport_header(skb); | 140 | start = skb->data; |
146 | 141 | ||
147 | cpu = get_cpu(); | 142 | cpu = get_cpu(); |
148 | scratch = *per_cpu_ptr(ipcomp6_scratches, cpu); | 143 | scratch = *per_cpu_ptr(ipcomp6_scratches, cpu); |
@@ -155,13 +150,9 @@ static int ipcomp6_output(struct xfrm_state *x, struct sk_buff *skb) | |||
155 | } | 150 | } |
156 | memcpy(start + sizeof(struct ip_comp_hdr), scratch, dlen); | 151 | memcpy(start + sizeof(struct ip_comp_hdr), scratch, dlen); |
157 | put_cpu(); | 152 | put_cpu(); |
158 | pskb_trim(skb, hdr_len + dlen + sizeof(struct ip_comp_hdr)); | 153 | pskb_trim(skb, dlen + sizeof(struct ip_comp_hdr)); |
159 | 154 | ||
160 | /* insert ipcomp header and replace datagram */ | 155 | /* insert ipcomp header and replace datagram */ |
161 | top_iph = ipv6_hdr(skb); | ||
162 | |||
163 | top_iph->payload_len = htons(skb->len - sizeof(struct ipv6hdr)); | ||
164 | |||
165 | ipch = ip_comp_hdr(skb); | 156 | ipch = ip_comp_hdr(skb); |
166 | ipch->nexthdr = *skb_mac_header(skb); | 157 | ipch->nexthdr = *skb_mac_header(skb); |
167 | ipch->flags = 0; | 158 | ipch->flags = 0; |
@@ -169,6 +160,8 @@ static int ipcomp6_output(struct xfrm_state *x, struct sk_buff *skb) | |||
169 | *skb_mac_header(skb) = IPPROTO_COMP; | 160 | *skb_mac_header(skb) = IPPROTO_COMP; |
170 | 161 | ||
171 | out_ok: | 162 | out_ok: |
163 | skb_push(skb, -skb_network_offset(skb)); | ||
164 | |||
172 | return 0; | 165 | return 0; |
173 | } | 166 | } |
174 | 167 | ||
diff --git a/net/ipv6/mip6.c b/net/ipv6/mip6.c index 0e7a60f7393a..7fd841d41019 100644 --- a/net/ipv6/mip6.c +++ b/net/ipv6/mip6.c | |||
@@ -155,7 +155,6 @@ static int mip6_destopt_output(struct xfrm_state *x, struct sk_buff *skb) | |||
155 | 155 | ||
156 | skb_push(skb, -skb_network_offset(skb)); | 156 | skb_push(skb, -skb_network_offset(skb)); |
157 | iph = ipv6_hdr(skb); | 157 | iph = ipv6_hdr(skb); |
158 | iph->payload_len = htons(skb->len - sizeof(*iph)); | ||
159 | 158 | ||
160 | nexthdr = *skb_mac_header(skb); | 159 | nexthdr = *skb_mac_header(skb); |
161 | *skb_mac_header(skb) = IPPROTO_DSTOPTS; | 160 | *skb_mac_header(skb) = IPPROTO_DSTOPTS; |
@@ -370,7 +369,6 @@ static int mip6_rthdr_output(struct xfrm_state *x, struct sk_buff *skb) | |||
370 | 369 | ||
371 | skb_push(skb, -skb_network_offset(skb)); | 370 | skb_push(skb, -skb_network_offset(skb)); |
372 | iph = ipv6_hdr(skb); | 371 | iph = ipv6_hdr(skb); |
373 | iph->payload_len = htons(skb->len - sizeof(*iph)); | ||
374 | 372 | ||
375 | nexthdr = *skb_mac_header(skb); | 373 | nexthdr = *skb_mac_header(skb); |
376 | *skb_mac_header(skb) = IPPROTO_ROUTING; | 374 | *skb_mac_header(skb) = IPPROTO_ROUTING; |
diff --git a/net/ipv6/xfrm6_mode_beet.c b/net/ipv6/xfrm6_mode_beet.c index 42c6ef839e59..13bb1e856764 100644 --- a/net/ipv6/xfrm6_mode_beet.c +++ b/net/ipv6/xfrm6_mode_beet.c | |||
@@ -22,8 +22,6 @@ | |||
22 | /* Add encapsulation header. | 22 | /* Add encapsulation header. |
23 | * | 23 | * |
24 | * The top IP header will be constructed per draft-nikander-esp-beet-mode-06.txt. | 24 | * The top IP header will be constructed per draft-nikander-esp-beet-mode-06.txt. |
25 | * The following fields in it shall be filled in by x->type->output: | ||
26 | * payload_len | ||
27 | */ | 25 | */ |
28 | static int xfrm6_beet_output(struct xfrm_state *x, struct sk_buff *skb) | 26 | static int xfrm6_beet_output(struct xfrm_state *x, struct sk_buff *skb) |
29 | { | 27 | { |
diff --git a/net/ipv6/xfrm6_mode_tunnel.c b/net/ipv6/xfrm6_mode_tunnel.c index e79c6bdf71c1..ea2283879112 100644 --- a/net/ipv6/xfrm6_mode_tunnel.c +++ b/net/ipv6/xfrm6_mode_tunnel.c | |||
@@ -33,9 +33,7 @@ static inline void ip6ip_ecn_decapsulate(struct sk_buff *skb) | |||
33 | 33 | ||
34 | /* Add encapsulation header. | 34 | /* Add encapsulation header. |
35 | * | 35 | * |
36 | * The top IP header will be constructed per RFC 2401. The following fields | 36 | * The top IP header will be constructed per RFC 2401. |
37 | * in it shall be filled in by x->type->output: | ||
38 | * payload_len | ||
39 | */ | 37 | */ |
40 | static int xfrm6_tunnel_output(struct xfrm_state *x, struct sk_buff *skb) | 38 | static int xfrm6_tunnel_output(struct xfrm_state *x, struct sk_buff *skb) |
41 | { | 39 | { |
diff --git a/net/ipv6/xfrm6_output.c b/net/ipv6/xfrm6_output.c index f21596f89984..4618c18e611d 100644 --- a/net/ipv6/xfrm6_output.c +++ b/net/ipv6/xfrm6_output.c | |||
@@ -47,6 +47,7 @@ static inline int xfrm6_output_one(struct sk_buff *skb) | |||
47 | { | 47 | { |
48 | struct dst_entry *dst = skb->dst; | 48 | struct dst_entry *dst = skb->dst; |
49 | struct xfrm_state *x = dst->xfrm; | 49 | struct xfrm_state *x = dst->xfrm; |
50 | struct ipv6hdr *iph; | ||
50 | int err; | 51 | int err; |
51 | 52 | ||
52 | if (x->props.mode == XFRM_MODE_TUNNEL) { | 53 | if (x->props.mode == XFRM_MODE_TUNNEL) { |
@@ -59,6 +60,9 @@ static inline int xfrm6_output_one(struct sk_buff *skb) | |||
59 | if (err) | 60 | if (err) |
60 | goto error_nolock; | 61 | goto error_nolock; |
61 | 62 | ||
63 | iph = ipv6_hdr(skb); | ||
64 | iph->payload_len = htons(skb->len - sizeof(*iph)); | ||
65 | |||
62 | IP6CB(skb)->flags |= IP6SKB_XFRM_TRANSFORMED; | 66 | IP6CB(skb)->flags |= IP6SKB_XFRM_TRANSFORMED; |
63 | err = 0; | 67 | err = 0; |
64 | 68 | ||
diff --git a/net/ipv6/xfrm6_tunnel.c b/net/ipv6/xfrm6_tunnel.c index 00a1a3e5237c..3f8a3abde67e 100644 --- a/net/ipv6/xfrm6_tunnel.c +++ b/net/ipv6/xfrm6_tunnel.c | |||
@@ -242,12 +242,7 @@ EXPORT_SYMBOL(xfrm6_tunnel_free_spi); | |||
242 | 242 | ||
243 | static int xfrm6_tunnel_output(struct xfrm_state *x, struct sk_buff *skb) | 243 | static int xfrm6_tunnel_output(struct xfrm_state *x, struct sk_buff *skb) |
244 | { | 244 | { |
245 | struct ipv6hdr *top_iph; | ||
246 | |||
247 | skb_push(skb, -skb_network_offset(skb)); | 245 | skb_push(skb, -skb_network_offset(skb)); |
248 | top_iph = ipv6_hdr(skb); | ||
249 | top_iph->payload_len = htons(skb->len - sizeof(struct ipv6hdr)); | ||
250 | |||
251 | return 0; | 246 | return 0; |
252 | } | 247 | } |
253 | 248 | ||