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