]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blame - net/xfrm/xfrm_state.c
[IPSEC]: Sync series - SA expires
[mirror_ubuntu-artful-kernel.git] / net / xfrm / xfrm_state.c
CommitLineData
1da177e4
LT
1/*
2 * xfrm_state.c
3 *
4 * Changes:
5 * Mitsuru KANDA @USAGI
6 * Kazunori MIYAZAWA @USAGI
7 * Kunihiro Ishiguro <kunihiro@ipinfusion.com>
8 * IPv6 support
9 * YOSHIFUJI Hideaki @USAGI
10 * Split up af-specific functions
11 * Derek Atkins <derek@ihtfp.com>
12 * Add UDP Encapsulation
df71837d 13 *
1da177e4
LT
14 */
15
16#include <linux/workqueue.h>
17#include <net/xfrm.h>
18#include <linux/pfkeyv2.h>
19#include <linux/ipsec.h>
20#include <linux/module.h>
21#include <asm/uaccess.h>
22
f8cd5488
JHS
23u32 sysctl_xfrm_aevent_etime = XFRM_AE_ETIME;
24u32 sysctl_xfrm_aevent_rseqth = XFRM_AE_SEQT_SIZE;
1da177e4
LT
25/* Each xfrm_state may be linked to two tables:
26
27 1. Hash table by (spi,daddr,ah/esp) to find SA by SPI. (input,ctl)
28 2. Hash table by daddr to find what SAs exist for given
29 destination/tunnel endpoint. (output)
30 */
31
32static DEFINE_SPINLOCK(xfrm_state_lock);
33
34/* Hash table to find appropriate SA towards given target (endpoint
35 * of tunnel or destination of transport mode) allowed by selector.
36 *
37 * Main use is finding SA after policy selected tunnel or transport mode.
38 * Also, it can be used by ah/esp icmp error handler to find offending SA.
39 */
40static struct list_head xfrm_state_bydst[XFRM_DST_HSIZE];
41static struct list_head xfrm_state_byspi[XFRM_DST_HSIZE];
42
43DECLARE_WAIT_QUEUE_HEAD(km_waitq);
44EXPORT_SYMBOL(km_waitq);
45
46static DEFINE_RWLOCK(xfrm_state_afinfo_lock);
47static struct xfrm_state_afinfo *xfrm_state_afinfo[NPROTO];
48
49static struct work_struct xfrm_state_gc_work;
50static struct list_head xfrm_state_gc_list = LIST_HEAD_INIT(xfrm_state_gc_list);
51static DEFINE_SPINLOCK(xfrm_state_gc_lock);
52
53static int xfrm_state_gc_flush_bundles;
54
53bc6b4d 55int __xfrm_state_delete(struct xfrm_state *x);
1da177e4
LT
56
57static struct xfrm_state_afinfo *xfrm_state_get_afinfo(unsigned short family);
58static void xfrm_state_put_afinfo(struct xfrm_state_afinfo *afinfo);
59
980ebd25 60int km_query(struct xfrm_state *x, struct xfrm_tmpl *t, struct xfrm_policy *pol);
53bc6b4d 61void km_state_expired(struct xfrm_state *x, int hard, u32 pid);
1da177e4
LT
62
63static void xfrm_state_gc_destroy(struct xfrm_state *x)
64{
65 if (del_timer(&x->timer))
66 BUG();
f8cd5488
JHS
67 if (del_timer(&x->rtimer))
68 BUG();
a51482bd
JJ
69 kfree(x->aalg);
70 kfree(x->ealg);
71 kfree(x->calg);
72 kfree(x->encap);
1da177e4
LT
73 if (x->type) {
74 x->type->destructor(x);
75 xfrm_put_type(x->type);
76 }
df71837d 77 security_xfrm_state_free(x);
1da177e4
LT
78 kfree(x);
79}
80
81static void xfrm_state_gc_task(void *data)
82{
83 struct xfrm_state *x;
84 struct list_head *entry, *tmp;
85 struct list_head gc_list = LIST_HEAD_INIT(gc_list);
86
87 if (xfrm_state_gc_flush_bundles) {
88 xfrm_state_gc_flush_bundles = 0;
89 xfrm_flush_bundles();
90 }
91
92 spin_lock_bh(&xfrm_state_gc_lock);
93 list_splice_init(&xfrm_state_gc_list, &gc_list);
94 spin_unlock_bh(&xfrm_state_gc_lock);
95
96 list_for_each_safe(entry, tmp, &gc_list) {
97 x = list_entry(entry, struct xfrm_state, bydst);
98 xfrm_state_gc_destroy(x);
99 }
100 wake_up(&km_waitq);
101}
102
103static inline unsigned long make_jiffies(long secs)
104{
105 if (secs >= (MAX_SCHEDULE_TIMEOUT-1)/HZ)
106 return MAX_SCHEDULE_TIMEOUT-1;
107 else
108 return secs*HZ;
109}
110
111static void xfrm_timer_handler(unsigned long data)
112{
113 struct xfrm_state *x = (struct xfrm_state*)data;
114 unsigned long now = (unsigned long)xtime.tv_sec;
115 long next = LONG_MAX;
116 int warn = 0;
117
118 spin_lock(&x->lock);
119 if (x->km.state == XFRM_STATE_DEAD)
120 goto out;
121 if (x->km.state == XFRM_STATE_EXPIRED)
122 goto expired;
123 if (x->lft.hard_add_expires_seconds) {
124 long tmo = x->lft.hard_add_expires_seconds +
125 x->curlft.add_time - now;
126 if (tmo <= 0)
127 goto expired;
128 if (tmo < next)
129 next = tmo;
130 }
131 if (x->lft.hard_use_expires_seconds) {
132 long tmo = x->lft.hard_use_expires_seconds +
133 (x->curlft.use_time ? : now) - now;
134 if (tmo <= 0)
135 goto expired;
136 if (tmo < next)
137 next = tmo;
138 }
139 if (x->km.dying)
140 goto resched;
141 if (x->lft.soft_add_expires_seconds) {
142 long tmo = x->lft.soft_add_expires_seconds +
143 x->curlft.add_time - now;
144 if (tmo <= 0)
145 warn = 1;
146 else if (tmo < next)
147 next = tmo;
148 }
149 if (x->lft.soft_use_expires_seconds) {
150 long tmo = x->lft.soft_use_expires_seconds +
151 (x->curlft.use_time ? : now) - now;
152 if (tmo <= 0)
153 warn = 1;
154 else if (tmo < next)
155 next = tmo;
156 }
157
4666faab 158 x->km.dying = warn;
1da177e4 159 if (warn)
53bc6b4d 160 km_state_expired(x, 0, 0);
1da177e4
LT
161resched:
162 if (next != LONG_MAX &&
163 !mod_timer(&x->timer, jiffies + make_jiffies(next)))
164 xfrm_state_hold(x);
165 goto out;
166
167expired:
168 if (x->km.state == XFRM_STATE_ACQ && x->id.spi == 0) {
169 x->km.state = XFRM_STATE_EXPIRED;
170 wake_up(&km_waitq);
171 next = 2;
172 goto resched;
173 }
4666faab 174 if (!__xfrm_state_delete(x) && x->id.spi)
53bc6b4d 175 km_state_expired(x, 1, 0);
1da177e4
LT
176
177out:
178 spin_unlock(&x->lock);
179 xfrm_state_put(x);
180}
181
182struct xfrm_state *xfrm_state_alloc(void)
183{
184 struct xfrm_state *x;
185
186 x = kmalloc(sizeof(struct xfrm_state), GFP_ATOMIC);
187
188 if (x) {
189 memset(x, 0, sizeof(struct xfrm_state));
190 atomic_set(&x->refcnt, 1);
191 atomic_set(&x->tunnel_users, 0);
192 INIT_LIST_HEAD(&x->bydst);
193 INIT_LIST_HEAD(&x->byspi);
194 init_timer(&x->timer);
195 x->timer.function = xfrm_timer_handler;
196 x->timer.data = (unsigned long)x;
f8cd5488
JHS
197 init_timer(&x->rtimer);
198 x->rtimer.function = xfrm_replay_timer_handler;
199 x->rtimer.data = (unsigned long)x;
1da177e4
LT
200 x->curlft.add_time = (unsigned long)xtime.tv_sec;
201 x->lft.soft_byte_limit = XFRM_INF;
202 x->lft.soft_packet_limit = XFRM_INF;
203 x->lft.hard_byte_limit = XFRM_INF;
204 x->lft.hard_packet_limit = XFRM_INF;
f8cd5488
JHS
205 x->replay_maxage = 0;
206 x->replay_maxdiff = 0;
1da177e4
LT
207 spin_lock_init(&x->lock);
208 }
209 return x;
210}
211EXPORT_SYMBOL(xfrm_state_alloc);
212
213void __xfrm_state_destroy(struct xfrm_state *x)
214{
215 BUG_TRAP(x->km.state == XFRM_STATE_DEAD);
216
217 spin_lock_bh(&xfrm_state_gc_lock);
218 list_add(&x->bydst, &xfrm_state_gc_list);
219 spin_unlock_bh(&xfrm_state_gc_lock);
220 schedule_work(&xfrm_state_gc_work);
221}
222EXPORT_SYMBOL(__xfrm_state_destroy);
223
53bc6b4d 224int __xfrm_state_delete(struct xfrm_state *x)
1da177e4 225{
26b15dad
JHS
226 int err = -ESRCH;
227
1da177e4
LT
228 if (x->km.state != XFRM_STATE_DEAD) {
229 x->km.state = XFRM_STATE_DEAD;
230 spin_lock(&xfrm_state_lock);
231 list_del(&x->bydst);
21380b81 232 __xfrm_state_put(x);
1da177e4
LT
233 if (x->id.spi) {
234 list_del(&x->byspi);
21380b81 235 __xfrm_state_put(x);
1da177e4
LT
236 }
237 spin_unlock(&xfrm_state_lock);
238 if (del_timer(&x->timer))
21380b81 239 __xfrm_state_put(x);
f8cd5488
JHS
240 if (del_timer(&x->rtimer))
241 __xfrm_state_put(x);
1da177e4
LT
242
243 /* The number two in this test is the reference
244 * mentioned in the comment below plus the reference
245 * our caller holds. A larger value means that
246 * there are DSTs attached to this xfrm_state.
247 */
248 if (atomic_read(&x->refcnt) > 2) {
249 xfrm_state_gc_flush_bundles = 1;
250 schedule_work(&xfrm_state_gc_work);
251 }
252
253 /* All xfrm_state objects are created by xfrm_state_alloc.
254 * The xfrm_state_alloc call gives a reference, and that
255 * is what we are dropping here.
256 */
21380b81 257 __xfrm_state_put(x);
26b15dad 258 err = 0;
1da177e4 259 }
26b15dad
JHS
260
261 return err;
1da177e4 262}
53bc6b4d 263EXPORT_SYMBOL(__xfrm_state_delete);
1da177e4 264
26b15dad 265int xfrm_state_delete(struct xfrm_state *x)
1da177e4 266{
26b15dad
JHS
267 int err;
268
1da177e4 269 spin_lock_bh(&x->lock);
26b15dad 270 err = __xfrm_state_delete(x);
1da177e4 271 spin_unlock_bh(&x->lock);
26b15dad
JHS
272
273 return err;
1da177e4
LT
274}
275EXPORT_SYMBOL(xfrm_state_delete);
276
277void xfrm_state_flush(u8 proto)
278{
279 int i;
280 struct xfrm_state *x;
281
282 spin_lock_bh(&xfrm_state_lock);
283 for (i = 0; i < XFRM_DST_HSIZE; i++) {
284restart:
285 list_for_each_entry(x, xfrm_state_bydst+i, bydst) {
286 if (!xfrm_state_kern(x) &&
287 (proto == IPSEC_PROTO_ANY || x->id.proto == proto)) {
288 xfrm_state_hold(x);
289 spin_unlock_bh(&xfrm_state_lock);
290
291 xfrm_state_delete(x);
292 xfrm_state_put(x);
293
294 spin_lock_bh(&xfrm_state_lock);
295 goto restart;
296 }
297 }
298 }
299 spin_unlock_bh(&xfrm_state_lock);
300 wake_up(&km_waitq);
301}
302EXPORT_SYMBOL(xfrm_state_flush);
303
304static int
305xfrm_init_tempsel(struct xfrm_state *x, struct flowi *fl,
306 struct xfrm_tmpl *tmpl,
307 xfrm_address_t *daddr, xfrm_address_t *saddr,
308 unsigned short family)
309{
310 struct xfrm_state_afinfo *afinfo = xfrm_state_get_afinfo(family);
311 if (!afinfo)
312 return -1;
313 afinfo->init_tempsel(x, fl, tmpl, daddr, saddr);
314 xfrm_state_put_afinfo(afinfo);
315 return 0;
316}
317
318struct xfrm_state *
319xfrm_state_find(xfrm_address_t *daddr, xfrm_address_t *saddr,
320 struct flowi *fl, struct xfrm_tmpl *tmpl,
321 struct xfrm_policy *pol, int *err,
322 unsigned short family)
323{
324 unsigned h = xfrm_dst_hash(daddr, family);
325 struct xfrm_state *x, *x0;
326 int acquire_in_progress = 0;
327 int error = 0;
328 struct xfrm_state *best = NULL;
329 struct xfrm_state_afinfo *afinfo;
330
331 afinfo = xfrm_state_get_afinfo(family);
332 if (afinfo == NULL) {
333 *err = -EAFNOSUPPORT;
334 return NULL;
335 }
336
337 spin_lock_bh(&xfrm_state_lock);
338 list_for_each_entry(x, xfrm_state_bydst+h, bydst) {
339 if (x->props.family == family &&
340 x->props.reqid == tmpl->reqid &&
341 xfrm_state_addr_check(x, daddr, saddr, family) &&
342 tmpl->mode == x->props.mode &&
343 tmpl->id.proto == x->id.proto &&
344 (tmpl->id.spi == x->id.spi || !tmpl->id.spi)) {
345 /* Resolution logic:
346 1. There is a valid state with matching selector.
347 Done.
348 2. Valid state with inappropriate selector. Skip.
349
350 Entering area of "sysdeps".
351
352 3. If state is not valid, selector is temporary,
353 it selects only session which triggered
354 previous resolution. Key manager will do
355 something to install a state with proper
356 selector.
357 */
358 if (x->km.state == XFRM_STATE_VALID) {
df71837d
TJ
359 if (!xfrm_selector_match(&x->sel, fl, family) ||
360 !xfrm_sec_ctx_match(pol->security, x->security))
1da177e4
LT
361 continue;
362 if (!best ||
363 best->km.dying > x->km.dying ||
364 (best->km.dying == x->km.dying &&
365 best->curlft.add_time < x->curlft.add_time))
366 best = x;
367 } else if (x->km.state == XFRM_STATE_ACQ) {
368 acquire_in_progress = 1;
369 } else if (x->km.state == XFRM_STATE_ERROR ||
370 x->km.state == XFRM_STATE_EXPIRED) {
df71837d
TJ
371 if (xfrm_selector_match(&x->sel, fl, family) &&
372 xfrm_sec_ctx_match(pol->security, x->security))
1da177e4
LT
373 error = -ESRCH;
374 }
375 }
376 }
377
378 x = best;
379 if (!x && !error && !acquire_in_progress) {
5c5d281a
PM
380 if (tmpl->id.spi &&
381 (x0 = afinfo->state_lookup(daddr, tmpl->id.spi,
382 tmpl->id.proto)) != NULL) {
1da177e4
LT
383 xfrm_state_put(x0);
384 error = -EEXIST;
385 goto out;
386 }
387 x = xfrm_state_alloc();
388 if (x == NULL) {
389 error = -ENOMEM;
390 goto out;
391 }
392 /* Initialize temporary selector matching only
393 * to current session. */
394 xfrm_init_tempsel(x, fl, tmpl, daddr, saddr, family);
395
396 if (km_query(x, tmpl, pol) == 0) {
397 x->km.state = XFRM_STATE_ACQ;
398 list_add_tail(&x->bydst, xfrm_state_bydst+h);
399 xfrm_state_hold(x);
400 if (x->id.spi) {
401 h = xfrm_spi_hash(&x->id.daddr, x->id.spi, x->id.proto, family);
402 list_add(&x->byspi, xfrm_state_byspi+h);
403 xfrm_state_hold(x);
404 }
405 x->lft.hard_add_expires_seconds = XFRM_ACQ_EXPIRES;
406 xfrm_state_hold(x);
407 x->timer.expires = jiffies + XFRM_ACQ_EXPIRES*HZ;
408 add_timer(&x->timer);
409 } else {
410 x->km.state = XFRM_STATE_DEAD;
411 xfrm_state_put(x);
412 x = NULL;
413 error = -ESRCH;
414 }
415 }
416out:
417 if (x)
418 xfrm_state_hold(x);
419 else
420 *err = acquire_in_progress ? -EAGAIN : error;
421 spin_unlock_bh(&xfrm_state_lock);
422 xfrm_state_put_afinfo(afinfo);
423 return x;
424}
425
426static void __xfrm_state_insert(struct xfrm_state *x)
427{
428 unsigned h = xfrm_dst_hash(&x->id.daddr, x->props.family);
429
430 list_add(&x->bydst, xfrm_state_bydst+h);
431 xfrm_state_hold(x);
432
433 h = xfrm_spi_hash(&x->id.daddr, x->id.spi, x->id.proto, x->props.family);
434
435 list_add(&x->byspi, xfrm_state_byspi+h);
436 xfrm_state_hold(x);
437
438 if (!mod_timer(&x->timer, jiffies + HZ))
439 xfrm_state_hold(x);
440
f8cd5488
JHS
441 if (x->replay_maxage &&
442 !mod_timer(&x->rtimer, jiffies + x->replay_maxage))
443 xfrm_state_hold(x);
444
1da177e4
LT
445 wake_up(&km_waitq);
446}
447
448void xfrm_state_insert(struct xfrm_state *x)
449{
450 spin_lock_bh(&xfrm_state_lock);
451 __xfrm_state_insert(x);
452 spin_unlock_bh(&xfrm_state_lock);
399c180a
DM
453
454 xfrm_flush_all_bundles();
1da177e4
LT
455}
456EXPORT_SYMBOL(xfrm_state_insert);
457
458static struct xfrm_state *__xfrm_find_acq_byseq(u32 seq);
459
460int xfrm_state_add(struct xfrm_state *x)
461{
462 struct xfrm_state_afinfo *afinfo;
463 struct xfrm_state *x1;
464 int family;
465 int err;
466
467 family = x->props.family;
468 afinfo = xfrm_state_get_afinfo(family);
469 if (unlikely(afinfo == NULL))
470 return -EAFNOSUPPORT;
471
472 spin_lock_bh(&xfrm_state_lock);
473
474 x1 = afinfo->state_lookup(&x->id.daddr, x->id.spi, x->id.proto);
475 if (x1) {
476 xfrm_state_put(x1);
477 x1 = NULL;
478 err = -EEXIST;
479 goto out;
480 }
481
482 if (x->km.seq) {
483 x1 = __xfrm_find_acq_byseq(x->km.seq);
484 if (x1 && xfrm_addr_cmp(&x1->id.daddr, &x->id.daddr, family)) {
485 xfrm_state_put(x1);
486 x1 = NULL;
487 }
488 }
489
490 if (!x1)
491 x1 = afinfo->find_acq(
492 x->props.mode, x->props.reqid, x->id.proto,
493 &x->id.daddr, &x->props.saddr, 0);
494
495 __xfrm_state_insert(x);
496 err = 0;
497
498out:
499 spin_unlock_bh(&xfrm_state_lock);
500 xfrm_state_put_afinfo(afinfo);
501
399c180a
DM
502 if (!err)
503 xfrm_flush_all_bundles();
504
1da177e4
LT
505 if (x1) {
506 xfrm_state_delete(x1);
507 xfrm_state_put(x1);
508 }
509
510 return err;
511}
512EXPORT_SYMBOL(xfrm_state_add);
513
514int xfrm_state_update(struct xfrm_state *x)
515{
516 struct xfrm_state_afinfo *afinfo;
517 struct xfrm_state *x1;
518 int err;
519
520 afinfo = xfrm_state_get_afinfo(x->props.family);
521 if (unlikely(afinfo == NULL))
522 return -EAFNOSUPPORT;
523
524 spin_lock_bh(&xfrm_state_lock);
525 x1 = afinfo->state_lookup(&x->id.daddr, x->id.spi, x->id.proto);
526
527 err = -ESRCH;
528 if (!x1)
529 goto out;
530
531 if (xfrm_state_kern(x1)) {
532 xfrm_state_put(x1);
533 err = -EEXIST;
534 goto out;
535 }
536
537 if (x1->km.state == XFRM_STATE_ACQ) {
538 __xfrm_state_insert(x);
539 x = NULL;
540 }
541 err = 0;
542
543out:
544 spin_unlock_bh(&xfrm_state_lock);
545 xfrm_state_put_afinfo(afinfo);
546
547 if (err)
548 return err;
549
550 if (!x) {
551 xfrm_state_delete(x1);
552 xfrm_state_put(x1);
553 return 0;
554 }
555
556 err = -EINVAL;
557 spin_lock_bh(&x1->lock);
558 if (likely(x1->km.state == XFRM_STATE_VALID)) {
559 if (x->encap && x1->encap)
560 memcpy(x1->encap, x->encap, sizeof(*x1->encap));
561 memcpy(&x1->lft, &x->lft, sizeof(x1->lft));
562 x1->km.dying = 0;
563
564 if (!mod_timer(&x1->timer, jiffies + HZ))
565 xfrm_state_hold(x1);
566 if (x1->curlft.use_time)
567 xfrm_state_check_expire(x1);
568
569 err = 0;
570 }
571 spin_unlock_bh(&x1->lock);
572
573 xfrm_state_put(x1);
574
575 return err;
576}
577EXPORT_SYMBOL(xfrm_state_update);
578
579int xfrm_state_check_expire(struct xfrm_state *x)
580{
581 if (!x->curlft.use_time)
582 x->curlft.use_time = (unsigned long)xtime.tv_sec;
583
584 if (x->km.state != XFRM_STATE_VALID)
585 return -EINVAL;
586
587 if (x->curlft.bytes >= x->lft.hard_byte_limit ||
588 x->curlft.packets >= x->lft.hard_packet_limit) {
4666faab
HX
589 x->km.state = XFRM_STATE_EXPIRED;
590 if (!mod_timer(&x->timer, jiffies))
1da177e4
LT
591 xfrm_state_hold(x);
592 return -EINVAL;
593 }
594
595 if (!x->km.dying &&
596 (x->curlft.bytes >= x->lft.soft_byte_limit ||
4666faab
HX
597 x->curlft.packets >= x->lft.soft_packet_limit)) {
598 x->km.dying = 1;
53bc6b4d 599 km_state_expired(x, 0, 0);
4666faab 600 }
1da177e4
LT
601 return 0;
602}
603EXPORT_SYMBOL(xfrm_state_check_expire);
604
605static int xfrm_state_check_space(struct xfrm_state *x, struct sk_buff *skb)
606{
607 int nhead = x->props.header_len + LL_RESERVED_SPACE(skb->dst->dev)
608 - skb_headroom(skb);
609
610 if (nhead > 0)
611 return pskb_expand_head(skb, nhead, 0, GFP_ATOMIC);
612
613 /* Check tail too... */
614 return 0;
615}
616
617int xfrm_state_check(struct xfrm_state *x, struct sk_buff *skb)
618{
619 int err = xfrm_state_check_expire(x);
620 if (err < 0)
621 goto err;
622 err = xfrm_state_check_space(x, skb);
623err:
624 return err;
625}
626EXPORT_SYMBOL(xfrm_state_check);
627
628struct xfrm_state *
629xfrm_state_lookup(xfrm_address_t *daddr, u32 spi, u8 proto,
630 unsigned short family)
631{
632 struct xfrm_state *x;
633 struct xfrm_state_afinfo *afinfo = xfrm_state_get_afinfo(family);
634 if (!afinfo)
635 return NULL;
636
637 spin_lock_bh(&xfrm_state_lock);
638 x = afinfo->state_lookup(daddr, spi, proto);
639 spin_unlock_bh(&xfrm_state_lock);
640 xfrm_state_put_afinfo(afinfo);
641 return x;
642}
643EXPORT_SYMBOL(xfrm_state_lookup);
644
645struct xfrm_state *
646xfrm_find_acq(u8 mode, u32 reqid, u8 proto,
647 xfrm_address_t *daddr, xfrm_address_t *saddr,
648 int create, unsigned short family)
649{
650 struct xfrm_state *x;
651 struct xfrm_state_afinfo *afinfo = xfrm_state_get_afinfo(family);
652 if (!afinfo)
653 return NULL;
654
655 spin_lock_bh(&xfrm_state_lock);
656 x = afinfo->find_acq(mode, reqid, proto, daddr, saddr, create);
657 spin_unlock_bh(&xfrm_state_lock);
658 xfrm_state_put_afinfo(afinfo);
659 return x;
660}
661EXPORT_SYMBOL(xfrm_find_acq);
662
663/* Silly enough, but I'm lazy to build resolution list */
664
665static struct xfrm_state *__xfrm_find_acq_byseq(u32 seq)
666{
667 int i;
668 struct xfrm_state *x;
669
670 for (i = 0; i < XFRM_DST_HSIZE; i++) {
671 list_for_each_entry(x, xfrm_state_bydst+i, bydst) {
672 if (x->km.seq == seq && x->km.state == XFRM_STATE_ACQ) {
673 xfrm_state_hold(x);
674 return x;
675 }
676 }
677 }
678 return NULL;
679}
680
681struct xfrm_state *xfrm_find_acq_byseq(u32 seq)
682{
683 struct xfrm_state *x;
684
685 spin_lock_bh(&xfrm_state_lock);
686 x = __xfrm_find_acq_byseq(seq);
687 spin_unlock_bh(&xfrm_state_lock);
688 return x;
689}
690EXPORT_SYMBOL(xfrm_find_acq_byseq);
691
692u32 xfrm_get_acqseq(void)
693{
694 u32 res;
695 static u32 acqseq;
696 static DEFINE_SPINLOCK(acqseq_lock);
697
698 spin_lock_bh(&acqseq_lock);
699 res = (++acqseq ? : ++acqseq);
700 spin_unlock_bh(&acqseq_lock);
701 return res;
702}
703EXPORT_SYMBOL(xfrm_get_acqseq);
704
705void
706xfrm_alloc_spi(struct xfrm_state *x, u32 minspi, u32 maxspi)
707{
708 u32 h;
709 struct xfrm_state *x0;
710
711 if (x->id.spi)
712 return;
713
714 if (minspi == maxspi) {
715 x0 = xfrm_state_lookup(&x->id.daddr, minspi, x->id.proto, x->props.family);
716 if (x0) {
717 xfrm_state_put(x0);
718 return;
719 }
720 x->id.spi = minspi;
721 } else {
722 u32 spi = 0;
723 minspi = ntohl(minspi);
724 maxspi = ntohl(maxspi);
725 for (h=0; h<maxspi-minspi+1; h++) {
726 spi = minspi + net_random()%(maxspi-minspi+1);
727 x0 = xfrm_state_lookup(&x->id.daddr, htonl(spi), x->id.proto, x->props.family);
728 if (x0 == NULL) {
729 x->id.spi = htonl(spi);
730 break;
731 }
732 xfrm_state_put(x0);
733 }
734 }
735 if (x->id.spi) {
736 spin_lock_bh(&xfrm_state_lock);
737 h = xfrm_spi_hash(&x->id.daddr, x->id.spi, x->id.proto, x->props.family);
738 list_add(&x->byspi, xfrm_state_byspi+h);
739 xfrm_state_hold(x);
740 spin_unlock_bh(&xfrm_state_lock);
741 wake_up(&km_waitq);
742 }
743}
744EXPORT_SYMBOL(xfrm_alloc_spi);
745
746int xfrm_state_walk(u8 proto, int (*func)(struct xfrm_state *, int, void*),
747 void *data)
748{
749 int i;
750 struct xfrm_state *x;
751 int count = 0;
752 int err = 0;
753
754 spin_lock_bh(&xfrm_state_lock);
755 for (i = 0; i < XFRM_DST_HSIZE; i++) {
756 list_for_each_entry(x, xfrm_state_bydst+i, bydst) {
757 if (proto == IPSEC_PROTO_ANY || x->id.proto == proto)
758 count++;
759 }
760 }
761 if (count == 0) {
762 err = -ENOENT;
763 goto out;
764 }
765
766 for (i = 0; i < XFRM_DST_HSIZE; i++) {
767 list_for_each_entry(x, xfrm_state_bydst+i, bydst) {
768 if (proto != IPSEC_PROTO_ANY && x->id.proto != proto)
769 continue;
770 err = func(x, --count, data);
771 if (err)
772 goto out;
773 }
774 }
775out:
776 spin_unlock_bh(&xfrm_state_lock);
777 return err;
778}
779EXPORT_SYMBOL(xfrm_state_walk);
780
f8cd5488
JHS
781
782void xfrm_replay_notify(struct xfrm_state *x, int event)
783{
784 struct km_event c;
785 /* we send notify messages in case
786 * 1. we updated on of the sequence numbers, and the seqno difference
787 * is at least x->replay_maxdiff, in this case we also update the
788 * timeout of our timer function
789 * 2. if x->replay_maxage has elapsed since last update,
790 * and there were changes
791 *
792 * The state structure must be locked!
793 */
794
795 switch (event) {
796 case XFRM_REPLAY_UPDATE:
797 if (x->replay_maxdiff &&
798 (x->replay.seq - x->preplay.seq < x->replay_maxdiff) &&
799 (x->replay.oseq - x->preplay.oseq < x->replay_maxdiff))
800 return;
801
802 break;
803
804 case XFRM_REPLAY_TIMEOUT:
805 if ((x->replay.seq == x->preplay.seq) &&
806 (x->replay.bitmap == x->preplay.bitmap) &&
807 (x->replay.oseq == x->preplay.oseq))
808 return;
809
810 break;
811 }
812
813 memcpy(&x->preplay, &x->replay, sizeof(struct xfrm_replay_state));
814 c.event = XFRM_MSG_NEWAE;
815 c.data.aevent = event;
816 km_state_notify(x, &c);
817
818resched:
819 if (x->replay_maxage &&
820 !mod_timer(&x->rtimer, jiffies + x->replay_maxage))
821 xfrm_state_hold(x);
822
823}
824
825static void xfrm_replay_timer_handler(unsigned long data)
826{
827 struct xfrm_state *x = (struct xfrm_state*)data;
828
829 spin_lock(&x->lock);
830
831 if (xfrm_aevent_is_on() && x->km.state == XFRM_STATE_VALID)
832 xfrm_replay_notify(x, XFRM_REPLAY_TIMEOUT);
833
834 spin_unlock(&x->lock);
835}
836
1da177e4
LT
837int xfrm_replay_check(struct xfrm_state *x, u32 seq)
838{
839 u32 diff;
840
841 seq = ntohl(seq);
842
843 if (unlikely(seq == 0))
844 return -EINVAL;
845
846 if (likely(seq > x->replay.seq))
847 return 0;
848
849 diff = x->replay.seq - seq;
850 if (diff >= x->props.replay_window) {
851 x->stats.replay_window++;
852 return -EINVAL;
853 }
854
855 if (x->replay.bitmap & (1U << diff)) {
856 x->stats.replay++;
857 return -EINVAL;
858 }
859 return 0;
860}
861EXPORT_SYMBOL(xfrm_replay_check);
862
863void xfrm_replay_advance(struct xfrm_state *x, u32 seq)
864{
865 u32 diff;
866
867 seq = ntohl(seq);
868
869 if (seq > x->replay.seq) {
870 diff = seq - x->replay.seq;
871 if (diff < x->props.replay_window)
872 x->replay.bitmap = ((x->replay.bitmap) << diff) | 1;
873 else
874 x->replay.bitmap = 1;
875 x->replay.seq = seq;
876 } else {
877 diff = x->replay.seq - seq;
878 x->replay.bitmap |= (1U << diff);
879 }
f8cd5488
JHS
880
881 if (xfrm_aevent_is_on())
882 xfrm_replay_notify(x, XFRM_REPLAY_UPDATE);
1da177e4
LT
883}
884EXPORT_SYMBOL(xfrm_replay_advance);
885
886static struct list_head xfrm_km_list = LIST_HEAD_INIT(xfrm_km_list);
887static DEFINE_RWLOCK(xfrm_km_lock);
888
26b15dad 889void km_policy_notify(struct xfrm_policy *xp, int dir, struct km_event *c)
1da177e4
LT
890{
891 struct xfrm_mgr *km;
892
26b15dad
JHS
893 read_lock(&xfrm_km_lock);
894 list_for_each_entry(km, &xfrm_km_list, list)
895 if (km->notify_policy)
896 km->notify_policy(xp, dir, c);
897 read_unlock(&xfrm_km_lock);
898}
1da177e4 899
26b15dad
JHS
900void km_state_notify(struct xfrm_state *x, struct km_event *c)
901{
902 struct xfrm_mgr *km;
1da177e4
LT
903 read_lock(&xfrm_km_lock);
904 list_for_each_entry(km, &xfrm_km_list, list)
26b15dad
JHS
905 if (km->notify)
906 km->notify(x, c);
1da177e4 907 read_unlock(&xfrm_km_lock);
26b15dad
JHS
908}
909
910EXPORT_SYMBOL(km_policy_notify);
911EXPORT_SYMBOL(km_state_notify);
912
53bc6b4d 913void km_state_expired(struct xfrm_state *x, int hard, u32 pid)
26b15dad
JHS
914{
915 struct km_event c;
916
bf08867f 917 c.data.hard = hard;
53bc6b4d 918 c.pid = pid;
f60f6b8f 919 c.event = XFRM_MSG_EXPIRE;
26b15dad 920 km_state_notify(x, &c);
1da177e4
LT
921
922 if (hard)
923 wake_up(&km_waitq);
924}
925
53bc6b4d 926EXPORT_SYMBOL(km_state_expired);
26b15dad
JHS
927/*
928 * We send to all registered managers regardless of failure
929 * We are happy with one success
930*/
980ebd25 931int km_query(struct xfrm_state *x, struct xfrm_tmpl *t, struct xfrm_policy *pol)
1da177e4 932{
26b15dad 933 int err = -EINVAL, acqret;
1da177e4
LT
934 struct xfrm_mgr *km;
935
936 read_lock(&xfrm_km_lock);
937 list_for_each_entry(km, &xfrm_km_list, list) {
26b15dad
JHS
938 acqret = km->acquire(x, t, pol, XFRM_POLICY_OUT);
939 if (!acqret)
940 err = acqret;
1da177e4
LT
941 }
942 read_unlock(&xfrm_km_lock);
943 return err;
944}
980ebd25 945EXPORT_SYMBOL(km_query);
1da177e4
LT
946
947int km_new_mapping(struct xfrm_state *x, xfrm_address_t *ipaddr, u16 sport)
948{
949 int err = -EINVAL;
950 struct xfrm_mgr *km;
951
952 read_lock(&xfrm_km_lock);
953 list_for_each_entry(km, &xfrm_km_list, list) {
954 if (km->new_mapping)
955 err = km->new_mapping(x, ipaddr, sport);
956 if (!err)
957 break;
958 }
959 read_unlock(&xfrm_km_lock);
960 return err;
961}
962EXPORT_SYMBOL(km_new_mapping);
963
964void km_policy_expired(struct xfrm_policy *pol, int dir, int hard)
965{
26b15dad 966 struct km_event c;
1da177e4 967
bf08867f 968 c.data.hard = hard;
f60f6b8f 969 c.event = XFRM_MSG_POLEXPIRE;
26b15dad 970 km_policy_notify(pol, dir, &c);
1da177e4
LT
971
972 if (hard)
973 wake_up(&km_waitq);
974}
975
976int xfrm_user_policy(struct sock *sk, int optname, u8 __user *optval, int optlen)
977{
978 int err;
979 u8 *data;
980 struct xfrm_mgr *km;
981 struct xfrm_policy *pol = NULL;
982
983 if (optlen <= 0 || optlen > PAGE_SIZE)
984 return -EMSGSIZE;
985
986 data = kmalloc(optlen, GFP_KERNEL);
987 if (!data)
988 return -ENOMEM;
989
990 err = -EFAULT;
991 if (copy_from_user(data, optval, optlen))
992 goto out;
993
994 err = -EINVAL;
995 read_lock(&xfrm_km_lock);
996 list_for_each_entry(km, &xfrm_km_list, list) {
997 pol = km->compile_policy(sk->sk_family, optname, data,
998 optlen, &err);
999 if (err >= 0)
1000 break;
1001 }
1002 read_unlock(&xfrm_km_lock);
1003
1004 if (err >= 0) {
1005 xfrm_sk_policy_insert(sk, err, pol);
1006 xfrm_pol_put(pol);
1007 err = 0;
1008 }
1009
1010out:
1011 kfree(data);
1012 return err;
1013}
1014EXPORT_SYMBOL(xfrm_user_policy);
1015
1016int xfrm_register_km(struct xfrm_mgr *km)
1017{
1018 write_lock_bh(&xfrm_km_lock);
1019 list_add_tail(&km->list, &xfrm_km_list);
1020 write_unlock_bh(&xfrm_km_lock);
1021 return 0;
1022}
1023EXPORT_SYMBOL(xfrm_register_km);
1024
1025int xfrm_unregister_km(struct xfrm_mgr *km)
1026{
1027 write_lock_bh(&xfrm_km_lock);
1028 list_del(&km->list);
1029 write_unlock_bh(&xfrm_km_lock);
1030 return 0;
1031}
1032EXPORT_SYMBOL(xfrm_unregister_km);
1033
1034int xfrm_state_register_afinfo(struct xfrm_state_afinfo *afinfo)
1035{
1036 int err = 0;
1037 if (unlikely(afinfo == NULL))
1038 return -EINVAL;
1039 if (unlikely(afinfo->family >= NPROTO))
1040 return -EAFNOSUPPORT;
1041 write_lock(&xfrm_state_afinfo_lock);
1042 if (unlikely(xfrm_state_afinfo[afinfo->family] != NULL))
1043 err = -ENOBUFS;
1044 else {
1045 afinfo->state_bydst = xfrm_state_bydst;
1046 afinfo->state_byspi = xfrm_state_byspi;
1047 xfrm_state_afinfo[afinfo->family] = afinfo;
1048 }
1049 write_unlock(&xfrm_state_afinfo_lock);
1050 return err;
1051}
1052EXPORT_SYMBOL(xfrm_state_register_afinfo);
1053
1054int xfrm_state_unregister_afinfo(struct xfrm_state_afinfo *afinfo)
1055{
1056 int err = 0;
1057 if (unlikely(afinfo == NULL))
1058 return -EINVAL;
1059 if (unlikely(afinfo->family >= NPROTO))
1060 return -EAFNOSUPPORT;
1061 write_lock(&xfrm_state_afinfo_lock);
1062 if (likely(xfrm_state_afinfo[afinfo->family] != NULL)) {
1063 if (unlikely(xfrm_state_afinfo[afinfo->family] != afinfo))
1064 err = -EINVAL;
1065 else {
1066 xfrm_state_afinfo[afinfo->family] = NULL;
1067 afinfo->state_byspi = NULL;
1068 afinfo->state_bydst = NULL;
1069 }
1070 }
1071 write_unlock(&xfrm_state_afinfo_lock);
1072 return err;
1073}
1074EXPORT_SYMBOL(xfrm_state_unregister_afinfo);
1075
1076static struct xfrm_state_afinfo *xfrm_state_get_afinfo(unsigned short family)
1077{
1078 struct xfrm_state_afinfo *afinfo;
1079 if (unlikely(family >= NPROTO))
1080 return NULL;
1081 read_lock(&xfrm_state_afinfo_lock);
1082 afinfo = xfrm_state_afinfo[family];
1083 if (likely(afinfo != NULL))
1084 read_lock(&afinfo->lock);
1085 read_unlock(&xfrm_state_afinfo_lock);
1086 return afinfo;
1087}
1088
1089static void xfrm_state_put_afinfo(struct xfrm_state_afinfo *afinfo)
1090{
1091 if (unlikely(afinfo == NULL))
1092 return;
1093 read_unlock(&afinfo->lock);
1094}
1095
1096/* Temporarily located here until net/xfrm/xfrm_tunnel.c is created */
1097void xfrm_state_delete_tunnel(struct xfrm_state *x)
1098{
1099 if (x->tunnel) {
1100 struct xfrm_state *t = x->tunnel;
1101
1102 if (atomic_read(&t->tunnel_users) == 2)
1103 xfrm_state_delete(t);
1104 atomic_dec(&t->tunnel_users);
1105 xfrm_state_put(t);
1106 x->tunnel = NULL;
1107 }
1108}
1109EXPORT_SYMBOL(xfrm_state_delete_tunnel);
1110
80b30c10
HX
1111/*
1112 * This function is NOT optimal. For example, with ESP it will give an
1113 * MTU that's usually two bytes short of being optimal. However, it will
1114 * usually give an answer that's a multiple of 4 provided the input is
1115 * also a multiple of 4.
1116 */
1da177e4
LT
1117int xfrm_state_mtu(struct xfrm_state *x, int mtu)
1118{
1119 int res = mtu;
1120
1121 res -= x->props.header_len;
1122
1123 for (;;) {
1124 int m = res;
1125
1126 if (m < 68)
1127 return 68;
1128
1129 spin_lock_bh(&x->lock);
1130 if (x->km.state == XFRM_STATE_VALID &&
1131 x->type && x->type->get_max_size)
1132 m = x->type->get_max_size(x, m);
1133 else
1134 m += x->props.header_len;
1135 spin_unlock_bh(&x->lock);
1136
1137 if (m <= mtu)
1138 break;
1139 res -= (m - mtu);
1140 }
1141
1142 return res;
1143}
1144
1145EXPORT_SYMBOL(xfrm_state_mtu);
72cb6962
HX
1146
1147int xfrm_init_state(struct xfrm_state *x)
1148{
d094cd83
HX
1149 struct xfrm_state_afinfo *afinfo;
1150 int family = x->props.family;
72cb6962
HX
1151 int err;
1152
d094cd83
HX
1153 err = -EAFNOSUPPORT;
1154 afinfo = xfrm_state_get_afinfo(family);
1155 if (!afinfo)
1156 goto error;
1157
1158 err = 0;
1159 if (afinfo->init_flags)
1160 err = afinfo->init_flags(x);
1161
1162 xfrm_state_put_afinfo(afinfo);
1163
1164 if (err)
1165 goto error;
1166
1167 err = -EPROTONOSUPPORT;
1168 x->type = xfrm_get_type(x->id.proto, family);
72cb6962
HX
1169 if (x->type == NULL)
1170 goto error;
1171
1172 err = x->type->init_state(x);
1173 if (err)
1174 goto error;
1175
1176 x->km.state = XFRM_STATE_VALID;
1177
1178error:
1179 return err;
1180}
1181
1182EXPORT_SYMBOL(xfrm_init_state);
1da177e4
LT
1183
1184void __init xfrm_state_init(void)
1185{
1186 int i;
1187
1188 for (i=0; i<XFRM_DST_HSIZE; i++) {
1189 INIT_LIST_HEAD(&xfrm_state_bydst[i]);
1190 INIT_LIST_HEAD(&xfrm_state_byspi[i]);
1191 }
1192 INIT_WORK(&xfrm_state_gc_work, xfrm_state_gc_task, NULL);
1193}
1194