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