1#ifndef _NET_XFRM_H
2#define _NET_XFRM_H
3
4#include <linux/compiler.h>
5#include <linux/xfrm.h>
6#include <linux/spinlock.h>
7#include <linux/list.h>
8#include <linux/skbuff.h>
9#include <linux/socket.h>
10#include <linux/pfkeyv2.h>
11#include <linux/ipsec.h>
12#include <linux/in6.h>
13#include <linux/mutex.h>
14#include <linux/audit.h>
15
16#include <net/sock.h>
17#include <net/dst.h>
18#include <net/ip.h>
19#include <net/route.h>
20#include <net/ipv6.h>
21#include <net/ip6_fib.h>
22#ifdef CONFIG_XFRM_STATISTICS
23#include <net/snmp.h>
24#endif
25
26#define XFRM_PROTO_ESP 50
27#define XFRM_PROTO_AH 51
28#define XFRM_PROTO_COMP 108
29#define XFRM_PROTO_IPIP 4
30#define XFRM_PROTO_IPV6 41
31#define XFRM_PROTO_ROUTING IPPROTO_ROUTING
32#define XFRM_PROTO_DSTOPTS IPPROTO_DSTOPTS
33
34#define XFRM_ALIGN8(len) (((len) + 7) & ~7)
35#define MODULE_ALIAS_XFRM_MODE(family, encap) \
36 MODULE_ALIAS("xfrm-mode-" __stringify(family) "-" __stringify(encap))
37#define MODULE_ALIAS_XFRM_TYPE(family, proto) \
38 MODULE_ALIAS("xfrm-type-" __stringify(family) "-" __stringify(proto))
39
40#ifdef CONFIG_XFRM_STATISTICS
41DECLARE_SNMP_STAT(struct linux_xfrm_mib, xfrm_statistics);
42#define XFRM_INC_STATS(field) SNMP_INC_STATS(xfrm_statistics, field)
43#define XFRM_INC_STATS_BH(field) SNMP_INC_STATS_BH(xfrm_statistics, field)
44#define XFRM_INC_STATS_USER(field) SNMP_INC_STATS_USER(xfrm_statistics, field)
45#else
46#define XFRM_INC_STATS(field)
47#define XFRM_INC_STATS_BH(field)
48#define XFRM_INC_STATS_USER(field)
49#endif
50
51extern struct sock *xfrm_nl;
52extern u32 sysctl_xfrm_aevent_etime;
53extern u32 sysctl_xfrm_aevent_rseqth;
54extern int sysctl_xfrm_larval_drop;
55extern u32 sysctl_xfrm_acq_expires;
56
57extern struct mutex xfrm_cfg_mutex;
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121struct xfrm_state
122{
123
124 struct list_head all;
125 struct hlist_node bydst;
126 struct hlist_node bysrc;
127 struct hlist_node byspi;
128
129 atomic_t refcnt;
130 spinlock_t lock;
131
132 struct xfrm_id id;
133 struct xfrm_selector sel;
134
135 u32 genid;
136
137
138 struct {
139 u8 state;
140 u8 dying;
141 u32 seq;
142 } km;
143
144
145 struct {
146 u32 reqid;
147 u8 mode;
148 u8 replay_window;
149 u8 aalgo, ealgo, calgo;
150 u8 flags;
151 u16 family;
152 xfrm_address_t saddr;
153 int header_len;
154 int trailer_len;
155 } props;
156
157 struct xfrm_lifetime_cfg lft;
158
159
160 struct xfrm_algo *aalg;
161 struct xfrm_algo *ealg;
162 struct xfrm_algo *calg;
163 struct xfrm_algo_aead *aead;
164
165
166 struct xfrm_encap_tmpl *encap;
167
168
169 xfrm_address_t *coaddr;
170
171
172 struct xfrm_state *tunnel;
173
174
175 atomic_t tunnel_users;
176
177
178 struct xfrm_replay_state replay;
179
180
181 struct xfrm_replay_state preplay;
182
183
184
185
186 u32 xflags;
187
188
189 u32 replay_maxage;
190 u32 replay_maxdiff;
191
192
193 struct timer_list rtimer;
194
195
196 struct xfrm_stats stats;
197
198 struct xfrm_lifetime_cur curlft;
199 struct timer_list timer;
200
201
202 unsigned long lastused;
203
204
205
206 const struct xfrm_type *type;
207 struct xfrm_mode *inner_mode;
208 struct xfrm_mode *inner_mode_iaf;
209 struct xfrm_mode *outer_mode;
210
211
212 struct xfrm_sec_ctx *security;
213
214
215
216 void *data;
217};
218
219
220#define XFRM_TIME_DEFER 1
221
222enum {
223 XFRM_STATE_VOID,
224 XFRM_STATE_ACQ,
225 XFRM_STATE_VALID,
226 XFRM_STATE_ERROR,
227 XFRM_STATE_EXPIRED,
228 XFRM_STATE_DEAD
229};
230
231
232struct km_event
233{
234 union {
235 u32 hard;
236 u32 proto;
237 u32 byid;
238 u32 aevent;
239 u32 type;
240 } data;
241
242 u32 seq;
243 u32 pid;
244 u32 event;
245};
246
247struct net_device;
248struct xfrm_type;
249struct xfrm_dst;
250struct xfrm_policy_afinfo {
251 unsigned short family;
252 struct dst_ops *dst_ops;
253 void (*garbage_collect)(void);
254 struct dst_entry *(*dst_lookup)(int tos, xfrm_address_t *saddr,
255 xfrm_address_t *daddr);
256 int (*get_saddr)(xfrm_address_t *saddr, xfrm_address_t *daddr);
257 struct dst_entry *(*find_bundle)(struct flowi *fl, struct xfrm_policy *policy);
258 void (*decode_session)(struct sk_buff *skb,
259 struct flowi *fl,
260 int reverse);
261 int (*get_tos)(struct flowi *fl);
262 int (*init_path)(struct xfrm_dst *path,
263 struct dst_entry *dst,
264 int nfheader_len);
265 int (*fill_dst)(struct xfrm_dst *xdst,
266 struct net_device *dev);
267};
268
269extern int xfrm_policy_register_afinfo(struct xfrm_policy_afinfo *afinfo);
270extern int xfrm_policy_unregister_afinfo(struct xfrm_policy_afinfo *afinfo);
271extern void km_policy_notify(struct xfrm_policy *xp, int dir, struct km_event *c);
272extern void km_state_notify(struct xfrm_state *x, struct km_event *c);
273
274struct xfrm_tmpl;
275extern int km_query(struct xfrm_state *x, struct xfrm_tmpl *t, struct xfrm_policy *pol);
276extern void km_state_expired(struct xfrm_state *x, int hard, u32 pid);
277extern int __xfrm_state_delete(struct xfrm_state *x);
278
279struct xfrm_state_afinfo {
280 unsigned int family;
281 unsigned int proto;
282 __be16 eth_proto;
283 struct module *owner;
284 const struct xfrm_type *type_map[IPPROTO_MAX];
285 struct xfrm_mode *mode_map[XFRM_MODE_MAX];
286 int (*init_flags)(struct xfrm_state *x);
287 void (*init_tempsel)(struct xfrm_state *x, struct flowi *fl,
288 struct xfrm_tmpl *tmpl,
289 xfrm_address_t *daddr, xfrm_address_t *saddr);
290 int (*tmpl_sort)(struct xfrm_tmpl **dst, struct xfrm_tmpl **src, int n);
291 int (*state_sort)(struct xfrm_state **dst, struct xfrm_state **src, int n);
292 int (*output)(struct sk_buff *skb);
293 int (*extract_input)(struct xfrm_state *x,
294 struct sk_buff *skb);
295 int (*extract_output)(struct xfrm_state *x,
296 struct sk_buff *skb);
297 int (*transport_finish)(struct sk_buff *skb,
298 int async);
299};
300
301extern int xfrm_state_register_afinfo(struct xfrm_state_afinfo *afinfo);
302extern int xfrm_state_unregister_afinfo(struct xfrm_state_afinfo *afinfo);
303
304extern void xfrm_state_delete_tunnel(struct xfrm_state *x);
305
306struct xfrm_type
307{
308 char *description;
309 struct module *owner;
310 __u8 proto;
311 __u8 flags;
312#define XFRM_TYPE_NON_FRAGMENT 1
313#define XFRM_TYPE_REPLAY_PROT 2
314#define XFRM_TYPE_LOCAL_COADDR 4
315#define XFRM_TYPE_REMOTE_COADDR 8
316
317 int (*init_state)(struct xfrm_state *x);
318 void (*destructor)(struct xfrm_state *);
319 int (*input)(struct xfrm_state *, struct sk_buff *skb);
320 int (*output)(struct xfrm_state *, struct sk_buff *pskb);
321 int (*reject)(struct xfrm_state *, struct sk_buff *, struct flowi *);
322 int (*hdr_offset)(struct xfrm_state *, struct sk_buff *, u8 **);
323
324 u32 (*get_mtu)(struct xfrm_state *, int size);
325};
326
327extern int xfrm_register_type(const struct xfrm_type *type, unsigned short family);
328extern int xfrm_unregister_type(const struct xfrm_type *type, unsigned short family);
329
330struct xfrm_mode {
331
332
333
334
335
336
337
338
339
340
341
342 int (*input2)(struct xfrm_state *x, struct sk_buff *skb);
343
344
345
346
347
348
349
350
351
352 int (*input)(struct xfrm_state *x, struct sk_buff *skb);
353
354
355
356
357
358
359
360
361
362
363
364
365 int (*output2)(struct xfrm_state *x,struct sk_buff *skb);
366
367
368
369
370
371
372
373
374
375
376 int (*output)(struct xfrm_state *x, struct sk_buff *skb);
377
378 struct xfrm_state_afinfo *afinfo;
379 struct module *owner;
380 unsigned int encap;
381 int flags;
382};
383
384
385enum {
386 XFRM_MODE_FLAG_TUNNEL = 1,
387};
388
389extern int xfrm_register_mode(struct xfrm_mode *mode, int family);
390extern int xfrm_unregister_mode(struct xfrm_mode *mode, int family);
391
392static inline int xfrm_af2proto(unsigned int family)
393{
394 switch(family) {
395 case AF_INET:
396 return IPPROTO_IPIP;
397 case AF_INET6:
398 return IPPROTO_IPV6;
399 default:
400 return 0;
401 }
402}
403
404static inline struct xfrm_mode *xfrm_ip2inner_mode(struct xfrm_state *x, int ipproto)
405{
406 if ((ipproto == IPPROTO_IPIP && x->props.family == AF_INET) ||
407 (ipproto == IPPROTO_IPV6 && x->props.family == AF_INET6))
408 return x->inner_mode;
409 else
410 return x->inner_mode_iaf;
411}
412
413struct xfrm_tmpl
414{
415
416
417
418
419
420
421 struct xfrm_id id;
422
423
424 xfrm_address_t saddr;
425
426 unsigned short encap_family;
427
428 __u32 reqid;
429
430
431 __u8 mode;
432
433
434 __u8 share;
435
436
437 __u8 optional;
438
439
440 __u8 allalgs;
441
442
443 __u32 aalgos;
444 __u32 ealgos;
445 __u32 calgos;
446};
447
448#define XFRM_MAX_DEPTH 6
449
450struct xfrm_policy
451{
452 struct xfrm_policy *next;
453 struct list_head bytype;
454 struct hlist_node bydst;
455 struct hlist_node byidx;
456
457
458 rwlock_t lock;
459 atomic_t refcnt;
460 struct timer_list timer;
461
462 u32 priority;
463 u32 index;
464 struct xfrm_selector selector;
465 struct xfrm_lifetime_cfg lft;
466 struct xfrm_lifetime_cur curlft;
467 struct dst_entry *bundles;
468 u16 family;
469 u8 type;
470 u8 action;
471 u8 flags;
472 u8 dead;
473 u8 xfrm_nr;
474
475 struct xfrm_sec_ctx *security;
476 struct xfrm_tmpl xfrm_vec[XFRM_MAX_DEPTH];
477};
478
479struct xfrm_migrate {
480 xfrm_address_t old_daddr;
481 xfrm_address_t old_saddr;
482 xfrm_address_t new_daddr;
483 xfrm_address_t new_saddr;
484 u8 proto;
485 u8 mode;
486 u16 reserved;
487 u32 reqid;
488 u16 old_family;
489 u16 new_family;
490};
491
492#define XFRM_KM_TIMEOUT 30
493
494#define XFRM_REPLAY_SEQ 1
495#define XFRM_REPLAY_OSEQ 2
496#define XFRM_REPLAY_SEQ_MASK 3
497
498#define XFRM_REPLAY_UPDATE XFRM_AE_CR
499#define XFRM_REPLAY_TIMEOUT XFRM_AE_CE
500
501
502#define XFRM_AE_ETIME 10
503
504#define XFRM_AE_ETH_M 10
505
506#define XFRM_AE_SEQT_SIZE 2
507
508struct xfrm_mgr
509{
510 struct list_head list;
511 char *id;
512 int (*notify)(struct xfrm_state *x, struct km_event *c);
513 int (*acquire)(struct xfrm_state *x, struct xfrm_tmpl *, struct xfrm_policy *xp, int dir);
514 struct xfrm_policy *(*compile_policy)(struct sock *sk, int opt, u8 *data, int len, int *dir);
515 int (*new_mapping)(struct xfrm_state *x, xfrm_address_t *ipaddr, __be16 sport);
516 int (*notify_policy)(struct xfrm_policy *x, int dir, struct km_event *c);
517 int (*report)(u8 proto, struct xfrm_selector *sel, xfrm_address_t *addr);
518 int (*migrate)(struct xfrm_selector *sel, u8 dir, u8 type, struct xfrm_migrate *m, int num_bundles);
519};
520
521extern int xfrm_register_km(struct xfrm_mgr *km);
522extern int xfrm_unregister_km(struct xfrm_mgr *km);
523
524extern unsigned int xfrm_policy_count[XFRM_POLICY_MAX*2];
525
526
527
528
529
530
531struct xfrm_skb_cb {
532 union {
533 struct inet_skb_parm h4;
534 struct inet6_skb_parm h6;
535 } header;
536
537
538 union {
539 u64 output;
540 __be32 input;
541 } seq;
542};
543
544#define XFRM_SKB_CB(__skb) ((struct xfrm_skb_cb *)&((__skb)->cb[0]))
545
546
547
548
549
550struct xfrm_mode_skb_cb {
551 union {
552 struct inet_skb_parm h4;
553 struct inet6_skb_parm h6;
554 } header;
555
556
557 __be16 id;
558 __be16 frag_off;
559
560
561 u8 ihl;
562
563
564 u8 tos;
565
566
567 u8 ttl;
568
569
570 u8 protocol;
571
572
573 u8 optlen;
574
575
576 u8 flow_lbl[3];
577};
578
579#define XFRM_MODE_SKB_CB(__skb) ((struct xfrm_mode_skb_cb *)&((__skb)->cb[0]))
580
581
582
583
584
585struct xfrm_spi_skb_cb {
586 union {
587 struct inet_skb_parm h4;
588 struct inet6_skb_parm h6;
589 } header;
590
591 unsigned int daddroff;
592 unsigned int family;
593};
594
595#define XFRM_SPI_SKB_CB(__skb) ((struct xfrm_spi_skb_cb *)&((__skb)->cb[0]))
596
597
598struct xfrm_audit
599{
600 u32 secid;
601 uid_t loginuid;
602 u32 sessionid;
603};
604
605#ifdef CONFIG_AUDITSYSCALL
606static inline struct audit_buffer *xfrm_audit_start(const char *op)
607{
608 struct audit_buffer *audit_buf = NULL;
609
610 if (audit_enabled == 0)
611 return NULL;
612 audit_buf = audit_log_start(current->audit_context, GFP_ATOMIC,
613 AUDIT_MAC_IPSEC_EVENT);
614 if (audit_buf == NULL)
615 return NULL;
616 audit_log_format(audit_buf, "op=%s", op);
617 return audit_buf;
618}
619
620static inline void xfrm_audit_helper_usrinfo(uid_t auid, u32 ses, u32 secid,
621 struct audit_buffer *audit_buf)
622{
623 char *secctx;
624 u32 secctx_len;
625
626 audit_log_format(audit_buf, " auid=%u ses=%u", auid, ses);
627 if (secid != 0 &&
628 security_secid_to_secctx(secid, &secctx, &secctx_len) == 0) {
629 audit_log_format(audit_buf, " subj=%s", secctx);
630 security_release_secctx(secctx, secctx_len);
631 } else
632 audit_log_task_context(audit_buf);
633}
634
635extern void xfrm_audit_policy_add(struct xfrm_policy *xp, int result,
636 u32 auid, u32 ses, u32 secid);
637extern void xfrm_audit_policy_delete(struct xfrm_policy *xp, int result,
638 u32 auid, u32 ses, u32 secid);
639extern void xfrm_audit_state_add(struct xfrm_state *x, int result,
640 u32 auid, u32 ses, u32 secid);
641extern void xfrm_audit_state_delete(struct xfrm_state *x, int result,
642 u32 auid, u32 ses, u32 secid);
643extern void xfrm_audit_state_replay_overflow(struct xfrm_state *x,
644 struct sk_buff *skb);
645extern void xfrm_audit_state_notfound_simple(struct sk_buff *skb, u16 family);
646extern void xfrm_audit_state_notfound(struct sk_buff *skb, u16 family,
647 __be32 net_spi, __be32 net_seq);
648extern void xfrm_audit_state_icvfail(struct xfrm_state *x,
649 struct sk_buff *skb, u8 proto);
650#else
651
652static inline void xfrm_audit_policy_add(struct xfrm_policy *xp, int result,
653 u32 auid, u32 ses, u32 secid)
654{
655}
656
657static inline void xfrm_audit_policy_delete(struct xfrm_policy *xp, int result,
658 u32 auid, u32 ses, u32 secid)
659{
660}
661
662static inline void xfrm_audit_state_add(struct xfrm_state *x, int result,
663 u32 auid, u32 ses, u32 secid)
664{
665}
666
667static inline void xfrm_audit_state_delete(struct xfrm_state *x, int result,
668 u32 auid, u32 ses, u32 secid)
669{
670}
671
672static inline void xfrm_audit_state_replay_overflow(struct xfrm_state *x,
673 struct sk_buff *skb)
674{
675}
676
677static inline void xfrm_audit_state_notfound_simple(struct sk_buff *skb,
678 u16 family)
679{
680}
681
682static inline void xfrm_audit_state_notfound(struct sk_buff *skb, u16 family,
683 __be32 net_spi, __be32 net_seq)
684{
685}
686
687static inline void xfrm_audit_state_icvfail(struct xfrm_state *x,
688 struct sk_buff *skb, u8 proto)
689{
690}
691#endif
692
693static inline void xfrm_pol_hold(struct xfrm_policy *policy)
694{
695 if (likely(policy != NULL))
696 atomic_inc(&policy->refcnt);
697}
698
699extern void xfrm_policy_destroy(struct xfrm_policy *policy);
700
701static inline void xfrm_pol_put(struct xfrm_policy *policy)
702{
703 if (atomic_dec_and_test(&policy->refcnt))
704 xfrm_policy_destroy(policy);
705}
706
707#ifdef CONFIG_XFRM_SUB_POLICY
708static inline void xfrm_pols_put(struct xfrm_policy **pols, int npols)
709{
710 int i;
711 for (i = npols - 1; i >= 0; --i)
712 xfrm_pol_put(pols[i]);
713}
714#else
715static inline void xfrm_pols_put(struct xfrm_policy **pols, int npols)
716{
717 xfrm_pol_put(pols[0]);
718}
719#endif
720
721extern void __xfrm_state_destroy(struct xfrm_state *);
722
723static inline void __xfrm_state_put(struct xfrm_state *x)
724{
725 atomic_dec(&x->refcnt);
726}
727
728static inline void xfrm_state_put(struct xfrm_state *x)
729{
730 if (atomic_dec_and_test(&x->refcnt))
731 __xfrm_state_destroy(x);
732}
733
734static inline void xfrm_state_hold(struct xfrm_state *x)
735{
736 atomic_inc(&x->refcnt);
737}
738
739static __inline__ int addr_match(void *token1, void *token2, int prefixlen)
740{
741 __be32 *a1 = token1;
742 __be32 *a2 = token2;
743 int pdw;
744 int pbi;
745
746 pdw = prefixlen >> 5;
747 pbi = prefixlen & 0x1f;
748
749 if (pdw)
750 if (memcmp(a1, a2, pdw << 2))
751 return 0;
752
753 if (pbi) {
754 __be32 mask;
755
756 mask = htonl((0xffffffff) << (32 - pbi));
757
758 if ((a1[pdw] ^ a2[pdw]) & mask)
759 return 0;
760 }
761
762 return 1;
763}
764
765static __inline__
766__be16 xfrm_flowi_sport(struct flowi *fl)
767{
768 __be16 port;
769 switch(fl->proto) {
770 case IPPROTO_TCP:
771 case IPPROTO_UDP:
772 case IPPROTO_UDPLITE:
773 case IPPROTO_SCTP:
774 port = fl->fl_ip_sport;
775 break;
776 case IPPROTO_ICMP:
777 case IPPROTO_ICMPV6:
778 port = htons(fl->fl_icmp_type);
779 break;
780 case IPPROTO_MH:
781 port = htons(fl->fl_mh_type);
782 break;
783 default:
784 port = 0;
785 }
786 return port;
787}
788
789static __inline__
790__be16 xfrm_flowi_dport(struct flowi *fl)
791{
792 __be16 port;
793 switch(fl->proto) {
794 case IPPROTO_TCP:
795 case IPPROTO_UDP:
796 case IPPROTO_UDPLITE:
797 case IPPROTO_SCTP:
798 port = fl->fl_ip_dport;
799 break;
800 case IPPROTO_ICMP:
801 case IPPROTO_ICMPV6:
802 port = htons(fl->fl_icmp_code);
803 break;
804 default:
805 port = 0;
806 }
807 return port;
808}
809
810extern int xfrm_selector_match(struct xfrm_selector *sel, struct flowi *fl,
811 unsigned short family);
812
813#ifdef CONFIG_SECURITY_NETWORK_XFRM
814
815
816
817static inline int xfrm_sec_ctx_match(struct xfrm_sec_ctx *s1, struct xfrm_sec_ctx *s2)
818{
819 return ((!s1 && !s2) ||
820 (s1 && s2 &&
821 (s1->ctx_sid == s2->ctx_sid) &&
822 (s1->ctx_doi == s2->ctx_doi) &&
823 (s1->ctx_alg == s2->ctx_alg)));
824}
825#else
826static inline int xfrm_sec_ctx_match(struct xfrm_sec_ctx *s1, struct xfrm_sec_ctx *s2)
827{
828 return 1;
829}
830#endif
831
832
833
834
835
836
837
838
839
840
841
842
843struct xfrm_dst
844{
845 union {
846 struct dst_entry dst;
847 struct rtable rt;
848 struct rt6_info rt6;
849 } u;
850 struct dst_entry *route;
851#ifdef CONFIG_XFRM_SUB_POLICY
852 struct flowi *origin;
853 struct xfrm_selector *partner;
854#endif
855 u32 genid;
856 u32 route_mtu_cached;
857 u32 child_mtu_cached;
858 u32 route_cookie;
859 u32 path_cookie;
860};
861
862static inline void xfrm_dst_destroy(struct xfrm_dst *xdst)
863{
864 dst_release(xdst->route);
865 if (likely(xdst->u.dst.xfrm))
866 xfrm_state_put(xdst->u.dst.xfrm);
867#ifdef CONFIG_XFRM_SUB_POLICY
868 kfree(xdst->origin);
869 xdst->origin = NULL;
870 kfree(xdst->partner);
871 xdst->partner = NULL;
872#endif
873}
874
875extern void xfrm_dst_ifdown(struct dst_entry *dst, struct net_device *dev);
876
877struct sec_path
878{
879 atomic_t refcnt;
880 int len;
881 struct xfrm_state *xvec[XFRM_MAX_DEPTH];
882};
883
884static inline struct sec_path *
885secpath_get(struct sec_path *sp)
886{
887 if (sp)
888 atomic_inc(&sp->refcnt);
889 return sp;
890}
891
892extern void __secpath_destroy(struct sec_path *sp);
893
894static inline void
895secpath_put(struct sec_path *sp)
896{
897 if (sp && atomic_dec_and_test(&sp->refcnt))
898 __secpath_destroy(sp);
899}
900
901extern struct sec_path *secpath_dup(struct sec_path *src);
902
903static inline void
904secpath_reset(struct sk_buff *skb)
905{
906#ifdef CONFIG_XFRM
907 secpath_put(skb->sp);
908 skb->sp = NULL;
909#endif
910}
911
912static inline int
913xfrm_addr_any(xfrm_address_t *addr, unsigned short family)
914{
915 switch (family) {
916 case AF_INET:
917 return addr->a4 == 0;
918 case AF_INET6:
919 return ipv6_addr_any((struct in6_addr *)&addr->a6);
920 }
921 return 0;
922}
923
924static inline int
925__xfrm4_state_addr_cmp(struct xfrm_tmpl *tmpl, struct xfrm_state *x)
926{
927 return (tmpl->saddr.a4 &&
928 tmpl->saddr.a4 != x->props.saddr.a4);
929}
930
931static inline int
932__xfrm6_state_addr_cmp(struct xfrm_tmpl *tmpl, struct xfrm_state *x)
933{
934 return (!ipv6_addr_any((struct in6_addr*)&tmpl->saddr) &&
935 ipv6_addr_cmp((struct in6_addr *)&tmpl->saddr, (struct in6_addr*)&x->props.saddr));
936}
937
938static inline int
939xfrm_state_addr_cmp(struct xfrm_tmpl *tmpl, struct xfrm_state *x, unsigned short family)
940{
941 switch (family) {
942 case AF_INET:
943 return __xfrm4_state_addr_cmp(tmpl, x);
944 case AF_INET6:
945 return __xfrm6_state_addr_cmp(tmpl, x);
946 }
947 return !0;
948}
949
950#ifdef CONFIG_XFRM
951extern int __xfrm_policy_check(struct sock *, int dir, struct sk_buff *skb, unsigned short family);
952
953static inline int __xfrm_policy_check2(struct sock *sk, int dir,
954 struct sk_buff *skb,
955 unsigned int family, int reverse)
956{
957 int ndir = dir | (reverse ? XFRM_POLICY_MASK + 1 : 0);
958
959 if (sk && sk->sk_policy[XFRM_POLICY_IN])
960 return __xfrm_policy_check(sk, ndir, skb, family);
961
962 return (!xfrm_policy_count[dir] && !skb->sp) ||
963 (skb->dst->flags & DST_NOPOLICY) ||
964 __xfrm_policy_check(sk, ndir, skb, family);
965}
966
967static inline int xfrm_policy_check(struct sock *sk, int dir, struct sk_buff *skb, unsigned short family)
968{
969 return __xfrm_policy_check2(sk, dir, skb, family, 0);
970}
971
972static inline int xfrm4_policy_check(struct sock *sk, int dir, struct sk_buff *skb)
973{
974 return xfrm_policy_check(sk, dir, skb, AF_INET);
975}
976
977static inline int xfrm6_policy_check(struct sock *sk, int dir, struct sk_buff *skb)
978{
979 return xfrm_policy_check(sk, dir, skb, AF_INET6);
980}
981
982static inline int xfrm4_policy_check_reverse(struct sock *sk, int dir,
983 struct sk_buff *skb)
984{
985 return __xfrm_policy_check2(sk, dir, skb, AF_INET, 1);
986}
987
988static inline int xfrm6_policy_check_reverse(struct sock *sk, int dir,
989 struct sk_buff *skb)
990{
991 return __xfrm_policy_check2(sk, dir, skb, AF_INET6, 1);
992}
993
994extern int __xfrm_decode_session(struct sk_buff *skb, struct flowi *fl,
995 unsigned int family, int reverse);
996
997static inline int xfrm_decode_session(struct sk_buff *skb, struct flowi *fl,
998 unsigned int family)
999{
1000 return __xfrm_decode_session(skb, fl, family, 0);
1001}
1002
1003static inline int xfrm_decode_session_reverse(struct sk_buff *skb,
1004 struct flowi *fl,
1005 unsigned int family)
1006{
1007 return __xfrm_decode_session(skb, fl, family, 1);
1008}
1009
1010extern int __xfrm_route_forward(struct sk_buff *skb, unsigned short family);
1011
1012static inline int xfrm_route_forward(struct sk_buff *skb, unsigned short family)
1013{
1014 return !xfrm_policy_count[XFRM_POLICY_OUT] ||
1015 (skb->dst->flags & DST_NOXFRM) ||
1016 __xfrm_route_forward(skb, family);
1017}
1018
1019static inline int xfrm4_route_forward(struct sk_buff *skb)
1020{
1021 return xfrm_route_forward(skb, AF_INET);
1022}
1023
1024static inline int xfrm6_route_forward(struct sk_buff *skb)
1025{
1026 return xfrm_route_forward(skb, AF_INET6);
1027}
1028
1029extern int __xfrm_sk_clone_policy(struct sock *sk);
1030
1031static inline int xfrm_sk_clone_policy(struct sock *sk)
1032{
1033 if (unlikely(sk->sk_policy[0] || sk->sk_policy[1]))
1034 return __xfrm_sk_clone_policy(sk);
1035 return 0;
1036}
1037
1038extern int xfrm_policy_delete(struct xfrm_policy *pol, int dir);
1039
1040static inline void xfrm_sk_free_policy(struct sock *sk)
1041{
1042 if (unlikely(sk->sk_policy[0] != NULL)) {
1043 xfrm_policy_delete(sk->sk_policy[0], XFRM_POLICY_MAX);
1044 sk->sk_policy[0] = NULL;
1045 }
1046 if (unlikely(sk->sk_policy[1] != NULL)) {
1047 xfrm_policy_delete(sk->sk_policy[1], XFRM_POLICY_MAX+1);
1048 sk->sk_policy[1] = NULL;
1049 }
1050}
1051
1052#else
1053
1054static inline void xfrm_sk_free_policy(struct sock *sk) {}
1055static inline int xfrm_sk_clone_policy(struct sock *sk) { return 0; }
1056static inline int xfrm6_route_forward(struct sk_buff *skb) { return 1; }
1057static inline int xfrm4_route_forward(struct sk_buff *skb) { return 1; }
1058static inline int xfrm6_policy_check(struct sock *sk, int dir, struct sk_buff *skb)
1059{
1060 return 1;
1061}
1062static inline int xfrm4_policy_check(struct sock *sk, int dir, struct sk_buff *skb)
1063{
1064 return 1;
1065}
1066static inline int xfrm_policy_check(struct sock *sk, int dir, struct sk_buff *skb, unsigned short family)
1067{
1068 return 1;
1069}
1070static inline int xfrm_decode_session_reverse(struct sk_buff *skb,
1071 struct flowi *fl,
1072 unsigned int family)
1073{
1074 return -ENOSYS;
1075}
1076static inline int xfrm4_policy_check_reverse(struct sock *sk, int dir,
1077 struct sk_buff *skb)
1078{
1079 return 1;
1080}
1081static inline int xfrm6_policy_check_reverse(struct sock *sk, int dir,
1082 struct sk_buff *skb)
1083{
1084 return 1;
1085}
1086#endif
1087
1088static __inline__
1089xfrm_address_t *xfrm_flowi_daddr(struct flowi *fl, unsigned short family)
1090{
1091 switch (family){
1092 case AF_INET:
1093 return (xfrm_address_t *)&fl->fl4_dst;
1094 case AF_INET6:
1095 return (xfrm_address_t *)&fl->fl6_dst;
1096 }
1097 return NULL;
1098}
1099
1100static __inline__
1101xfrm_address_t *xfrm_flowi_saddr(struct flowi *fl, unsigned short family)
1102{
1103 switch (family){
1104 case AF_INET:
1105 return (xfrm_address_t *)&fl->fl4_src;
1106 case AF_INET6:
1107 return (xfrm_address_t *)&fl->fl6_src;
1108 }
1109 return NULL;
1110}
1111
1112static __inline__
1113void xfrm_flowi_addr_get(struct flowi *fl,
1114 xfrm_address_t *saddr, xfrm_address_t *daddr,
1115 unsigned short family)
1116{
1117 switch(family) {
1118 case AF_INET:
1119 memcpy(&saddr->a4, &fl->fl4_src, sizeof(saddr->a4));
1120 memcpy(&daddr->a4, &fl->fl4_dst, sizeof(daddr->a4));
1121 break;
1122 case AF_INET6:
1123 ipv6_addr_copy((struct in6_addr *)&saddr->a6, &fl->fl6_src);
1124 ipv6_addr_copy((struct in6_addr *)&daddr->a6, &fl->fl6_dst);
1125 break;
1126 }
1127}
1128
1129static __inline__ int
1130__xfrm4_state_addr_check(struct xfrm_state *x,
1131 xfrm_address_t *daddr, xfrm_address_t *saddr)
1132{
1133 if (daddr->a4 == x->id.daddr.a4 &&
1134 (saddr->a4 == x->props.saddr.a4 || !saddr->a4 || !x->props.saddr.a4))
1135 return 1;
1136 return 0;
1137}
1138
1139static __inline__ int
1140__xfrm6_state_addr_check(struct xfrm_state *x,
1141 xfrm_address_t *daddr, xfrm_address_t *saddr)
1142{
1143 if (!ipv6_addr_cmp((struct in6_addr *)daddr, (struct in6_addr *)&x->id.daddr) &&
1144 (!ipv6_addr_cmp((struct in6_addr *)saddr, (struct in6_addr *)&x->props.saddr)||
1145 ipv6_addr_any((struct in6_addr *)saddr) ||
1146 ipv6_addr_any((struct in6_addr *)&x->props.saddr)))
1147 return 1;
1148 return 0;
1149}
1150
1151static __inline__ int
1152xfrm_state_addr_check(struct xfrm_state *x,
1153 xfrm_address_t *daddr, xfrm_address_t *saddr,
1154 unsigned short family)
1155{
1156 switch (family) {
1157 case AF_INET:
1158 return __xfrm4_state_addr_check(x, daddr, saddr);
1159 case AF_INET6:
1160 return __xfrm6_state_addr_check(x, daddr, saddr);
1161 }
1162 return 0;
1163}
1164
1165static __inline__ int
1166xfrm_state_addr_flow_check(struct xfrm_state *x, struct flowi *fl,
1167 unsigned short family)
1168{
1169 switch (family) {
1170 case AF_INET:
1171 return __xfrm4_state_addr_check(x,
1172 (xfrm_address_t *)&fl->fl4_dst,
1173 (xfrm_address_t *)&fl->fl4_src);
1174 case AF_INET6:
1175 return __xfrm6_state_addr_check(x,
1176 (xfrm_address_t *)&fl->fl6_dst,
1177 (xfrm_address_t *)&fl->fl6_src);
1178 }
1179 return 0;
1180}
1181
1182static inline int xfrm_state_kern(struct xfrm_state *x)
1183{
1184 return atomic_read(&x->tunnel_users);
1185}
1186
1187static inline int xfrm_id_proto_match(u8 proto, u8 userproto)
1188{
1189 return (!userproto || proto == userproto ||
1190 (userproto == IPSEC_PROTO_ANY && (proto == IPPROTO_AH ||
1191 proto == IPPROTO_ESP ||
1192 proto == IPPROTO_COMP)));
1193}
1194
1195
1196
1197
1198struct xfrm_algo_aead_info {
1199 u16 icv_truncbits;
1200};
1201
1202struct xfrm_algo_auth_info {
1203 u16 icv_truncbits;
1204 u16 icv_fullbits;
1205};
1206
1207struct xfrm_algo_encr_info {
1208 u16 blockbits;
1209 u16 defkeybits;
1210};
1211
1212struct xfrm_algo_comp_info {
1213 u16 threshold;
1214};
1215
1216struct xfrm_algo_desc {
1217 char *name;
1218 char *compat;
1219 u8 available:1;
1220 union {
1221 struct xfrm_algo_aead_info aead;
1222 struct xfrm_algo_auth_info auth;
1223 struct xfrm_algo_encr_info encr;
1224 struct xfrm_algo_comp_info comp;
1225 } uinfo;
1226 struct sadb_alg desc;
1227};
1228
1229
1230struct xfrm_tunnel {
1231 int (*handler)(struct sk_buff *skb);
1232 int (*err_handler)(struct sk_buff *skb, __u32 info);
1233
1234 struct xfrm_tunnel *next;
1235 int priority;
1236};
1237
1238struct xfrm6_tunnel {
1239 int (*handler)(struct sk_buff *skb);
1240 int (*err_handler)(struct sk_buff *skb, struct inet6_skb_parm *opt,
1241 int type, int code, int offset, __be32 info);
1242 struct xfrm6_tunnel *next;
1243 int priority;
1244};
1245
1246struct xfrm_state_walk {
1247 struct xfrm_state *state;
1248 int count;
1249 u8 proto;
1250};
1251
1252struct xfrm_policy_walk {
1253 struct xfrm_policy *policy;
1254 int count;
1255 u8 type, cur_type;
1256};
1257
1258extern void xfrm_init(void);
1259extern void xfrm4_init(void);
1260extern void xfrm_state_init(void);
1261extern void xfrm4_state_init(void);
1262#ifdef CONFIG_XFRM
1263extern int xfrm6_init(void);
1264extern void xfrm6_fini(void);
1265extern int xfrm6_state_init(void);
1266extern void xfrm6_state_fini(void);
1267#else
1268static inline int xfrm6_init(void)
1269{
1270 return 0;
1271}
1272static inline void xfrm6_fini(void)
1273{
1274 ;
1275}
1276#endif
1277
1278#ifdef CONFIG_XFRM_STATISTICS
1279extern int xfrm_proc_init(void);
1280#endif
1281
1282static inline void xfrm_state_walk_init(struct xfrm_state_walk *walk, u8 proto)
1283{
1284 walk->proto = proto;
1285 walk->state = NULL;
1286 walk->count = 0;
1287}
1288
1289static inline void xfrm_state_walk_done(struct xfrm_state_walk *walk)
1290{
1291 if (walk->state != NULL) {
1292 xfrm_state_put(walk->state);
1293 walk->state = NULL;
1294 }
1295}
1296
1297extern int xfrm_state_walk(struct xfrm_state_walk *walk,
1298 int (*func)(struct xfrm_state *, int, void*), void *);
1299extern struct xfrm_state *xfrm_state_alloc(void);
1300extern struct xfrm_state *xfrm_state_find(xfrm_address_t *daddr, xfrm_address_t *saddr,
1301 struct flowi *fl, struct xfrm_tmpl *tmpl,
1302 struct xfrm_policy *pol, int *err,
1303 unsigned short family);
1304extern struct xfrm_state * xfrm_stateonly_find(xfrm_address_t *daddr,
1305 xfrm_address_t *saddr,
1306 unsigned short family,
1307 u8 mode, u8 proto, u32 reqid);
1308extern int xfrm_state_check_expire(struct xfrm_state *x);
1309extern void xfrm_state_insert(struct xfrm_state *x);
1310extern int xfrm_state_add(struct xfrm_state *x);
1311extern int xfrm_state_update(struct xfrm_state *x);
1312extern struct xfrm_state *xfrm_state_lookup(xfrm_address_t *daddr, __be32 spi, u8 proto, unsigned short family);
1313extern struct xfrm_state *xfrm_state_lookup_byaddr(xfrm_address_t *daddr, xfrm_address_t *saddr, u8 proto, unsigned short family);
1314#ifdef CONFIG_XFRM_SUB_POLICY
1315extern int xfrm_tmpl_sort(struct xfrm_tmpl **dst, struct xfrm_tmpl **src,
1316 int n, unsigned short family);
1317extern int xfrm_state_sort(struct xfrm_state **dst, struct xfrm_state **src,
1318 int n, unsigned short family);
1319#else
1320static inline int xfrm_tmpl_sort(struct xfrm_tmpl **dst, struct xfrm_tmpl **src,
1321 int n, unsigned short family)
1322{
1323 return -ENOSYS;
1324}
1325
1326static inline int xfrm_state_sort(struct xfrm_state **dst, struct xfrm_state **src,
1327 int n, unsigned short family)
1328{
1329 return -ENOSYS;
1330}
1331#endif
1332
1333struct xfrmk_sadinfo {
1334 u32 sadhcnt;
1335 u32 sadhmcnt;
1336 u32 sadcnt;
1337};
1338
1339struct xfrmk_spdinfo {
1340 u32 incnt;
1341 u32 outcnt;
1342 u32 fwdcnt;
1343 u32 inscnt;
1344 u32 outscnt;
1345 u32 fwdscnt;
1346 u32 spdhcnt;
1347 u32 spdhmcnt;
1348};
1349
1350extern struct xfrm_state *xfrm_find_acq_byseq(u32 seq);
1351extern int xfrm_state_delete(struct xfrm_state *x);
1352extern int xfrm_state_flush(u8 proto, struct xfrm_audit *audit_info);
1353extern void xfrm_sad_getinfo(struct xfrmk_sadinfo *si);
1354extern void xfrm_spd_getinfo(struct xfrmk_spdinfo *si);
1355extern int xfrm_replay_check(struct xfrm_state *x,
1356 struct sk_buff *skb, __be32 seq);
1357extern void xfrm_replay_advance(struct xfrm_state *x, __be32 seq);
1358extern void xfrm_replay_notify(struct xfrm_state *x, int event);
1359extern int xfrm_state_mtu(struct xfrm_state *x, int mtu);
1360extern int xfrm_init_state(struct xfrm_state *x);
1361extern int xfrm_prepare_input(struct xfrm_state *x, struct sk_buff *skb);
1362extern int xfrm_input(struct sk_buff *skb, int nexthdr, __be32 spi,
1363 int encap_type);
1364extern int xfrm_input_resume(struct sk_buff *skb, int nexthdr);
1365extern int xfrm_output_resume(struct sk_buff *skb, int err);
1366extern int xfrm_output(struct sk_buff *skb);
1367extern int xfrm_inner_extract_output(struct xfrm_state *x, struct sk_buff *skb);
1368extern int xfrm4_extract_header(struct sk_buff *skb);
1369extern int xfrm4_extract_input(struct xfrm_state *x, struct sk_buff *skb);
1370extern int xfrm4_rcv_encap(struct sk_buff *skb, int nexthdr, __be32 spi,
1371 int encap_type);
1372extern int xfrm4_transport_finish(struct sk_buff *skb, int async);
1373extern int xfrm4_rcv(struct sk_buff *skb);
1374
1375static inline int xfrm4_rcv_spi(struct sk_buff *skb, int nexthdr, __be32 spi)
1376{
1377 return xfrm4_rcv_encap(skb, nexthdr, spi, 0);
1378}
1379
1380extern int xfrm4_extract_output(struct xfrm_state *x, struct sk_buff *skb);
1381extern int xfrm4_prepare_output(struct xfrm_state *x, struct sk_buff *skb);
1382extern int xfrm4_output(struct sk_buff *skb);
1383extern int xfrm4_tunnel_register(struct xfrm_tunnel *handler, unsigned short family);
1384extern int xfrm4_tunnel_deregister(struct xfrm_tunnel *handler, unsigned short family);
1385extern int xfrm6_extract_header(struct sk_buff *skb);
1386extern int xfrm6_extract_input(struct xfrm_state *x, struct sk_buff *skb);
1387extern int xfrm6_rcv_spi(struct sk_buff *skb, int nexthdr, __be32 spi);
1388extern int xfrm6_transport_finish(struct sk_buff *skb, int async);
1389extern int xfrm6_rcv(struct sk_buff *skb);
1390extern int xfrm6_input_addr(struct sk_buff *skb, xfrm_address_t *daddr,
1391 xfrm_address_t *saddr, u8 proto);
1392extern int xfrm6_tunnel_register(struct xfrm6_tunnel *handler, unsigned short family);
1393extern int xfrm6_tunnel_deregister(struct xfrm6_tunnel *handler, unsigned short family);
1394extern __be32 xfrm6_tunnel_alloc_spi(xfrm_address_t *saddr);
1395extern void xfrm6_tunnel_free_spi(xfrm_address_t *saddr);
1396extern __be32 xfrm6_tunnel_spi_lookup(xfrm_address_t *saddr);
1397extern int xfrm6_extract_output(struct xfrm_state *x, struct sk_buff *skb);
1398extern int xfrm6_prepare_output(struct xfrm_state *x, struct sk_buff *skb);
1399extern int xfrm6_output(struct sk_buff *skb);
1400extern int xfrm6_find_1stfragopt(struct xfrm_state *x, struct sk_buff *skb,
1401 u8 **prevhdr);
1402
1403#ifdef CONFIG_XFRM
1404extern int xfrm4_udp_encap_rcv(struct sock *sk, struct sk_buff *skb);
1405extern int xfrm_user_policy(struct sock *sk, int optname, u8 __user *optval, int optlen);
1406#else
1407static inline int xfrm_user_policy(struct sock *sk, int optname, u8 __user *optval, int optlen)
1408{
1409 return -ENOPROTOOPT;
1410}
1411
1412static inline int xfrm4_udp_encap_rcv(struct sock *sk, struct sk_buff *skb)
1413{
1414
1415 kfree_skb(skb);
1416 return 0;
1417}
1418#endif
1419
1420struct xfrm_policy *xfrm_policy_alloc(gfp_t gfp);
1421
1422static inline void xfrm_policy_walk_init(struct xfrm_policy_walk *walk, u8 type)
1423{
1424 walk->cur_type = XFRM_POLICY_TYPE_MAIN;
1425 walk->type = type;
1426 walk->policy = NULL;
1427 walk->count = 0;
1428}
1429
1430static inline void xfrm_policy_walk_done(struct xfrm_policy_walk *walk)
1431{
1432 if (walk->policy != NULL) {
1433 xfrm_pol_put(walk->policy);
1434 walk->policy = NULL;
1435 }
1436}
1437
1438extern int xfrm_policy_walk(struct xfrm_policy_walk *walk,
1439 int (*func)(struct xfrm_policy *, int, int, void*), void *);
1440int xfrm_policy_insert(int dir, struct xfrm_policy *policy, int excl);
1441struct xfrm_policy *xfrm_policy_bysel_ctx(u8 type, int dir,
1442 struct xfrm_selector *sel,
1443 struct xfrm_sec_ctx *ctx, int delete,
1444 int *err);
1445struct xfrm_policy *xfrm_policy_byid(u8, int dir, u32 id, int delete, int *err);
1446int xfrm_policy_flush(u8 type, struct xfrm_audit *audit_info);
1447u32 xfrm_get_acqseq(void);
1448extern int xfrm_alloc_spi(struct xfrm_state *x, u32 minspi, u32 maxspi);
1449struct xfrm_state * xfrm_find_acq(u8 mode, u32 reqid, u8 proto,
1450 xfrm_address_t *daddr, xfrm_address_t *saddr,
1451 int create, unsigned short family);
1452extern int xfrm_sk_policy_insert(struct sock *sk, int dir, struct xfrm_policy *pol);
1453extern int xfrm_bundle_ok(struct xfrm_policy *pol, struct xfrm_dst *xdst,
1454 struct flowi *fl, int family, int strict);
1455
1456#ifdef CONFIG_XFRM_MIGRATE
1457extern int km_migrate(struct xfrm_selector *sel, u8 dir, u8 type,
1458 struct xfrm_migrate *m, int num_bundles);
1459extern struct xfrm_state * xfrm_migrate_state_find(struct xfrm_migrate *m);
1460extern struct xfrm_state * xfrm_state_migrate(struct xfrm_state *x,
1461 struct xfrm_migrate *m);
1462extern int xfrm_migrate(struct xfrm_selector *sel, u8 dir, u8 type,
1463 struct xfrm_migrate *m, int num_bundles);
1464#endif
1465
1466extern wait_queue_head_t km_waitq;
1467extern int km_new_mapping(struct xfrm_state *x, xfrm_address_t *ipaddr, __be16 sport);
1468extern void km_policy_expired(struct xfrm_policy *pol, int dir, int hard, u32 pid);
1469extern int km_report(u8 proto, struct xfrm_selector *sel, xfrm_address_t *addr);
1470
1471extern void xfrm_input_init(void);
1472extern int xfrm_parse_spi(struct sk_buff *skb, u8 nexthdr, __be32 *spi, __be32 *seq);
1473
1474extern void xfrm_probe_algs(void);
1475extern int xfrm_count_auth_supported(void);
1476extern int xfrm_count_enc_supported(void);
1477extern struct xfrm_algo_desc *xfrm_aalg_get_byidx(unsigned int idx);
1478extern struct xfrm_algo_desc *xfrm_ealg_get_byidx(unsigned int idx);
1479extern struct xfrm_algo_desc *xfrm_aalg_get_byid(int alg_id);
1480extern struct xfrm_algo_desc *xfrm_ealg_get_byid(int alg_id);
1481extern struct xfrm_algo_desc *xfrm_calg_get_byid(int alg_id);
1482extern struct xfrm_algo_desc *xfrm_aalg_get_byname(char *name, int probe);
1483extern struct xfrm_algo_desc *xfrm_ealg_get_byname(char *name, int probe);
1484extern struct xfrm_algo_desc *xfrm_calg_get_byname(char *name, int probe);
1485extern struct xfrm_algo_desc *xfrm_aead_get_byname(char *name, int icv_len,
1486 int probe);
1487
1488struct hash_desc;
1489struct scatterlist;
1490typedef int (icv_update_fn_t)(struct hash_desc *, struct scatterlist *,
1491 unsigned int);
1492
1493extern int skb_icv_walk(const struct sk_buff *skb, struct hash_desc *tfm,
1494 int offset, int len, icv_update_fn_t icv_update);
1495
1496static inline int xfrm_addr_cmp(xfrm_address_t *a, xfrm_address_t *b,
1497 int family)
1498{
1499 switch (family) {
1500 default:
1501 case AF_INET:
1502 return (__force __u32)a->a4 - (__force __u32)b->a4;
1503 case AF_INET6:
1504 return ipv6_addr_cmp((struct in6_addr *)a,
1505 (struct in6_addr *)b);
1506 }
1507}
1508
1509static inline int xfrm_policy_id2dir(u32 index)
1510{
1511 return index & 7;
1512}
1513
1514static inline int xfrm_aevent_is_on(void)
1515{
1516 struct sock *nlsk;
1517 int ret = 0;
1518
1519 rcu_read_lock();
1520 nlsk = rcu_dereference(xfrm_nl);
1521 if (nlsk)
1522 ret = netlink_has_listeners(nlsk, XFRMNLGRP_AEVENTS);
1523 rcu_read_unlock();
1524 return ret;
1525}
1526
1527static inline int xfrm_alg_len(struct xfrm_algo *alg)
1528{
1529 return sizeof(*alg) + ((alg->alg_key_len + 7) / 8);
1530}
1531
1532#ifdef CONFIG_XFRM_MIGRATE
1533static inline struct xfrm_algo *xfrm_algo_clone(struct xfrm_algo *orig)
1534{
1535 return kmemdup(orig, xfrm_alg_len(orig), GFP_KERNEL);
1536}
1537
1538static inline void xfrm_states_put(struct xfrm_state **states, int n)
1539{
1540 int i;
1541 for (i = 0; i < n; i++)
1542 xfrm_state_put(*(states + i));
1543}
1544
1545static inline void xfrm_states_delete(struct xfrm_state **states, int n)
1546{
1547 int i;
1548 for (i = 0; i < n; i++)
1549 xfrm_state_delete(*(states + i));
1550}
1551#endif
1552
1553static inline struct xfrm_state *xfrm_input_state(struct sk_buff *skb)
1554{
1555 return skb->sp->xvec[skb->sp->len - 1];
1556}
1557
1558#endif
1559