aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteffen Klassert <steffen.klassert@secunet.com>2017-01-17 04:23:08 -0500
committerSteffen Klassert <steffen.klassert@secunet.com>2017-01-17 04:23:08 -0500
commiteb758c8864d49f5786432ce38fd8a72bdbbd10cf (patch)
tree1ca9170765259d1cfff4def7f51bc788b42508c7
parent03e2a30f6a27e2f3e5283b777f6ddd146b38c738 (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.c44
-rw-r--r--net/ipv6/esp6.c44
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
185static 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
185static int esp_output(struct xfrm_state *x, struct sk_buff *skb) 201static 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
397skip_cow: 402skip_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
201static 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
201static int esp6_output(struct xfrm_state *x, struct sk_buff *skb) 217static 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
377skip_cow: 382skip_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);