[IPSEC]: Move xfrm_state_check into xfrm_output.c
[deliverable/linux.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 <linux/cache.h>
22 #include <asm/uaccess.h>
23
24 #include "xfrm_hash.h"
25
26 struct sock *xfrm_nl;
27 EXPORT_SYMBOL(xfrm_nl);
28
29 u32 sysctl_xfrm_aevent_etime __read_mostly = XFRM_AE_ETIME;
30 EXPORT_SYMBOL(sysctl_xfrm_aevent_etime);
31
32 u32 sysctl_xfrm_aevent_rseqth __read_mostly = XFRM_AE_SEQT_SIZE;
33 EXPORT_SYMBOL(sysctl_xfrm_aevent_rseqth);
34
35 u32 sysctl_xfrm_acq_expires __read_mostly = 30;
36
37 /* Each xfrm_state may be linked to two tables:
38
39 1. Hash table by (spi,daddr,ah/esp) to find SA by SPI. (input,ctl)
40 2. Hash table by (daddr,family,reqid) to find what SAs exist for given
41 destination/tunnel endpoint. (output)
42 */
43
44 static DEFINE_SPINLOCK(xfrm_state_lock);
45
46 /* Hash table to find appropriate SA towards given target (endpoint
47 * of tunnel or destination of transport mode) allowed by selector.
48 *
49 * Main use is finding SA after policy selected tunnel or transport mode.
50 * Also, it can be used by ah/esp icmp error handler to find offending SA.
51 */
52 static struct hlist_head *xfrm_state_bydst __read_mostly;
53 static struct hlist_head *xfrm_state_bysrc __read_mostly;
54 static struct hlist_head *xfrm_state_byspi __read_mostly;
55 static unsigned int xfrm_state_hmask __read_mostly;
56 static unsigned int xfrm_state_hashmax __read_mostly = 1 * 1024 * 1024;
57 static unsigned int xfrm_state_num;
58 static unsigned int xfrm_state_genid;
59
60 static inline unsigned int xfrm_dst_hash(xfrm_address_t *daddr,
61 xfrm_address_t *saddr,
62 u32 reqid,
63 unsigned short family)
64 {
65 return __xfrm_dst_hash(daddr, saddr, reqid, family, xfrm_state_hmask);
66 }
67
68 static inline unsigned int xfrm_src_hash(xfrm_address_t *daddr,
69 xfrm_address_t *saddr,
70 unsigned short family)
71 {
72 return __xfrm_src_hash(daddr, saddr, family, xfrm_state_hmask);
73 }
74
75 static inline unsigned int
76 xfrm_spi_hash(xfrm_address_t *daddr, __be32 spi, u8 proto, unsigned short family)
77 {
78 return __xfrm_spi_hash(daddr, spi, proto, family, xfrm_state_hmask);
79 }
80
81 static void xfrm_hash_transfer(struct hlist_head *list,
82 struct hlist_head *ndsttable,
83 struct hlist_head *nsrctable,
84 struct hlist_head *nspitable,
85 unsigned int nhashmask)
86 {
87 struct hlist_node *entry, *tmp;
88 struct xfrm_state *x;
89
90 hlist_for_each_entry_safe(x, entry, tmp, list, bydst) {
91 unsigned int h;
92
93 h = __xfrm_dst_hash(&x->id.daddr, &x->props.saddr,
94 x->props.reqid, x->props.family,
95 nhashmask);
96 hlist_add_head(&x->bydst, ndsttable+h);
97
98 h = __xfrm_src_hash(&x->id.daddr, &x->props.saddr,
99 x->props.family,
100 nhashmask);
101 hlist_add_head(&x->bysrc, nsrctable+h);
102
103 if (x->id.spi) {
104 h = __xfrm_spi_hash(&x->id.daddr, x->id.spi,
105 x->id.proto, x->props.family,
106 nhashmask);
107 hlist_add_head(&x->byspi, nspitable+h);
108 }
109 }
110 }
111
112 static unsigned long xfrm_hash_new_size(void)
113 {
114 return ((xfrm_state_hmask + 1) << 1) *
115 sizeof(struct hlist_head);
116 }
117
118 static DEFINE_MUTEX(hash_resize_mutex);
119
120 static void xfrm_hash_resize(struct work_struct *__unused)
121 {
122 struct hlist_head *ndst, *nsrc, *nspi, *odst, *osrc, *ospi;
123 unsigned long nsize, osize;
124 unsigned int nhashmask, ohashmask;
125 int i;
126
127 mutex_lock(&hash_resize_mutex);
128
129 nsize = xfrm_hash_new_size();
130 ndst = xfrm_hash_alloc(nsize);
131 if (!ndst)
132 goto out_unlock;
133 nsrc = xfrm_hash_alloc(nsize);
134 if (!nsrc) {
135 xfrm_hash_free(ndst, nsize);
136 goto out_unlock;
137 }
138 nspi = xfrm_hash_alloc(nsize);
139 if (!nspi) {
140 xfrm_hash_free(ndst, nsize);
141 xfrm_hash_free(nsrc, nsize);
142 goto out_unlock;
143 }
144
145 spin_lock_bh(&xfrm_state_lock);
146
147 nhashmask = (nsize / sizeof(struct hlist_head)) - 1U;
148 for (i = xfrm_state_hmask; i >= 0; i--)
149 xfrm_hash_transfer(xfrm_state_bydst+i, ndst, nsrc, nspi,
150 nhashmask);
151
152 odst = xfrm_state_bydst;
153 osrc = xfrm_state_bysrc;
154 ospi = xfrm_state_byspi;
155 ohashmask = xfrm_state_hmask;
156
157 xfrm_state_bydst = ndst;
158 xfrm_state_bysrc = nsrc;
159 xfrm_state_byspi = nspi;
160 xfrm_state_hmask = nhashmask;
161
162 spin_unlock_bh(&xfrm_state_lock);
163
164 osize = (ohashmask + 1) * sizeof(struct hlist_head);
165 xfrm_hash_free(odst, osize);
166 xfrm_hash_free(osrc, osize);
167 xfrm_hash_free(ospi, osize);
168
169 out_unlock:
170 mutex_unlock(&hash_resize_mutex);
171 }
172
173 static DECLARE_WORK(xfrm_hash_work, xfrm_hash_resize);
174
175 DECLARE_WAIT_QUEUE_HEAD(km_waitq);
176 EXPORT_SYMBOL(km_waitq);
177
178 static DEFINE_RWLOCK(xfrm_state_afinfo_lock);
179 static struct xfrm_state_afinfo *xfrm_state_afinfo[NPROTO];
180
181 static struct work_struct xfrm_state_gc_work;
182 static HLIST_HEAD(xfrm_state_gc_list);
183 static DEFINE_SPINLOCK(xfrm_state_gc_lock);
184
185 int __xfrm_state_delete(struct xfrm_state *x);
186
187 int km_query(struct xfrm_state *x, struct xfrm_tmpl *t, struct xfrm_policy *pol);
188 void km_state_expired(struct xfrm_state *x, int hard, u32 pid);
189
190 static void xfrm_state_gc_destroy(struct xfrm_state *x)
191 {
192 del_timer_sync(&x->timer);
193 del_timer_sync(&x->rtimer);
194 kfree(x->aalg);
195 kfree(x->ealg);
196 kfree(x->calg);
197 kfree(x->encap);
198 kfree(x->coaddr);
199 if (x->mode)
200 xfrm_put_mode(x->mode);
201 if (x->type) {
202 x->type->destructor(x);
203 xfrm_put_type(x->type);
204 }
205 security_xfrm_state_free(x);
206 kfree(x);
207 }
208
209 static void xfrm_state_gc_task(struct work_struct *data)
210 {
211 struct xfrm_state *x;
212 struct hlist_node *entry, *tmp;
213 struct hlist_head gc_list;
214
215 spin_lock_bh(&xfrm_state_gc_lock);
216 gc_list.first = xfrm_state_gc_list.first;
217 INIT_HLIST_HEAD(&xfrm_state_gc_list);
218 spin_unlock_bh(&xfrm_state_gc_lock);
219
220 hlist_for_each_entry_safe(x, entry, tmp, &gc_list, bydst)
221 xfrm_state_gc_destroy(x);
222
223 wake_up(&km_waitq);
224 }
225
226 static inline unsigned long make_jiffies(long secs)
227 {
228 if (secs >= (MAX_SCHEDULE_TIMEOUT-1)/HZ)
229 return MAX_SCHEDULE_TIMEOUT-1;
230 else
231 return secs*HZ;
232 }
233
234 static void xfrm_timer_handler(unsigned long data)
235 {
236 struct xfrm_state *x = (struct xfrm_state*)data;
237 unsigned long now = get_seconds();
238 long next = LONG_MAX;
239 int warn = 0;
240 int err = 0;
241
242 spin_lock(&x->lock);
243 if (x->km.state == XFRM_STATE_DEAD)
244 goto out;
245 if (x->km.state == XFRM_STATE_EXPIRED)
246 goto expired;
247 if (x->lft.hard_add_expires_seconds) {
248 long tmo = x->lft.hard_add_expires_seconds +
249 x->curlft.add_time - now;
250 if (tmo <= 0)
251 goto expired;
252 if (tmo < next)
253 next = tmo;
254 }
255 if (x->lft.hard_use_expires_seconds) {
256 long tmo = x->lft.hard_use_expires_seconds +
257 (x->curlft.use_time ? : now) - now;
258 if (tmo <= 0)
259 goto expired;
260 if (tmo < next)
261 next = tmo;
262 }
263 if (x->km.dying)
264 goto resched;
265 if (x->lft.soft_add_expires_seconds) {
266 long tmo = x->lft.soft_add_expires_seconds +
267 x->curlft.add_time - now;
268 if (tmo <= 0)
269 warn = 1;
270 else if (tmo < next)
271 next = tmo;
272 }
273 if (x->lft.soft_use_expires_seconds) {
274 long tmo = x->lft.soft_use_expires_seconds +
275 (x->curlft.use_time ? : now) - now;
276 if (tmo <= 0)
277 warn = 1;
278 else if (tmo < next)
279 next = tmo;
280 }
281
282 x->km.dying = warn;
283 if (warn)
284 km_state_expired(x, 0, 0);
285 resched:
286 if (next != LONG_MAX)
287 mod_timer(&x->timer, jiffies + make_jiffies(next));
288
289 goto out;
290
291 expired:
292 if (x->km.state == XFRM_STATE_ACQ && x->id.spi == 0) {
293 x->km.state = XFRM_STATE_EXPIRED;
294 wake_up(&km_waitq);
295 next = 2;
296 goto resched;
297 }
298
299 err = __xfrm_state_delete(x);
300 if (!err && x->id.spi)
301 km_state_expired(x, 1, 0);
302
303 xfrm_audit_state_delete(x, err ? 0 : 1,
304 audit_get_loginuid(current->audit_context), 0);
305
306 out:
307 spin_unlock(&x->lock);
308 }
309
310 static void xfrm_replay_timer_handler(unsigned long data);
311
312 struct xfrm_state *xfrm_state_alloc(void)
313 {
314 struct xfrm_state *x;
315
316 x = kzalloc(sizeof(struct xfrm_state), GFP_ATOMIC);
317
318 if (x) {
319 atomic_set(&x->refcnt, 1);
320 atomic_set(&x->tunnel_users, 0);
321 INIT_HLIST_NODE(&x->bydst);
322 INIT_HLIST_NODE(&x->bysrc);
323 INIT_HLIST_NODE(&x->byspi);
324 init_timer(&x->timer);
325 x->timer.function = xfrm_timer_handler;
326 x->timer.data = (unsigned long)x;
327 init_timer(&x->rtimer);
328 x->rtimer.function = xfrm_replay_timer_handler;
329 x->rtimer.data = (unsigned long)x;
330 x->curlft.add_time = get_seconds();
331 x->lft.soft_byte_limit = XFRM_INF;
332 x->lft.soft_packet_limit = XFRM_INF;
333 x->lft.hard_byte_limit = XFRM_INF;
334 x->lft.hard_packet_limit = XFRM_INF;
335 x->replay_maxage = 0;
336 x->replay_maxdiff = 0;
337 spin_lock_init(&x->lock);
338 }
339 return x;
340 }
341 EXPORT_SYMBOL(xfrm_state_alloc);
342
343 void __xfrm_state_destroy(struct xfrm_state *x)
344 {
345 BUG_TRAP(x->km.state == XFRM_STATE_DEAD);
346
347 spin_lock_bh(&xfrm_state_gc_lock);
348 hlist_add_head(&x->bydst, &xfrm_state_gc_list);
349 spin_unlock_bh(&xfrm_state_gc_lock);
350 schedule_work(&xfrm_state_gc_work);
351 }
352 EXPORT_SYMBOL(__xfrm_state_destroy);
353
354 int __xfrm_state_delete(struct xfrm_state *x)
355 {
356 int err = -ESRCH;
357
358 if (x->km.state != XFRM_STATE_DEAD) {
359 x->km.state = XFRM_STATE_DEAD;
360 spin_lock(&xfrm_state_lock);
361 hlist_del(&x->bydst);
362 hlist_del(&x->bysrc);
363 if (x->id.spi)
364 hlist_del(&x->byspi);
365 xfrm_state_num--;
366 spin_unlock(&xfrm_state_lock);
367
368 /* All xfrm_state objects are created by xfrm_state_alloc.
369 * The xfrm_state_alloc call gives a reference, and that
370 * is what we are dropping here.
371 */
372 __xfrm_state_put(x);
373 err = 0;
374 }
375
376 return err;
377 }
378 EXPORT_SYMBOL(__xfrm_state_delete);
379
380 int xfrm_state_delete(struct xfrm_state *x)
381 {
382 int err;
383
384 spin_lock_bh(&x->lock);
385 err = __xfrm_state_delete(x);
386 spin_unlock_bh(&x->lock);
387
388 return err;
389 }
390 EXPORT_SYMBOL(xfrm_state_delete);
391
392 #ifdef CONFIG_SECURITY_NETWORK_XFRM
393 static inline int
394 xfrm_state_flush_secctx_check(u8 proto, struct xfrm_audit *audit_info)
395 {
396 int i, err = 0;
397
398 for (i = 0; i <= xfrm_state_hmask; i++) {
399 struct hlist_node *entry;
400 struct xfrm_state *x;
401
402 hlist_for_each_entry(x, entry, xfrm_state_bydst+i, bydst) {
403 if (xfrm_id_proto_match(x->id.proto, proto) &&
404 (err = security_xfrm_state_delete(x)) != 0) {
405 xfrm_audit_state_delete(x, 0,
406 audit_info->loginuid,
407 audit_info->secid);
408 return err;
409 }
410 }
411 }
412
413 return err;
414 }
415 #else
416 static inline int
417 xfrm_state_flush_secctx_check(u8 proto, struct xfrm_audit *audit_info)
418 {
419 return 0;
420 }
421 #endif
422
423 int xfrm_state_flush(u8 proto, struct xfrm_audit *audit_info)
424 {
425 int i, err = 0;
426
427 spin_lock_bh(&xfrm_state_lock);
428 err = xfrm_state_flush_secctx_check(proto, audit_info);
429 if (err)
430 goto out;
431
432 for (i = 0; i <= xfrm_state_hmask; i++) {
433 struct hlist_node *entry;
434 struct xfrm_state *x;
435 restart:
436 hlist_for_each_entry(x, entry, xfrm_state_bydst+i, bydst) {
437 if (!xfrm_state_kern(x) &&
438 xfrm_id_proto_match(x->id.proto, proto)) {
439 xfrm_state_hold(x);
440 spin_unlock_bh(&xfrm_state_lock);
441
442 err = xfrm_state_delete(x);
443 xfrm_audit_state_delete(x, err ? 0 : 1,
444 audit_info->loginuid,
445 audit_info->secid);
446 xfrm_state_put(x);
447
448 spin_lock_bh(&xfrm_state_lock);
449 goto restart;
450 }
451 }
452 }
453 err = 0;
454
455 out:
456 spin_unlock_bh(&xfrm_state_lock);
457 wake_up(&km_waitq);
458 return err;
459 }
460 EXPORT_SYMBOL(xfrm_state_flush);
461
462 void xfrm_sad_getinfo(struct xfrmk_sadinfo *si)
463 {
464 spin_lock_bh(&xfrm_state_lock);
465 si->sadcnt = xfrm_state_num;
466 si->sadhcnt = xfrm_state_hmask;
467 si->sadhmcnt = xfrm_state_hashmax;
468 spin_unlock_bh(&xfrm_state_lock);
469 }
470 EXPORT_SYMBOL(xfrm_sad_getinfo);
471
472 static int
473 xfrm_init_tempsel(struct xfrm_state *x, struct flowi *fl,
474 struct xfrm_tmpl *tmpl,
475 xfrm_address_t *daddr, xfrm_address_t *saddr,
476 unsigned short family)
477 {
478 struct xfrm_state_afinfo *afinfo = xfrm_state_get_afinfo(family);
479 if (!afinfo)
480 return -1;
481 afinfo->init_tempsel(x, fl, tmpl, daddr, saddr);
482 xfrm_state_put_afinfo(afinfo);
483 return 0;
484 }
485
486 static struct xfrm_state *__xfrm_state_lookup(xfrm_address_t *daddr, __be32 spi, u8 proto, unsigned short family)
487 {
488 unsigned int h = xfrm_spi_hash(daddr, spi, proto, family);
489 struct xfrm_state *x;
490 struct hlist_node *entry;
491
492 hlist_for_each_entry(x, entry, xfrm_state_byspi+h, byspi) {
493 if (x->props.family != family ||
494 x->id.spi != spi ||
495 x->id.proto != proto)
496 continue;
497
498 switch (family) {
499 case AF_INET:
500 if (x->id.daddr.a4 != daddr->a4)
501 continue;
502 break;
503 case AF_INET6:
504 if (!ipv6_addr_equal((struct in6_addr *)daddr,
505 (struct in6_addr *)
506 x->id.daddr.a6))
507 continue;
508 break;
509 }
510
511 xfrm_state_hold(x);
512 return x;
513 }
514
515 return NULL;
516 }
517
518 static struct xfrm_state *__xfrm_state_lookup_byaddr(xfrm_address_t *daddr, xfrm_address_t *saddr, u8 proto, unsigned short family)
519 {
520 unsigned int h = xfrm_src_hash(daddr, saddr, family);
521 struct xfrm_state *x;
522 struct hlist_node *entry;
523
524 hlist_for_each_entry(x, entry, xfrm_state_bysrc+h, bysrc) {
525 if (x->props.family != family ||
526 x->id.proto != proto)
527 continue;
528
529 switch (family) {
530 case AF_INET:
531 if (x->id.daddr.a4 != daddr->a4 ||
532 x->props.saddr.a4 != saddr->a4)
533 continue;
534 break;
535 case AF_INET6:
536 if (!ipv6_addr_equal((struct in6_addr *)daddr,
537 (struct in6_addr *)
538 x->id.daddr.a6) ||
539 !ipv6_addr_equal((struct in6_addr *)saddr,
540 (struct in6_addr *)
541 x->props.saddr.a6))
542 continue;
543 break;
544 }
545
546 xfrm_state_hold(x);
547 return x;
548 }
549
550 return NULL;
551 }
552
553 static inline struct xfrm_state *
554 __xfrm_state_locate(struct xfrm_state *x, int use_spi, int family)
555 {
556 if (use_spi)
557 return __xfrm_state_lookup(&x->id.daddr, x->id.spi,
558 x->id.proto, family);
559 else
560 return __xfrm_state_lookup_byaddr(&x->id.daddr,
561 &x->props.saddr,
562 x->id.proto, family);
563 }
564
565 static void xfrm_hash_grow_check(int have_hash_collision)
566 {
567 if (have_hash_collision &&
568 (xfrm_state_hmask + 1) < xfrm_state_hashmax &&
569 xfrm_state_num > xfrm_state_hmask)
570 schedule_work(&xfrm_hash_work);
571 }
572
573 struct xfrm_state *
574 xfrm_state_find(xfrm_address_t *daddr, xfrm_address_t *saddr,
575 struct flowi *fl, struct xfrm_tmpl *tmpl,
576 struct xfrm_policy *pol, int *err,
577 unsigned short family)
578 {
579 unsigned int h = xfrm_dst_hash(daddr, saddr, tmpl->reqid, family);
580 struct hlist_node *entry;
581 struct xfrm_state *x, *x0;
582 int acquire_in_progress = 0;
583 int error = 0;
584 struct xfrm_state *best = NULL;
585
586 spin_lock_bh(&xfrm_state_lock);
587 hlist_for_each_entry(x, entry, xfrm_state_bydst+h, bydst) {
588 if (x->props.family == family &&
589 x->props.reqid == tmpl->reqid &&
590 !(x->props.flags & XFRM_STATE_WILDRECV) &&
591 xfrm_state_addr_check(x, daddr, saddr, family) &&
592 tmpl->mode == x->props.mode &&
593 tmpl->id.proto == x->id.proto &&
594 (tmpl->id.spi == x->id.spi || !tmpl->id.spi)) {
595 /* Resolution logic:
596 1. There is a valid state with matching selector.
597 Done.
598 2. Valid state with inappropriate selector. Skip.
599
600 Entering area of "sysdeps".
601
602 3. If state is not valid, selector is temporary,
603 it selects only session which triggered
604 previous resolution. Key manager will do
605 something to install a state with proper
606 selector.
607 */
608 if (x->km.state == XFRM_STATE_VALID) {
609 if (!xfrm_selector_match(&x->sel, fl, x->sel.family) ||
610 !security_xfrm_state_pol_flow_match(x, pol, fl))
611 continue;
612 if (!best ||
613 best->km.dying > x->km.dying ||
614 (best->km.dying == x->km.dying &&
615 best->curlft.add_time < x->curlft.add_time))
616 best = x;
617 } else if (x->km.state == XFRM_STATE_ACQ) {
618 acquire_in_progress = 1;
619 } else if (x->km.state == XFRM_STATE_ERROR ||
620 x->km.state == XFRM_STATE_EXPIRED) {
621 if (xfrm_selector_match(&x->sel, fl, x->sel.family) &&
622 security_xfrm_state_pol_flow_match(x, pol, fl))
623 error = -ESRCH;
624 }
625 }
626 }
627
628 x = best;
629 if (!x && !error && !acquire_in_progress) {
630 if (tmpl->id.spi &&
631 (x0 = __xfrm_state_lookup(daddr, tmpl->id.spi,
632 tmpl->id.proto, family)) != NULL) {
633 xfrm_state_put(x0);
634 error = -EEXIST;
635 goto out;
636 }
637 x = xfrm_state_alloc();
638 if (x == NULL) {
639 error = -ENOMEM;
640 goto out;
641 }
642 /* Initialize temporary selector matching only
643 * to current session. */
644 xfrm_init_tempsel(x, fl, tmpl, daddr, saddr, family);
645
646 error = security_xfrm_state_alloc_acquire(x, pol->security, fl->secid);
647 if (error) {
648 x->km.state = XFRM_STATE_DEAD;
649 xfrm_state_put(x);
650 x = NULL;
651 goto out;
652 }
653
654 if (km_query(x, tmpl, pol) == 0) {
655 x->km.state = XFRM_STATE_ACQ;
656 hlist_add_head(&x->bydst, xfrm_state_bydst+h);
657 h = xfrm_src_hash(daddr, saddr, family);
658 hlist_add_head(&x->bysrc, xfrm_state_bysrc+h);
659 if (x->id.spi) {
660 h = xfrm_spi_hash(&x->id.daddr, x->id.spi, x->id.proto, family);
661 hlist_add_head(&x->byspi, xfrm_state_byspi+h);
662 }
663 x->lft.hard_add_expires_seconds = sysctl_xfrm_acq_expires;
664 x->timer.expires = jiffies + sysctl_xfrm_acq_expires*HZ;
665 add_timer(&x->timer);
666 xfrm_state_num++;
667 xfrm_hash_grow_check(x->bydst.next != NULL);
668 } else {
669 x->km.state = XFRM_STATE_DEAD;
670 xfrm_state_put(x);
671 x = NULL;
672 error = -ESRCH;
673 }
674 }
675 out:
676 if (x)
677 xfrm_state_hold(x);
678 else
679 *err = acquire_in_progress ? -EAGAIN : error;
680 spin_unlock_bh(&xfrm_state_lock);
681 return x;
682 }
683
684 struct xfrm_state *
685 xfrm_stateonly_find(xfrm_address_t *daddr, xfrm_address_t *saddr,
686 unsigned short family, u8 mode, u8 proto, u32 reqid)
687 {
688 unsigned int h = xfrm_dst_hash(daddr, saddr, reqid, family);
689 struct xfrm_state *rx = NULL, *x = NULL;
690 struct hlist_node *entry;
691
692 spin_lock(&xfrm_state_lock);
693 hlist_for_each_entry(x, entry, xfrm_state_bydst+h, bydst) {
694 if (x->props.family == family &&
695 x->props.reqid == reqid &&
696 !(x->props.flags & XFRM_STATE_WILDRECV) &&
697 xfrm_state_addr_check(x, daddr, saddr, family) &&
698 mode == x->props.mode &&
699 proto == x->id.proto &&
700 x->km.state == XFRM_STATE_VALID) {
701 rx = x;
702 break;
703 }
704 }
705
706 if (rx)
707 xfrm_state_hold(rx);
708 spin_unlock(&xfrm_state_lock);
709
710
711 return rx;
712 }
713 EXPORT_SYMBOL(xfrm_stateonly_find);
714
715 static void __xfrm_state_insert(struct xfrm_state *x)
716 {
717 unsigned int h;
718
719 x->genid = ++xfrm_state_genid;
720
721 h = xfrm_dst_hash(&x->id.daddr, &x->props.saddr,
722 x->props.reqid, x->props.family);
723 hlist_add_head(&x->bydst, xfrm_state_bydst+h);
724
725 h = xfrm_src_hash(&x->id.daddr, &x->props.saddr, x->props.family);
726 hlist_add_head(&x->bysrc, xfrm_state_bysrc+h);
727
728 if (x->id.spi) {
729 h = xfrm_spi_hash(&x->id.daddr, x->id.spi, x->id.proto,
730 x->props.family);
731
732 hlist_add_head(&x->byspi, xfrm_state_byspi+h);
733 }
734
735 mod_timer(&x->timer, jiffies + HZ);
736 if (x->replay_maxage)
737 mod_timer(&x->rtimer, jiffies + x->replay_maxage);
738
739 wake_up(&km_waitq);
740
741 xfrm_state_num++;
742
743 xfrm_hash_grow_check(x->bydst.next != NULL);
744 }
745
746 /* xfrm_state_lock is held */
747 static void __xfrm_state_bump_genids(struct xfrm_state *xnew)
748 {
749 unsigned short family = xnew->props.family;
750 u32 reqid = xnew->props.reqid;
751 struct xfrm_state *x;
752 struct hlist_node *entry;
753 unsigned int h;
754
755 h = xfrm_dst_hash(&xnew->id.daddr, &xnew->props.saddr, reqid, family);
756 hlist_for_each_entry(x, entry, xfrm_state_bydst+h, bydst) {
757 if (x->props.family == family &&
758 x->props.reqid == reqid &&
759 !xfrm_addr_cmp(&x->id.daddr, &xnew->id.daddr, family) &&
760 !xfrm_addr_cmp(&x->props.saddr, &xnew->props.saddr, family))
761 x->genid = xfrm_state_genid;
762 }
763 }
764
765 void xfrm_state_insert(struct xfrm_state *x)
766 {
767 spin_lock_bh(&xfrm_state_lock);
768 __xfrm_state_bump_genids(x);
769 __xfrm_state_insert(x);
770 spin_unlock_bh(&xfrm_state_lock);
771 }
772 EXPORT_SYMBOL(xfrm_state_insert);
773
774 /* xfrm_state_lock is held */
775 static struct xfrm_state *__find_acq_core(unsigned short family, u8 mode, u32 reqid, u8 proto, xfrm_address_t *daddr, xfrm_address_t *saddr, int create)
776 {
777 unsigned int h = xfrm_dst_hash(daddr, saddr, reqid, family);
778 struct hlist_node *entry;
779 struct xfrm_state *x;
780
781 hlist_for_each_entry(x, entry, xfrm_state_bydst+h, bydst) {
782 if (x->props.reqid != reqid ||
783 x->props.mode != mode ||
784 x->props.family != family ||
785 x->km.state != XFRM_STATE_ACQ ||
786 x->id.spi != 0 ||
787 x->id.proto != proto)
788 continue;
789
790 switch (family) {
791 case AF_INET:
792 if (x->id.daddr.a4 != daddr->a4 ||
793 x->props.saddr.a4 != saddr->a4)
794 continue;
795 break;
796 case AF_INET6:
797 if (!ipv6_addr_equal((struct in6_addr *)x->id.daddr.a6,
798 (struct in6_addr *)daddr) ||
799 !ipv6_addr_equal((struct in6_addr *)
800 x->props.saddr.a6,
801 (struct in6_addr *)saddr))
802 continue;
803 break;
804 }
805
806 xfrm_state_hold(x);
807 return x;
808 }
809
810 if (!create)
811 return NULL;
812
813 x = xfrm_state_alloc();
814 if (likely(x)) {
815 switch (family) {
816 case AF_INET:
817 x->sel.daddr.a4 = daddr->a4;
818 x->sel.saddr.a4 = saddr->a4;
819 x->sel.prefixlen_d = 32;
820 x->sel.prefixlen_s = 32;
821 x->props.saddr.a4 = saddr->a4;
822 x->id.daddr.a4 = daddr->a4;
823 break;
824
825 case AF_INET6:
826 ipv6_addr_copy((struct in6_addr *)x->sel.daddr.a6,
827 (struct in6_addr *)daddr);
828 ipv6_addr_copy((struct in6_addr *)x->sel.saddr.a6,
829 (struct in6_addr *)saddr);
830 x->sel.prefixlen_d = 128;
831 x->sel.prefixlen_s = 128;
832 ipv6_addr_copy((struct in6_addr *)x->props.saddr.a6,
833 (struct in6_addr *)saddr);
834 ipv6_addr_copy((struct in6_addr *)x->id.daddr.a6,
835 (struct in6_addr *)daddr);
836 break;
837 }
838
839 x->km.state = XFRM_STATE_ACQ;
840 x->id.proto = proto;
841 x->props.family = family;
842 x->props.mode = mode;
843 x->props.reqid = reqid;
844 x->lft.hard_add_expires_seconds = sysctl_xfrm_acq_expires;
845 xfrm_state_hold(x);
846 x->timer.expires = jiffies + sysctl_xfrm_acq_expires*HZ;
847 add_timer(&x->timer);
848 hlist_add_head(&x->bydst, xfrm_state_bydst+h);
849 h = xfrm_src_hash(daddr, saddr, family);
850 hlist_add_head(&x->bysrc, xfrm_state_bysrc+h);
851 wake_up(&km_waitq);
852
853 xfrm_state_num++;
854
855 xfrm_hash_grow_check(x->bydst.next != NULL);
856 }
857
858 return x;
859 }
860
861 static struct xfrm_state *__xfrm_find_acq_byseq(u32 seq);
862
863 int xfrm_state_add(struct xfrm_state *x)
864 {
865 struct xfrm_state *x1;
866 int family;
867 int err;
868 int use_spi = xfrm_id_proto_match(x->id.proto, IPSEC_PROTO_ANY);
869
870 family = x->props.family;
871
872 spin_lock_bh(&xfrm_state_lock);
873
874 x1 = __xfrm_state_locate(x, use_spi, family);
875 if (x1) {
876 xfrm_state_put(x1);
877 x1 = NULL;
878 err = -EEXIST;
879 goto out;
880 }
881
882 if (use_spi && x->km.seq) {
883 x1 = __xfrm_find_acq_byseq(x->km.seq);
884 if (x1 && ((x1->id.proto != x->id.proto) ||
885 xfrm_addr_cmp(&x1->id.daddr, &x->id.daddr, family))) {
886 xfrm_state_put(x1);
887 x1 = NULL;
888 }
889 }
890
891 if (use_spi && !x1)
892 x1 = __find_acq_core(family, x->props.mode, x->props.reqid,
893 x->id.proto,
894 &x->id.daddr, &x->props.saddr, 0);
895
896 __xfrm_state_bump_genids(x);
897 __xfrm_state_insert(x);
898 err = 0;
899
900 out:
901 spin_unlock_bh(&xfrm_state_lock);
902
903 if (x1) {
904 xfrm_state_delete(x1);
905 xfrm_state_put(x1);
906 }
907
908 return err;
909 }
910 EXPORT_SYMBOL(xfrm_state_add);
911
912 #ifdef CONFIG_XFRM_MIGRATE
913 struct xfrm_state *xfrm_state_clone(struct xfrm_state *orig, int *errp)
914 {
915 int err = -ENOMEM;
916 struct xfrm_state *x = xfrm_state_alloc();
917 if (!x)
918 goto error;
919
920 memcpy(&x->id, &orig->id, sizeof(x->id));
921 memcpy(&x->sel, &orig->sel, sizeof(x->sel));
922 memcpy(&x->lft, &orig->lft, sizeof(x->lft));
923 x->props.mode = orig->props.mode;
924 x->props.replay_window = orig->props.replay_window;
925 x->props.reqid = orig->props.reqid;
926 x->props.family = orig->props.family;
927 x->props.saddr = orig->props.saddr;
928
929 if (orig->aalg) {
930 x->aalg = xfrm_algo_clone(orig->aalg);
931 if (!x->aalg)
932 goto error;
933 }
934 x->props.aalgo = orig->props.aalgo;
935
936 if (orig->ealg) {
937 x->ealg = xfrm_algo_clone(orig->ealg);
938 if (!x->ealg)
939 goto error;
940 }
941 x->props.ealgo = orig->props.ealgo;
942
943 if (orig->calg) {
944 x->calg = xfrm_algo_clone(orig->calg);
945 if (!x->calg)
946 goto error;
947 }
948 x->props.calgo = orig->props.calgo;
949
950 if (orig->encap) {
951 x->encap = kmemdup(orig->encap, sizeof(*x->encap), GFP_KERNEL);
952 if (!x->encap)
953 goto error;
954 }
955
956 if (orig->coaddr) {
957 x->coaddr = kmemdup(orig->coaddr, sizeof(*x->coaddr),
958 GFP_KERNEL);
959 if (!x->coaddr)
960 goto error;
961 }
962
963 err = xfrm_init_state(x);
964 if (err)
965 goto error;
966
967 x->props.flags = orig->props.flags;
968
969 x->curlft.add_time = orig->curlft.add_time;
970 x->km.state = orig->km.state;
971 x->km.seq = orig->km.seq;
972
973 return x;
974
975 error:
976 if (errp)
977 *errp = err;
978 if (x) {
979 kfree(x->aalg);
980 kfree(x->ealg);
981 kfree(x->calg);
982 kfree(x->encap);
983 kfree(x->coaddr);
984 }
985 kfree(x);
986 return NULL;
987 }
988 EXPORT_SYMBOL(xfrm_state_clone);
989
990 /* xfrm_state_lock is held */
991 struct xfrm_state * xfrm_migrate_state_find(struct xfrm_migrate *m)
992 {
993 unsigned int h;
994 struct xfrm_state *x;
995 struct hlist_node *entry;
996
997 if (m->reqid) {
998 h = xfrm_dst_hash(&m->old_daddr, &m->old_saddr,
999 m->reqid, m->old_family);
1000 hlist_for_each_entry(x, entry, xfrm_state_bydst+h, bydst) {
1001 if (x->props.mode != m->mode ||
1002 x->id.proto != m->proto)
1003 continue;
1004 if (m->reqid && x->props.reqid != m->reqid)
1005 continue;
1006 if (xfrm_addr_cmp(&x->id.daddr, &m->old_daddr,
1007 m->old_family) ||
1008 xfrm_addr_cmp(&x->props.saddr, &m->old_saddr,
1009 m->old_family))
1010 continue;
1011 xfrm_state_hold(x);
1012 return x;
1013 }
1014 } else {
1015 h = xfrm_src_hash(&m->old_daddr, &m->old_saddr,
1016 m->old_family);
1017 hlist_for_each_entry(x, entry, xfrm_state_bysrc+h, bysrc) {
1018 if (x->props.mode != m->mode ||
1019 x->id.proto != m->proto)
1020 continue;
1021 if (xfrm_addr_cmp(&x->id.daddr, &m->old_daddr,
1022 m->old_family) ||
1023 xfrm_addr_cmp(&x->props.saddr, &m->old_saddr,
1024 m->old_family))
1025 continue;
1026 xfrm_state_hold(x);
1027 return x;
1028 }
1029 }
1030
1031 return NULL;
1032 }
1033 EXPORT_SYMBOL(xfrm_migrate_state_find);
1034
1035 struct xfrm_state * xfrm_state_migrate(struct xfrm_state *x,
1036 struct xfrm_migrate *m)
1037 {
1038 struct xfrm_state *xc;
1039 int err;
1040
1041 xc = xfrm_state_clone(x, &err);
1042 if (!xc)
1043 return NULL;
1044
1045 memcpy(&xc->id.daddr, &m->new_daddr, sizeof(xc->id.daddr));
1046 memcpy(&xc->props.saddr, &m->new_saddr, sizeof(xc->props.saddr));
1047
1048 /* add state */
1049 if (!xfrm_addr_cmp(&x->id.daddr, &m->new_daddr, m->new_family)) {
1050 /* a care is needed when the destination address of the
1051 state is to be updated as it is a part of triplet */
1052 xfrm_state_insert(xc);
1053 } else {
1054 if ((err = xfrm_state_add(xc)) < 0)
1055 goto error;
1056 }
1057
1058 return xc;
1059 error:
1060 kfree(xc);
1061 return NULL;
1062 }
1063 EXPORT_SYMBOL(xfrm_state_migrate);
1064 #endif
1065
1066 int xfrm_state_update(struct xfrm_state *x)
1067 {
1068 struct xfrm_state *x1;
1069 int err;
1070 int use_spi = xfrm_id_proto_match(x->id.proto, IPSEC_PROTO_ANY);
1071
1072 spin_lock_bh(&xfrm_state_lock);
1073 x1 = __xfrm_state_locate(x, use_spi, x->props.family);
1074
1075 err = -ESRCH;
1076 if (!x1)
1077 goto out;
1078
1079 if (xfrm_state_kern(x1)) {
1080 xfrm_state_put(x1);
1081 err = -EEXIST;
1082 goto out;
1083 }
1084
1085 if (x1->km.state == XFRM_STATE_ACQ) {
1086 __xfrm_state_insert(x);
1087 x = NULL;
1088 }
1089 err = 0;
1090
1091 out:
1092 spin_unlock_bh(&xfrm_state_lock);
1093
1094 if (err)
1095 return err;
1096
1097 if (!x) {
1098 xfrm_state_delete(x1);
1099 xfrm_state_put(x1);
1100 return 0;
1101 }
1102
1103 err = -EINVAL;
1104 spin_lock_bh(&x1->lock);
1105 if (likely(x1->km.state == XFRM_STATE_VALID)) {
1106 if (x->encap && x1->encap)
1107 memcpy(x1->encap, x->encap, sizeof(*x1->encap));
1108 if (x->coaddr && x1->coaddr) {
1109 memcpy(x1->coaddr, x->coaddr, sizeof(*x1->coaddr));
1110 }
1111 if (!use_spi && memcmp(&x1->sel, &x->sel, sizeof(x1->sel)))
1112 memcpy(&x1->sel, &x->sel, sizeof(x1->sel));
1113 memcpy(&x1->lft, &x->lft, sizeof(x1->lft));
1114 x1->km.dying = 0;
1115
1116 mod_timer(&x1->timer, jiffies + HZ);
1117 if (x1->curlft.use_time)
1118 xfrm_state_check_expire(x1);
1119
1120 err = 0;
1121 }
1122 spin_unlock_bh(&x1->lock);
1123
1124 xfrm_state_put(x1);
1125
1126 return err;
1127 }
1128 EXPORT_SYMBOL(xfrm_state_update);
1129
1130 int xfrm_state_check_expire(struct xfrm_state *x)
1131 {
1132 if (!x->curlft.use_time)
1133 x->curlft.use_time = get_seconds();
1134
1135 if (x->km.state != XFRM_STATE_VALID)
1136 return -EINVAL;
1137
1138 if (x->curlft.bytes >= x->lft.hard_byte_limit ||
1139 x->curlft.packets >= x->lft.hard_packet_limit) {
1140 x->km.state = XFRM_STATE_EXPIRED;
1141 mod_timer(&x->timer, jiffies);
1142 return -EINVAL;
1143 }
1144
1145 if (!x->km.dying &&
1146 (x->curlft.bytes >= x->lft.soft_byte_limit ||
1147 x->curlft.packets >= x->lft.soft_packet_limit)) {
1148 x->km.dying = 1;
1149 km_state_expired(x, 0, 0);
1150 }
1151 return 0;
1152 }
1153 EXPORT_SYMBOL(xfrm_state_check_expire);
1154
1155 struct xfrm_state *
1156 xfrm_state_lookup(xfrm_address_t *daddr, __be32 spi, u8 proto,
1157 unsigned short family)
1158 {
1159 struct xfrm_state *x;
1160
1161 spin_lock_bh(&xfrm_state_lock);
1162 x = __xfrm_state_lookup(daddr, spi, proto, family);
1163 spin_unlock_bh(&xfrm_state_lock);
1164 return x;
1165 }
1166 EXPORT_SYMBOL(xfrm_state_lookup);
1167
1168 struct xfrm_state *
1169 xfrm_state_lookup_byaddr(xfrm_address_t *daddr, xfrm_address_t *saddr,
1170 u8 proto, unsigned short family)
1171 {
1172 struct xfrm_state *x;
1173
1174 spin_lock_bh(&xfrm_state_lock);
1175 x = __xfrm_state_lookup_byaddr(daddr, saddr, proto, family);
1176 spin_unlock_bh(&xfrm_state_lock);
1177 return x;
1178 }
1179 EXPORT_SYMBOL(xfrm_state_lookup_byaddr);
1180
1181 struct xfrm_state *
1182 xfrm_find_acq(u8 mode, u32 reqid, u8 proto,
1183 xfrm_address_t *daddr, xfrm_address_t *saddr,
1184 int create, unsigned short family)
1185 {
1186 struct xfrm_state *x;
1187
1188 spin_lock_bh(&xfrm_state_lock);
1189 x = __find_acq_core(family, mode, reqid, proto, daddr, saddr, create);
1190 spin_unlock_bh(&xfrm_state_lock);
1191
1192 return x;
1193 }
1194 EXPORT_SYMBOL(xfrm_find_acq);
1195
1196 #ifdef CONFIG_XFRM_SUB_POLICY
1197 int
1198 xfrm_tmpl_sort(struct xfrm_tmpl **dst, struct xfrm_tmpl **src, int n,
1199 unsigned short family)
1200 {
1201 int err = 0;
1202 struct xfrm_state_afinfo *afinfo = xfrm_state_get_afinfo(family);
1203 if (!afinfo)
1204 return -EAFNOSUPPORT;
1205
1206 spin_lock_bh(&xfrm_state_lock);
1207 if (afinfo->tmpl_sort)
1208 err = afinfo->tmpl_sort(dst, src, n);
1209 spin_unlock_bh(&xfrm_state_lock);
1210 xfrm_state_put_afinfo(afinfo);
1211 return err;
1212 }
1213 EXPORT_SYMBOL(xfrm_tmpl_sort);
1214
1215 int
1216 xfrm_state_sort(struct xfrm_state **dst, struct xfrm_state **src, int n,
1217 unsigned short family)
1218 {
1219 int err = 0;
1220 struct xfrm_state_afinfo *afinfo = xfrm_state_get_afinfo(family);
1221 if (!afinfo)
1222 return -EAFNOSUPPORT;
1223
1224 spin_lock_bh(&xfrm_state_lock);
1225 if (afinfo->state_sort)
1226 err = afinfo->state_sort(dst, src, n);
1227 spin_unlock_bh(&xfrm_state_lock);
1228 xfrm_state_put_afinfo(afinfo);
1229 return err;
1230 }
1231 EXPORT_SYMBOL(xfrm_state_sort);
1232 #endif
1233
1234 /* Silly enough, but I'm lazy to build resolution list */
1235
1236 static struct xfrm_state *__xfrm_find_acq_byseq(u32 seq)
1237 {
1238 int i;
1239
1240 for (i = 0; i <= xfrm_state_hmask; i++) {
1241 struct hlist_node *entry;
1242 struct xfrm_state *x;
1243
1244 hlist_for_each_entry(x, entry, xfrm_state_bydst+i, bydst) {
1245 if (x->km.seq == seq &&
1246 x->km.state == XFRM_STATE_ACQ) {
1247 xfrm_state_hold(x);
1248 return x;
1249 }
1250 }
1251 }
1252 return NULL;
1253 }
1254
1255 struct xfrm_state *xfrm_find_acq_byseq(u32 seq)
1256 {
1257 struct xfrm_state *x;
1258
1259 spin_lock_bh(&xfrm_state_lock);
1260 x = __xfrm_find_acq_byseq(seq);
1261 spin_unlock_bh(&xfrm_state_lock);
1262 return x;
1263 }
1264 EXPORT_SYMBOL(xfrm_find_acq_byseq);
1265
1266 u32 xfrm_get_acqseq(void)
1267 {
1268 u32 res;
1269 static u32 acqseq;
1270 static DEFINE_SPINLOCK(acqseq_lock);
1271
1272 spin_lock_bh(&acqseq_lock);
1273 res = (++acqseq ? : ++acqseq);
1274 spin_unlock_bh(&acqseq_lock);
1275 return res;
1276 }
1277 EXPORT_SYMBOL(xfrm_get_acqseq);
1278
1279 void
1280 xfrm_alloc_spi(struct xfrm_state *x, __be32 minspi, __be32 maxspi)
1281 {
1282 unsigned int h;
1283 struct xfrm_state *x0;
1284
1285 if (x->id.spi)
1286 return;
1287
1288 if (minspi == maxspi) {
1289 x0 = xfrm_state_lookup(&x->id.daddr, minspi, x->id.proto, x->props.family);
1290 if (x0) {
1291 xfrm_state_put(x0);
1292 return;
1293 }
1294 x->id.spi = minspi;
1295 } else {
1296 u32 spi = 0;
1297 u32 low = ntohl(minspi);
1298 u32 high = ntohl(maxspi);
1299 for (h=0; h<high-low+1; h++) {
1300 spi = low + net_random()%(high-low+1);
1301 x0 = xfrm_state_lookup(&x->id.daddr, htonl(spi), x->id.proto, x->props.family);
1302 if (x0 == NULL) {
1303 x->id.spi = htonl(spi);
1304 break;
1305 }
1306 xfrm_state_put(x0);
1307 }
1308 }
1309 if (x->id.spi) {
1310 spin_lock_bh(&xfrm_state_lock);
1311 h = xfrm_spi_hash(&x->id.daddr, x->id.spi, x->id.proto, x->props.family);
1312 hlist_add_head(&x->byspi, xfrm_state_byspi+h);
1313 spin_unlock_bh(&xfrm_state_lock);
1314 wake_up(&km_waitq);
1315 }
1316 }
1317 EXPORT_SYMBOL(xfrm_alloc_spi);
1318
1319 int xfrm_state_walk(u8 proto, int (*func)(struct xfrm_state *, int, void*),
1320 void *data)
1321 {
1322 int i;
1323 struct xfrm_state *x, *last = NULL;
1324 struct hlist_node *entry;
1325 int count = 0;
1326 int err = 0;
1327
1328 spin_lock_bh(&xfrm_state_lock);
1329 for (i = 0; i <= xfrm_state_hmask; i++) {
1330 hlist_for_each_entry(x, entry, xfrm_state_bydst+i, bydst) {
1331 if (!xfrm_id_proto_match(x->id.proto, proto))
1332 continue;
1333 if (last) {
1334 err = func(last, count, data);
1335 if (err)
1336 goto out;
1337 }
1338 last = x;
1339 count++;
1340 }
1341 }
1342 if (count == 0) {
1343 err = -ENOENT;
1344 goto out;
1345 }
1346 err = func(last, 0, data);
1347 out:
1348 spin_unlock_bh(&xfrm_state_lock);
1349 return err;
1350 }
1351 EXPORT_SYMBOL(xfrm_state_walk);
1352
1353
1354 void xfrm_replay_notify(struct xfrm_state *x, int event)
1355 {
1356 struct km_event c;
1357 /* we send notify messages in case
1358 * 1. we updated on of the sequence numbers, and the seqno difference
1359 * is at least x->replay_maxdiff, in this case we also update the
1360 * timeout of our timer function
1361 * 2. if x->replay_maxage has elapsed since last update,
1362 * and there were changes
1363 *
1364 * The state structure must be locked!
1365 */
1366
1367 switch (event) {
1368 case XFRM_REPLAY_UPDATE:
1369 if (x->replay_maxdiff &&
1370 (x->replay.seq - x->preplay.seq < x->replay_maxdiff) &&
1371 (x->replay.oseq - x->preplay.oseq < x->replay_maxdiff)) {
1372 if (x->xflags & XFRM_TIME_DEFER)
1373 event = XFRM_REPLAY_TIMEOUT;
1374 else
1375 return;
1376 }
1377
1378 break;
1379
1380 case XFRM_REPLAY_TIMEOUT:
1381 if ((x->replay.seq == x->preplay.seq) &&
1382 (x->replay.bitmap == x->preplay.bitmap) &&
1383 (x->replay.oseq == x->preplay.oseq)) {
1384 x->xflags |= XFRM_TIME_DEFER;
1385 return;
1386 }
1387
1388 break;
1389 }
1390
1391 memcpy(&x->preplay, &x->replay, sizeof(struct xfrm_replay_state));
1392 c.event = XFRM_MSG_NEWAE;
1393 c.data.aevent = event;
1394 km_state_notify(x, &c);
1395
1396 if (x->replay_maxage &&
1397 !mod_timer(&x->rtimer, jiffies + x->replay_maxage))
1398 x->xflags &= ~XFRM_TIME_DEFER;
1399 }
1400 EXPORT_SYMBOL(xfrm_replay_notify);
1401
1402 static void xfrm_replay_timer_handler(unsigned long data)
1403 {
1404 struct xfrm_state *x = (struct xfrm_state*)data;
1405
1406 spin_lock(&x->lock);
1407
1408 if (x->km.state == XFRM_STATE_VALID) {
1409 if (xfrm_aevent_is_on())
1410 xfrm_replay_notify(x, XFRM_REPLAY_TIMEOUT);
1411 else
1412 x->xflags |= XFRM_TIME_DEFER;
1413 }
1414
1415 spin_unlock(&x->lock);
1416 }
1417
1418 int xfrm_replay_check(struct xfrm_state *x, __be32 net_seq)
1419 {
1420 u32 diff;
1421 u32 seq = ntohl(net_seq);
1422
1423 if (unlikely(seq == 0))
1424 return -EINVAL;
1425
1426 if (likely(seq > x->replay.seq))
1427 return 0;
1428
1429 diff = x->replay.seq - seq;
1430 if (diff >= min_t(unsigned int, x->props.replay_window,
1431 sizeof(x->replay.bitmap) * 8)) {
1432 x->stats.replay_window++;
1433 return -EINVAL;
1434 }
1435
1436 if (x->replay.bitmap & (1U << diff)) {
1437 x->stats.replay++;
1438 return -EINVAL;
1439 }
1440 return 0;
1441 }
1442 EXPORT_SYMBOL(xfrm_replay_check);
1443
1444 void xfrm_replay_advance(struct xfrm_state *x, __be32 net_seq)
1445 {
1446 u32 diff;
1447 u32 seq = ntohl(net_seq);
1448
1449 if (seq > x->replay.seq) {
1450 diff = seq - x->replay.seq;
1451 if (diff < x->props.replay_window)
1452 x->replay.bitmap = ((x->replay.bitmap) << diff) | 1;
1453 else
1454 x->replay.bitmap = 1;
1455 x->replay.seq = seq;
1456 } else {
1457 diff = x->replay.seq - seq;
1458 x->replay.bitmap |= (1U << diff);
1459 }
1460
1461 if (xfrm_aevent_is_on())
1462 xfrm_replay_notify(x, XFRM_REPLAY_UPDATE);
1463 }
1464 EXPORT_SYMBOL(xfrm_replay_advance);
1465
1466 static struct list_head xfrm_km_list = LIST_HEAD_INIT(xfrm_km_list);
1467 static DEFINE_RWLOCK(xfrm_km_lock);
1468
1469 void km_policy_notify(struct xfrm_policy *xp, int dir, struct km_event *c)
1470 {
1471 struct xfrm_mgr *km;
1472
1473 read_lock(&xfrm_km_lock);
1474 list_for_each_entry(km, &xfrm_km_list, list)
1475 if (km->notify_policy)
1476 km->notify_policy(xp, dir, c);
1477 read_unlock(&xfrm_km_lock);
1478 }
1479
1480 void km_state_notify(struct xfrm_state *x, struct km_event *c)
1481 {
1482 struct xfrm_mgr *km;
1483 read_lock(&xfrm_km_lock);
1484 list_for_each_entry(km, &xfrm_km_list, list)
1485 if (km->notify)
1486 km->notify(x, c);
1487 read_unlock(&xfrm_km_lock);
1488 }
1489
1490 EXPORT_SYMBOL(km_policy_notify);
1491 EXPORT_SYMBOL(km_state_notify);
1492
1493 void km_state_expired(struct xfrm_state *x, int hard, u32 pid)
1494 {
1495 struct km_event c;
1496
1497 c.data.hard = hard;
1498 c.pid = pid;
1499 c.event = XFRM_MSG_EXPIRE;
1500 km_state_notify(x, &c);
1501
1502 if (hard)
1503 wake_up(&km_waitq);
1504 }
1505
1506 EXPORT_SYMBOL(km_state_expired);
1507 /*
1508 * We send to all registered managers regardless of failure
1509 * We are happy with one success
1510 */
1511 int km_query(struct xfrm_state *x, struct xfrm_tmpl *t, struct xfrm_policy *pol)
1512 {
1513 int err = -EINVAL, acqret;
1514 struct xfrm_mgr *km;
1515
1516 read_lock(&xfrm_km_lock);
1517 list_for_each_entry(km, &xfrm_km_list, list) {
1518 acqret = km->acquire(x, t, pol, XFRM_POLICY_OUT);
1519 if (!acqret)
1520 err = acqret;
1521 }
1522 read_unlock(&xfrm_km_lock);
1523 return err;
1524 }
1525 EXPORT_SYMBOL(km_query);
1526
1527 int km_new_mapping(struct xfrm_state *x, xfrm_address_t *ipaddr, __be16 sport)
1528 {
1529 int err = -EINVAL;
1530 struct xfrm_mgr *km;
1531
1532 read_lock(&xfrm_km_lock);
1533 list_for_each_entry(km, &xfrm_km_list, list) {
1534 if (km->new_mapping)
1535 err = km->new_mapping(x, ipaddr, sport);
1536 if (!err)
1537 break;
1538 }
1539 read_unlock(&xfrm_km_lock);
1540 return err;
1541 }
1542 EXPORT_SYMBOL(km_new_mapping);
1543
1544 void km_policy_expired(struct xfrm_policy *pol, int dir, int hard, u32 pid)
1545 {
1546 struct km_event c;
1547
1548 c.data.hard = hard;
1549 c.pid = pid;
1550 c.event = XFRM_MSG_POLEXPIRE;
1551 km_policy_notify(pol, dir, &c);
1552
1553 if (hard)
1554 wake_up(&km_waitq);
1555 }
1556 EXPORT_SYMBOL(km_policy_expired);
1557
1558 int km_migrate(struct xfrm_selector *sel, u8 dir, u8 type,
1559 struct xfrm_migrate *m, int num_migrate)
1560 {
1561 int err = -EINVAL;
1562 int ret;
1563 struct xfrm_mgr *km;
1564
1565 read_lock(&xfrm_km_lock);
1566 list_for_each_entry(km, &xfrm_km_list, list) {
1567 if (km->migrate) {
1568 ret = km->migrate(sel, dir, type, m, num_migrate);
1569 if (!ret)
1570 err = ret;
1571 }
1572 }
1573 read_unlock(&xfrm_km_lock);
1574 return err;
1575 }
1576 EXPORT_SYMBOL(km_migrate);
1577
1578 int km_report(u8 proto, struct xfrm_selector *sel, xfrm_address_t *addr)
1579 {
1580 int err = -EINVAL;
1581 int ret;
1582 struct xfrm_mgr *km;
1583
1584 read_lock(&xfrm_km_lock);
1585 list_for_each_entry(km, &xfrm_km_list, list) {
1586 if (km->report) {
1587 ret = km->report(proto, sel, addr);
1588 if (!ret)
1589 err = ret;
1590 }
1591 }
1592 read_unlock(&xfrm_km_lock);
1593 return err;
1594 }
1595 EXPORT_SYMBOL(km_report);
1596
1597 int xfrm_user_policy(struct sock *sk, int optname, u8 __user *optval, int optlen)
1598 {
1599 int err;
1600 u8 *data;
1601 struct xfrm_mgr *km;
1602 struct xfrm_policy *pol = NULL;
1603
1604 if (optlen <= 0 || optlen > PAGE_SIZE)
1605 return -EMSGSIZE;
1606
1607 data = kmalloc(optlen, GFP_KERNEL);
1608 if (!data)
1609 return -ENOMEM;
1610
1611 err = -EFAULT;
1612 if (copy_from_user(data, optval, optlen))
1613 goto out;
1614
1615 err = -EINVAL;
1616 read_lock(&xfrm_km_lock);
1617 list_for_each_entry(km, &xfrm_km_list, list) {
1618 pol = km->compile_policy(sk, optname, data,
1619 optlen, &err);
1620 if (err >= 0)
1621 break;
1622 }
1623 read_unlock(&xfrm_km_lock);
1624
1625 if (err >= 0) {
1626 xfrm_sk_policy_insert(sk, err, pol);
1627 xfrm_pol_put(pol);
1628 err = 0;
1629 }
1630
1631 out:
1632 kfree(data);
1633 return err;
1634 }
1635 EXPORT_SYMBOL(xfrm_user_policy);
1636
1637 int xfrm_register_km(struct xfrm_mgr *km)
1638 {
1639 write_lock_bh(&xfrm_km_lock);
1640 list_add_tail(&km->list, &xfrm_km_list);
1641 write_unlock_bh(&xfrm_km_lock);
1642 return 0;
1643 }
1644 EXPORT_SYMBOL(xfrm_register_km);
1645
1646 int xfrm_unregister_km(struct xfrm_mgr *km)
1647 {
1648 write_lock_bh(&xfrm_km_lock);
1649 list_del(&km->list);
1650 write_unlock_bh(&xfrm_km_lock);
1651 return 0;
1652 }
1653 EXPORT_SYMBOL(xfrm_unregister_km);
1654
1655 int xfrm_state_register_afinfo(struct xfrm_state_afinfo *afinfo)
1656 {
1657 int err = 0;
1658 if (unlikely(afinfo == NULL))
1659 return -EINVAL;
1660 if (unlikely(afinfo->family >= NPROTO))
1661 return -EAFNOSUPPORT;
1662 write_lock_bh(&xfrm_state_afinfo_lock);
1663 if (unlikely(xfrm_state_afinfo[afinfo->family] != NULL))
1664 err = -ENOBUFS;
1665 else
1666 xfrm_state_afinfo[afinfo->family] = afinfo;
1667 write_unlock_bh(&xfrm_state_afinfo_lock);
1668 return err;
1669 }
1670 EXPORT_SYMBOL(xfrm_state_register_afinfo);
1671
1672 int xfrm_state_unregister_afinfo(struct xfrm_state_afinfo *afinfo)
1673 {
1674 int err = 0;
1675 if (unlikely(afinfo == NULL))
1676 return -EINVAL;
1677 if (unlikely(afinfo->family >= NPROTO))
1678 return -EAFNOSUPPORT;
1679 write_lock_bh(&xfrm_state_afinfo_lock);
1680 if (likely(xfrm_state_afinfo[afinfo->family] != NULL)) {
1681 if (unlikely(xfrm_state_afinfo[afinfo->family] != afinfo))
1682 err = -EINVAL;
1683 else
1684 xfrm_state_afinfo[afinfo->family] = NULL;
1685 }
1686 write_unlock_bh(&xfrm_state_afinfo_lock);
1687 return err;
1688 }
1689 EXPORT_SYMBOL(xfrm_state_unregister_afinfo);
1690
1691 struct xfrm_state_afinfo *xfrm_state_get_afinfo(unsigned short family)
1692 {
1693 struct xfrm_state_afinfo *afinfo;
1694 if (unlikely(family >= NPROTO))
1695 return NULL;
1696 read_lock(&xfrm_state_afinfo_lock);
1697 afinfo = xfrm_state_afinfo[family];
1698 if (unlikely(!afinfo))
1699 read_unlock(&xfrm_state_afinfo_lock);
1700 return afinfo;
1701 }
1702
1703 void xfrm_state_put_afinfo(struct xfrm_state_afinfo *afinfo)
1704 {
1705 read_unlock(&xfrm_state_afinfo_lock);
1706 }
1707
1708 EXPORT_SYMBOL(xfrm_state_get_afinfo);
1709 EXPORT_SYMBOL(xfrm_state_put_afinfo);
1710
1711 /* Temporarily located here until net/xfrm/xfrm_tunnel.c is created */
1712 void xfrm_state_delete_tunnel(struct xfrm_state *x)
1713 {
1714 if (x->tunnel) {
1715 struct xfrm_state *t = x->tunnel;
1716
1717 if (atomic_read(&t->tunnel_users) == 2)
1718 xfrm_state_delete(t);
1719 atomic_dec(&t->tunnel_users);
1720 xfrm_state_put(t);
1721 x->tunnel = NULL;
1722 }
1723 }
1724 EXPORT_SYMBOL(xfrm_state_delete_tunnel);
1725
1726 int xfrm_state_mtu(struct xfrm_state *x, int mtu)
1727 {
1728 int res;
1729
1730 spin_lock_bh(&x->lock);
1731 if (x->km.state == XFRM_STATE_VALID &&
1732 x->type && x->type->get_mtu)
1733 res = x->type->get_mtu(x, mtu);
1734 else
1735 res = mtu - x->props.header_len;
1736 spin_unlock_bh(&x->lock);
1737 return res;
1738 }
1739
1740 int xfrm_init_state(struct xfrm_state *x)
1741 {
1742 struct xfrm_state_afinfo *afinfo;
1743 int family = x->props.family;
1744 int err;
1745
1746 err = -EAFNOSUPPORT;
1747 afinfo = xfrm_state_get_afinfo(family);
1748 if (!afinfo)
1749 goto error;
1750
1751 err = 0;
1752 if (afinfo->init_flags)
1753 err = afinfo->init_flags(x);
1754
1755 xfrm_state_put_afinfo(afinfo);
1756
1757 if (err)
1758 goto error;
1759
1760 err = -EPROTONOSUPPORT;
1761 x->type = xfrm_get_type(x->id.proto, family);
1762 if (x->type == NULL)
1763 goto error;
1764
1765 err = x->type->init_state(x);
1766 if (err)
1767 goto error;
1768
1769 x->mode = xfrm_get_mode(x->props.mode, family);
1770 if (x->mode == NULL)
1771 goto error;
1772
1773 x->km.state = XFRM_STATE_VALID;
1774
1775 error:
1776 return err;
1777 }
1778
1779 EXPORT_SYMBOL(xfrm_init_state);
1780
1781 void __init xfrm_state_init(void)
1782 {
1783 unsigned int sz;
1784
1785 sz = sizeof(struct hlist_head) * 8;
1786
1787 xfrm_state_bydst = xfrm_hash_alloc(sz);
1788 xfrm_state_bysrc = xfrm_hash_alloc(sz);
1789 xfrm_state_byspi = xfrm_hash_alloc(sz);
1790 if (!xfrm_state_bydst || !xfrm_state_bysrc || !xfrm_state_byspi)
1791 panic("XFRM: Cannot allocate bydst/bysrc/byspi hashes.");
1792 xfrm_state_hmask = ((sz / sizeof(struct hlist_head)) - 1);
1793
1794 INIT_WORK(&xfrm_state_gc_work, xfrm_state_gc_task);
1795 }
1796
1797 #ifdef CONFIG_AUDITSYSCALL
1798 static inline void xfrm_audit_common_stateinfo(struct xfrm_state *x,
1799 struct audit_buffer *audit_buf)
1800 {
1801 if (x->security)
1802 audit_log_format(audit_buf, " sec_alg=%u sec_doi=%u sec_obj=%s",
1803 x->security->ctx_alg, x->security->ctx_doi,
1804 x->security->ctx_str);
1805
1806 switch(x->props.family) {
1807 case AF_INET:
1808 audit_log_format(audit_buf, " src=%u.%u.%u.%u dst=%u.%u.%u.%u",
1809 NIPQUAD(x->props.saddr.a4),
1810 NIPQUAD(x->id.daddr.a4));
1811 break;
1812 case AF_INET6:
1813 {
1814 struct in6_addr saddr6, daddr6;
1815
1816 memcpy(&saddr6, x->props.saddr.a6,
1817 sizeof(struct in6_addr));
1818 memcpy(&daddr6, x->id.daddr.a6,
1819 sizeof(struct in6_addr));
1820 audit_log_format(audit_buf,
1821 " src=" NIP6_FMT " dst=" NIP6_FMT,
1822 NIP6(saddr6), NIP6(daddr6));
1823 }
1824 break;
1825 }
1826 }
1827
1828 void
1829 xfrm_audit_state_add(struct xfrm_state *x, int result, u32 auid, u32 sid)
1830 {
1831 struct audit_buffer *audit_buf;
1832 extern int audit_enabled;
1833
1834 if (audit_enabled == 0)
1835 return;
1836 audit_buf = xfrm_audit_start(sid, auid);
1837 if (audit_buf == NULL)
1838 return;
1839 audit_log_format(audit_buf, " op=SAD-add res=%u",result);
1840 xfrm_audit_common_stateinfo(x, audit_buf);
1841 audit_log_format(audit_buf, " spi=%lu(0x%lx)",
1842 (unsigned long)x->id.spi, (unsigned long)x->id.spi);
1843 audit_log_end(audit_buf);
1844 }
1845 EXPORT_SYMBOL_GPL(xfrm_audit_state_add);
1846
1847 void
1848 xfrm_audit_state_delete(struct xfrm_state *x, int result, u32 auid, u32 sid)
1849 {
1850 struct audit_buffer *audit_buf;
1851 extern int audit_enabled;
1852
1853 if (audit_enabled == 0)
1854 return;
1855 audit_buf = xfrm_audit_start(sid, auid);
1856 if (audit_buf == NULL)
1857 return;
1858 audit_log_format(audit_buf, " op=SAD-delete res=%u",result);
1859 xfrm_audit_common_stateinfo(x, audit_buf);
1860 audit_log_format(audit_buf, " spi=%lu(0x%lx)",
1861 (unsigned long)x->id.spi, (unsigned long)x->id.spi);
1862 audit_log_end(audit_buf);
1863 }
1864 EXPORT_SYMBOL_GPL(xfrm_audit_state_delete);
1865 #endif /* CONFIG_AUDITSYSCALL */
This page took 0.095123 seconds and 6 git commands to generate.