diff options
author | Steffen Klassert <steffen.klassert@secunet.com> | 2017-01-17 04:23:08 -0500 |
---|---|---|
committer | Steffen Klassert <steffen.klassert@secunet.com> | 2017-01-17 04:23:08 -0500 |
commit | eb758c8864d49f5786432ce38fd8a72bdbbd10cf (patch) | |
tree | 1ca9170765259d1cfff4def7f51bc788b42508c7 | |
parent | 03e2a30f6a27e2f3e5283b777f6ddd146b38c738 (diff) |
esp: Introduce a helper to setup the trailer
We need to setup the trailer in two different cases,
so add a helper to avoid code duplication.
Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
-rw-r--r-- | net/ipv4/esp4.c | 44 | ||||
-rw-r--r-- | net/ipv6/esp6.c | 44 |
2 files changed, 38 insertions, 50 deletions
diff --git a/net/ipv4/esp4.c b/net/ipv4/esp4.c index 9e8d97133513..b1e24446e297 100644 --- a/net/ipv4/esp4.c +++ b/net/ipv4/esp4.c | |||
@@ -182,6 +182,22 @@ static void esp_output_done_esn(struct crypto_async_request *base, int err) | |||
182 | esp_output_done(base, err); | 182 | esp_output_done(base, err); |
183 | } | 183 | } |
184 | 184 | ||
185 | static void esp_output_fill_trailer(u8 *tail, int tfclen, int plen, __u8 proto) | ||
186 | { | ||
187 | /* Fill padding... */ | ||
188 | if (tfclen) { | ||
189 | memset(tail, 0, tfclen); | ||
190 | tail += tfclen; | ||
191 | } | ||
192 | do { | ||
193 | int i; | ||
194 | for (i = 0; i < plen - 2; i++) | ||
195 | tail[i] = i + 1; | ||
196 | } while (0); | ||
197 | tail[plen - 2] = plen - 2; | ||
198 | tail[plen - 1] = proto; | ||
199 | } | ||
200 | |||
185 | static int esp_output(struct xfrm_state *x, struct sk_buff *skb) | 201 | static int esp_output(struct xfrm_state *x, struct sk_buff *skb) |
186 | { | 202 | { |
187 | struct esp_output_extra *extra; | 203 | struct esp_output_extra *extra; |
@@ -304,18 +320,7 @@ static int esp_output(struct xfrm_state *x, struct sk_buff *skb) | |||
304 | 320 | ||
305 | tail = vaddr + pfrag->offset; | 321 | tail = vaddr + pfrag->offset; |
306 | 322 | ||
307 | /* Fill padding... */ | 323 | esp_output_fill_trailer(tail, tfclen, plen, proto); |
308 | if (tfclen) { | ||
309 | memset(tail, 0, tfclen); | ||
310 | tail += tfclen; | ||
311 | } | ||
312 | do { | ||
313 | int i; | ||
314 | for (i = 0; i < plen - 2; i++) | ||
315 | tail[i] = i + 1; | ||
316 | } while (0); | ||
317 | tail[plen - 2] = plen - 2; | ||
318 | tail[plen - 1] = proto; | ||
319 | 324 | ||
320 | kunmap_atomic(vaddr); | 325 | kunmap_atomic(vaddr); |
321 | 326 | ||
@@ -395,20 +400,9 @@ cow: | |||
395 | esph = ip_esp_hdr(skb); | 400 | esph = ip_esp_hdr(skb); |
396 | 401 | ||
397 | skip_cow: | 402 | skip_cow: |
398 | /* Fill padding... */ | 403 | esp_output_fill_trailer(tail, tfclen, plen, proto); |
399 | if (tfclen) { | ||
400 | memset(tail, 0, tfclen); | ||
401 | tail += tfclen; | ||
402 | } | ||
403 | do { | ||
404 | int i; | ||
405 | for (i = 0; i < plen - 2; i++) | ||
406 | tail[i] = i + 1; | ||
407 | } while (0); | ||
408 | tail[plen - 2] = plen - 2; | ||
409 | tail[plen - 1] = proto; | ||
410 | pskb_put(skb, trailer, clen - skb->len + alen); | ||
411 | 404 | ||
405 | pskb_put(skb, trailer, clen - skb->len + alen); | ||
412 | skb_push(skb, -skb_network_offset(skb)); | 406 | skb_push(skb, -skb_network_offset(skb)); |
413 | esph->seq_no = htonl(XFRM_SKB_CB(skb)->seq.output.low); | 407 | esph->seq_no = htonl(XFRM_SKB_CB(skb)->seq.output.low); |
414 | esph->spi = x->id.spi; | 408 | esph->spi = x->id.spi; |
diff --git a/net/ipv6/esp6.c b/net/ipv6/esp6.c index a428ac6b7c74..ff54faa75631 100644 --- a/net/ipv6/esp6.c +++ b/net/ipv6/esp6.c | |||
@@ -198,6 +198,22 @@ static void esp_output_done_esn(struct crypto_async_request *base, int err) | |||
198 | esp_output_done(base, err); | 198 | esp_output_done(base, err); |
199 | } | 199 | } |
200 | 200 | ||
201 | static void esp_output_fill_trailer(u8 *tail, int tfclen, int plen, __u8 proto) | ||
202 | { | ||
203 | /* Fill padding... */ | ||
204 | if (tfclen) { | ||
205 | memset(tail, 0, tfclen); | ||
206 | tail += tfclen; | ||
207 | } | ||
208 | do { | ||
209 | int i; | ||
210 | for (i = 0; i < plen - 2; i++) | ||
211 | tail[i] = i + 1; | ||
212 | } while (0); | ||
213 | tail[plen - 2] = plen - 2; | ||
214 | tail[plen - 1] = proto; | ||
215 | } | ||
216 | |||
201 | static int esp6_output(struct xfrm_state *x, struct sk_buff *skb) | 217 | static int esp6_output(struct xfrm_state *x, struct sk_buff *skb) |
202 | { | 218 | { |
203 | int err; | 219 | int err; |
@@ -284,18 +300,7 @@ static int esp6_output(struct xfrm_state *x, struct sk_buff *skb) | |||
284 | 300 | ||
285 | tail = vaddr + pfrag->offset; | 301 | tail = vaddr + pfrag->offset; |
286 | 302 | ||
287 | /* Fill padding... */ | 303 | esp_output_fill_trailer(tail, tfclen, plen, proto); |
288 | if (tfclen) { | ||
289 | memset(tail, 0, tfclen); | ||
290 | tail += tfclen; | ||
291 | } | ||
292 | do { | ||
293 | int i; | ||
294 | for (i = 0; i < plen - 2; i++) | ||
295 | tail[i] = i + 1; | ||
296 | } while (0); | ||
297 | tail[plen - 2] = plen - 2; | ||
298 | tail[plen - 1] = proto; | ||
299 | 304 | ||
300 | kunmap_atomic(vaddr); | 305 | kunmap_atomic(vaddr); |
301 | 306 | ||
@@ -375,20 +380,9 @@ cow: | |||
375 | esph = ip_esp_hdr(skb); | 380 | esph = ip_esp_hdr(skb); |
376 | 381 | ||
377 | skip_cow: | 382 | skip_cow: |
378 | /* Fill padding... */ | 383 | esp_output_fill_trailer(tail, tfclen, plen, proto); |
379 | if (tfclen) { | ||
380 | memset(tail, 0, tfclen); | ||
381 | tail += tfclen; | ||
382 | } | ||
383 | do { | ||
384 | int i; | ||
385 | for (i = 0; i < plen - 2; i++) | ||
386 | tail[i] = i + 1; | ||
387 | } while (0); | ||
388 | tail[plen - 2] = plen - 2; | ||
389 | tail[plen - 1] = proto; | ||
390 | pskb_put(skb, trailer, clen - skb->len + alen); | ||
391 | 384 | ||
385 | pskb_put(skb, trailer, clen - skb->len + alen); | ||
392 | skb_push(skb, -skb_network_offset(skb)); | 386 | skb_push(skb, -skb_network_offset(skb)); |
393 | 387 | ||
394 | esph->seq_no = htonl(XFRM_SKB_CB(skb)->seq.output.low); | 388 | esph->seq_no = htonl(XFRM_SKB_CB(skb)->seq.output.low); |