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