x86: use the correct cpuid method to detect MWAIT support for C states
[linux-2.6/next.git] / net / xfrm / xfrm_state.c
blob3003503d0c94937d570795fcbabf8ce155155130
1 /*
2 * xfrm_state.c
4 * Changes:
5 * Mitsuru KANDA @USAGI
6 * Kazunori MIYAZAWA @USAGI
7 * Kunihiro Ishiguro <kunihiro@ipinfusion.com>
8 * IPv6 support
9 * YOSHIFUJI Hideaki @USAGI
10 * Split up af-specific functions
11 * Derek Atkins <derek@ihtfp.com>
12 * Add UDP Encapsulation
16 #include <linux/workqueue.h>
17 #include <net/xfrm.h>
18 #include <linux/pfkeyv2.h>
19 #include <linux/ipsec.h>
20 #include <linux/module.h>
21 #include <linux/cache.h>
22 #include <linux/audit.h>
23 #include <asm/uaccess.h>
25 #include "xfrm_hash.h"
27 struct sock *xfrm_nl;
28 EXPORT_SYMBOL(xfrm_nl);
30 u32 sysctl_xfrm_aevent_etime __read_mostly = XFRM_AE_ETIME;
31 EXPORT_SYMBOL(sysctl_xfrm_aevent_etime);
33 u32 sysctl_xfrm_aevent_rseqth __read_mostly = XFRM_AE_SEQT_SIZE;
34 EXPORT_SYMBOL(sysctl_xfrm_aevent_rseqth);
36 u32 sysctl_xfrm_acq_expires __read_mostly = 30;
38 /* Each xfrm_state may be linked to two tables:
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)
45 static DEFINE_SPINLOCK(xfrm_state_lock);
47 /* Hash table to find appropriate SA towards given target (endpoint
48 * of tunnel or destination of transport mode) allowed by selector.
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.
53 static struct hlist_head *xfrm_state_bydst __read_mostly;
54 static struct hlist_head *xfrm_state_bysrc __read_mostly;
55 static struct hlist_head *xfrm_state_byspi __read_mostly;
56 static unsigned int xfrm_state_hmask __read_mostly;
57 static unsigned int xfrm_state_hashmax __read_mostly = 1 * 1024 * 1024;
58 static unsigned int xfrm_state_num;
59 static unsigned int xfrm_state_genid;
61 static struct xfrm_state_afinfo *xfrm_state_get_afinfo(unsigned int family);
62 static void xfrm_state_put_afinfo(struct xfrm_state_afinfo *afinfo);
64 #ifdef CONFIG_AUDITSYSCALL
65 static void xfrm_audit_state_replay(struct xfrm_state *x,
66 struct sk_buff *skb, __be32 net_seq);
67 #else
68 #define xfrm_audit_state_replay(x, s, sq) do { ; } while (0)
69 #endif /* CONFIG_AUDITSYSCALL */
71 static inline unsigned int xfrm_dst_hash(xfrm_address_t *daddr,
72 xfrm_address_t *saddr,
73 u32 reqid,
74 unsigned short family)
76 return __xfrm_dst_hash(daddr, saddr, reqid, family, xfrm_state_hmask);
79 static inline unsigned int xfrm_src_hash(xfrm_address_t *daddr,
80 xfrm_address_t *saddr,
81 unsigned short family)
83 return __xfrm_src_hash(daddr, saddr, family, xfrm_state_hmask);
86 static inline unsigned int
87 xfrm_spi_hash(xfrm_address_t *daddr, __be32 spi, u8 proto, unsigned short family)
89 return __xfrm_spi_hash(daddr, spi, proto, family, xfrm_state_hmask);
92 static void xfrm_hash_transfer(struct hlist_head *list,
93 struct hlist_head *ndsttable,
94 struct hlist_head *nsrctable,
95 struct hlist_head *nspitable,
96 unsigned int nhashmask)
98 struct hlist_node *entry, *tmp;
99 struct xfrm_state *x;
101 hlist_for_each_entry_safe(x, entry, tmp, list, bydst) {
102 unsigned int h;
104 h = __xfrm_dst_hash(&x->id.daddr, &x->props.saddr,
105 x->props.reqid, x->props.family,
106 nhashmask);
107 hlist_add_head(&x->bydst, ndsttable+h);
109 h = __xfrm_src_hash(&x->id.daddr, &x->props.saddr,
110 x->props.family,
111 nhashmask);
112 hlist_add_head(&x->bysrc, nsrctable+h);
114 if (x->id.spi) {
115 h = __xfrm_spi_hash(&x->id.daddr, x->id.spi,
116 x->id.proto, x->props.family,
117 nhashmask);
118 hlist_add_head(&x->byspi, nspitable+h);
123 static unsigned long xfrm_hash_new_size(void)
125 return ((xfrm_state_hmask + 1) << 1) *
126 sizeof(struct hlist_head);
129 static DEFINE_MUTEX(hash_resize_mutex);
131 static void xfrm_hash_resize(struct work_struct *__unused)
133 struct hlist_head *ndst, *nsrc, *nspi, *odst, *osrc, *ospi;
134 unsigned long nsize, osize;
135 unsigned int nhashmask, ohashmask;
136 int i;
138 mutex_lock(&hash_resize_mutex);
140 nsize = xfrm_hash_new_size();
141 ndst = xfrm_hash_alloc(nsize);
142 if (!ndst)
143 goto out_unlock;
144 nsrc = xfrm_hash_alloc(nsize);
145 if (!nsrc) {
146 xfrm_hash_free(ndst, nsize);
147 goto out_unlock;
149 nspi = xfrm_hash_alloc(nsize);
150 if (!nspi) {
151 xfrm_hash_free(ndst, nsize);
152 xfrm_hash_free(nsrc, nsize);
153 goto out_unlock;
156 spin_lock_bh(&xfrm_state_lock);
158 nhashmask = (nsize / sizeof(struct hlist_head)) - 1U;
159 for (i = xfrm_state_hmask; i >= 0; i--)
160 xfrm_hash_transfer(xfrm_state_bydst+i, ndst, nsrc, nspi,
161 nhashmask);
163 odst = xfrm_state_bydst;
164 osrc = xfrm_state_bysrc;
165 ospi = xfrm_state_byspi;
166 ohashmask = xfrm_state_hmask;
168 xfrm_state_bydst = ndst;
169 xfrm_state_bysrc = nsrc;
170 xfrm_state_byspi = nspi;
171 xfrm_state_hmask = nhashmask;
173 spin_unlock_bh(&xfrm_state_lock);
175 osize = (ohashmask + 1) * sizeof(struct hlist_head);
176 xfrm_hash_free(odst, osize);
177 xfrm_hash_free(osrc, osize);
178 xfrm_hash_free(ospi, osize);
180 out_unlock:
181 mutex_unlock(&hash_resize_mutex);
184 static DECLARE_WORK(xfrm_hash_work, xfrm_hash_resize);
186 DECLARE_WAIT_QUEUE_HEAD(km_waitq);
187 EXPORT_SYMBOL(km_waitq);
189 static DEFINE_RWLOCK(xfrm_state_afinfo_lock);
190 static struct xfrm_state_afinfo *xfrm_state_afinfo[NPROTO];
192 static struct work_struct xfrm_state_gc_work;
193 static HLIST_HEAD(xfrm_state_gc_list);
194 static DEFINE_SPINLOCK(xfrm_state_gc_lock);
196 int __xfrm_state_delete(struct xfrm_state *x);
198 int km_query(struct xfrm_state *x, struct xfrm_tmpl *t, struct xfrm_policy *pol);
199 void km_state_expired(struct xfrm_state *x, int hard, u32 pid);
201 static struct xfrm_state_afinfo *xfrm_state_lock_afinfo(unsigned int family)
203 struct xfrm_state_afinfo *afinfo;
204 if (unlikely(family >= NPROTO))
205 return NULL;
206 write_lock_bh(&xfrm_state_afinfo_lock);
207 afinfo = xfrm_state_afinfo[family];
208 if (unlikely(!afinfo))
209 write_unlock_bh(&xfrm_state_afinfo_lock);
210 return afinfo;
213 static void xfrm_state_unlock_afinfo(struct xfrm_state_afinfo *afinfo)
214 __releases(xfrm_state_afinfo_lock)
216 write_unlock_bh(&xfrm_state_afinfo_lock);
219 int xfrm_register_type(struct xfrm_type *type, unsigned short family)
221 struct xfrm_state_afinfo *afinfo = xfrm_state_lock_afinfo(family);
222 struct xfrm_type **typemap;
223 int err = 0;
225 if (unlikely(afinfo == NULL))
226 return -EAFNOSUPPORT;
227 typemap = afinfo->type_map;
229 if (likely(typemap[type->proto] == NULL))
230 typemap[type->proto] = type;
231 else
232 err = -EEXIST;
233 xfrm_state_unlock_afinfo(afinfo);
234 return err;
236 EXPORT_SYMBOL(xfrm_register_type);
238 int xfrm_unregister_type(struct xfrm_type *type, unsigned short family)
240 struct xfrm_state_afinfo *afinfo = xfrm_state_lock_afinfo(family);
241 struct xfrm_type **typemap;
242 int err = 0;
244 if (unlikely(afinfo == NULL))
245 return -EAFNOSUPPORT;
246 typemap = afinfo->type_map;
248 if (unlikely(typemap[type->proto] != type))
249 err = -ENOENT;
250 else
251 typemap[type->proto] = NULL;
252 xfrm_state_unlock_afinfo(afinfo);
253 return err;
255 EXPORT_SYMBOL(xfrm_unregister_type);
257 static struct xfrm_type *xfrm_get_type(u8 proto, unsigned short family)
259 struct xfrm_state_afinfo *afinfo;
260 struct xfrm_type **typemap;
261 struct xfrm_type *type;
262 int modload_attempted = 0;
264 retry:
265 afinfo = xfrm_state_get_afinfo(family);
266 if (unlikely(afinfo == NULL))
267 return NULL;
268 typemap = afinfo->type_map;
270 type = typemap[proto];
271 if (unlikely(type && !try_module_get(type->owner)))
272 type = NULL;
273 if (!type && !modload_attempted) {
274 xfrm_state_put_afinfo(afinfo);
275 request_module("xfrm-type-%d-%d", family, proto);
276 modload_attempted = 1;
277 goto retry;
280 xfrm_state_put_afinfo(afinfo);
281 return type;
284 static void xfrm_put_type(struct xfrm_type *type)
286 module_put(type->owner);
289 int xfrm_register_mode(struct xfrm_mode *mode, int family)
291 struct xfrm_state_afinfo *afinfo;
292 struct xfrm_mode **modemap;
293 int err;
295 if (unlikely(mode->encap >= XFRM_MODE_MAX))
296 return -EINVAL;
298 afinfo = xfrm_state_lock_afinfo(family);
299 if (unlikely(afinfo == NULL))
300 return -EAFNOSUPPORT;
302 err = -EEXIST;
303 modemap = afinfo->mode_map;
304 if (modemap[mode->encap])
305 goto out;
307 err = -ENOENT;
308 if (!try_module_get(afinfo->owner))
309 goto out;
311 mode->afinfo = afinfo;
312 modemap[mode->encap] = mode;
313 err = 0;
315 out:
316 xfrm_state_unlock_afinfo(afinfo);
317 return err;
319 EXPORT_SYMBOL(xfrm_register_mode);
321 int xfrm_unregister_mode(struct xfrm_mode *mode, int family)
323 struct xfrm_state_afinfo *afinfo;
324 struct xfrm_mode **modemap;
325 int err;
327 if (unlikely(mode->encap >= XFRM_MODE_MAX))
328 return -EINVAL;
330 afinfo = xfrm_state_lock_afinfo(family);
331 if (unlikely(afinfo == NULL))
332 return -EAFNOSUPPORT;
334 err = -ENOENT;
335 modemap = afinfo->mode_map;
336 if (likely(modemap[mode->encap] == mode)) {
337 modemap[mode->encap] = NULL;
338 module_put(mode->afinfo->owner);
339 err = 0;
342 xfrm_state_unlock_afinfo(afinfo);
343 return err;
345 EXPORT_SYMBOL(xfrm_unregister_mode);
347 static struct xfrm_mode *xfrm_get_mode(unsigned int encap, int family)
349 struct xfrm_state_afinfo *afinfo;
350 struct xfrm_mode *mode;
351 int modload_attempted = 0;
353 if (unlikely(encap >= XFRM_MODE_MAX))
354 return NULL;
356 retry:
357 afinfo = xfrm_state_get_afinfo(family);
358 if (unlikely(afinfo == NULL))
359 return NULL;
361 mode = afinfo->mode_map[encap];
362 if (unlikely(mode && !try_module_get(mode->owner)))
363 mode = NULL;
364 if (!mode && !modload_attempted) {
365 xfrm_state_put_afinfo(afinfo);
366 request_module("xfrm-mode-%d-%d", family, encap);
367 modload_attempted = 1;
368 goto retry;
371 xfrm_state_put_afinfo(afinfo);
372 return mode;
375 static void xfrm_put_mode(struct xfrm_mode *mode)
377 module_put(mode->owner);
380 static void xfrm_state_gc_destroy(struct xfrm_state *x)
382 del_timer_sync(&x->timer);
383 del_timer_sync(&x->rtimer);
384 kfree(x->aalg);
385 kfree(x->ealg);
386 kfree(x->calg);
387 kfree(x->encap);
388 kfree(x->coaddr);
389 if (x->inner_mode)
390 xfrm_put_mode(x->inner_mode);
391 if (x->outer_mode)
392 xfrm_put_mode(x->outer_mode);
393 if (x->type) {
394 x->type->destructor(x);
395 xfrm_put_type(x->type);
397 security_xfrm_state_free(x);
398 kfree(x);
401 static void xfrm_state_gc_task(struct work_struct *data)
403 struct xfrm_state *x;
404 struct hlist_node *entry, *tmp;
405 struct hlist_head gc_list;
407 spin_lock_bh(&xfrm_state_gc_lock);
408 gc_list.first = xfrm_state_gc_list.first;
409 INIT_HLIST_HEAD(&xfrm_state_gc_list);
410 spin_unlock_bh(&xfrm_state_gc_lock);
412 hlist_for_each_entry_safe(x, entry, tmp, &gc_list, bydst)
413 xfrm_state_gc_destroy(x);
415 wake_up(&km_waitq);
418 static inline unsigned long make_jiffies(long secs)
420 if (secs >= (MAX_SCHEDULE_TIMEOUT-1)/HZ)
421 return MAX_SCHEDULE_TIMEOUT-1;
422 else
423 return secs*HZ;
426 static void xfrm_timer_handler(unsigned long data)
428 struct xfrm_state *x = (struct xfrm_state*)data;
429 unsigned long now = get_seconds();
430 long next = LONG_MAX;
431 int warn = 0;
432 int err = 0;
434 spin_lock(&x->lock);
435 if (x->km.state == XFRM_STATE_DEAD)
436 goto out;
437 if (x->km.state == XFRM_STATE_EXPIRED)
438 goto expired;
439 if (x->lft.hard_add_expires_seconds) {
440 long tmo = x->lft.hard_add_expires_seconds +
441 x->curlft.add_time - now;
442 if (tmo <= 0)
443 goto expired;
444 if (tmo < next)
445 next = tmo;
447 if (x->lft.hard_use_expires_seconds) {
448 long tmo = x->lft.hard_use_expires_seconds +
449 (x->curlft.use_time ? : now) - now;
450 if (tmo <= 0)
451 goto expired;
452 if (tmo < next)
453 next = tmo;
455 if (x->km.dying)
456 goto resched;
457 if (x->lft.soft_add_expires_seconds) {
458 long tmo = x->lft.soft_add_expires_seconds +
459 x->curlft.add_time - now;
460 if (tmo <= 0)
461 warn = 1;
462 else if (tmo < next)
463 next = tmo;
465 if (x->lft.soft_use_expires_seconds) {
466 long tmo = x->lft.soft_use_expires_seconds +
467 (x->curlft.use_time ? : now) - now;
468 if (tmo <= 0)
469 warn = 1;
470 else if (tmo < next)
471 next = tmo;
474 x->km.dying = warn;
475 if (warn)
476 km_state_expired(x, 0, 0);
477 resched:
478 if (next != LONG_MAX)
479 mod_timer(&x->timer, jiffies + make_jiffies(next));
481 goto out;
483 expired:
484 if (x->km.state == XFRM_STATE_ACQ && x->id.spi == 0) {
485 x->km.state = XFRM_STATE_EXPIRED;
486 wake_up(&km_waitq);
487 next = 2;
488 goto resched;
491 err = __xfrm_state_delete(x);
492 if (!err && x->id.spi)
493 km_state_expired(x, 1, 0);
495 xfrm_audit_state_delete(x, err ? 0 : 1,
496 audit_get_loginuid(current->audit_context), 0);
498 out:
499 spin_unlock(&x->lock);
502 static void xfrm_replay_timer_handler(unsigned long data);
504 struct xfrm_state *xfrm_state_alloc(void)
506 struct xfrm_state *x;
508 x = kzalloc(sizeof(struct xfrm_state), GFP_ATOMIC);
510 if (x) {
511 atomic_set(&x->refcnt, 1);
512 atomic_set(&x->tunnel_users, 0);
513 INIT_HLIST_NODE(&x->bydst);
514 INIT_HLIST_NODE(&x->bysrc);
515 INIT_HLIST_NODE(&x->byspi);
516 setup_timer(&x->timer, xfrm_timer_handler, (unsigned long)x);
517 setup_timer(&x->rtimer, xfrm_replay_timer_handler,
518 (unsigned long)x);
519 x->curlft.add_time = get_seconds();
520 x->lft.soft_byte_limit = XFRM_INF;
521 x->lft.soft_packet_limit = XFRM_INF;
522 x->lft.hard_byte_limit = XFRM_INF;
523 x->lft.hard_packet_limit = XFRM_INF;
524 x->replay_maxage = 0;
525 x->replay_maxdiff = 0;
526 spin_lock_init(&x->lock);
528 return x;
530 EXPORT_SYMBOL(xfrm_state_alloc);
532 void __xfrm_state_destroy(struct xfrm_state *x)
534 BUG_TRAP(x->km.state == XFRM_STATE_DEAD);
536 spin_lock_bh(&xfrm_state_gc_lock);
537 hlist_add_head(&x->bydst, &xfrm_state_gc_list);
538 spin_unlock_bh(&xfrm_state_gc_lock);
539 schedule_work(&xfrm_state_gc_work);
541 EXPORT_SYMBOL(__xfrm_state_destroy);
543 int __xfrm_state_delete(struct xfrm_state *x)
545 int err = -ESRCH;
547 if (x->km.state != XFRM_STATE_DEAD) {
548 x->km.state = XFRM_STATE_DEAD;
549 spin_lock(&xfrm_state_lock);
550 hlist_del(&x->bydst);
551 hlist_del(&x->bysrc);
552 if (x->id.spi)
553 hlist_del(&x->byspi);
554 xfrm_state_num--;
555 spin_unlock(&xfrm_state_lock);
557 /* All xfrm_state objects are created by xfrm_state_alloc.
558 * The xfrm_state_alloc call gives a reference, and that
559 * is what we are dropping here.
561 xfrm_state_put(x);
562 err = 0;
565 return err;
567 EXPORT_SYMBOL(__xfrm_state_delete);
569 int xfrm_state_delete(struct xfrm_state *x)
571 int err;
573 spin_lock_bh(&x->lock);
574 err = __xfrm_state_delete(x);
575 spin_unlock_bh(&x->lock);
577 return err;
579 EXPORT_SYMBOL(xfrm_state_delete);
581 #ifdef CONFIG_SECURITY_NETWORK_XFRM
582 static inline int
583 xfrm_state_flush_secctx_check(u8 proto, struct xfrm_audit *audit_info)
585 int i, err = 0;
587 for (i = 0; i <= xfrm_state_hmask; i++) {
588 struct hlist_node *entry;
589 struct xfrm_state *x;
591 hlist_for_each_entry(x, entry, xfrm_state_bydst+i, bydst) {
592 if (xfrm_id_proto_match(x->id.proto, proto) &&
593 (err = security_xfrm_state_delete(x)) != 0) {
594 xfrm_audit_state_delete(x, 0,
595 audit_info->loginuid,
596 audit_info->secid);
597 return err;
602 return err;
604 #else
605 static inline int
606 xfrm_state_flush_secctx_check(u8 proto, struct xfrm_audit *audit_info)
608 return 0;
610 #endif
612 int xfrm_state_flush(u8 proto, struct xfrm_audit *audit_info)
614 int i, err = 0;
616 spin_lock_bh(&xfrm_state_lock);
617 err = xfrm_state_flush_secctx_check(proto, audit_info);
618 if (err)
619 goto out;
621 for (i = 0; i <= xfrm_state_hmask; i++) {
622 struct hlist_node *entry;
623 struct xfrm_state *x;
624 restart:
625 hlist_for_each_entry(x, entry, xfrm_state_bydst+i, bydst) {
626 if (!xfrm_state_kern(x) &&
627 xfrm_id_proto_match(x->id.proto, proto)) {
628 xfrm_state_hold(x);
629 spin_unlock_bh(&xfrm_state_lock);
631 err = xfrm_state_delete(x);
632 xfrm_audit_state_delete(x, err ? 0 : 1,
633 audit_info->loginuid,
634 audit_info->secid);
635 xfrm_state_put(x);
637 spin_lock_bh(&xfrm_state_lock);
638 goto restart;
642 err = 0;
644 out:
645 spin_unlock_bh(&xfrm_state_lock);
646 wake_up(&km_waitq);
647 return err;
649 EXPORT_SYMBOL(xfrm_state_flush);
651 void xfrm_sad_getinfo(struct xfrmk_sadinfo *si)
653 spin_lock_bh(&xfrm_state_lock);
654 si->sadcnt = xfrm_state_num;
655 si->sadhcnt = xfrm_state_hmask;
656 si->sadhmcnt = xfrm_state_hashmax;
657 spin_unlock_bh(&xfrm_state_lock);
659 EXPORT_SYMBOL(xfrm_sad_getinfo);
661 static int
662 xfrm_init_tempsel(struct xfrm_state *x, struct flowi *fl,
663 struct xfrm_tmpl *tmpl,
664 xfrm_address_t *daddr, xfrm_address_t *saddr,
665 unsigned short family)
667 struct xfrm_state_afinfo *afinfo = xfrm_state_get_afinfo(family);
668 if (!afinfo)
669 return -1;
670 afinfo->init_tempsel(x, fl, tmpl, daddr, saddr);
671 xfrm_state_put_afinfo(afinfo);
672 return 0;
675 static struct xfrm_state *__xfrm_state_lookup(xfrm_address_t *daddr, __be32 spi, u8 proto, unsigned short family)
677 unsigned int h = xfrm_spi_hash(daddr, spi, proto, family);
678 struct xfrm_state *x;
679 struct hlist_node *entry;
681 hlist_for_each_entry(x, entry, xfrm_state_byspi+h, byspi) {
682 if (x->props.family != family ||
683 x->id.spi != spi ||
684 x->id.proto != proto)
685 continue;
687 switch (family) {
688 case AF_INET:
689 if (x->id.daddr.a4 != daddr->a4)
690 continue;
691 break;
692 case AF_INET6:
693 if (!ipv6_addr_equal((struct in6_addr *)daddr,
694 (struct in6_addr *)
695 x->id.daddr.a6))
696 continue;
697 break;
700 xfrm_state_hold(x);
701 return x;
704 return NULL;
707 static struct xfrm_state *__xfrm_state_lookup_byaddr(xfrm_address_t *daddr, xfrm_address_t *saddr, u8 proto, unsigned short family)
709 unsigned int h = xfrm_src_hash(daddr, saddr, family);
710 struct xfrm_state *x;
711 struct hlist_node *entry;
713 hlist_for_each_entry(x, entry, xfrm_state_bysrc+h, bysrc) {
714 if (x->props.family != family ||
715 x->id.proto != proto)
716 continue;
718 switch (family) {
719 case AF_INET:
720 if (x->id.daddr.a4 != daddr->a4 ||
721 x->props.saddr.a4 != saddr->a4)
722 continue;
723 break;
724 case AF_INET6:
725 if (!ipv6_addr_equal((struct in6_addr *)daddr,
726 (struct in6_addr *)
727 x->id.daddr.a6) ||
728 !ipv6_addr_equal((struct in6_addr *)saddr,
729 (struct in6_addr *)
730 x->props.saddr.a6))
731 continue;
732 break;
735 xfrm_state_hold(x);
736 return x;
739 return NULL;
742 static inline struct xfrm_state *
743 __xfrm_state_locate(struct xfrm_state *x, int use_spi, int family)
745 if (use_spi)
746 return __xfrm_state_lookup(&x->id.daddr, x->id.spi,
747 x->id.proto, family);
748 else
749 return __xfrm_state_lookup_byaddr(&x->id.daddr,
750 &x->props.saddr,
751 x->id.proto, family);
754 static void xfrm_hash_grow_check(int have_hash_collision)
756 if (have_hash_collision &&
757 (xfrm_state_hmask + 1) < xfrm_state_hashmax &&
758 xfrm_state_num > xfrm_state_hmask)
759 schedule_work(&xfrm_hash_work);
762 struct xfrm_state *
763 xfrm_state_find(xfrm_address_t *daddr, xfrm_address_t *saddr,
764 struct flowi *fl, struct xfrm_tmpl *tmpl,
765 struct xfrm_policy *pol, int *err,
766 unsigned short family)
768 unsigned int h;
769 struct hlist_node *entry;
770 struct xfrm_state *x, *x0;
771 int acquire_in_progress = 0;
772 int error = 0;
773 struct xfrm_state *best = NULL;
775 spin_lock_bh(&xfrm_state_lock);
776 h = xfrm_dst_hash(daddr, saddr, tmpl->reqid, family);
777 hlist_for_each_entry(x, entry, xfrm_state_bydst+h, bydst) {
778 if (x->props.family == family &&
779 x->props.reqid == tmpl->reqid &&
780 !(x->props.flags & XFRM_STATE_WILDRECV) &&
781 xfrm_state_addr_check(x, daddr, saddr, family) &&
782 tmpl->mode == x->props.mode &&
783 tmpl->id.proto == x->id.proto &&
784 (tmpl->id.spi == x->id.spi || !tmpl->id.spi)) {
785 /* Resolution logic:
786 1. There is a valid state with matching selector.
787 Done.
788 2. Valid state with inappropriate selector. Skip.
790 Entering area of "sysdeps".
792 3. If state is not valid, selector is temporary,
793 it selects only session which triggered
794 previous resolution. Key manager will do
795 something to install a state with proper
796 selector.
798 if (x->km.state == XFRM_STATE_VALID) {
799 if (!xfrm_selector_match(&x->sel, fl, x->sel.family) ||
800 !security_xfrm_state_pol_flow_match(x, pol, fl))
801 continue;
802 if (!best ||
803 best->km.dying > x->km.dying ||
804 (best->km.dying == x->km.dying &&
805 best->curlft.add_time < x->curlft.add_time))
806 best = x;
807 } else if (x->km.state == XFRM_STATE_ACQ) {
808 acquire_in_progress = 1;
809 } else if (x->km.state == XFRM_STATE_ERROR ||
810 x->km.state == XFRM_STATE_EXPIRED) {
811 if (xfrm_selector_match(&x->sel, fl, x->sel.family) &&
812 security_xfrm_state_pol_flow_match(x, pol, fl))
813 error = -ESRCH;
818 x = best;
819 if (!x && !error && !acquire_in_progress) {
820 if (tmpl->id.spi &&
821 (x0 = __xfrm_state_lookup(daddr, tmpl->id.spi,
822 tmpl->id.proto, family)) != NULL) {
823 xfrm_state_put(x0);
824 error = -EEXIST;
825 goto out;
827 x = xfrm_state_alloc();
828 if (x == NULL) {
829 error = -ENOMEM;
830 goto out;
832 /* Initialize temporary selector matching only
833 * to current session. */
834 xfrm_init_tempsel(x, fl, tmpl, daddr, saddr, family);
836 error = security_xfrm_state_alloc_acquire(x, pol->security, fl->secid);
837 if (error) {
838 x->km.state = XFRM_STATE_DEAD;
839 xfrm_state_put(x);
840 x = NULL;
841 goto out;
844 if (km_query(x, tmpl, pol) == 0) {
845 x->km.state = XFRM_STATE_ACQ;
846 hlist_add_head(&x->bydst, xfrm_state_bydst+h);
847 h = xfrm_src_hash(daddr, saddr, family);
848 hlist_add_head(&x->bysrc, xfrm_state_bysrc+h);
849 if (x->id.spi) {
850 h = xfrm_spi_hash(&x->id.daddr, x->id.spi, x->id.proto, family);
851 hlist_add_head(&x->byspi, xfrm_state_byspi+h);
853 x->lft.hard_add_expires_seconds = sysctl_xfrm_acq_expires;
854 x->timer.expires = jiffies + sysctl_xfrm_acq_expires*HZ;
855 add_timer(&x->timer);
856 xfrm_state_num++;
857 xfrm_hash_grow_check(x->bydst.next != NULL);
858 } else {
859 x->km.state = XFRM_STATE_DEAD;
860 xfrm_state_put(x);
861 x = NULL;
862 error = -ESRCH;
865 out:
866 if (x)
867 xfrm_state_hold(x);
868 else
869 *err = acquire_in_progress ? -EAGAIN : error;
870 spin_unlock_bh(&xfrm_state_lock);
871 return x;
874 struct xfrm_state *
875 xfrm_stateonly_find(xfrm_address_t *daddr, xfrm_address_t *saddr,
876 unsigned short family, u8 mode, u8 proto, u32 reqid)
878 unsigned int h;
879 struct xfrm_state *rx = NULL, *x = NULL;
880 struct hlist_node *entry;
882 spin_lock(&xfrm_state_lock);
883 h = xfrm_dst_hash(daddr, saddr, reqid, family);
884 hlist_for_each_entry(x, entry, xfrm_state_bydst+h, bydst) {
885 if (x->props.family == family &&
886 x->props.reqid == reqid &&
887 !(x->props.flags & XFRM_STATE_WILDRECV) &&
888 xfrm_state_addr_check(x, daddr, saddr, family) &&
889 mode == x->props.mode &&
890 proto == x->id.proto &&
891 x->km.state == XFRM_STATE_VALID) {
892 rx = x;
893 break;
897 if (rx)
898 xfrm_state_hold(rx);
899 spin_unlock(&xfrm_state_lock);
902 return rx;
904 EXPORT_SYMBOL(xfrm_stateonly_find);
906 static void __xfrm_state_insert(struct xfrm_state *x)
908 unsigned int h;
910 x->genid = ++xfrm_state_genid;
912 h = xfrm_dst_hash(&x->id.daddr, &x->props.saddr,
913 x->props.reqid, x->props.family);
914 hlist_add_head(&x->bydst, xfrm_state_bydst+h);
916 h = xfrm_src_hash(&x->id.daddr, &x->props.saddr, x->props.family);
917 hlist_add_head(&x->bysrc, xfrm_state_bysrc+h);
919 if (x->id.spi) {
920 h = xfrm_spi_hash(&x->id.daddr, x->id.spi, x->id.proto,
921 x->props.family);
923 hlist_add_head(&x->byspi, xfrm_state_byspi+h);
926 mod_timer(&x->timer, jiffies + HZ);
927 if (x->replay_maxage)
928 mod_timer(&x->rtimer, jiffies + x->replay_maxage);
930 wake_up(&km_waitq);
932 xfrm_state_num++;
934 xfrm_hash_grow_check(x->bydst.next != NULL);
937 /* xfrm_state_lock is held */
938 static void __xfrm_state_bump_genids(struct xfrm_state *xnew)
940 unsigned short family = xnew->props.family;
941 u32 reqid = xnew->props.reqid;
942 struct xfrm_state *x;
943 struct hlist_node *entry;
944 unsigned int h;
946 h = xfrm_dst_hash(&xnew->id.daddr, &xnew->props.saddr, reqid, family);
947 hlist_for_each_entry(x, entry, xfrm_state_bydst+h, bydst) {
948 if (x->props.family == family &&
949 x->props.reqid == reqid &&
950 !xfrm_addr_cmp(&x->id.daddr, &xnew->id.daddr, family) &&
951 !xfrm_addr_cmp(&x->props.saddr, &xnew->props.saddr, family))
952 x->genid = xfrm_state_genid;
956 void xfrm_state_insert(struct xfrm_state *x)
958 spin_lock_bh(&xfrm_state_lock);
959 __xfrm_state_bump_genids(x);
960 __xfrm_state_insert(x);
961 spin_unlock_bh(&xfrm_state_lock);
963 EXPORT_SYMBOL(xfrm_state_insert);
965 /* xfrm_state_lock is held */
966 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)
968 unsigned int h = xfrm_dst_hash(daddr, saddr, reqid, family);
969 struct hlist_node *entry;
970 struct xfrm_state *x;
972 hlist_for_each_entry(x, entry, xfrm_state_bydst+h, bydst) {
973 if (x->props.reqid != reqid ||
974 x->props.mode != mode ||
975 x->props.family != family ||
976 x->km.state != XFRM_STATE_ACQ ||
977 x->id.spi != 0 ||
978 x->id.proto != proto)
979 continue;
981 switch (family) {
982 case AF_INET:
983 if (x->id.daddr.a4 != daddr->a4 ||
984 x->props.saddr.a4 != saddr->a4)
985 continue;
986 break;
987 case AF_INET6:
988 if (!ipv6_addr_equal((struct in6_addr *)x->id.daddr.a6,
989 (struct in6_addr *)daddr) ||
990 !ipv6_addr_equal((struct in6_addr *)
991 x->props.saddr.a6,
992 (struct in6_addr *)saddr))
993 continue;
994 break;
997 xfrm_state_hold(x);
998 return x;
1001 if (!create)
1002 return NULL;
1004 x = xfrm_state_alloc();
1005 if (likely(x)) {
1006 switch (family) {
1007 case AF_INET:
1008 x->sel.daddr.a4 = daddr->a4;
1009 x->sel.saddr.a4 = saddr->a4;
1010 x->sel.prefixlen_d = 32;
1011 x->sel.prefixlen_s = 32;
1012 x->props.saddr.a4 = saddr->a4;
1013 x->id.daddr.a4 = daddr->a4;
1014 break;
1016 case AF_INET6:
1017 ipv6_addr_copy((struct in6_addr *)x->sel.daddr.a6,
1018 (struct in6_addr *)daddr);
1019 ipv6_addr_copy((struct in6_addr *)x->sel.saddr.a6,
1020 (struct in6_addr *)saddr);
1021 x->sel.prefixlen_d = 128;
1022 x->sel.prefixlen_s = 128;
1023 ipv6_addr_copy((struct in6_addr *)x->props.saddr.a6,
1024 (struct in6_addr *)saddr);
1025 ipv6_addr_copy((struct in6_addr *)x->id.daddr.a6,
1026 (struct in6_addr *)daddr);
1027 break;
1030 x->km.state = XFRM_STATE_ACQ;
1031 x->id.proto = proto;
1032 x->props.family = family;
1033 x->props.mode = mode;
1034 x->props.reqid = reqid;
1035 x->lft.hard_add_expires_seconds = sysctl_xfrm_acq_expires;
1036 xfrm_state_hold(x);
1037 x->timer.expires = jiffies + sysctl_xfrm_acq_expires*HZ;
1038 add_timer(&x->timer);
1039 hlist_add_head(&x->bydst, xfrm_state_bydst+h);
1040 h = xfrm_src_hash(daddr, saddr, family);
1041 hlist_add_head(&x->bysrc, xfrm_state_bysrc+h);
1043 xfrm_state_num++;
1045 xfrm_hash_grow_check(x->bydst.next != NULL);
1048 return x;
1051 static struct xfrm_state *__xfrm_find_acq_byseq(u32 seq);
1053 int xfrm_state_add(struct xfrm_state *x)
1055 struct xfrm_state *x1;
1056 int family;
1057 int err;
1058 int use_spi = xfrm_id_proto_match(x->id.proto, IPSEC_PROTO_ANY);
1060 family = x->props.family;
1062 spin_lock_bh(&xfrm_state_lock);
1064 x1 = __xfrm_state_locate(x, use_spi, family);
1065 if (x1) {
1066 xfrm_state_put(x1);
1067 x1 = NULL;
1068 err = -EEXIST;
1069 goto out;
1072 if (use_spi && x->km.seq) {
1073 x1 = __xfrm_find_acq_byseq(x->km.seq);
1074 if (x1 && ((x1->id.proto != x->id.proto) ||
1075 xfrm_addr_cmp(&x1->id.daddr, &x->id.daddr, family))) {
1076 xfrm_state_put(x1);
1077 x1 = NULL;
1081 if (use_spi && !x1)
1082 x1 = __find_acq_core(family, x->props.mode, x->props.reqid,
1083 x->id.proto,
1084 &x->id.daddr, &x->props.saddr, 0);
1086 __xfrm_state_bump_genids(x);
1087 __xfrm_state_insert(x);
1088 err = 0;
1090 out:
1091 spin_unlock_bh(&xfrm_state_lock);
1093 if (x1) {
1094 xfrm_state_delete(x1);
1095 xfrm_state_put(x1);
1098 return err;
1100 EXPORT_SYMBOL(xfrm_state_add);
1102 #ifdef CONFIG_XFRM_MIGRATE
1103 static struct xfrm_state *xfrm_state_clone(struct xfrm_state *orig, int *errp)
1105 int err = -ENOMEM;
1106 struct xfrm_state *x = xfrm_state_alloc();
1107 if (!x)
1108 goto error;
1110 memcpy(&x->id, &orig->id, sizeof(x->id));
1111 memcpy(&x->sel, &orig->sel, sizeof(x->sel));
1112 memcpy(&x->lft, &orig->lft, sizeof(x->lft));
1113 x->props.mode = orig->props.mode;
1114 x->props.replay_window = orig->props.replay_window;
1115 x->props.reqid = orig->props.reqid;
1116 x->props.family = orig->props.family;
1117 x->props.saddr = orig->props.saddr;
1119 if (orig->aalg) {
1120 x->aalg = xfrm_algo_clone(orig->aalg);
1121 if (!x->aalg)
1122 goto error;
1124 x->props.aalgo = orig->props.aalgo;
1126 if (orig->ealg) {
1127 x->ealg = xfrm_algo_clone(orig->ealg);
1128 if (!x->ealg)
1129 goto error;
1131 x->props.ealgo = orig->props.ealgo;
1133 if (orig->calg) {
1134 x->calg = xfrm_algo_clone(orig->calg);
1135 if (!x->calg)
1136 goto error;
1138 x->props.calgo = orig->props.calgo;
1140 if (orig->encap) {
1141 x->encap = kmemdup(orig->encap, sizeof(*x->encap), GFP_KERNEL);
1142 if (!x->encap)
1143 goto error;
1146 if (orig->coaddr) {
1147 x->coaddr = kmemdup(orig->coaddr, sizeof(*x->coaddr),
1148 GFP_KERNEL);
1149 if (!x->coaddr)
1150 goto error;
1153 err = xfrm_init_state(x);
1154 if (err)
1155 goto error;
1157 x->props.flags = orig->props.flags;
1159 x->curlft.add_time = orig->curlft.add_time;
1160 x->km.state = orig->km.state;
1161 x->km.seq = orig->km.seq;
1163 return x;
1165 error:
1166 if (errp)
1167 *errp = err;
1168 if (x) {
1169 kfree(x->aalg);
1170 kfree(x->ealg);
1171 kfree(x->calg);
1172 kfree(x->encap);
1173 kfree(x->coaddr);
1175 kfree(x);
1176 return NULL;
1179 /* xfrm_state_lock is held */
1180 struct xfrm_state * xfrm_migrate_state_find(struct xfrm_migrate *m)
1182 unsigned int h;
1183 struct xfrm_state *x;
1184 struct hlist_node *entry;
1186 if (m->reqid) {
1187 h = xfrm_dst_hash(&m->old_daddr, &m->old_saddr,
1188 m->reqid, m->old_family);
1189 hlist_for_each_entry(x, entry, xfrm_state_bydst+h, bydst) {
1190 if (x->props.mode != m->mode ||
1191 x->id.proto != m->proto)
1192 continue;
1193 if (m->reqid && x->props.reqid != m->reqid)
1194 continue;
1195 if (xfrm_addr_cmp(&x->id.daddr, &m->old_daddr,
1196 m->old_family) ||
1197 xfrm_addr_cmp(&x->props.saddr, &m->old_saddr,
1198 m->old_family))
1199 continue;
1200 xfrm_state_hold(x);
1201 return x;
1203 } else {
1204 h = xfrm_src_hash(&m->old_daddr, &m->old_saddr,
1205 m->old_family);
1206 hlist_for_each_entry(x, entry, xfrm_state_bysrc+h, bysrc) {
1207 if (x->props.mode != m->mode ||
1208 x->id.proto != m->proto)
1209 continue;
1210 if (xfrm_addr_cmp(&x->id.daddr, &m->old_daddr,
1211 m->old_family) ||
1212 xfrm_addr_cmp(&x->props.saddr, &m->old_saddr,
1213 m->old_family))
1214 continue;
1215 xfrm_state_hold(x);
1216 return x;
1220 return NULL;
1222 EXPORT_SYMBOL(xfrm_migrate_state_find);
1224 struct xfrm_state * xfrm_state_migrate(struct xfrm_state *x,
1225 struct xfrm_migrate *m)
1227 struct xfrm_state *xc;
1228 int err;
1230 xc = xfrm_state_clone(x, &err);
1231 if (!xc)
1232 return NULL;
1234 memcpy(&xc->id.daddr, &m->new_daddr, sizeof(xc->id.daddr));
1235 memcpy(&xc->props.saddr, &m->new_saddr, sizeof(xc->props.saddr));
1237 /* add state */
1238 if (!xfrm_addr_cmp(&x->id.daddr, &m->new_daddr, m->new_family)) {
1239 /* a care is needed when the destination address of the
1240 state is to be updated as it is a part of triplet */
1241 xfrm_state_insert(xc);
1242 } else {
1243 if ((err = xfrm_state_add(xc)) < 0)
1244 goto error;
1247 return xc;
1248 error:
1249 kfree(xc);
1250 return NULL;
1252 EXPORT_SYMBOL(xfrm_state_migrate);
1253 #endif
1255 int xfrm_state_update(struct xfrm_state *x)
1257 struct xfrm_state *x1;
1258 int err;
1259 int use_spi = xfrm_id_proto_match(x->id.proto, IPSEC_PROTO_ANY);
1261 spin_lock_bh(&xfrm_state_lock);
1262 x1 = __xfrm_state_locate(x, use_spi, x->props.family);
1264 err = -ESRCH;
1265 if (!x1)
1266 goto out;
1268 if (xfrm_state_kern(x1)) {
1269 xfrm_state_put(x1);
1270 err = -EEXIST;
1271 goto out;
1274 if (x1->km.state == XFRM_STATE_ACQ) {
1275 __xfrm_state_insert(x);
1276 x = NULL;
1278 err = 0;
1280 out:
1281 spin_unlock_bh(&xfrm_state_lock);
1283 if (err)
1284 return err;
1286 if (!x) {
1287 xfrm_state_delete(x1);
1288 xfrm_state_put(x1);
1289 return 0;
1292 err = -EINVAL;
1293 spin_lock_bh(&x1->lock);
1294 if (likely(x1->km.state == XFRM_STATE_VALID)) {
1295 if (x->encap && x1->encap)
1296 memcpy(x1->encap, x->encap, sizeof(*x1->encap));
1297 if (x->coaddr && x1->coaddr) {
1298 memcpy(x1->coaddr, x->coaddr, sizeof(*x1->coaddr));
1300 if (!use_spi && memcmp(&x1->sel, &x->sel, sizeof(x1->sel)))
1301 memcpy(&x1->sel, &x->sel, sizeof(x1->sel));
1302 memcpy(&x1->lft, &x->lft, sizeof(x1->lft));
1303 x1->km.dying = 0;
1305 mod_timer(&x1->timer, jiffies + HZ);
1306 if (x1->curlft.use_time)
1307 xfrm_state_check_expire(x1);
1309 err = 0;
1311 spin_unlock_bh(&x1->lock);
1313 xfrm_state_put(x1);
1315 return err;
1317 EXPORT_SYMBOL(xfrm_state_update);
1319 int xfrm_state_check_expire(struct xfrm_state *x)
1321 if (!x->curlft.use_time)
1322 x->curlft.use_time = get_seconds();
1324 if (x->km.state != XFRM_STATE_VALID)
1325 return -EINVAL;
1327 if (x->curlft.bytes >= x->lft.hard_byte_limit ||
1328 x->curlft.packets >= x->lft.hard_packet_limit) {
1329 x->km.state = XFRM_STATE_EXPIRED;
1330 mod_timer(&x->timer, jiffies);
1331 return -EINVAL;
1334 if (!x->km.dying &&
1335 (x->curlft.bytes >= x->lft.soft_byte_limit ||
1336 x->curlft.packets >= x->lft.soft_packet_limit)) {
1337 x->km.dying = 1;
1338 km_state_expired(x, 0, 0);
1340 return 0;
1342 EXPORT_SYMBOL(xfrm_state_check_expire);
1344 struct xfrm_state *
1345 xfrm_state_lookup(xfrm_address_t *daddr, __be32 spi, u8 proto,
1346 unsigned short family)
1348 struct xfrm_state *x;
1350 spin_lock_bh(&xfrm_state_lock);
1351 x = __xfrm_state_lookup(daddr, spi, proto, family);
1352 spin_unlock_bh(&xfrm_state_lock);
1353 return x;
1355 EXPORT_SYMBOL(xfrm_state_lookup);
1357 struct xfrm_state *
1358 xfrm_state_lookup_byaddr(xfrm_address_t *daddr, xfrm_address_t *saddr,
1359 u8 proto, unsigned short family)
1361 struct xfrm_state *x;
1363 spin_lock_bh(&xfrm_state_lock);
1364 x = __xfrm_state_lookup_byaddr(daddr, saddr, proto, family);
1365 spin_unlock_bh(&xfrm_state_lock);
1366 return x;
1368 EXPORT_SYMBOL(xfrm_state_lookup_byaddr);
1370 struct xfrm_state *
1371 xfrm_find_acq(u8 mode, u32 reqid, u8 proto,
1372 xfrm_address_t *daddr, xfrm_address_t *saddr,
1373 int create, unsigned short family)
1375 struct xfrm_state *x;
1377 spin_lock_bh(&xfrm_state_lock);
1378 x = __find_acq_core(family, mode, reqid, proto, daddr, saddr, create);
1379 spin_unlock_bh(&xfrm_state_lock);
1381 return x;
1383 EXPORT_SYMBOL(xfrm_find_acq);
1385 #ifdef CONFIG_XFRM_SUB_POLICY
1387 xfrm_tmpl_sort(struct xfrm_tmpl **dst, struct xfrm_tmpl **src, int n,
1388 unsigned short family)
1390 int err = 0;
1391 struct xfrm_state_afinfo *afinfo = xfrm_state_get_afinfo(family);
1392 if (!afinfo)
1393 return -EAFNOSUPPORT;
1395 spin_lock_bh(&xfrm_state_lock);
1396 if (afinfo->tmpl_sort)
1397 err = afinfo->tmpl_sort(dst, src, n);
1398 spin_unlock_bh(&xfrm_state_lock);
1399 xfrm_state_put_afinfo(afinfo);
1400 return err;
1402 EXPORT_SYMBOL(xfrm_tmpl_sort);
1405 xfrm_state_sort(struct xfrm_state **dst, struct xfrm_state **src, int n,
1406 unsigned short family)
1408 int err = 0;
1409 struct xfrm_state_afinfo *afinfo = xfrm_state_get_afinfo(family);
1410 if (!afinfo)
1411 return -EAFNOSUPPORT;
1413 spin_lock_bh(&xfrm_state_lock);
1414 if (afinfo->state_sort)
1415 err = afinfo->state_sort(dst, src, n);
1416 spin_unlock_bh(&xfrm_state_lock);
1417 xfrm_state_put_afinfo(afinfo);
1418 return err;
1420 EXPORT_SYMBOL(xfrm_state_sort);
1421 #endif
1423 /* Silly enough, but I'm lazy to build resolution list */
1425 static struct xfrm_state *__xfrm_find_acq_byseq(u32 seq)
1427 int i;
1429 for (i = 0; i <= xfrm_state_hmask; i++) {
1430 struct hlist_node *entry;
1431 struct xfrm_state *x;
1433 hlist_for_each_entry(x, entry, xfrm_state_bydst+i, bydst) {
1434 if (x->km.seq == seq &&
1435 x->km.state == XFRM_STATE_ACQ) {
1436 xfrm_state_hold(x);
1437 return x;
1441 return NULL;
1444 struct xfrm_state *xfrm_find_acq_byseq(u32 seq)
1446 struct xfrm_state *x;
1448 spin_lock_bh(&xfrm_state_lock);
1449 x = __xfrm_find_acq_byseq(seq);
1450 spin_unlock_bh(&xfrm_state_lock);
1451 return x;
1453 EXPORT_SYMBOL(xfrm_find_acq_byseq);
1455 u32 xfrm_get_acqseq(void)
1457 u32 res;
1458 static u32 acqseq;
1459 static DEFINE_SPINLOCK(acqseq_lock);
1461 spin_lock_bh(&acqseq_lock);
1462 res = (++acqseq ? : ++acqseq);
1463 spin_unlock_bh(&acqseq_lock);
1464 return res;
1466 EXPORT_SYMBOL(xfrm_get_acqseq);
1468 int xfrm_alloc_spi(struct xfrm_state *x, u32 low, u32 high)
1470 unsigned int h;
1471 struct xfrm_state *x0;
1472 int err = -ENOENT;
1473 __be32 minspi = htonl(low);
1474 __be32 maxspi = htonl(high);
1476 spin_lock_bh(&x->lock);
1477 if (x->km.state == XFRM_STATE_DEAD)
1478 goto unlock;
1480 err = 0;
1481 if (x->id.spi)
1482 goto unlock;
1484 err = -ENOENT;
1486 if (minspi == maxspi) {
1487 x0 = xfrm_state_lookup(&x->id.daddr, minspi, x->id.proto, x->props.family);
1488 if (x0) {
1489 xfrm_state_put(x0);
1490 goto unlock;
1492 x->id.spi = minspi;
1493 } else {
1494 u32 spi = 0;
1495 for (h=0; h<high-low+1; h++) {
1496 spi = low + net_random()%(high-low+1);
1497 x0 = xfrm_state_lookup(&x->id.daddr, htonl(spi), x->id.proto, x->props.family);
1498 if (x0 == NULL) {
1499 x->id.spi = htonl(spi);
1500 break;
1502 xfrm_state_put(x0);
1505 if (x->id.spi) {
1506 spin_lock_bh(&xfrm_state_lock);
1507 h = xfrm_spi_hash(&x->id.daddr, x->id.spi, x->id.proto, x->props.family);
1508 hlist_add_head(&x->byspi, xfrm_state_byspi+h);
1509 spin_unlock_bh(&xfrm_state_lock);
1511 err = 0;
1514 unlock:
1515 spin_unlock_bh(&x->lock);
1517 return err;
1519 EXPORT_SYMBOL(xfrm_alloc_spi);
1521 int xfrm_state_walk(u8 proto, int (*func)(struct xfrm_state *, int, void*),
1522 void *data)
1524 int i;
1525 struct xfrm_state *x, *last = NULL;
1526 struct hlist_node *entry;
1527 int count = 0;
1528 int err = 0;
1530 spin_lock_bh(&xfrm_state_lock);
1531 for (i = 0; i <= xfrm_state_hmask; i++) {
1532 hlist_for_each_entry(x, entry, xfrm_state_bydst+i, bydst) {
1533 if (!xfrm_id_proto_match(x->id.proto, proto))
1534 continue;
1535 if (last) {
1536 err = func(last, count, data);
1537 if (err)
1538 goto out;
1540 last = x;
1541 count++;
1544 if (count == 0) {
1545 err = -ENOENT;
1546 goto out;
1548 err = func(last, 0, data);
1549 out:
1550 spin_unlock_bh(&xfrm_state_lock);
1551 return err;
1553 EXPORT_SYMBOL(xfrm_state_walk);
1556 void xfrm_replay_notify(struct xfrm_state *x, int event)
1558 struct km_event c;
1559 /* we send notify messages in case
1560 * 1. we updated on of the sequence numbers, and the seqno difference
1561 * is at least x->replay_maxdiff, in this case we also update the
1562 * timeout of our timer function
1563 * 2. if x->replay_maxage has elapsed since last update,
1564 * and there were changes
1566 * The state structure must be locked!
1569 switch (event) {
1570 case XFRM_REPLAY_UPDATE:
1571 if (x->replay_maxdiff &&
1572 (x->replay.seq - x->preplay.seq < x->replay_maxdiff) &&
1573 (x->replay.oseq - x->preplay.oseq < x->replay_maxdiff)) {
1574 if (x->xflags & XFRM_TIME_DEFER)
1575 event = XFRM_REPLAY_TIMEOUT;
1576 else
1577 return;
1580 break;
1582 case XFRM_REPLAY_TIMEOUT:
1583 if ((x->replay.seq == x->preplay.seq) &&
1584 (x->replay.bitmap == x->preplay.bitmap) &&
1585 (x->replay.oseq == x->preplay.oseq)) {
1586 x->xflags |= XFRM_TIME_DEFER;
1587 return;
1590 break;
1593 memcpy(&x->preplay, &x->replay, sizeof(struct xfrm_replay_state));
1594 c.event = XFRM_MSG_NEWAE;
1595 c.data.aevent = event;
1596 km_state_notify(x, &c);
1598 if (x->replay_maxage &&
1599 !mod_timer(&x->rtimer, jiffies + x->replay_maxage))
1600 x->xflags &= ~XFRM_TIME_DEFER;
1603 static void xfrm_replay_timer_handler(unsigned long data)
1605 struct xfrm_state *x = (struct xfrm_state*)data;
1607 spin_lock(&x->lock);
1609 if (x->km.state == XFRM_STATE_VALID) {
1610 if (xfrm_aevent_is_on())
1611 xfrm_replay_notify(x, XFRM_REPLAY_TIMEOUT);
1612 else
1613 x->xflags |= XFRM_TIME_DEFER;
1616 spin_unlock(&x->lock);
1619 int xfrm_replay_check(struct xfrm_state *x,
1620 struct sk_buff *skb, __be32 net_seq)
1622 u32 diff;
1623 u32 seq = ntohl(net_seq);
1625 if (unlikely(seq == 0))
1626 goto err;
1628 if (likely(seq > x->replay.seq))
1629 return 0;
1631 diff = x->replay.seq - seq;
1632 if (diff >= min_t(unsigned int, x->props.replay_window,
1633 sizeof(x->replay.bitmap) * 8)) {
1634 x->stats.replay_window++;
1635 goto err;
1638 if (x->replay.bitmap & (1U << diff)) {
1639 x->stats.replay++;
1640 goto err;
1642 return 0;
1644 err:
1645 xfrm_audit_state_replay(x, skb, net_seq);
1646 return -EINVAL;
1648 EXPORT_SYMBOL(xfrm_replay_check);
1650 void xfrm_replay_advance(struct xfrm_state *x, __be32 net_seq)
1652 u32 diff;
1653 u32 seq = ntohl(net_seq);
1655 if (seq > x->replay.seq) {
1656 diff = seq - x->replay.seq;
1657 if (diff < x->props.replay_window)
1658 x->replay.bitmap = ((x->replay.bitmap) << diff) | 1;
1659 else
1660 x->replay.bitmap = 1;
1661 x->replay.seq = seq;
1662 } else {
1663 diff = x->replay.seq - seq;
1664 x->replay.bitmap |= (1U << diff);
1667 if (xfrm_aevent_is_on())
1668 xfrm_replay_notify(x, XFRM_REPLAY_UPDATE);
1670 EXPORT_SYMBOL(xfrm_replay_advance);
1672 static LIST_HEAD(xfrm_km_list);
1673 static DEFINE_RWLOCK(xfrm_km_lock);
1675 void km_policy_notify(struct xfrm_policy *xp, int dir, struct km_event *c)
1677 struct xfrm_mgr *km;
1679 read_lock(&xfrm_km_lock);
1680 list_for_each_entry(km, &xfrm_km_list, list)
1681 if (km->notify_policy)
1682 km->notify_policy(xp, dir, c);
1683 read_unlock(&xfrm_km_lock);
1686 void km_state_notify(struct xfrm_state *x, struct km_event *c)
1688 struct xfrm_mgr *km;
1689 read_lock(&xfrm_km_lock);
1690 list_for_each_entry(km, &xfrm_km_list, list)
1691 if (km->notify)
1692 km->notify(x, c);
1693 read_unlock(&xfrm_km_lock);
1696 EXPORT_SYMBOL(km_policy_notify);
1697 EXPORT_SYMBOL(km_state_notify);
1699 void km_state_expired(struct xfrm_state *x, int hard, u32 pid)
1701 struct km_event c;
1703 c.data.hard = hard;
1704 c.pid = pid;
1705 c.event = XFRM_MSG_EXPIRE;
1706 km_state_notify(x, &c);
1708 if (hard)
1709 wake_up(&km_waitq);
1712 EXPORT_SYMBOL(km_state_expired);
1714 * We send to all registered managers regardless of failure
1715 * We are happy with one success
1717 int km_query(struct xfrm_state *x, struct xfrm_tmpl *t, struct xfrm_policy *pol)
1719 int err = -EINVAL, acqret;
1720 struct xfrm_mgr *km;
1722 read_lock(&xfrm_km_lock);
1723 list_for_each_entry(km, &xfrm_km_list, list) {
1724 acqret = km->acquire(x, t, pol, XFRM_POLICY_OUT);
1725 if (!acqret)
1726 err = acqret;
1728 read_unlock(&xfrm_km_lock);
1729 return err;
1731 EXPORT_SYMBOL(km_query);
1733 int km_new_mapping(struct xfrm_state *x, xfrm_address_t *ipaddr, __be16 sport)
1735 int err = -EINVAL;
1736 struct xfrm_mgr *km;
1738 read_lock(&xfrm_km_lock);
1739 list_for_each_entry(km, &xfrm_km_list, list) {
1740 if (km->new_mapping)
1741 err = km->new_mapping(x, ipaddr, sport);
1742 if (!err)
1743 break;
1745 read_unlock(&xfrm_km_lock);
1746 return err;
1748 EXPORT_SYMBOL(km_new_mapping);
1750 void km_policy_expired(struct xfrm_policy *pol, int dir, int hard, u32 pid)
1752 struct km_event c;
1754 c.data.hard = hard;
1755 c.pid = pid;
1756 c.event = XFRM_MSG_POLEXPIRE;
1757 km_policy_notify(pol, dir, &c);
1759 if (hard)
1760 wake_up(&km_waitq);
1762 EXPORT_SYMBOL(km_policy_expired);
1764 #ifdef CONFIG_XFRM_MIGRATE
1765 int km_migrate(struct xfrm_selector *sel, u8 dir, u8 type,
1766 struct xfrm_migrate *m, int num_migrate)
1768 int err = -EINVAL;
1769 int ret;
1770 struct xfrm_mgr *km;
1772 read_lock(&xfrm_km_lock);
1773 list_for_each_entry(km, &xfrm_km_list, list) {
1774 if (km->migrate) {
1775 ret = km->migrate(sel, dir, type, m, num_migrate);
1776 if (!ret)
1777 err = ret;
1780 read_unlock(&xfrm_km_lock);
1781 return err;
1783 EXPORT_SYMBOL(km_migrate);
1784 #endif
1786 int km_report(u8 proto, struct xfrm_selector *sel, xfrm_address_t *addr)
1788 int err = -EINVAL;
1789 int ret;
1790 struct xfrm_mgr *km;
1792 read_lock(&xfrm_km_lock);
1793 list_for_each_entry(km, &xfrm_km_list, list) {
1794 if (km->report) {
1795 ret = km->report(proto, sel, addr);
1796 if (!ret)
1797 err = ret;
1800 read_unlock(&xfrm_km_lock);
1801 return err;
1803 EXPORT_SYMBOL(km_report);
1805 int xfrm_user_policy(struct sock *sk, int optname, u8 __user *optval, int optlen)
1807 int err;
1808 u8 *data;
1809 struct xfrm_mgr *km;
1810 struct xfrm_policy *pol = NULL;
1812 if (optlen <= 0 || optlen > PAGE_SIZE)
1813 return -EMSGSIZE;
1815 data = kmalloc(optlen, GFP_KERNEL);
1816 if (!data)
1817 return -ENOMEM;
1819 err = -EFAULT;
1820 if (copy_from_user(data, optval, optlen))
1821 goto out;
1823 err = -EINVAL;
1824 read_lock(&xfrm_km_lock);
1825 list_for_each_entry(km, &xfrm_km_list, list) {
1826 pol = km->compile_policy(sk, optname, data,
1827 optlen, &err);
1828 if (err >= 0)
1829 break;
1831 read_unlock(&xfrm_km_lock);
1833 if (err >= 0) {
1834 xfrm_sk_policy_insert(sk, err, pol);
1835 xfrm_pol_put(pol);
1836 err = 0;
1839 out:
1840 kfree(data);
1841 return err;
1843 EXPORT_SYMBOL(xfrm_user_policy);
1845 int xfrm_register_km(struct xfrm_mgr *km)
1847 write_lock_bh(&xfrm_km_lock);
1848 list_add_tail(&km->list, &xfrm_km_list);
1849 write_unlock_bh(&xfrm_km_lock);
1850 return 0;
1852 EXPORT_SYMBOL(xfrm_register_km);
1854 int xfrm_unregister_km(struct xfrm_mgr *km)
1856 write_lock_bh(&xfrm_km_lock);
1857 list_del(&km->list);
1858 write_unlock_bh(&xfrm_km_lock);
1859 return 0;
1861 EXPORT_SYMBOL(xfrm_unregister_km);
1863 int xfrm_state_register_afinfo(struct xfrm_state_afinfo *afinfo)
1865 int err = 0;
1866 if (unlikely(afinfo == NULL))
1867 return -EINVAL;
1868 if (unlikely(afinfo->family >= NPROTO))
1869 return -EAFNOSUPPORT;
1870 write_lock_bh(&xfrm_state_afinfo_lock);
1871 if (unlikely(xfrm_state_afinfo[afinfo->family] != NULL))
1872 err = -ENOBUFS;
1873 else
1874 xfrm_state_afinfo[afinfo->family] = afinfo;
1875 write_unlock_bh(&xfrm_state_afinfo_lock);
1876 return err;
1878 EXPORT_SYMBOL(xfrm_state_register_afinfo);
1880 int xfrm_state_unregister_afinfo(struct xfrm_state_afinfo *afinfo)
1882 int err = 0;
1883 if (unlikely(afinfo == NULL))
1884 return -EINVAL;
1885 if (unlikely(afinfo->family >= NPROTO))
1886 return -EAFNOSUPPORT;
1887 write_lock_bh(&xfrm_state_afinfo_lock);
1888 if (likely(xfrm_state_afinfo[afinfo->family] != NULL)) {
1889 if (unlikely(xfrm_state_afinfo[afinfo->family] != afinfo))
1890 err = -EINVAL;
1891 else
1892 xfrm_state_afinfo[afinfo->family] = NULL;
1894 write_unlock_bh(&xfrm_state_afinfo_lock);
1895 return err;
1897 EXPORT_SYMBOL(xfrm_state_unregister_afinfo);
1899 static struct xfrm_state_afinfo *xfrm_state_get_afinfo(unsigned int family)
1901 struct xfrm_state_afinfo *afinfo;
1902 if (unlikely(family >= NPROTO))
1903 return NULL;
1904 read_lock(&xfrm_state_afinfo_lock);
1905 afinfo = xfrm_state_afinfo[family];
1906 if (unlikely(!afinfo))
1907 read_unlock(&xfrm_state_afinfo_lock);
1908 return afinfo;
1911 static void xfrm_state_put_afinfo(struct xfrm_state_afinfo *afinfo)
1912 __releases(xfrm_state_afinfo_lock)
1914 read_unlock(&xfrm_state_afinfo_lock);
1917 /* Temporarily located here until net/xfrm/xfrm_tunnel.c is created */
1918 void xfrm_state_delete_tunnel(struct xfrm_state *x)
1920 if (x->tunnel) {
1921 struct xfrm_state *t = x->tunnel;
1923 if (atomic_read(&t->tunnel_users) == 2)
1924 xfrm_state_delete(t);
1925 atomic_dec(&t->tunnel_users);
1926 xfrm_state_put(t);
1927 x->tunnel = NULL;
1930 EXPORT_SYMBOL(xfrm_state_delete_tunnel);
1932 int xfrm_state_mtu(struct xfrm_state *x, int mtu)
1934 int res;
1936 spin_lock_bh(&x->lock);
1937 if (x->km.state == XFRM_STATE_VALID &&
1938 x->type && x->type->get_mtu)
1939 res = x->type->get_mtu(x, mtu);
1940 else
1941 res = mtu - x->props.header_len;
1942 spin_unlock_bh(&x->lock);
1943 return res;
1946 int xfrm_init_state(struct xfrm_state *x)
1948 struct xfrm_state_afinfo *afinfo;
1949 int family = x->props.family;
1950 int err;
1952 err = -EAFNOSUPPORT;
1953 afinfo = xfrm_state_get_afinfo(family);
1954 if (!afinfo)
1955 goto error;
1957 err = 0;
1958 if (afinfo->init_flags)
1959 err = afinfo->init_flags(x);
1961 xfrm_state_put_afinfo(afinfo);
1963 if (err)
1964 goto error;
1966 err = -EPROTONOSUPPORT;
1967 x->inner_mode = xfrm_get_mode(x->props.mode, x->sel.family);
1968 if (x->inner_mode == NULL)
1969 goto error;
1971 if (!(x->inner_mode->flags & XFRM_MODE_FLAG_TUNNEL) &&
1972 family != x->sel.family)
1973 goto error;
1975 x->type = xfrm_get_type(x->id.proto, family);
1976 if (x->type == NULL)
1977 goto error;
1979 err = x->type->init_state(x);
1980 if (err)
1981 goto error;
1983 x->outer_mode = xfrm_get_mode(x->props.mode, family);
1984 if (x->outer_mode == NULL)
1985 goto error;
1987 x->km.state = XFRM_STATE_VALID;
1989 error:
1990 return err;
1993 EXPORT_SYMBOL(xfrm_init_state);
1995 void __init xfrm_state_init(void)
1997 unsigned int sz;
1999 sz = sizeof(struct hlist_head) * 8;
2001 xfrm_state_bydst = xfrm_hash_alloc(sz);
2002 xfrm_state_bysrc = xfrm_hash_alloc(sz);
2003 xfrm_state_byspi = xfrm_hash_alloc(sz);
2004 if (!xfrm_state_bydst || !xfrm_state_bysrc || !xfrm_state_byspi)
2005 panic("XFRM: Cannot allocate bydst/bysrc/byspi hashes.");
2006 xfrm_state_hmask = ((sz / sizeof(struct hlist_head)) - 1);
2008 INIT_WORK(&xfrm_state_gc_work, xfrm_state_gc_task);
2011 #ifdef CONFIG_AUDITSYSCALL
2012 static void xfrm_audit_helper_sainfo(struct xfrm_state *x,
2013 struct audit_buffer *audit_buf)
2015 struct xfrm_sec_ctx *ctx = x->security;
2016 u32 spi = ntohl(x->id.spi);
2018 if (ctx)
2019 audit_log_format(audit_buf, " sec_alg=%u sec_doi=%u sec_obj=%s",
2020 ctx->ctx_alg, ctx->ctx_doi, ctx->ctx_str);
2022 switch(x->props.family) {
2023 case AF_INET:
2024 audit_log_format(audit_buf,
2025 " src=" NIPQUAD_FMT " dst=" NIPQUAD_FMT,
2026 NIPQUAD(x->props.saddr.a4),
2027 NIPQUAD(x->id.daddr.a4));
2028 break;
2029 case AF_INET6:
2030 audit_log_format(audit_buf,
2031 " src=" NIP6_FMT " dst=" NIP6_FMT,
2032 NIP6(*(struct in6_addr *)x->props.saddr.a6),
2033 NIP6(*(struct in6_addr *)x->id.daddr.a6));
2034 break;
2037 audit_log_format(audit_buf, " spi=%u(0x%x)", spi, spi);
2040 static void xfrm_audit_helper_pktinfo(struct sk_buff *skb, u16 family,
2041 struct audit_buffer *audit_buf)
2043 struct iphdr *iph4;
2044 struct ipv6hdr *iph6;
2046 switch (family) {
2047 case AF_INET:
2048 iph4 = ip_hdr(skb);
2049 audit_log_format(audit_buf,
2050 " src=" NIPQUAD_FMT " dst=" NIPQUAD_FMT,
2051 NIPQUAD(iph4->saddr),
2052 NIPQUAD(iph4->daddr));
2053 break;
2054 case AF_INET6:
2055 iph6 = ipv6_hdr(skb);
2056 audit_log_format(audit_buf,
2057 " src=" NIP6_FMT " dst=" NIP6_FMT
2058 " flowlbl=0x%x%x%x",
2059 NIP6(iph6->saddr),
2060 NIP6(iph6->daddr),
2061 iph6->flow_lbl[0] & 0x0f,
2062 iph6->flow_lbl[1],
2063 iph6->flow_lbl[2]);
2064 break;
2068 void xfrm_audit_state_add(struct xfrm_state *x, int result,
2069 u32 auid, u32 secid)
2071 struct audit_buffer *audit_buf;
2073 audit_buf = xfrm_audit_start("SAD-add");
2074 if (audit_buf == NULL)
2075 return;
2076 xfrm_audit_helper_usrinfo(auid, secid, audit_buf);
2077 xfrm_audit_helper_sainfo(x, audit_buf);
2078 audit_log_format(audit_buf, " res=%u", result);
2079 audit_log_end(audit_buf);
2081 EXPORT_SYMBOL_GPL(xfrm_audit_state_add);
2083 void xfrm_audit_state_delete(struct xfrm_state *x, int result,
2084 u32 auid, u32 secid)
2086 struct audit_buffer *audit_buf;
2088 audit_buf = xfrm_audit_start("SAD-delete");
2089 if (audit_buf == NULL)
2090 return;
2091 xfrm_audit_helper_usrinfo(auid, secid, audit_buf);
2092 xfrm_audit_helper_sainfo(x, audit_buf);
2093 audit_log_format(audit_buf, " res=%u", result);
2094 audit_log_end(audit_buf);
2096 EXPORT_SYMBOL_GPL(xfrm_audit_state_delete);
2098 void xfrm_audit_state_replay_overflow(struct xfrm_state *x,
2099 struct sk_buff *skb)
2101 struct audit_buffer *audit_buf;
2102 u32 spi;
2104 audit_buf = xfrm_audit_start("SA-replay-overflow");
2105 if (audit_buf == NULL)
2106 return;
2107 xfrm_audit_helper_pktinfo(skb, x->props.family, audit_buf);
2108 /* don't record the sequence number because it's inherent in this kind
2109 * of audit message */
2110 spi = ntohl(x->id.spi);
2111 audit_log_format(audit_buf, " spi=%u(0x%x)", spi, spi);
2112 audit_log_end(audit_buf);
2114 EXPORT_SYMBOL_GPL(xfrm_audit_state_replay_overflow);
2116 static void xfrm_audit_state_replay(struct xfrm_state *x,
2117 struct sk_buff *skb, __be32 net_seq)
2119 struct audit_buffer *audit_buf;
2120 u32 spi;
2122 audit_buf = xfrm_audit_start("SA-replayed-pkt");
2123 if (audit_buf == NULL)
2124 return;
2125 xfrm_audit_helper_pktinfo(skb, x->props.family, audit_buf);
2126 spi = ntohl(x->id.spi);
2127 audit_log_format(audit_buf, " spi=%u(0x%x) seqno=%u",
2128 spi, spi, ntohl(net_seq));
2129 audit_log_end(audit_buf);
2132 void xfrm_audit_state_notfound_simple(struct sk_buff *skb, u16 family)
2134 struct audit_buffer *audit_buf;
2136 audit_buf = xfrm_audit_start("SA-notfound");
2137 if (audit_buf == NULL)
2138 return;
2139 xfrm_audit_helper_pktinfo(skb, family, audit_buf);
2140 audit_log_end(audit_buf);
2142 EXPORT_SYMBOL_GPL(xfrm_audit_state_notfound_simple);
2144 void xfrm_audit_state_notfound(struct sk_buff *skb, u16 family,
2145 __be32 net_spi, __be32 net_seq)
2147 struct audit_buffer *audit_buf;
2148 u32 spi;
2150 audit_buf = xfrm_audit_start("SA-notfound");
2151 if (audit_buf == NULL)
2152 return;
2153 xfrm_audit_helper_pktinfo(skb, family, audit_buf);
2154 spi = ntohl(net_spi);
2155 audit_log_format(audit_buf, " spi=%u(0x%x) seqno=%u",
2156 spi, spi, ntohl(net_seq));
2157 audit_log_end(audit_buf);
2159 EXPORT_SYMBOL_GPL(xfrm_audit_state_notfound);
2161 void xfrm_audit_state_icvfail(struct xfrm_state *x,
2162 struct sk_buff *skb, u8 proto)
2164 struct audit_buffer *audit_buf;
2165 __be32 net_spi;
2166 __be32 net_seq;
2168 audit_buf = xfrm_audit_start("SA-icv-failure");
2169 if (audit_buf == NULL)
2170 return;
2171 xfrm_audit_helper_pktinfo(skb, x->props.family, audit_buf);
2172 if (xfrm_parse_spi(skb, proto, &net_spi, &net_seq) == 0) {
2173 u32 spi = ntohl(net_spi);
2174 audit_log_format(audit_buf, " spi=%u(0x%x) seqno=%u",
2175 spi, spi, ntohl(net_seq));
2177 audit_log_end(audit_buf);
2179 EXPORT_SYMBOL_GPL(xfrm_audit_state_icvfail);
2180 #endif /* CONFIG_AUDITSYSCALL */