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