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