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