aboutsummaryrefslogtreecommitdiffstats
path: root/net/xfrm
diff options
context:
space:
mode:
authorSteffen Klassert <steffen.klassert@secunet.com>2011-10-10 21:58:37 -0400
committerDavid S. Miller <davem@davemloft.net>2011-10-18 23:51:30 -0400
commit1d9743745bf5ba30b57986d8da33c4fa072c355b (patch)
tree0c17d35afb44595a5241f8549cd832ca3cc55ddf /net/xfrm
parenta4886d522e18e5d4a63b95a5ead72f6105e3ef98 (diff)
xfrm: Simplify the replay check and advance functions
The replay check and replay advance functions had some code duplications. This patch removes the duplications. Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/xfrm')
-rw-r--r--net/xfrm/xfrm_replay.c98
1 files changed, 34 insertions, 64 deletions
diff --git a/net/xfrm/xfrm_replay.c b/net/xfrm/xfrm_replay.c
index b11ea692bd7d..6ca357406ea8 100644
--- a/net/xfrm/xfrm_replay.c
+++ b/net/xfrm/xfrm_replay.c
@@ -203,8 +203,6 @@ static int xfrm_replay_check_bmp(struct xfrm_state *x,
203 if (!replay_esn->replay_window) 203 if (!replay_esn->replay_window)
204 return 0; 204 return 0;
205 205
206 pos = (replay_esn->seq - 1) % replay_esn->replay_window;
207
208 if (unlikely(seq == 0)) 206 if (unlikely(seq == 0))
209 goto err; 207 goto err;
210 208
@@ -216,19 +214,18 @@ static int xfrm_replay_check_bmp(struct xfrm_state *x,
216 goto err; 214 goto err;
217 } 215 }
218 216
219 if (pos >= diff) { 217 pos = (replay_esn->seq - 1) % replay_esn->replay_window;
218
219 if (pos >= diff)
220 bitnr = (pos - diff) % replay_esn->replay_window; 220 bitnr = (pos - diff) % replay_esn->replay_window;
221 nr = bitnr >> 5; 221 else
222 bitnr = bitnr & 0x1F;
223 if (replay_esn->bmp[nr] & (1U << bitnr))
224 goto err_replay;
225 } else {
226 bitnr = replay_esn->replay_window - (diff - pos); 222 bitnr = replay_esn->replay_window - (diff - pos);
227 nr = bitnr >> 5; 223
228 bitnr = bitnr & 0x1F; 224 nr = bitnr >> 5;
229 if (replay_esn->bmp[nr] & (1U << bitnr)) 225 bitnr = bitnr & 0x1F;
230 goto err_replay; 226 if (replay_esn->bmp[nr] & (1U << bitnr))
231 } 227 goto err_replay;
228
232 return 0; 229 return 0;
233 230
234err_replay: 231err_replay:
@@ -259,39 +256,27 @@ static void xfrm_replay_advance_bmp(struct xfrm_state *x, __be32 net_seq)
259 bitnr = bitnr & 0x1F; 256 bitnr = bitnr & 0x1F;
260 replay_esn->bmp[nr] &= ~(1U << bitnr); 257 replay_esn->bmp[nr] &= ~(1U << bitnr);
261 } 258 }
262
263 bitnr = (pos + diff) % replay_esn->replay_window;
264 nr = bitnr >> 5;
265 bitnr = bitnr & 0x1F;
266 replay_esn->bmp[nr] |= (1U << bitnr);
267 } else { 259 } else {
268 nr = (replay_esn->replay_window - 1) >> 5; 260 nr = (replay_esn->replay_window - 1) >> 5;
269 for (i = 0; i <= nr; i++) 261 for (i = 0; i <= nr; i++)
270 replay_esn->bmp[i] = 0; 262 replay_esn->bmp[i] = 0;
271
272 bitnr = (pos + diff) % replay_esn->replay_window;
273 nr = bitnr >> 5;
274 bitnr = bitnr & 0x1F;
275 replay_esn->bmp[nr] |= (1U << bitnr);
276 } 263 }
277 264
265 bitnr = (pos + diff) % replay_esn->replay_window;
278 replay_esn->seq = seq; 266 replay_esn->seq = seq;
279 } else { 267 } else {
280 diff = replay_esn->seq - seq; 268 diff = replay_esn->seq - seq;
281 269
282 if (pos >= diff) { 270 if (pos >= diff)
283 bitnr = (pos - diff) % replay_esn->replay_window; 271 bitnr = (pos - diff) % replay_esn->replay_window;
284 nr = bitnr >> 5; 272 else
285 bitnr = bitnr & 0x1F;
286 replay_esn->bmp[nr] |= (1U << bitnr);
287 } else {
288 bitnr = replay_esn->replay_window - (diff - pos); 273 bitnr = replay_esn->replay_window - (diff - pos);
289 nr = bitnr >> 5;
290 bitnr = bitnr & 0x1F;
291 replay_esn->bmp[nr] |= (1U << bitnr);
292 }
293 } 274 }
294 275
276 nr = bitnr >> 5;
277 bitnr = bitnr & 0x1F;
278 replay_esn->bmp[nr] |= (1U << bitnr);
279
295 if (xfrm_aevent_is_on(xs_net(x))) 280 if (xfrm_aevent_is_on(xs_net(x)))
296 xfrm_replay_notify(x, XFRM_REPLAY_UPDATE); 281 xfrm_replay_notify(x, XFRM_REPLAY_UPDATE);
297} 282}
@@ -390,8 +375,6 @@ static int xfrm_replay_check_esn(struct xfrm_state *x,
390 if (!wsize) 375 if (!wsize)
391 return 0; 376 return 0;
392 377
393 pos = (replay_esn->seq - 1) % replay_esn->replay_window;
394
395 if (unlikely(seq == 0 && replay_esn->seq_hi == 0 && 378 if (unlikely(seq == 0 && replay_esn->seq_hi == 0 &&
396 (replay_esn->seq < replay_esn->replay_window - 1))) 379 (replay_esn->seq < replay_esn->replay_window - 1)))
397 goto err; 380 goto err;
@@ -415,19 +398,18 @@ static int xfrm_replay_check_esn(struct xfrm_state *x,
415 goto err; 398 goto err;
416 } 399 }
417 400
418 if (pos >= diff) { 401 pos = (replay_esn->seq - 1) % replay_esn->replay_window;
402
403 if (pos >= diff)
419 bitnr = (pos - diff) % replay_esn->replay_window; 404 bitnr = (pos - diff) % replay_esn->replay_window;
420 nr = bitnr >> 5; 405 else
421 bitnr = bitnr & 0x1F;
422 if (replay_esn->bmp[nr] & (1U << bitnr))
423 goto err_replay;
424 } else {
425 bitnr = replay_esn->replay_window - (diff - pos); 406 bitnr = replay_esn->replay_window - (diff - pos);
426 nr = bitnr >> 5; 407
427 bitnr = bitnr & 0x1F; 408 nr = bitnr >> 5;
428 if (replay_esn->bmp[nr] & (1U << bitnr)) 409 bitnr = bitnr & 0x1F;
429 goto err_replay; 410 if (replay_esn->bmp[nr] & (1U << bitnr))
430 } 411 goto err_replay;
412
431 return 0; 413 return 0;
432 414
433err_replay: 415err_replay:
@@ -465,22 +447,13 @@ static void xfrm_replay_advance_esn(struct xfrm_state *x, __be32 net_seq)
465 bitnr = bitnr & 0x1F; 447 bitnr = bitnr & 0x1F;
466 replay_esn->bmp[nr] &= ~(1U << bitnr); 448 replay_esn->bmp[nr] &= ~(1U << bitnr);
467 } 449 }
468
469 bitnr = (pos + diff) % replay_esn->replay_window;
470 nr = bitnr >> 5;
471 bitnr = bitnr & 0x1F;
472 replay_esn->bmp[nr] |= (1U << bitnr);
473 } else { 450 } else {
474 nr = (replay_esn->replay_window - 1) >> 5; 451 nr = (replay_esn->replay_window - 1) >> 5;
475 for (i = 0; i <= nr; i++) 452 for (i = 0; i <= nr; i++)
476 replay_esn->bmp[i] = 0; 453 replay_esn->bmp[i] = 0;
477
478 bitnr = (pos + diff) % replay_esn->replay_window;
479 nr = bitnr >> 5;
480 bitnr = bitnr & 0x1F;
481 replay_esn->bmp[nr] |= (1U << bitnr);
482 } 454 }
483 455
456 bitnr = (pos + diff) % replay_esn->replay_window;
484 replay_esn->seq = seq; 457 replay_esn->seq = seq;
485 458
486 if (unlikely(wrap > 0)) 459 if (unlikely(wrap > 0))
@@ -488,19 +461,16 @@ static void xfrm_replay_advance_esn(struct xfrm_state *x, __be32 net_seq)
488 } else { 461 } else {
489 diff = replay_esn->seq - seq; 462 diff = replay_esn->seq - seq;
490 463
491 if (pos >= diff) { 464 if (pos >= diff)
492 bitnr = (pos - diff) % replay_esn->replay_window; 465 bitnr = (pos - diff) % replay_esn->replay_window;
493 nr = bitnr >> 5; 466 else
494 bitnr = bitnr & 0x1F;
495 replay_esn->bmp[nr] |= (1U << bitnr);
496 } else {
497 bitnr = replay_esn->replay_window - (diff - pos); 467 bitnr = replay_esn->replay_window - (diff - pos);
498 nr = bitnr >> 5;
499 bitnr = bitnr & 0x1F;
500 replay_esn->bmp[nr] |= (1U << bitnr);
501 }
502 } 468 }
503 469
470 nr = bitnr >> 5;
471 bitnr = bitnr & 0x1F;
472 replay_esn->bmp[nr] |= (1U << bitnr);
473
504 if (xfrm_aevent_is_on(xs_net(x))) 474 if (xfrm_aevent_is_on(xs_net(x)))
505 xfrm_replay_notify(x, XFRM_REPLAY_UPDATE); 475 xfrm_replay_notify(x, XFRM_REPLAY_UPDATE);
506} 476}