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