[PATCH] VT binding: Make newport_con support binding
[linux-2.6/linux-acpi-2.6/ibm-acpi-2.6.git] / net / xfrm / xfrm_state.c
blob17b29ec3c41779d70562113ed1219e68ff3ae5fc
1 /*
2 * xfrm_state.c
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
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>
23 struct sock *xfrm_nl;
24 EXPORT_SYMBOL(xfrm_nl);
26 u32 sysctl_xfrm_aevent_etime = XFRM_AE_ETIME;
27 EXPORT_SYMBOL(sysctl_xfrm_aevent_etime);
29 u32 sysctl_xfrm_aevent_rseqth = XFRM_AE_SEQT_SIZE;
30 EXPORT_SYMBOL(sysctl_xfrm_aevent_rseqth);
32 /* Each xfrm_state may be linked to two tables:
34 1. Hash table by (spi,daddr,ah/esp) to find SA by SPI. (input,ctl)
35 2. Hash table by daddr to find what SAs exist for given
36 destination/tunnel endpoint. (output)
39 static DEFINE_SPINLOCK(xfrm_state_lock);
41 /* Hash table to find appropriate SA towards given target (endpoint
42 * of tunnel or destination of transport mode) allowed by selector.
44 * Main use is finding SA after policy selected tunnel or transport mode.
45 * Also, it can be used by ah/esp icmp error handler to find offending SA.
47 static struct list_head xfrm_state_bydst[XFRM_DST_HSIZE];
48 static struct list_head xfrm_state_byspi[XFRM_DST_HSIZE];
50 DECLARE_WAIT_QUEUE_HEAD(km_waitq);
51 EXPORT_SYMBOL(km_waitq);
53 static DEFINE_RWLOCK(xfrm_state_afinfo_lock);
54 static struct xfrm_state_afinfo *xfrm_state_afinfo[NPROTO];
56 static struct work_struct xfrm_state_gc_work;
57 static struct list_head xfrm_state_gc_list = LIST_HEAD_INIT(xfrm_state_gc_list);
58 static DEFINE_SPINLOCK(xfrm_state_gc_lock);
60 static int xfrm_state_gc_flush_bundles;
62 int __xfrm_state_delete(struct xfrm_state *x);
64 static struct xfrm_state_afinfo *xfrm_state_get_afinfo(unsigned short family);
65 static void xfrm_state_put_afinfo(struct xfrm_state_afinfo *afinfo);
67 int km_query(struct xfrm_state *x, struct xfrm_tmpl *t, struct xfrm_policy *pol);
68 void km_state_expired(struct xfrm_state *x, int hard, u32 pid);
70 static void xfrm_state_gc_destroy(struct xfrm_state *x)
72 if (del_timer(&x->timer))
73 BUG();
74 if (del_timer(&x->rtimer))
75 BUG();
76 kfree(x->aalg);
77 kfree(x->ealg);
78 kfree(x->calg);
79 kfree(x->encap);
80 if (x->mode)
81 xfrm_put_mode(x->mode);
82 if (x->type) {
83 x->type->destructor(x);
84 xfrm_put_type(x->type);
86 security_xfrm_state_free(x);
87 kfree(x);
90 static void xfrm_state_gc_task(void *data)
92 struct xfrm_state *x;
93 struct list_head *entry, *tmp;
94 struct list_head gc_list = LIST_HEAD_INIT(gc_list);
96 if (xfrm_state_gc_flush_bundles) {
97 xfrm_state_gc_flush_bundles = 0;
98 xfrm_flush_bundles();
101 spin_lock_bh(&xfrm_state_gc_lock);
102 list_splice_init(&xfrm_state_gc_list, &gc_list);
103 spin_unlock_bh(&xfrm_state_gc_lock);
105 list_for_each_safe(entry, tmp, &gc_list) {
106 x = list_entry(entry, struct xfrm_state, bydst);
107 xfrm_state_gc_destroy(x);
109 wake_up(&km_waitq);
112 static inline unsigned long make_jiffies(long secs)
114 if (secs >= (MAX_SCHEDULE_TIMEOUT-1)/HZ)
115 return MAX_SCHEDULE_TIMEOUT-1;
116 else
117 return secs*HZ;
120 static void xfrm_timer_handler(unsigned long data)
122 struct xfrm_state *x = (struct xfrm_state*)data;
123 unsigned long now = (unsigned long)xtime.tv_sec;
124 long next = LONG_MAX;
125 int warn = 0;
127 spin_lock(&x->lock);
128 if (x->km.state == XFRM_STATE_DEAD)
129 goto out;
130 if (x->km.state == XFRM_STATE_EXPIRED)
131 goto expired;
132 if (x->lft.hard_add_expires_seconds) {
133 long tmo = x->lft.hard_add_expires_seconds +
134 x->curlft.add_time - now;
135 if (tmo <= 0)
136 goto expired;
137 if (tmo < next)
138 next = tmo;
140 if (x->lft.hard_use_expires_seconds) {
141 long tmo = x->lft.hard_use_expires_seconds +
142 (x->curlft.use_time ? : now) - now;
143 if (tmo <= 0)
144 goto expired;
145 if (tmo < next)
146 next = tmo;
148 if (x->km.dying)
149 goto resched;
150 if (x->lft.soft_add_expires_seconds) {
151 long tmo = x->lft.soft_add_expires_seconds +
152 x->curlft.add_time - now;
153 if (tmo <= 0)
154 warn = 1;
155 else if (tmo < next)
156 next = tmo;
158 if (x->lft.soft_use_expires_seconds) {
159 long tmo = x->lft.soft_use_expires_seconds +
160 (x->curlft.use_time ? : now) - now;
161 if (tmo <= 0)
162 warn = 1;
163 else if (tmo < next)
164 next = tmo;
167 x->km.dying = warn;
168 if (warn)
169 km_state_expired(x, 0, 0);
170 resched:
171 if (next != LONG_MAX &&
172 !mod_timer(&x->timer, jiffies + make_jiffies(next)))
173 xfrm_state_hold(x);
174 goto out;
176 expired:
177 if (x->km.state == XFRM_STATE_ACQ && x->id.spi == 0) {
178 x->km.state = XFRM_STATE_EXPIRED;
179 wake_up(&km_waitq);
180 next = 2;
181 goto resched;
183 if (!__xfrm_state_delete(x) && x->id.spi)
184 km_state_expired(x, 1, 0);
186 out:
187 spin_unlock(&x->lock);
188 xfrm_state_put(x);
191 static void xfrm_replay_timer_handler(unsigned long data);
193 struct xfrm_state *xfrm_state_alloc(void)
195 struct xfrm_state *x;
197 x = kmalloc(sizeof(struct xfrm_state), GFP_ATOMIC);
199 if (x) {
200 memset(x, 0, sizeof(struct xfrm_state));
201 atomic_set(&x->refcnt, 1);
202 atomic_set(&x->tunnel_users, 0);
203 INIT_LIST_HEAD(&x->bydst);
204 INIT_LIST_HEAD(&x->byspi);
205 init_timer(&x->timer);
206 x->timer.function = xfrm_timer_handler;
207 x->timer.data = (unsigned long)x;
208 init_timer(&x->rtimer);
209 x->rtimer.function = xfrm_replay_timer_handler;
210 x->rtimer.data = (unsigned long)x;
211 x->curlft.add_time = (unsigned long)xtime.tv_sec;
212 x->lft.soft_byte_limit = XFRM_INF;
213 x->lft.soft_packet_limit = XFRM_INF;
214 x->lft.hard_byte_limit = XFRM_INF;
215 x->lft.hard_packet_limit = XFRM_INF;
216 x->replay_maxage = 0;
217 x->replay_maxdiff = 0;
218 spin_lock_init(&x->lock);
220 return x;
222 EXPORT_SYMBOL(xfrm_state_alloc);
224 void __xfrm_state_destroy(struct xfrm_state *x)
226 BUG_TRAP(x->km.state == XFRM_STATE_DEAD);
228 spin_lock_bh(&xfrm_state_gc_lock);
229 list_add(&x->bydst, &xfrm_state_gc_list);
230 spin_unlock_bh(&xfrm_state_gc_lock);
231 schedule_work(&xfrm_state_gc_work);
233 EXPORT_SYMBOL(__xfrm_state_destroy);
235 int __xfrm_state_delete(struct xfrm_state *x)
237 int err = -ESRCH;
239 if (x->km.state != XFRM_STATE_DEAD) {
240 x->km.state = XFRM_STATE_DEAD;
241 spin_lock(&xfrm_state_lock);
242 list_del(&x->bydst);
243 __xfrm_state_put(x);
244 if (x->id.spi) {
245 list_del(&x->byspi);
246 __xfrm_state_put(x);
248 spin_unlock(&xfrm_state_lock);
249 if (del_timer(&x->timer))
250 __xfrm_state_put(x);
251 if (del_timer(&x->rtimer))
252 __xfrm_state_put(x);
254 /* The number two in this test is the reference
255 * mentioned in the comment below plus the reference
256 * our caller holds. A larger value means that
257 * there are DSTs attached to this xfrm_state.
259 if (atomic_read(&x->refcnt) > 2) {
260 xfrm_state_gc_flush_bundles = 1;
261 schedule_work(&xfrm_state_gc_work);
264 /* All xfrm_state objects are created by xfrm_state_alloc.
265 * The xfrm_state_alloc call gives a reference, and that
266 * is what we are dropping here.
268 __xfrm_state_put(x);
269 err = 0;
272 return err;
274 EXPORT_SYMBOL(__xfrm_state_delete);
276 int xfrm_state_delete(struct xfrm_state *x)
278 int err;
280 spin_lock_bh(&x->lock);
281 err = __xfrm_state_delete(x);
282 spin_unlock_bh(&x->lock);
284 return err;
286 EXPORT_SYMBOL(xfrm_state_delete);
288 void xfrm_state_flush(u8 proto)
290 int i;
291 struct xfrm_state *x;
293 spin_lock_bh(&xfrm_state_lock);
294 for (i = 0; i < XFRM_DST_HSIZE; i++) {
295 restart:
296 list_for_each_entry(x, xfrm_state_bydst+i, bydst) {
297 if (!xfrm_state_kern(x) &&
298 (proto == IPSEC_PROTO_ANY || x->id.proto == proto)) {
299 xfrm_state_hold(x);
300 spin_unlock_bh(&xfrm_state_lock);
302 xfrm_state_delete(x);
303 xfrm_state_put(x);
305 spin_lock_bh(&xfrm_state_lock);
306 goto restart;
310 spin_unlock_bh(&xfrm_state_lock);
311 wake_up(&km_waitq);
313 EXPORT_SYMBOL(xfrm_state_flush);
315 static int
316 xfrm_init_tempsel(struct xfrm_state *x, struct flowi *fl,
317 struct xfrm_tmpl *tmpl,
318 xfrm_address_t *daddr, xfrm_address_t *saddr,
319 unsigned short family)
321 struct xfrm_state_afinfo *afinfo = xfrm_state_get_afinfo(family);
322 if (!afinfo)
323 return -1;
324 afinfo->init_tempsel(x, fl, tmpl, daddr, saddr);
325 xfrm_state_put_afinfo(afinfo);
326 return 0;
329 struct xfrm_state *
330 xfrm_state_find(xfrm_address_t *daddr, xfrm_address_t *saddr,
331 struct flowi *fl, struct xfrm_tmpl *tmpl,
332 struct xfrm_policy *pol, int *err,
333 unsigned short family)
335 unsigned h = xfrm_dst_hash(daddr, family);
336 struct xfrm_state *x, *x0;
337 int acquire_in_progress = 0;
338 int error = 0;
339 struct xfrm_state *best = NULL;
340 struct xfrm_state_afinfo *afinfo;
342 afinfo = xfrm_state_get_afinfo(family);
343 if (afinfo == NULL) {
344 *err = -EAFNOSUPPORT;
345 return NULL;
348 spin_lock_bh(&xfrm_state_lock);
349 list_for_each_entry(x, xfrm_state_bydst+h, bydst) {
350 if (x->props.family == family &&
351 x->props.reqid == tmpl->reqid &&
352 xfrm_state_addr_check(x, daddr, saddr, family) &&
353 tmpl->mode == x->props.mode &&
354 tmpl->id.proto == x->id.proto &&
355 (tmpl->id.spi == x->id.spi || !tmpl->id.spi)) {
356 /* Resolution logic:
357 1. There is a valid state with matching selector.
358 Done.
359 2. Valid state with inappropriate selector. Skip.
361 Entering area of "sysdeps".
363 3. If state is not valid, selector is temporary,
364 it selects only session which triggered
365 previous resolution. Key manager will do
366 something to install a state with proper
367 selector.
369 if (x->km.state == XFRM_STATE_VALID) {
370 if (!xfrm_selector_match(&x->sel, fl, family) ||
371 !xfrm_sec_ctx_match(pol->security, x->security))
372 continue;
373 if (!best ||
374 best->km.dying > x->km.dying ||
375 (best->km.dying == x->km.dying &&
376 best->curlft.add_time < x->curlft.add_time))
377 best = x;
378 } else if (x->km.state == XFRM_STATE_ACQ) {
379 acquire_in_progress = 1;
380 } else if (x->km.state == XFRM_STATE_ERROR ||
381 x->km.state == XFRM_STATE_EXPIRED) {
382 if (xfrm_selector_match(&x->sel, fl, family) &&
383 xfrm_sec_ctx_match(pol->security, x->security))
384 error = -ESRCH;
389 x = best;
390 if (!x && !error && !acquire_in_progress) {
391 if (tmpl->id.spi &&
392 (x0 = afinfo->state_lookup(daddr, tmpl->id.spi,
393 tmpl->id.proto)) != NULL) {
394 xfrm_state_put(x0);
395 error = -EEXIST;
396 goto out;
398 x = xfrm_state_alloc();
399 if (x == NULL) {
400 error = -ENOMEM;
401 goto out;
403 /* Initialize temporary selector matching only
404 * to current session. */
405 xfrm_init_tempsel(x, fl, tmpl, daddr, saddr, family);
407 if (km_query(x, tmpl, pol) == 0) {
408 x->km.state = XFRM_STATE_ACQ;
409 list_add_tail(&x->bydst, xfrm_state_bydst+h);
410 xfrm_state_hold(x);
411 if (x->id.spi) {
412 h = xfrm_spi_hash(&x->id.daddr, x->id.spi, x->id.proto, family);
413 list_add(&x->byspi, xfrm_state_byspi+h);
414 xfrm_state_hold(x);
416 x->lft.hard_add_expires_seconds = XFRM_ACQ_EXPIRES;
417 xfrm_state_hold(x);
418 x->timer.expires = jiffies + XFRM_ACQ_EXPIRES*HZ;
419 add_timer(&x->timer);
420 } else {
421 x->km.state = XFRM_STATE_DEAD;
422 xfrm_state_put(x);
423 x = NULL;
424 error = -ESRCH;
427 out:
428 if (x)
429 xfrm_state_hold(x);
430 else
431 *err = acquire_in_progress ? -EAGAIN : error;
432 spin_unlock_bh(&xfrm_state_lock);
433 xfrm_state_put_afinfo(afinfo);
434 return x;
437 static void __xfrm_state_insert(struct xfrm_state *x)
439 unsigned h = xfrm_dst_hash(&x->id.daddr, x->props.family);
441 list_add(&x->bydst, xfrm_state_bydst+h);
442 xfrm_state_hold(x);
444 h = xfrm_spi_hash(&x->id.daddr, x->id.spi, x->id.proto, x->props.family);
446 list_add(&x->byspi, xfrm_state_byspi+h);
447 xfrm_state_hold(x);
449 if (!mod_timer(&x->timer, jiffies + HZ))
450 xfrm_state_hold(x);
452 if (x->replay_maxage &&
453 !mod_timer(&x->rtimer, jiffies + x->replay_maxage))
454 xfrm_state_hold(x);
456 wake_up(&km_waitq);
459 void xfrm_state_insert(struct xfrm_state *x)
461 spin_lock_bh(&xfrm_state_lock);
462 __xfrm_state_insert(x);
463 spin_unlock_bh(&xfrm_state_lock);
465 xfrm_flush_all_bundles();
467 EXPORT_SYMBOL(xfrm_state_insert);
469 static struct xfrm_state *__xfrm_find_acq_byseq(u32 seq);
471 int xfrm_state_add(struct xfrm_state *x)
473 struct xfrm_state_afinfo *afinfo;
474 struct xfrm_state *x1;
475 int family;
476 int err;
478 family = x->props.family;
479 afinfo = xfrm_state_get_afinfo(family);
480 if (unlikely(afinfo == NULL))
481 return -EAFNOSUPPORT;
483 spin_lock_bh(&xfrm_state_lock);
485 x1 = afinfo->state_lookup(&x->id.daddr, x->id.spi, x->id.proto);
486 if (x1) {
487 xfrm_state_put(x1);
488 x1 = NULL;
489 err = -EEXIST;
490 goto out;
493 if (x->km.seq) {
494 x1 = __xfrm_find_acq_byseq(x->km.seq);
495 if (x1 && xfrm_addr_cmp(&x1->id.daddr, &x->id.daddr, family)) {
496 xfrm_state_put(x1);
497 x1 = NULL;
501 if (!x1)
502 x1 = afinfo->find_acq(
503 x->props.mode, x->props.reqid, x->id.proto,
504 &x->id.daddr, &x->props.saddr, 0);
506 __xfrm_state_insert(x);
507 err = 0;
509 out:
510 spin_unlock_bh(&xfrm_state_lock);
511 xfrm_state_put_afinfo(afinfo);
513 if (!err)
514 xfrm_flush_all_bundles();
516 if (x1) {
517 xfrm_state_delete(x1);
518 xfrm_state_put(x1);
521 return err;
523 EXPORT_SYMBOL(xfrm_state_add);
525 int xfrm_state_update(struct xfrm_state *x)
527 struct xfrm_state_afinfo *afinfo;
528 struct xfrm_state *x1;
529 int err;
531 afinfo = xfrm_state_get_afinfo(x->props.family);
532 if (unlikely(afinfo == NULL))
533 return -EAFNOSUPPORT;
535 spin_lock_bh(&xfrm_state_lock);
536 x1 = afinfo->state_lookup(&x->id.daddr, x->id.spi, x->id.proto);
538 err = -ESRCH;
539 if (!x1)
540 goto out;
542 if (xfrm_state_kern(x1)) {
543 xfrm_state_put(x1);
544 err = -EEXIST;
545 goto out;
548 if (x1->km.state == XFRM_STATE_ACQ) {
549 __xfrm_state_insert(x);
550 x = NULL;
552 err = 0;
554 out:
555 spin_unlock_bh(&xfrm_state_lock);
556 xfrm_state_put_afinfo(afinfo);
558 if (err)
559 return err;
561 if (!x) {
562 xfrm_state_delete(x1);
563 xfrm_state_put(x1);
564 return 0;
567 err = -EINVAL;
568 spin_lock_bh(&x1->lock);
569 if (likely(x1->km.state == XFRM_STATE_VALID)) {
570 if (x->encap && x1->encap)
571 memcpy(x1->encap, x->encap, sizeof(*x1->encap));
572 memcpy(&x1->lft, &x->lft, sizeof(x1->lft));
573 x1->km.dying = 0;
575 if (!mod_timer(&x1->timer, jiffies + HZ))
576 xfrm_state_hold(x1);
577 if (x1->curlft.use_time)
578 xfrm_state_check_expire(x1);
580 err = 0;
582 spin_unlock_bh(&x1->lock);
584 xfrm_state_put(x1);
586 return err;
588 EXPORT_SYMBOL(xfrm_state_update);
590 int xfrm_state_check_expire(struct xfrm_state *x)
592 if (!x->curlft.use_time)
593 x->curlft.use_time = (unsigned long)xtime.tv_sec;
595 if (x->km.state != XFRM_STATE_VALID)
596 return -EINVAL;
598 if (x->curlft.bytes >= x->lft.hard_byte_limit ||
599 x->curlft.packets >= x->lft.hard_packet_limit) {
600 x->km.state = XFRM_STATE_EXPIRED;
601 if (!mod_timer(&x->timer, jiffies))
602 xfrm_state_hold(x);
603 return -EINVAL;
606 if (!x->km.dying &&
607 (x->curlft.bytes >= x->lft.soft_byte_limit ||
608 x->curlft.packets >= x->lft.soft_packet_limit)) {
609 x->km.dying = 1;
610 km_state_expired(x, 0, 0);
612 return 0;
614 EXPORT_SYMBOL(xfrm_state_check_expire);
616 static int xfrm_state_check_space(struct xfrm_state *x, struct sk_buff *skb)
618 int nhead = x->props.header_len + LL_RESERVED_SPACE(skb->dst->dev)
619 - skb_headroom(skb);
621 if (nhead > 0)
622 return pskb_expand_head(skb, nhead, 0, GFP_ATOMIC);
624 /* Check tail too... */
625 return 0;
628 int xfrm_state_check(struct xfrm_state *x, struct sk_buff *skb)
630 int err = xfrm_state_check_expire(x);
631 if (err < 0)
632 goto err;
633 err = xfrm_state_check_space(x, skb);
634 err:
635 return err;
637 EXPORT_SYMBOL(xfrm_state_check);
639 struct xfrm_state *
640 xfrm_state_lookup(xfrm_address_t *daddr, u32 spi, u8 proto,
641 unsigned short family)
643 struct xfrm_state *x;
644 struct xfrm_state_afinfo *afinfo = xfrm_state_get_afinfo(family);
645 if (!afinfo)
646 return NULL;
648 spin_lock_bh(&xfrm_state_lock);
649 x = afinfo->state_lookup(daddr, spi, proto);
650 spin_unlock_bh(&xfrm_state_lock);
651 xfrm_state_put_afinfo(afinfo);
652 return x;
654 EXPORT_SYMBOL(xfrm_state_lookup);
656 struct xfrm_state *
657 xfrm_find_acq(u8 mode, u32 reqid, u8 proto,
658 xfrm_address_t *daddr, xfrm_address_t *saddr,
659 int create, unsigned short family)
661 struct xfrm_state *x;
662 struct xfrm_state_afinfo *afinfo = xfrm_state_get_afinfo(family);
663 if (!afinfo)
664 return NULL;
666 spin_lock_bh(&xfrm_state_lock);
667 x = afinfo->find_acq(mode, reqid, proto, daddr, saddr, create);
668 spin_unlock_bh(&xfrm_state_lock);
669 xfrm_state_put_afinfo(afinfo);
670 return x;
672 EXPORT_SYMBOL(xfrm_find_acq);
674 /* Silly enough, but I'm lazy to build resolution list */
676 static struct xfrm_state *__xfrm_find_acq_byseq(u32 seq)
678 int i;
679 struct xfrm_state *x;
681 for (i = 0; i < XFRM_DST_HSIZE; i++) {
682 list_for_each_entry(x, xfrm_state_bydst+i, bydst) {
683 if (x->km.seq == seq && x->km.state == XFRM_STATE_ACQ) {
684 xfrm_state_hold(x);
685 return x;
689 return NULL;
692 struct xfrm_state *xfrm_find_acq_byseq(u32 seq)
694 struct xfrm_state *x;
696 spin_lock_bh(&xfrm_state_lock);
697 x = __xfrm_find_acq_byseq(seq);
698 spin_unlock_bh(&xfrm_state_lock);
699 return x;
701 EXPORT_SYMBOL(xfrm_find_acq_byseq);
703 u32 xfrm_get_acqseq(void)
705 u32 res;
706 static u32 acqseq;
707 static DEFINE_SPINLOCK(acqseq_lock);
709 spin_lock_bh(&acqseq_lock);
710 res = (++acqseq ? : ++acqseq);
711 spin_unlock_bh(&acqseq_lock);
712 return res;
714 EXPORT_SYMBOL(xfrm_get_acqseq);
716 void
717 xfrm_alloc_spi(struct xfrm_state *x, u32 minspi, u32 maxspi)
719 u32 h;
720 struct xfrm_state *x0;
722 if (x->id.spi)
723 return;
725 if (minspi == maxspi) {
726 x0 = xfrm_state_lookup(&x->id.daddr, minspi, x->id.proto, x->props.family);
727 if (x0) {
728 xfrm_state_put(x0);
729 return;
731 x->id.spi = minspi;
732 } else {
733 u32 spi = 0;
734 minspi = ntohl(minspi);
735 maxspi = ntohl(maxspi);
736 for (h=0; h<maxspi-minspi+1; h++) {
737 spi = minspi + net_random()%(maxspi-minspi+1);
738 x0 = xfrm_state_lookup(&x->id.daddr, htonl(spi), x->id.proto, x->props.family);
739 if (x0 == NULL) {
740 x->id.spi = htonl(spi);
741 break;
743 xfrm_state_put(x0);
746 if (x->id.spi) {
747 spin_lock_bh(&xfrm_state_lock);
748 h = xfrm_spi_hash(&x->id.daddr, x->id.spi, x->id.proto, x->props.family);
749 list_add(&x->byspi, xfrm_state_byspi+h);
750 xfrm_state_hold(x);
751 spin_unlock_bh(&xfrm_state_lock);
752 wake_up(&km_waitq);
755 EXPORT_SYMBOL(xfrm_alloc_spi);
757 int xfrm_state_walk(u8 proto, int (*func)(struct xfrm_state *, int, void*),
758 void *data)
760 int i;
761 struct xfrm_state *x;
762 int count = 0;
763 int err = 0;
765 spin_lock_bh(&xfrm_state_lock);
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 count++;
772 if (count == 0) {
773 err = -ENOENT;
774 goto out;
777 for (i = 0; i < XFRM_DST_HSIZE; i++) {
778 list_for_each_entry(x, xfrm_state_bydst+i, bydst) {
779 if (proto != IPSEC_PROTO_ANY && x->id.proto != proto)
780 continue;
781 err = func(x, --count, data);
782 if (err)
783 goto out;
786 out:
787 spin_unlock_bh(&xfrm_state_lock);
788 return err;
790 EXPORT_SYMBOL(xfrm_state_walk);
793 void xfrm_replay_notify(struct xfrm_state *x, int event)
795 struct km_event c;
796 /* we send notify messages in case
797 * 1. we updated on of the sequence numbers, and the seqno difference
798 * is at least x->replay_maxdiff, in this case we also update the
799 * timeout of our timer function
800 * 2. if x->replay_maxage has elapsed since last update,
801 * and there were changes
803 * The state structure must be locked!
806 switch (event) {
807 case XFRM_REPLAY_UPDATE:
808 if (x->replay_maxdiff &&
809 (x->replay.seq - x->preplay.seq < x->replay_maxdiff) &&
810 (x->replay.oseq - x->preplay.oseq < x->replay_maxdiff)) {
811 if (x->xflags & XFRM_TIME_DEFER)
812 event = XFRM_REPLAY_TIMEOUT;
813 else
814 return;
817 break;
819 case XFRM_REPLAY_TIMEOUT:
820 if ((x->replay.seq == x->preplay.seq) &&
821 (x->replay.bitmap == x->preplay.bitmap) &&
822 (x->replay.oseq == x->preplay.oseq)) {
823 x->xflags |= XFRM_TIME_DEFER;
824 return;
827 break;
830 memcpy(&x->preplay, &x->replay, sizeof(struct xfrm_replay_state));
831 c.event = XFRM_MSG_NEWAE;
832 c.data.aevent = event;
833 km_state_notify(x, &c);
835 if (x->replay_maxage &&
836 !mod_timer(&x->rtimer, jiffies + x->replay_maxage)) {
837 xfrm_state_hold(x);
838 x->xflags &= ~XFRM_TIME_DEFER;
841 EXPORT_SYMBOL(xfrm_replay_notify);
843 static void xfrm_replay_timer_handler(unsigned long data)
845 struct xfrm_state *x = (struct xfrm_state*)data;
847 spin_lock(&x->lock);
849 if (x->km.state == XFRM_STATE_VALID) {
850 if (xfrm_aevent_is_on())
851 xfrm_replay_notify(x, XFRM_REPLAY_TIMEOUT);
852 else
853 x->xflags |= XFRM_TIME_DEFER;
856 spin_unlock(&x->lock);
857 xfrm_state_put(x);
860 int xfrm_replay_check(struct xfrm_state *x, u32 seq)
862 u32 diff;
864 seq = ntohl(seq);
866 if (unlikely(seq == 0))
867 return -EINVAL;
869 if (likely(seq > x->replay.seq))
870 return 0;
872 diff = x->replay.seq - seq;
873 if (diff >= x->props.replay_window) {
874 x->stats.replay_window++;
875 return -EINVAL;
878 if (x->replay.bitmap & (1U << diff)) {
879 x->stats.replay++;
880 return -EINVAL;
882 return 0;
884 EXPORT_SYMBOL(xfrm_replay_check);
886 void xfrm_replay_advance(struct xfrm_state *x, u32 seq)
888 u32 diff;
890 seq = ntohl(seq);
892 if (seq > x->replay.seq) {
893 diff = seq - x->replay.seq;
894 if (diff < x->props.replay_window)
895 x->replay.bitmap = ((x->replay.bitmap) << diff) | 1;
896 else
897 x->replay.bitmap = 1;
898 x->replay.seq = seq;
899 } else {
900 diff = x->replay.seq - seq;
901 x->replay.bitmap |= (1U << diff);
904 if (xfrm_aevent_is_on())
905 xfrm_replay_notify(x, XFRM_REPLAY_UPDATE);
907 EXPORT_SYMBOL(xfrm_replay_advance);
909 static struct list_head xfrm_km_list = LIST_HEAD_INIT(xfrm_km_list);
910 static DEFINE_RWLOCK(xfrm_km_lock);
912 void km_policy_notify(struct xfrm_policy *xp, int dir, struct km_event *c)
914 struct xfrm_mgr *km;
916 read_lock(&xfrm_km_lock);
917 list_for_each_entry(km, &xfrm_km_list, list)
918 if (km->notify_policy)
919 km->notify_policy(xp, dir, c);
920 read_unlock(&xfrm_km_lock);
923 void km_state_notify(struct xfrm_state *x, struct km_event *c)
925 struct xfrm_mgr *km;
926 read_lock(&xfrm_km_lock);
927 list_for_each_entry(km, &xfrm_km_list, list)
928 if (km->notify)
929 km->notify(x, c);
930 read_unlock(&xfrm_km_lock);
933 EXPORT_SYMBOL(km_policy_notify);
934 EXPORT_SYMBOL(km_state_notify);
936 void km_state_expired(struct xfrm_state *x, int hard, u32 pid)
938 struct km_event c;
940 c.data.hard = hard;
941 c.pid = pid;
942 c.event = XFRM_MSG_EXPIRE;
943 km_state_notify(x, &c);
945 if (hard)
946 wake_up(&km_waitq);
949 EXPORT_SYMBOL(km_state_expired);
951 * We send to all registered managers regardless of failure
952 * We are happy with one success
954 int km_query(struct xfrm_state *x, struct xfrm_tmpl *t, struct xfrm_policy *pol)
956 int err = -EINVAL, acqret;
957 struct xfrm_mgr *km;
959 read_lock(&xfrm_km_lock);
960 list_for_each_entry(km, &xfrm_km_list, list) {
961 acqret = km->acquire(x, t, pol, XFRM_POLICY_OUT);
962 if (!acqret)
963 err = acqret;
965 read_unlock(&xfrm_km_lock);
966 return err;
968 EXPORT_SYMBOL(km_query);
970 int km_new_mapping(struct xfrm_state *x, xfrm_address_t *ipaddr, u16 sport)
972 int err = -EINVAL;
973 struct xfrm_mgr *km;
975 read_lock(&xfrm_km_lock);
976 list_for_each_entry(km, &xfrm_km_list, list) {
977 if (km->new_mapping)
978 err = km->new_mapping(x, ipaddr, sport);
979 if (!err)
980 break;
982 read_unlock(&xfrm_km_lock);
983 return err;
985 EXPORT_SYMBOL(km_new_mapping);
987 void km_policy_expired(struct xfrm_policy *pol, int dir, int hard, u32 pid)
989 struct km_event c;
991 c.data.hard = hard;
992 c.pid = pid;
993 c.event = XFRM_MSG_POLEXPIRE;
994 km_policy_notify(pol, dir, &c);
996 if (hard)
997 wake_up(&km_waitq);
999 EXPORT_SYMBOL(km_policy_expired);
1001 int xfrm_user_policy(struct sock *sk, int optname, u8 __user *optval, int optlen)
1003 int err;
1004 u8 *data;
1005 struct xfrm_mgr *km;
1006 struct xfrm_policy *pol = NULL;
1008 if (optlen <= 0 || optlen > PAGE_SIZE)
1009 return -EMSGSIZE;
1011 data = kmalloc(optlen, GFP_KERNEL);
1012 if (!data)
1013 return -ENOMEM;
1015 err = -EFAULT;
1016 if (copy_from_user(data, optval, optlen))
1017 goto out;
1019 err = -EINVAL;
1020 read_lock(&xfrm_km_lock);
1021 list_for_each_entry(km, &xfrm_km_list, list) {
1022 pol = km->compile_policy(sk->sk_family, optname, data,
1023 optlen, &err);
1024 if (err >= 0)
1025 break;
1027 read_unlock(&xfrm_km_lock);
1029 if (err >= 0) {
1030 xfrm_sk_policy_insert(sk, err, pol);
1031 xfrm_pol_put(pol);
1032 err = 0;
1035 out:
1036 kfree(data);
1037 return err;
1039 EXPORT_SYMBOL(xfrm_user_policy);
1041 int xfrm_register_km(struct xfrm_mgr *km)
1043 write_lock_bh(&xfrm_km_lock);
1044 list_add_tail(&km->list, &xfrm_km_list);
1045 write_unlock_bh(&xfrm_km_lock);
1046 return 0;
1048 EXPORT_SYMBOL(xfrm_register_km);
1050 int xfrm_unregister_km(struct xfrm_mgr *km)
1052 write_lock_bh(&xfrm_km_lock);
1053 list_del(&km->list);
1054 write_unlock_bh(&xfrm_km_lock);
1055 return 0;
1057 EXPORT_SYMBOL(xfrm_unregister_km);
1059 int xfrm_state_register_afinfo(struct xfrm_state_afinfo *afinfo)
1061 int err = 0;
1062 if (unlikely(afinfo == NULL))
1063 return -EINVAL;
1064 if (unlikely(afinfo->family >= NPROTO))
1065 return -EAFNOSUPPORT;
1066 write_lock_bh(&xfrm_state_afinfo_lock);
1067 if (unlikely(xfrm_state_afinfo[afinfo->family] != NULL))
1068 err = -ENOBUFS;
1069 else {
1070 afinfo->state_bydst = xfrm_state_bydst;
1071 afinfo->state_byspi = xfrm_state_byspi;
1072 xfrm_state_afinfo[afinfo->family] = afinfo;
1074 write_unlock_bh(&xfrm_state_afinfo_lock);
1075 return err;
1077 EXPORT_SYMBOL(xfrm_state_register_afinfo);
1079 int xfrm_state_unregister_afinfo(struct xfrm_state_afinfo *afinfo)
1081 int err = 0;
1082 if (unlikely(afinfo == NULL))
1083 return -EINVAL;
1084 if (unlikely(afinfo->family >= NPROTO))
1085 return -EAFNOSUPPORT;
1086 write_lock_bh(&xfrm_state_afinfo_lock);
1087 if (likely(xfrm_state_afinfo[afinfo->family] != NULL)) {
1088 if (unlikely(xfrm_state_afinfo[afinfo->family] != afinfo))
1089 err = -EINVAL;
1090 else {
1091 xfrm_state_afinfo[afinfo->family] = NULL;
1092 afinfo->state_byspi = NULL;
1093 afinfo->state_bydst = NULL;
1096 write_unlock_bh(&xfrm_state_afinfo_lock);
1097 return err;
1099 EXPORT_SYMBOL(xfrm_state_unregister_afinfo);
1101 static struct xfrm_state_afinfo *xfrm_state_get_afinfo(unsigned short family)
1103 struct xfrm_state_afinfo *afinfo;
1104 if (unlikely(family >= NPROTO))
1105 return NULL;
1106 read_lock(&xfrm_state_afinfo_lock);
1107 afinfo = xfrm_state_afinfo[family];
1108 if (unlikely(!afinfo))
1109 read_unlock(&xfrm_state_afinfo_lock);
1110 return afinfo;
1113 static void xfrm_state_put_afinfo(struct xfrm_state_afinfo *afinfo)
1115 read_unlock(&xfrm_state_afinfo_lock);
1118 /* Temporarily located here until net/xfrm/xfrm_tunnel.c is created */
1119 void xfrm_state_delete_tunnel(struct xfrm_state *x)
1121 if (x->tunnel) {
1122 struct xfrm_state *t = x->tunnel;
1124 if (atomic_read(&t->tunnel_users) == 2)
1125 xfrm_state_delete(t);
1126 atomic_dec(&t->tunnel_users);
1127 xfrm_state_put(t);
1128 x->tunnel = NULL;
1131 EXPORT_SYMBOL(xfrm_state_delete_tunnel);
1134 * This function is NOT optimal. For example, with ESP it will give an
1135 * MTU that's usually two bytes short of being optimal. However, it will
1136 * usually give an answer that's a multiple of 4 provided the input is
1137 * also a multiple of 4.
1139 int xfrm_state_mtu(struct xfrm_state *x, int mtu)
1141 int res = mtu;
1143 res -= x->props.header_len;
1145 for (;;) {
1146 int m = res;
1148 if (m < 68)
1149 return 68;
1151 spin_lock_bh(&x->lock);
1152 if (x->km.state == XFRM_STATE_VALID &&
1153 x->type && x->type->get_max_size)
1154 m = x->type->get_max_size(x, m);
1155 else
1156 m += x->props.header_len;
1157 spin_unlock_bh(&x->lock);
1159 if (m <= mtu)
1160 break;
1161 res -= (m - mtu);
1164 return res;
1167 EXPORT_SYMBOL(xfrm_state_mtu);
1169 int xfrm_init_state(struct xfrm_state *x)
1171 struct xfrm_state_afinfo *afinfo;
1172 int family = x->props.family;
1173 int err;
1175 err = -EAFNOSUPPORT;
1176 afinfo = xfrm_state_get_afinfo(family);
1177 if (!afinfo)
1178 goto error;
1180 err = 0;
1181 if (afinfo->init_flags)
1182 err = afinfo->init_flags(x);
1184 xfrm_state_put_afinfo(afinfo);
1186 if (err)
1187 goto error;
1189 err = -EPROTONOSUPPORT;
1190 x->type = xfrm_get_type(x->id.proto, family);
1191 if (x->type == NULL)
1192 goto error;
1194 err = x->type->init_state(x);
1195 if (err)
1196 goto error;
1198 x->mode = xfrm_get_mode(x->props.mode, family);
1199 if (x->mode == NULL)
1200 goto error;
1202 x->km.state = XFRM_STATE_VALID;
1204 error:
1205 return err;
1208 EXPORT_SYMBOL(xfrm_init_state);
1210 void __init xfrm_state_init(void)
1212 int i;
1214 for (i=0; i<XFRM_DST_HSIZE; i++) {
1215 INIT_LIST_HEAD(&xfrm_state_bydst[i]);
1216 INIT_LIST_HEAD(&xfrm_state_byspi[i]);
1218 INIT_WORK(&xfrm_state_gc_work, xfrm_state_gc_task, NULL);