Blame view

include/net/xfrm.h 46.5 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
  #ifndef _NET_XFRM_H
  #define _NET_XFRM_H
aabc9761b   Herbert Xu   [IPSEC]: Store id...
3
  #include <linux/compiler.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4
5
6
7
  #include <linux/xfrm.h>
  #include <linux/spinlock.h>
  #include <linux/list.h>
  #include <linux/skbuff.h>
14c850212   Arnaldo Carvalho de Melo   [INET_SOCK]: Move...
8
  #include <linux/socket.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
9
  #include <linux/pfkeyv2.h>
5794708f1   Masahide NAKAMURA   [XFRM]: Introduce...
10
  #include <linux/ipsec.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
11
  #include <linux/in6.h>
4a3e2f711   Arjan van de Ven   [NET] sem2mutex: ...
12
  #include <linux/mutex.h>
ab5f5e8b1   Joy Latten   [XFRM]: xfrm audi...
13
  #include <linux/audit.h>
5a0e3ad6a   Tejun Heo   include cleanup: ...
14
  #include <linux/slab.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
15
16
17
  
  #include <net/sock.h>
  #include <net/dst.h>
436a0a402   Herbert Xu   [IPSEC]: Move out...
18
  #include <net/ip.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
19
20
21
  #include <net/route.h>
  #include <net/ipv6.h>
  #include <net/ip6_fib.h>
fe1a5f031   Timo Teräs   flow: virtualize ...
22
  #include <net/flow.h>
9e0d57fd6   Yury Polyanskiy   xfrm: SAD entries...
23
24
  
  #include <linux/interrupt.h>
558f82ef6   Masahide NAKAMURA   [XFRM]: Define pa...
25
26
27
  #ifdef CONFIG_XFRM_STATISTICS
  #include <net/snmp.h>
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
28

d3d6dd3ad   Masahide NAKAMURA   [XFRM]: Add modul...
29
30
31
32
33
34
35
  #define XFRM_PROTO_ESP		50
  #define XFRM_PROTO_AH		51
  #define XFRM_PROTO_COMP		108
  #define XFRM_PROTO_IPIP		4
  #define XFRM_PROTO_IPV6		41
  #define XFRM_PROTO_ROUTING	IPPROTO_ROUTING
  #define XFRM_PROTO_DSTOPTS	IPPROTO_DSTOPTS
fa9921e46   Nicolas Dichtel   ipsec: allow to a...
36
  #define XFRM_ALIGN4(len)	(((len) + 3) & ~3)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
37
  #define XFRM_ALIGN8(len)	(((len) + 7) & ~7)
b59f45d0b   Herbert Xu   [IPSEC] xfrm: Abs...
38
39
  #define MODULE_ALIAS_XFRM_MODE(family, encap) \
  	MODULE_ALIAS("xfrm-mode-" __stringify(family) "-" __stringify(encap))
d3d6dd3ad   Masahide NAKAMURA   [XFRM]: Add modul...
40
41
  #define MODULE_ALIAS_XFRM_TYPE(family, proto) \
  	MODULE_ALIAS("xfrm-type-" __stringify(family) "-" __stringify(proto))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
42

558f82ef6   Masahide NAKAMURA   [XFRM]: Define pa...
43
  #ifdef CONFIG_XFRM_STATISTICS
59c9940ed   Alexey Dobriyan   netns xfrm: per-n...
44
45
46
  #define XFRM_INC_STATS(net, field)	SNMP_INC_STATS((net)->mib.xfrm_statistics, field)
  #define XFRM_INC_STATS_BH(net, field)	SNMP_INC_STATS_BH((net)->mib.xfrm_statistics, field)
  #define XFRM_INC_STATS_USER(net, field)	SNMP_INC_STATS_USER((net)-mib.xfrm_statistics, field)
558f82ef6   Masahide NAKAMURA   [XFRM]: Define pa...
47
  #else
59c9940ed   Alexey Dobriyan   netns xfrm: per-n...
48
49
50
  #define XFRM_INC_STATS(net, field)	((void)(net))
  #define XFRM_INC_STATS_BH(net, field)	((void)(net))
  #define XFRM_INC_STATS_USER(net, field)	((void)(net))
558f82ef6   Masahide NAKAMURA   [XFRM]: Define pa...
51
  #endif
4a3e2f711   Arjan van de Ven   [NET] sem2mutex: ...
52
  extern struct mutex xfrm_cfg_mutex;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
  
  /* Organization of SPD aka "XFRM rules"
     ------------------------------------
  
     Basic objects:
     - policy rule, struct xfrm_policy (=SPD entry)
     - bundle of transformations, struct dst_entry == struct xfrm_dst (=SA bundle)
     - instance of a transformer, struct xfrm_state (=SA)
     - template to clone xfrm_state, struct xfrm_tmpl
  
     SPD is plain linear list of xfrm_policy rules, ordered by priority.
     (To be compatible with existing pfkeyv2 implementations,
     many rules with priority of 0x7fffffff are allowed to exist and
     such rules are ordered in an unpredictable way, thanks to bsd folks.)
  
     Lookup is plain linear search until the first match with selector.
  
     If "action" is "block", then we prohibit the flow, otherwise:
     if "xfrms_nr" is zero, the flow passes untransformed. Otherwise,
     policy entry has list of up to XFRM_MAX_DEPTH transformations,
     described by templates xfrm_tmpl. Each template is resolved
     to a complete xfrm_state (see below) and we pack bundle of transformations
     to a dst_entry returned to requestor.
  
     dst -. xfrm  .-> xfrm_state #1
      |---. child .-> dst -. xfrm .-> xfrm_state #2
                       |---. child .-> dst -. xfrm .-> xfrm_state #3
                                        |---. child .-> NULL
  
     Bundles are cached at xrfm_policy struct (field ->bundles).
  
  
     Resolution of xrfm_tmpl
     -----------------------
     Template contains:
     1. ->mode		Mode: transport or tunnel
     2. ->id.proto	Protocol: AH/ESP/IPCOMP
     3. ->id.daddr	Remote tunnel endpoint, ignored for transport mode.
        Q: allow to resolve security gateway?
     4. ->id.spi          If not zero, static SPI.
     5. ->saddr		Local tunnel endpoint, ignored for transport mode.
     6. ->algos		List of allowed algos. Plain bitmask now.
        Q: ealgos, aalgos, calgos. What a mess...
     7. ->share		Sharing mode.
        Q: how to implement private sharing mode? To add struct sock* to
        flow id?
  
     Having this template we search through SAD searching for entries
     with appropriate mode/proto/algo, permitted by selector.
     If no appropriate entry found, it is requested from key manager.
  
     PROBLEMS:
     Q: How to find all the bundles referring to a physical path for
        PMTU discovery? Seems, dst should contain list of all parents...
        and enter to infinite locking hierarchy disaster.
        No! It is easier, we will not search for them, let them find us.
        We add genid to each dst plus pointer to genid of raw IP route,
        pmtu disc will update pmtu on raw IP route and increase its genid.
        dst_check() will see this for top level and trigger resyncing
        metrics. Plus, it will be made via sk->sk_dst_cache. Solved.
   */
12a169e7d   Herbert Xu   ipsec: Put dumper...
114
115
116
117
118
119
120
121
122
  struct xfrm_state_walk {
  	struct list_head	all;
  	u8			state;
  	union {
  		u8		dying;
  		u8		proto;
  	};
  	u32			seq;
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
123
  /* Full description of state of transformer. */
fd2c3ef76   Eric Dumazet   net: cleanup incl...
124
  struct xfrm_state {
673c09be4   Alexey Dobriyan   netns xfrm: add s...
125
126
127
  #ifdef CONFIG_NET_NS
  	struct net		*xs_net;
  #endif
abb81c4f3   Herbert Xu   ipsec: Use RCU-li...
128
  	union {
12a169e7d   Herbert Xu   ipsec: Put dumper...
129
  		struct hlist_node	gclist;
abb81c4f3   Herbert Xu   ipsec: Use RCU-li...
130
131
  		struct hlist_node	bydst;
  	};
8f126e37c   David S. Miller   [XFRM]: Convert x...
132
133
  	struct hlist_node	bysrc;
  	struct hlist_node	byspi;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
134
135
136
137
138
139
  
  	atomic_t		refcnt;
  	spinlock_t		lock;
  
  	struct xfrm_id		id;
  	struct xfrm_selector	sel;
bf825f81b   Jamal Hadi Salim   xfrm: introduce b...
140
  	struct xfrm_mark	mark;
35d2856b4   Martin Willi   xfrm: Add Traffic...
141
  	u32			tfcpad;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
142

9d4a706d8   David S. Miller   [XFRM]: Add gener...
143
  	u32			genid;
12a169e7d   Herbert Xu   ipsec: Put dumper...
144
145
  	/* Key manager bits */
  	struct xfrm_state_walk	km;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
  
  	/* Parameters of this state. */
  	struct {
  		u32		reqid;
  		u8		mode;
  		u8		replay_window;
  		u8		aalgo, ealgo, calgo;
  		u8		flags;
  		u16		family;
  		xfrm_address_t	saddr;
  		int		header_len;
  		int		trailer_len;
  	} props;
  
  	struct xfrm_lifetime_cfg lft;
  
  	/* Data for transformer */
4447bb33f   Martin Willi   xfrm: Store aalg ...
163
  	struct xfrm_algo_auth	*aalg;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
164
165
  	struct xfrm_algo	*ealg;
  	struct xfrm_algo	*calg;
1a6509d99   Herbert Xu   [IPSEC]: Add supp...
166
  	struct xfrm_algo_aead	*aead;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
167
168
169
  
  	/* Data for encapsulator */
  	struct xfrm_encap_tmpl	*encap;
060f02a3b   Noriaki TAKAMIYA   [XFRM] STATE: Int...
170
171
  	/* Data for care-of address */
  	xfrm_address_t	*coaddr;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
172
173
174
175
176
177
178
179
  	/* IPComp needs an IPIP tunnel for handling uncompressed packets */
  	struct xfrm_state	*tunnel;
  
  	/* If a tunnel, number of users + 1 */
  	atomic_t		tunnel_users;
  
  	/* State for replay detection */
  	struct xfrm_replay_state replay;
9736acf39   Steffen Klassert   xfrm: Add basic i...
180
  	struct xfrm_replay_state_esn *replay_esn;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
181

f8cd54884   Jamal Hadi Salim   [IPSEC]: Sync ser...
182
183
  	/* Replay detection state at the time we sent the last notification */
  	struct xfrm_replay_state preplay;
9736acf39   Steffen Klassert   xfrm: Add basic i...
184
  	struct xfrm_replay_state_esn *preplay_esn;
f8cd54884   Jamal Hadi Salim   [IPSEC]: Sync ser...
185

9fdc4883d   Steffen Klassert   xfrm: Move IPsec ...
186
187
  	/* The functions for replay detection. */
  	struct xfrm_replay	*repl;
2717096ab   Jamal Hadi Salim   [XFRM]: Fix aeven...
188
189
190
191
  	/* internal flag that only holds state for delayed aevent at the
  	 * moment
  	*/
  	u32			xflags;
f8cd54884   Jamal Hadi Salim   [IPSEC]: Sync ser...
192
193
194
195
196
197
  	/* Replay detection notification settings */
  	u32			replay_maxage;
  	u32			replay_maxdiff;
  
  	/* Replay detection notification timer */
  	struct timer_list	rtimer;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
198
199
200
201
  	/* Statistics */
  	struct xfrm_stats	stats;
  
  	struct xfrm_lifetime_cur curlft;
9e0d57fd6   Yury Polyanskiy   xfrm: SAD entries...
202
  	struct tasklet_hrtimer	mtimer;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
203

9afaca057   Masahide NAKAMURA   [XFRM] IPV6: Upda...
204
  	/* Last used time */
d26f39840   Herbert Xu   [IPSEC]: Make x->...
205
  	unsigned long		lastused;
9afaca057   Masahide NAKAMURA   [XFRM] IPV6: Upda...
206

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
207
208
  	/* Reference to data common to all the instances of this
  	 * transformer. */
533cb5b0a   Eric Dumazet   [XFRM]: constify ...
209
  	const struct xfrm_type	*type;
13996378e   Herbert Xu   [IPSEC]: Rename m...
210
  	struct xfrm_mode	*inner_mode;
df9dcb458   Kazunori MIYAZAWA   [IPSEC]: Fix inte...
211
  	struct xfrm_mode	*inner_mode_iaf;
13996378e   Herbert Xu   [IPSEC]: Rename m...
212
  	struct xfrm_mode	*outer_mode;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
213

df71837d5   Trent Jaeger   [LSM-IPSec]: Secu...
214
215
  	/* Security context */
  	struct xfrm_sec_ctx	*security;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
216
217
218
219
  	/* Private data of this transformer, format is opaque,
  	 * interpreted by xfrm_type methods. */
  	void			*data;
  };
673c09be4   Alexey Dobriyan   netns xfrm: add s...
220
221
222
223
  static inline struct net *xs_net(struct xfrm_state *x)
  {
  	return read_pnet(&x->xs_net);
  }
2717096ab   Jamal Hadi Salim   [XFRM]: Fix aeven...
224
225
  /* xflags - make enum if more show up */
  #define XFRM_TIME_DEFER	1
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
226
227
228
229
230
231
232
233
  enum {
  	XFRM_STATE_VOID,
  	XFRM_STATE_ACQ,
  	XFRM_STATE_VALID,
  	XFRM_STATE_ERROR,
  	XFRM_STATE_EXPIRED,
  	XFRM_STATE_DEAD
  };
26b15dad9   Jamal Hadi Salim   [IPSEC] Add compl...
234
  /* callback structure passed from either netlink or pfkey */
fd2c3ef76   Eric Dumazet   net: cleanup incl...
235
  struct km_event {
bf08867f9   Herbert Xu   [IPSEC] Turn km_e...
236
237
238
239
  	union {
  		u32 hard;
  		u32 proto;
  		u32 byid;
f8cd54884   Jamal Hadi Salim   [IPSEC]: Sync ser...
240
  		u32 aevent;
f7b6983f0   Masahide NAKAMURA   [XFRM] POLICY: Su...
241
  		u32 type;
bf08867f9   Herbert Xu   [IPSEC] Turn km_e...
242
  	} data;
26b15dad9   Jamal Hadi Salim   [IPSEC] Add compl...
243
244
245
  	u32	seq;
  	u32	pid;
  	u32	event;
7067802e2   Alexey Dobriyan   netns xfrm: pass ...
246
  	struct net *net;
26b15dad9   Jamal Hadi Salim   [IPSEC] Add compl...
247
  };
9fdc4883d   Steffen Klassert   xfrm: Move IPsec ...
248
249
250
251
252
253
254
255
  struct xfrm_replay {
  	void	(*advance)(struct xfrm_state *x, __be32 net_seq);
  	int	(*check)(struct xfrm_state *x,
  			 struct sk_buff *skb,
  			 __be32 net_seq);
  	void	(*notify)(struct xfrm_state *x, int event);
  	int	(*overflow)(struct xfrm_state *x, struct sk_buff *skb);
  };
25ee3286d   Herbert Xu   [IPSEC]: Merge co...
256
  struct net_device;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
257
258
259
260
  struct xfrm_type;
  struct xfrm_dst;
  struct xfrm_policy_afinfo {
  	unsigned short		family;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
261
  	struct dst_ops		*dst_ops;
ddcfd7968   Alexey Dobriyan   netns xfrm: dst g...
262
  	void			(*garbage_collect)(struct net *net);
c5b3cf46e   Alexey Dobriyan   netns xfrm: ->dst...
263
  	struct dst_entry	*(*dst_lookup)(struct net *net, int tos,
5e6b930f2   David S. Miller   xfrm: Const'ify a...
264
265
  					       const xfrm_address_t *saddr,
  					       const xfrm_address_t *daddr);
fbda33b2b   Alexey Dobriyan   netns xfrm: ->get...
266
  	int			(*get_saddr)(struct net *net, xfrm_address_t *saddr, xfrm_address_t *daddr);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
267
  	void			(*decode_session)(struct sk_buff *skb,
d5422efe6   Herbert Xu   [IPSEC]: Added xf...
268
269
  						  struct flowi *fl,
  						  int reverse);
05d840257   David S. Miller   xfrm: Mark flowi ...
270
  	int			(*get_tos)(const struct flowi *fl);
a1b051405   Masahide NAKAMURA   [XFRM] IPv6: Fix ...
271
272
273
  	int			(*init_path)(struct xfrm_dst *path,
  					     struct dst_entry *dst,
  					     int nfheader_len);
25ee3286d   Herbert Xu   [IPSEC]: Merge co...
274
  	int			(*fill_dst)(struct xfrm_dst *xdst,
87c1e12b5   Herbert Xu   ipsec: Fix bogus ...
275
  					    struct net_device *dev,
0c7b3eefb   David S. Miller   xfrm: Mark flowi ...
276
  					    const struct flowi *fl);
2774c131b   David S. Miller   xfrm: Handle blac...
277
  	struct dst_entry	*(*blackhole_route)(struct net *net, struct dst_entry *orig);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
278
279
280
281
  };
  
  extern int xfrm_policy_register_afinfo(struct xfrm_policy_afinfo *afinfo);
  extern int xfrm_policy_unregister_afinfo(struct xfrm_policy_afinfo *afinfo);
214e005bc   David S. Miller   xfrm: Pass km_eve...
282
283
  extern void km_policy_notify(struct xfrm_policy *xp, int dir, const struct km_event *c);
  extern void km_state_notify(struct xfrm_state *x, const struct km_event *c);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
284
285
  
  struct xfrm_tmpl;
980ebd257   Jamal Hadi Salim   [IPSEC]: Sync ser...
286
  extern int km_query(struct xfrm_state *x, struct xfrm_tmpl *t, struct xfrm_policy *pol);
53bc6b4d2   Jamal Hadi Salim   [IPSEC]: Sync ser...
287
288
  extern void km_state_expired(struct xfrm_state *x, int hard, u32 pid);
  extern int __xfrm_state_delete(struct xfrm_state *x);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
289
  struct xfrm_state_afinfo {
17c2a42a2   Herbert Xu   [IPSEC]: Store af...
290
  	unsigned int		family;
36cf9acf9   Herbert Xu   [IPSEC]: Separate...
291
  	unsigned int		proto;
8e3d716cc   Al Viro   xfrm: ->eth_proto...
292
  	__be16			eth_proto;
17c2a42a2   Herbert Xu   [IPSEC]: Store af...
293
  	struct module		*owner;
533cb5b0a   Eric Dumazet   [XFRM]: constify ...
294
  	const struct xfrm_type	*type_map[IPPROTO_MAX];
aa5d62cc8   Herbert Xu   [IPSEC]: Move typ...
295
  	struct xfrm_mode	*mode_map[XFRM_MODE_MAX];
d094cd83c   Herbert Xu   [IPSEC]: Add xfrm...
296
  	int			(*init_flags)(struct xfrm_state *x);
73e5ebb20   David S. Miller   xfrm: Mark flowi ...
297
298
  	void			(*init_tempsel)(struct xfrm_selector *sel,
  						const struct flowi *fl);
19bd62441   David S. Miller   xfrm: Const'ify t...
299
300
301
302
  	void			(*init_temprop)(struct xfrm_state *x,
  						const struct xfrm_tmpl *tmpl,
  						const xfrm_address_t *daddr,
  						const xfrm_address_t *saddr);
41a49cc3c   Masahide NAKAMURA   [XFRM]: Add sorti...
303
304
  	int			(*tmpl_sort)(struct xfrm_tmpl **dst, struct xfrm_tmpl **src, int n);
  	int			(*state_sort)(struct xfrm_state **dst, struct xfrm_state **src, int n);
cdca72652   Miika Komu   [IPSEC]: exportin...
305
  	int			(*output)(struct sk_buff *skb);
43a4dea4c   Steffen Klassert   xfrm: Assign the ...
306
  	int			(*output_finish)(struct sk_buff *skb);
227620e29   Herbert Xu   [IPSEC]: Separate...
307
308
  	int			(*extract_input)(struct xfrm_state *x,
  						 struct sk_buff *skb);
36cf9acf9   Herbert Xu   [IPSEC]: Separate...
309
310
  	int			(*extract_output)(struct xfrm_state *x,
  						  struct sk_buff *skb);
716062fd4   Herbert Xu   [IPSEC]: Merge mo...
311
312
  	int			(*transport_finish)(struct sk_buff *skb,
  						    int async);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
313
314
315
316
317
318
  };
  
  extern int xfrm_state_register_afinfo(struct xfrm_state_afinfo *afinfo);
  extern int xfrm_state_unregister_afinfo(struct xfrm_state_afinfo *afinfo);
  
  extern void xfrm_state_delete_tunnel(struct xfrm_state *x);
fd2c3ef76   Eric Dumazet   net: cleanup incl...
319
  struct xfrm_type {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
320
321
  	char			*description;
  	struct module		*owner;
a63374631   jamal   xfrm: use proper ...
322
323
  	u8			proto;
  	u8			flags;
1b5c22998   Masahide NAKAMURA   [XFRM] STATE: Sup...
324
  #define XFRM_TYPE_NON_FRAGMENT	1
436a0a402   Herbert Xu   [IPSEC]: Move out...
325
  #define XFRM_TYPE_REPLAY_PROT	2
f04e7e8d7   Herbert Xu   [IPSEC]: Replace ...
326
327
  #define XFRM_TYPE_LOCAL_COADDR	4
  #define XFRM_TYPE_REMOTE_COADDR	8
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
328

72cb6962a   Herbert Xu   [IPSEC]: Add xfrm...
329
  	int			(*init_state)(struct xfrm_state *x);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
330
  	void			(*destructor)(struct xfrm_state *);
e695633e2   Herbert Xu   [IPSEC]: Kill unu...
331
  	int			(*input)(struct xfrm_state *, struct sk_buff *skb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
332
  	int			(*output)(struct xfrm_state *, struct sk_buff *pskb);
8f029de28   David S. Miller   xfrm: Mark flowi ...
333
334
  	int			(*reject)(struct xfrm_state *, struct sk_buff *,
  					  const struct flowi *);
aee5adb43   Masahide NAKAMURA   [XFRM] STATE: Add...
335
  	int			(*hdr_offset)(struct xfrm_state *, struct sk_buff *, u8 **);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
336
  	/* Estimate maximal size of result of transformation of a dgram */
c5c252389   Patrick McHardy   [XFRM]: Optimize ...
337
  	u32			(*get_mtu)(struct xfrm_state *, int size);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
338
  };
533cb5b0a   Eric Dumazet   [XFRM]: constify ...
339
340
  extern int xfrm_register_type(const struct xfrm_type *type, unsigned short family);
  extern int xfrm_unregister_type(const struct xfrm_type *type, unsigned short family);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
341

b59f45d0b   Herbert Xu   [IPSEC] xfrm: Abs...
342
  struct xfrm_mode {
227620e29   Herbert Xu   [IPSEC]: Separate...
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
  	/*
  	 * Remove encapsulation header.
  	 *
  	 * The IP header will be moved over the top of the encapsulation
  	 * header.
  	 *
  	 * On entry, the transport header shall point to where the IP header
  	 * should be and the network header shall be set to where the IP
  	 * header currently is.  skb->data shall point to the start of the
  	 * payload.
  	 */
  	int (*input2)(struct xfrm_state *x, struct sk_buff *skb);
  
  	/*
  	 * This is the actual input entry point.
  	 *
  	 * For transport mode and equivalent this would be identical to
  	 * input2 (which does not need to be set).  While tunnel mode
  	 * and equivalent would set this to the tunnel encapsulation function
  	 * xfrm4_prepare_input that would in turn call input2.
  	 */
b59f45d0b   Herbert Xu   [IPSEC] xfrm: Abs...
364
  	int (*input)(struct xfrm_state *x, struct sk_buff *skb);
37fedd3aa   Herbert Xu   [IPSEC]: Use IPv6...
365
366
367
368
369
370
371
372
373
374
375
376
  
  	/*
  	 * Add encapsulation header.
  	 *
  	 * On exit, the transport header will be set to the start of the
  	 * encapsulation header to be filled in by x->type->output and
  	 * the mac header will be set to the nextheader (protocol for
  	 * IPv4) field of the extension header directly preceding the
  	 * encapsulation header, or in its absence, that of the top IP
  	 * header.  The value of the network header will always point
  	 * to the top IP header while skb->data will point to the payload.
  	 */
36cf9acf9   Herbert Xu   [IPSEC]: Separate...
377
378
379
380
381
382
383
384
385
386
387
388
  	int (*output2)(struct xfrm_state *x,struct sk_buff *skb);
  
  	/*
  	 * This is the actual output entry point.
  	 *
  	 * For transport mode and equivalent this would be identical to
  	 * output2 (which does not need to be set).  While tunnel mode
  	 * and equivalent would set this to a tunnel encapsulation function
  	 * (xfrm4_prepare_output or xfrm6_prepare_output) that would in turn
  	 * call output2.
  	 */
  	int (*output)(struct xfrm_state *x, struct sk_buff *skb);
b59f45d0b   Herbert Xu   [IPSEC] xfrm: Abs...
389

17c2a42a2   Herbert Xu   [IPSEC]: Store af...
390
  	struct xfrm_state_afinfo *afinfo;
b59f45d0b   Herbert Xu   [IPSEC] xfrm: Abs...
391
392
  	struct module *owner;
  	unsigned int encap;
1bfcb10f6   Herbert Xu   [IPSEC]: Add miss...
393
394
395
396
397
398
  	int flags;
  };
  
  /* Flags for xfrm_mode. */
  enum {
  	XFRM_MODE_FLAG_TUNNEL = 1,
b59f45d0b   Herbert Xu   [IPSEC] xfrm: Abs...
399
400
401
402
  };
  
  extern int xfrm_register_mode(struct xfrm_mode *mode, int family);
  extern int xfrm_unregister_mode(struct xfrm_mode *mode, int family);
b59f45d0b   Herbert Xu   [IPSEC] xfrm: Abs...
403

df9dcb458   Kazunori MIYAZAWA   [IPSEC]: Fix inte...
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
  static inline int xfrm_af2proto(unsigned int family)
  {
  	switch(family) {
  	case AF_INET:
  		return IPPROTO_IPIP;
  	case AF_INET6:
  		return IPPROTO_IPV6;
  	default:
  		return 0;
  	}
  }
  
  static inline struct xfrm_mode *xfrm_ip2inner_mode(struct xfrm_state *x, int ipproto)
  {
  	if ((ipproto == IPPROTO_IPIP && x->props.family == AF_INET) ||
  	    (ipproto == IPPROTO_IPV6 && x->props.family == AF_INET6))
  		return x->inner_mode;
  	else
  		return x->inner_mode_iaf;
  }
fd2c3ef76   Eric Dumazet   net: cleanup incl...
424
  struct xfrm_tmpl {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
425
426
427
428
429
430
431
432
433
434
  /* id in template is interpreted as:
   * daddr - destination of tunnel, may be zero for transport mode.
   * spi   - zero to acquire spi. Not zero if spi is static, then
   *	   daddr must be fixed too.
   * proto - AH/ESP/IPCOMP
   */
  	struct xfrm_id		id;
  
  /* Source address of tunnel. Ignored, if it is not a tunnel. */
  	xfrm_address_t		saddr;
76b3f055f   Miika Komu   [IPSEC]: Add enca...
435
  	unsigned short		encap_family;
a63374631   jamal   xfrm: use proper ...
436
  	u32			reqid;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
437

7e49e6de3   Masahide NAKAMURA   [XFRM]: Add XFRM_...
438
  /* Mode: transport, tunnel etc. */
a63374631   jamal   xfrm: use proper ...
439
  	u8			mode;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
440
441
  
  /* Sharing mode: unique, this session only, this user only etc. */
a63374631   jamal   xfrm: use proper ...
442
  	u8			share;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
443
444
  
  /* May skip this transfomration if no SA is found */
a63374631   jamal   xfrm: use proper ...
445
  	u8			optional;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
446

c5d18e984   Herbert Xu   [IPSEC]: Fix catc...
447
  /* Skip aalgos/ealgos/calgos checks. */
a63374631   jamal   xfrm: use proper ...
448
  	u8			allalgs;
c5d18e984   Herbert Xu   [IPSEC]: Fix catc...
449

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
450
  /* Bit mask of algos allowed for acquisition */
a63374631   jamal   xfrm: use proper ...
451
452
453
  	u32			aalgos;
  	u32			ealgos;
  	u32			calgos;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
454
  };
622dc8281   Masahide NAKAMURA   [XFRM]: Expand XF...
455
  #define XFRM_MAX_DEPTH		6
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
456

12a169e7d   Herbert Xu   ipsec: Put dumper...
457
458
459
460
461
462
463
464
465
466
  struct xfrm_policy_walk_entry {
  	struct list_head	all;
  	u8			dead;
  };
  
  struct xfrm_policy_walk {
  	struct xfrm_policy_walk_entry walk;
  	u8 type;
  	u32 seq;
  };
fd2c3ef76   Eric Dumazet   net: cleanup incl...
467
  struct xfrm_policy {
0331b1f38   Alexey Dobriyan   netns xfrm: add s...
468
469
470
  #ifdef CONFIG_NET_NS
  	struct net		*xp_net;
  #endif
2518c7c2b   David S. Miller   [XFRM]: Hash poli...
471
472
  	struct hlist_node	bydst;
  	struct hlist_node	byidx;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
473
474
475
476
477
  
  	/* This lock only affects elements except for entry. */
  	rwlock_t		lock;
  	atomic_t		refcnt;
  	struct timer_list	timer;
fe1a5f031   Timo Teräs   flow: virtualize ...
478
  	struct flow_cache_object flo;
80c802f30   Timo Teräs   xfrm: cache bundl...
479
  	atomic_t		genid;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
480
481
  	u32			priority;
  	u32			index;
bf825f81b   Jamal Hadi Salim   xfrm: introduce b...
482
  	struct xfrm_mark	mark;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
483
484
485
  	struct xfrm_selector	selector;
  	struct xfrm_lifetime_cfg lft;
  	struct xfrm_lifetime_cur curlft;
12a169e7d   Herbert Xu   ipsec: Put dumper...
486
  	struct xfrm_policy_walk_entry walk;
46ca5f5dc   Arnaldo Carvalho de Melo   [XFRM]: Pack stru...
487
488
489
  	u8			type;
  	u8			action;
  	u8			flags;
46ca5f5dc   Arnaldo Carvalho de Melo   [XFRM]: Pack stru...
490
  	u8			xfrm_nr;
12a169e7d   Herbert Xu   ipsec: Put dumper...
491
  	u16			family;
df71837d5   Trent Jaeger   [LSM-IPSec]: Secu...
492
  	struct xfrm_sec_ctx	*security;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
493
494
  	struct xfrm_tmpl       	xfrm_vec[XFRM_MAX_DEPTH];
  };
63eb23f5d   David S. Miller   xfrm: Const'ify p...
495
  static inline struct net *xp_net(const struct xfrm_policy *xp)
0331b1f38   Alexey Dobriyan   netns xfrm: add s...
496
497
498
  {
  	return read_pnet(&xp->xp_net);
  }
13c1d1893   Arnaud Ebalard   xfrm: MIGRATE enh...
499
500
501
502
503
504
  struct xfrm_kmaddress {
  	xfrm_address_t          local;
  	xfrm_address_t          remote;
  	u32			reserved;
  	u16			family;
  };
80c9abaab   Shinta Sugimoto   [XFRM]: Extension...
505
506
507
508
509
510
511
512
513
514
515
516
  struct xfrm_migrate {
  	xfrm_address_t		old_daddr;
  	xfrm_address_t		old_saddr;
  	xfrm_address_t		new_daddr;
  	xfrm_address_t		new_saddr;
  	u8			proto;
  	u8			mode;
  	u16			reserved;
  	u32			reqid;
  	u16			old_family;
  	u16			new_family;
  };
f8cd54884   Jamal Hadi Salim   [IPSEC]: Sync ser...
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
  #define XFRM_KM_TIMEOUT                30
  /* which seqno */
  #define XFRM_REPLAY_SEQ		1
  #define XFRM_REPLAY_OSEQ	2
  #define XFRM_REPLAY_SEQ_MASK	3
  /* what happened */
  #define XFRM_REPLAY_UPDATE	XFRM_AE_CR
  #define XFRM_REPLAY_TIMEOUT	XFRM_AE_CE
  
  /* default aevent timeout in units of 100ms */
  #define XFRM_AE_ETIME			10
  /* Async Event timer multiplier */
  #define XFRM_AE_ETH_M			10
  /* default seq threshold size */
  #define XFRM_AE_SEQT_SIZE		2
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
532

fd2c3ef76   Eric Dumazet   net: cleanup incl...
533
  struct xfrm_mgr {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
534
535
  	struct list_head	list;
  	char			*id;
214e005bc   David S. Miller   xfrm: Pass km_eve...
536
  	int			(*notify)(struct xfrm_state *x, const struct km_event *c);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
537
  	int			(*acquire)(struct xfrm_state *x, struct xfrm_tmpl *, struct xfrm_policy *xp, int dir);
cb969f072   Venkat Yekkirala   [MLSXFRM]: Defaul...
538
  	struct xfrm_policy	*(*compile_policy)(struct sock *sk, int opt, u8 *data, int len, int *dir);
5d36b1803   Al Viro   [XFRM]: annotate ...
539
  	int			(*new_mapping)(struct xfrm_state *x, xfrm_address_t *ipaddr, __be16 sport);
214e005bc   David S. Miller   xfrm: Pass km_eve...
540
  	int			(*notify_policy)(struct xfrm_policy *x, int dir, const struct km_event *c);
db983c114   Alexey Dobriyan   netns xfrm: KM re...
541
  	int			(*report)(struct net *net, u8 proto, struct xfrm_selector *sel, xfrm_address_t *addr);
183cad127   David S. Miller   xfrm: Const'ify p...
542
543
544
545
546
  	int			(*migrate)(const struct xfrm_selector *sel,
  					   u8 dir, u8 type,
  					   const struct xfrm_migrate *m,
  					   int num_bundles,
  					   const struct xfrm_kmaddress *k);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
547
548
549
550
  };
  
  extern int xfrm_register_km(struct xfrm_mgr *km);
  extern int xfrm_unregister_km(struct xfrm_mgr *km);
436a0a402   Herbert Xu   [IPSEC]: Move out...
551
552
553
554
555
556
557
558
559
560
561
562
  /*
   * This structure is used for the duration where packets are being
   * transformed by IPsec.  As soon as the packet leaves IPsec the
   * area beyond the generic IP part may be overwritten.
   */
  struct xfrm_skb_cb {
  	union {
  		struct inet_skb_parm h4;
  		struct inet6_skb_parm h6;
          } header;
  
          /* Sequence number for replay protection. */
b318e0e4e   Herbert Xu   [IPSEC]: Fix bogu...
563
  	union {
1ce3644ad   Steffen Klassert   xfrm: Use separat...
564
565
566
567
568
569
570
571
  		struct {
  			__u32 low;
  			__u32 hi;
  		} output;
  		struct {
  			__be32 low;
  			__be32 hi;
  		} input;
b318e0e4e   Herbert Xu   [IPSEC]: Fix bogu...
572
  	} seq;
436a0a402   Herbert Xu   [IPSEC]: Move out...
573
574
575
  };
  
  #define XFRM_SKB_CB(__skb) ((struct xfrm_skb_cb *)&((__skb)->cb[0]))
36cf9acf9   Herbert Xu   [IPSEC]: Separate...
576
577
578
579
580
581
582
583
584
585
586
587
588
  /*
   * This structure is used by the afinfo prepare_input/prepare_output functions
   * to transmit header information to the mode input/output functions.
   */
  struct xfrm_mode_skb_cb {
  	union {
  		struct inet_skb_parm h4;
  		struct inet6_skb_parm h6;
  	} header;
  
  	/* Copied from header for IPv4, always set to zero and DF for IPv6. */
  	__be16 id;
  	__be16 frag_off;
732c8bd59   Herbert Xu   [IPSEC]: Fix BEET...
589
590
  	/* IP header length (excluding options or extension headers). */
  	u8 ihl;
36cf9acf9   Herbert Xu   [IPSEC]: Separate...
591
592
593
594
595
596
597
598
  	/* TOS for IPv4, class for IPv6. */
  	u8 tos;
  
  	/* TTL for IPv4, hop limitfor IPv6. */
  	u8 ttl;
  
  	/* Protocol for IPv4, NH for IPv6. */
  	u8 protocol;
732c8bd59   Herbert Xu   [IPSEC]: Fix BEET...
599
600
  	/* Option length for IPv4, zero for IPv6. */
  	u8 optlen;
36cf9acf9   Herbert Xu   [IPSEC]: Separate...
601
602
603
604
605
  	/* Used by IPv6 only, zero for IPv4. */
  	u8 flow_lbl[3];
  };
  
  #define XFRM_MODE_SKB_CB(__skb) ((struct xfrm_mode_skb_cb *)&((__skb)->cb[0]))
716062fd4   Herbert Xu   [IPSEC]: Merge mo...
606
607
608
609
610
611
612
613
614
  /*
   * This structure is used by the input processing to locate the SPI and
   * related information.
   */
  struct xfrm_spi_skb_cb {
  	union {
  		struct inet_skb_parm h4;
  		struct inet6_skb_parm h6;
  	} header;
716062fd4   Herbert Xu   [IPSEC]: Merge mo...
615
  	unsigned int daddroff;
2fcb45b6b   Herbert Xu   [IPSEC]: Use the ...
616
  	unsigned int family;
716062fd4   Herbert Xu   [IPSEC]: Merge mo...
617
618
619
  };
  
  #define XFRM_SPI_SKB_CB(__skb) ((struct xfrm_spi_skb_cb *)&((__skb)->cb[0]))
161a09e73   Joy Latten   audit: Add auditi...
620
  /* Audit Information */
fd2c3ef76   Eric Dumazet   net: cleanup incl...
621
  struct xfrm_audit {
161a09e73   Joy Latten   audit: Add auditi...
622
  	u32	secid;
2532386f4   Eric Paris   Audit: collect se...
623
624
  	uid_t	loginuid;
  	u32	sessionid;
161a09e73   Joy Latten   audit: Add auditi...
625
  };
c9204d9ca   Joy Latten   audit: disable ip...
626
627
  
  #ifdef CONFIG_AUDITSYSCALL
afeb14b49   Paul Moore   [XFRM]: RFC4303 c...
628
  static inline struct audit_buffer *xfrm_audit_start(const char *op)
ab5f5e8b1   Joy Latten   [XFRM]: xfrm audi...
629
630
  {
  	struct audit_buffer *audit_buf = NULL;
ab5f5e8b1   Joy Latten   [XFRM]: xfrm audi...
631

afeb14b49   Paul Moore   [XFRM]: RFC4303 c...
632
633
  	if (audit_enabled == 0)
  		return NULL;
ab5f5e8b1   Joy Latten   [XFRM]: xfrm audi...
634
  	audit_buf = audit_log_start(current->audit_context, GFP_ATOMIC,
afeb14b49   Paul Moore   [XFRM]: RFC4303 c...
635
  				    AUDIT_MAC_IPSEC_EVENT);
ab5f5e8b1   Joy Latten   [XFRM]: xfrm audi...
636
637
  	if (audit_buf == NULL)
  		return NULL;
afeb14b49   Paul Moore   [XFRM]: RFC4303 c...
638
639
640
  	audit_log_format(audit_buf, "op=%s", op);
  	return audit_buf;
  }
ab5f5e8b1   Joy Latten   [XFRM]: xfrm audi...
641

2532386f4   Eric Paris   Audit: collect se...
642
  static inline void xfrm_audit_helper_usrinfo(uid_t auid, u32 ses, u32 secid,
afeb14b49   Paul Moore   [XFRM]: RFC4303 c...
643
644
645
646
  					     struct audit_buffer *audit_buf)
  {
  	char *secctx;
  	u32 secctx_len;
ab5f5e8b1   Joy Latten   [XFRM]: xfrm audi...
647

2532386f4   Eric Paris   Audit: collect se...
648
  	audit_log_format(audit_buf, " auid=%u ses=%u", auid, ses);
68277accb   Paul Moore   [XFRM]: Assorted ...
649
650
  	if (secid != 0 &&
  	    security_secid_to_secctx(secid, &secctx, &secctx_len) == 0) {
ab5f5e8b1   Joy Latten   [XFRM]: xfrm audi...
651
652
653
654
  		audit_log_format(audit_buf, " subj=%s", secctx);
  		security_release_secctx(secctx, secctx_len);
  	} else
  		audit_log_task_context(audit_buf);
ab5f5e8b1   Joy Latten   [XFRM]: xfrm audi...
655
656
657
  }
  
  extern void xfrm_audit_policy_add(struct xfrm_policy *xp, int result,
2532386f4   Eric Paris   Audit: collect se...
658
  				  u32 auid, u32 ses, u32 secid);
ab5f5e8b1   Joy Latten   [XFRM]: xfrm audi...
659
  extern void xfrm_audit_policy_delete(struct xfrm_policy *xp, int result,
2532386f4   Eric Paris   Audit: collect se...
660
  				  u32 auid, u32 ses, u32 secid);
ab5f5e8b1   Joy Latten   [XFRM]: xfrm audi...
661
  extern void xfrm_audit_state_add(struct xfrm_state *x, int result,
2532386f4   Eric Paris   Audit: collect se...
662
  				 u32 auid, u32 ses, u32 secid);
ab5f5e8b1   Joy Latten   [XFRM]: xfrm audi...
663
  extern void xfrm_audit_state_delete(struct xfrm_state *x, int result,
2532386f4   Eric Paris   Audit: collect se...
664
  				    u32 auid, u32 ses, u32 secid);
afeb14b49   Paul Moore   [XFRM]: RFC4303 c...
665
666
  extern void xfrm_audit_state_replay_overflow(struct xfrm_state *x,
  					     struct sk_buff *skb);
9fdc4883d   Steffen Klassert   xfrm: Move IPsec ...
667
668
  extern void xfrm_audit_state_replay(struct xfrm_state *x,
  				    struct sk_buff *skb, __be32 net_seq);
afeb14b49   Paul Moore   [XFRM]: RFC4303 c...
669
670
671
672
673
  extern void xfrm_audit_state_notfound_simple(struct sk_buff *skb, u16 family);
  extern void xfrm_audit_state_notfound(struct sk_buff *skb, u16 family,
  				      __be32 net_spi, __be32 net_seq);
  extern void xfrm_audit_state_icvfail(struct xfrm_state *x,
  				     struct sk_buff *skb, u8 proto);
c9204d9ca   Joy Latten   audit: disable ip...
674
  #else
41fef0ee7   Marcin Slusarz   xfrm: convert emp...
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
  
  static inline void xfrm_audit_policy_add(struct xfrm_policy *xp, int result,
  				  u32 auid, u32 ses, u32 secid)
  {
  }
  
  static inline void xfrm_audit_policy_delete(struct xfrm_policy *xp, int result,
  				  u32 auid, u32 ses, u32 secid)
  {
  }
  
  static inline void xfrm_audit_state_add(struct xfrm_state *x, int result,
  				 u32 auid, u32 ses, u32 secid)
  {
  }
  
  static inline void xfrm_audit_state_delete(struct xfrm_state *x, int result,
  				    u32 auid, u32 ses, u32 secid)
  {
  }
  
  static inline void xfrm_audit_state_replay_overflow(struct xfrm_state *x,
  					     struct sk_buff *skb)
  {
  }
9fdc4883d   Steffen Klassert   xfrm: Move IPsec ...
700
701
702
703
  static inline void xfrm_audit_state_replay(struct xfrm_state *x,
  					   struct sk_buff *skb, __be32 net_seq)
  {
  }
41fef0ee7   Marcin Slusarz   xfrm: convert emp...
704
705
706
707
708
709
710
711
712
713
714
715
716
717
  static inline void xfrm_audit_state_notfound_simple(struct sk_buff *skb,
  				      u16 family)
  {
  }
  
  static inline void xfrm_audit_state_notfound(struct sk_buff *skb, u16 family,
  				      __be32 net_spi, __be32 net_seq)
  {
  }
  
  static inline void xfrm_audit_state_icvfail(struct xfrm_state *x,
  				     struct sk_buff *skb, u8 proto)
  {
  }
c9204d9ca   Joy Latten   audit: disable ip...
718
  #endif /* CONFIG_AUDITSYSCALL */
161a09e73   Joy Latten   audit: Add auditi...
719

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
720
721
722
723
724
  static inline void xfrm_pol_hold(struct xfrm_policy *policy)
  {
  	if (likely(policy != NULL))
  		atomic_inc(&policy->refcnt);
  }
64c31b3f7   WANG Cong   [XFRM] xfrm_polic...
725
  extern void xfrm_policy_destroy(struct xfrm_policy *policy);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
726
727
728
729
  
  static inline void xfrm_pol_put(struct xfrm_policy *policy)
  {
  	if (atomic_dec_and_test(&policy->refcnt))
64c31b3f7   WANG Cong   [XFRM] xfrm_polic...
730
  		xfrm_policy_destroy(policy);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
731
  }
4e81bb833   Masahide NAKAMURA   [XFRM] POLICY: su...
732
733
734
735
736
737
  static inline void xfrm_pols_put(struct xfrm_policy **pols, int npols)
  {
  	int i;
  	for (i = npols - 1; i >= 0; --i)
  		xfrm_pol_put(pols[i]);
  }
4e81bb833   Masahide NAKAMURA   [XFRM] POLICY: su...
738

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
739
  extern void __xfrm_state_destroy(struct xfrm_state *);
21380b81e   Herbert Xu   [XFRM]: Eliminate...
740
741
742
743
  static inline void __xfrm_state_put(struct xfrm_state *x)
  {
  	atomic_dec(&x->refcnt);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
744
745
746
747
748
749
750
751
752
753
  static inline void xfrm_state_put(struct xfrm_state *x)
  {
  	if (atomic_dec_and_test(&x->refcnt))
  		__xfrm_state_destroy(x);
  }
  
  static inline void xfrm_state_hold(struct xfrm_state *x)
  {
  	atomic_inc(&x->refcnt);
  }
1744a8fe0   David S. Miller   xfrm: Mark token ...
754
755
  static inline bool addr_match(const void *token1, const void *token2,
  			      int prefixlen)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
756
  {
1744a8fe0   David S. Miller   xfrm: Mark token ...
757
758
  	const __be32 *a1 = token1;
  	const __be32 *a2 = token2;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
759
760
  	int pdw;
  	int pbi;
a63374631   jamal   xfrm: use proper ...
761
  	pdw = prefixlen >> 5;	  /* num of whole u32 in prefix */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
762
763
764
765
  	pbi = prefixlen &  0x1f;  /* num of bits in incomplete u32 in prefix */
  
  	if (pdw)
  		if (memcmp(a1, a2, pdw << 2))
1744a8fe0   David S. Miller   xfrm: Mark token ...
766
  			return false;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
767
768
  
  	if (pbi) {
5f19343fb   Al Viro   [XFRM]: addr_matc...
769
  		__be32 mask;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
770
771
772
773
  
  		mask = htonl((0xffffffff) << (32 - pbi));
  
  		if ((a1[pdw] ^ a2[pdw]) & mask)
1744a8fe0   David S. Miller   xfrm: Mark token ...
774
  			return false;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
775
  	}
1744a8fe0   David S. Miller   xfrm: Mark token ...
776
  	return true;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
777
  }
26bff940d   Alexey Dobriyan   xfrm: optimize ip...
778
779
780
781
782
783
784
  static inline bool addr4_match(__be32 a1, __be32 a2, u8 prefixlen)
  {
  	/* C99 6.5.7 (3): u32 << 32 is undefined behaviour */
  	if (prefixlen == 0)
  		return true;
  	return !((a1 ^ a2) & htonl(0xFFFFFFFFu << (32 - prefixlen)));
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
785
  static __inline__
6281dcc94   David S. Miller   net: Make flowi p...
786
  __be16 xfrm_flowi_sport(const struct flowi *fl, const union flowi_uli *uli)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
787
  {
f9d07e41f   Al Viro   [XFRM]: xfrm_flow...
788
  	__be16 port;
1d28f42c1   David S. Miller   net: Put flowi_* ...
789
  	switch(fl->flowi_proto) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
790
791
  	case IPPROTO_TCP:
  	case IPPROTO_UDP:
ba4e58eca   Gerrit Renker   [NET]: Supporting...
792
  	case IPPROTO_UDPLITE:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
793
  	case IPPROTO_SCTP:
6281dcc94   David S. Miller   net: Make flowi p...
794
  		port = uli->ports.sport;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
795
796
797
  		break;
  	case IPPROTO_ICMP:
  	case IPPROTO_ICMPV6:
6281dcc94   David S. Miller   net: Make flowi p...
798
  		port = htons(uli->icmpt.type);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
799
  		break;
2ce4272a6   Masahide NAKAMURA   [IPV6] MIP6: Tran...
800
  	case IPPROTO_MH:
6281dcc94   David S. Miller   net: Make flowi p...
801
  		port = htons(uli->mht.type);
2ce4272a6   Masahide NAKAMURA   [IPV6] MIP6: Tran...
802
  		break;
cc9ff19da   Timo Teräs   xfrm: use gre key...
803
  	case IPPROTO_GRE:
6281dcc94   David S. Miller   net: Make flowi p...
804
  		port = htons(ntohl(uli->gre_key) >> 16);
cc9ff19da   Timo Teräs   xfrm: use gre key...
805
  		break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
806
807
808
809
810
811
812
  	default:
  		port = 0;	/*XXX*/
  	}
  	return port;
  }
  
  static __inline__
6281dcc94   David S. Miller   net: Make flowi p...
813
  __be16 xfrm_flowi_dport(const struct flowi *fl, const union flowi_uli *uli)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
814
  {
f9d07e41f   Al Viro   [XFRM]: xfrm_flow...
815
  	__be16 port;
1d28f42c1   David S. Miller   net: Put flowi_* ...
816
  	switch(fl->flowi_proto) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
817
818
  	case IPPROTO_TCP:
  	case IPPROTO_UDP:
ba4e58eca   Gerrit Renker   [NET]: Supporting...
819
  	case IPPROTO_UDPLITE:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
820
  	case IPPROTO_SCTP:
6281dcc94   David S. Miller   net: Make flowi p...
821
  		port = uli->ports.dport;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
822
823
824
  		break;
  	case IPPROTO_ICMP:
  	case IPPROTO_ICMPV6:
6281dcc94   David S. Miller   net: Make flowi p...
825
  		port = htons(uli->icmpt.code);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
826
  		break;
cc9ff19da   Timo Teräs   xfrm: use gre key...
827
  	case IPPROTO_GRE:
6281dcc94   David S. Miller   net: Make flowi p...
828
  		port = htons(ntohl(uli->gre_key) & 0xffff);
cc9ff19da   Timo Teräs   xfrm: use gre key...
829
  		break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
830
831
832
833
834
  	default:
  		port = 0;	/*XXX*/
  	}
  	return port;
  }
200ce96e5   David S. Miller   xfrm: Const'ify s...
835
  extern int xfrm_selector_match(const struct xfrm_selector *sel,
e1ad2ab2c   David S. Miller   xfrm: Mark flowi ...
836
  			       const struct flowi *fl,
776810217   Andrew Morton   [XFRM]: uninline ...
837
  			       unsigned short family);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
838

df71837d5   Trent Jaeger   [LSM-IPSec]: Secu...
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
  #ifdef CONFIG_SECURITY_NETWORK_XFRM
  /*	If neither has a context --> match
   * 	Otherwise, both must have a context and the sids, doi, alg must match
   */
  static inline int xfrm_sec_ctx_match(struct xfrm_sec_ctx *s1, struct xfrm_sec_ctx *s2)
  {
  	return ((!s1 && !s2) ||
  		(s1 && s2 &&
  		 (s1->ctx_sid == s2->ctx_sid) &&
  		 (s1->ctx_doi == s2->ctx_doi) &&
  		 (s1->ctx_alg == s2->ctx_alg)));
  }
  #else
  static inline int xfrm_sec_ctx_match(struct xfrm_sec_ctx *s1, struct xfrm_sec_ctx *s2)
  {
  	return 1;
  }
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
857
858
859
860
861
862
863
864
865
866
867
  /* A struct encoding bundle of transformations to apply to some set of flow.
   *
   * dst->child points to the next element of bundle.
   * dst->xfrm  points to an instanse of transformer.
   *
   * Due to unfortunate limitations of current routing cache, which we
   * have no time to fix, it mirrors struct rtable and bound to the same
   * routing key, including saddr,daddr. However, we can have many of
   * bundles differing by session id. All the bundles grow from a parent
   * policy rule.
   */
fd2c3ef76   Eric Dumazet   net: cleanup incl...
868
  struct xfrm_dst {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
869
  	union {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
870
871
872
873
874
  		struct dst_entry	dst;
  		struct rtable		rt;
  		struct rt6_info		rt6;
  	} u;
  	struct dst_entry *route;
80c802f30   Timo Teräs   xfrm: cache bundl...
875
876
877
  	struct flow_cache_object flo;
  	struct xfrm_policy *pols[XFRM_POLICY_TYPE_MAX];
  	int num_pols, num_xfrms;
157bfc250   Masahide NAKAMURA   [XFRM]: Restrict ...
878
879
880
881
  #ifdef CONFIG_XFRM_SUB_POLICY
  	struct flowi *origin;
  	struct xfrm_selector *partner;
  #endif
80c802f30   Timo Teräs   xfrm: cache bundl...
882
883
  	u32 xfrm_genid;
  	u32 policy_genid;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
884
885
  	u32 route_mtu_cached;
  	u32 child_mtu_cached;
92d63decc   Hideaki YOSHIFUJI   From: Kazunori Mi...
886
887
  	u32 route_cookie;
  	u32 path_cookie;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
888
  };
def8b4faf   Alexey Dobriyan   net: reduce struc...
889
  #ifdef CONFIG_XFRM
aabc9761b   Herbert Xu   [IPSEC]: Store id...
890
891
  static inline void xfrm_dst_destroy(struct xfrm_dst *xdst)
  {
80c802f30   Timo Teräs   xfrm: cache bundl...
892
  	xfrm_pols_put(xdst->pols, xdst->num_pols);
aabc9761b   Herbert Xu   [IPSEC]: Store id...
893
894
895
  	dst_release(xdst->route);
  	if (likely(xdst->u.dst.xfrm))
  		xfrm_state_put(xdst->u.dst.xfrm);
157bfc250   Masahide NAKAMURA   [XFRM]: Restrict ...
896
897
898
899
900
901
  #ifdef CONFIG_XFRM_SUB_POLICY
  	kfree(xdst->origin);
  	xdst->origin = NULL;
  	kfree(xdst->partner);
  	xdst->partner = NULL;
  #endif
aabc9761b   Herbert Xu   [IPSEC]: Store id...
902
  }
def8b4faf   Alexey Dobriyan   net: reduce struc...
903
  #endif
aabc9761b   Herbert Xu   [IPSEC]: Store id...
904
905
  
  extern void xfrm_dst_ifdown(struct dst_entry *dst, struct net_device *dev);
fd2c3ef76   Eric Dumazet   net: cleanup incl...
906
  struct sec_path {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
907
908
  	atomic_t		refcnt;
  	int			len;
dbe5b4aaa   Herbert Xu   [IPSEC]: Kill unu...
909
  	struct xfrm_state	*xvec[XFRM_MAX_DEPTH];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
910
  };
990078afb   Michael Smith   Disable rp_filter...
911
912
913
914
915
916
917
918
  static inline int secpath_exists(struct sk_buff *skb)
  {
  #ifdef CONFIG_XFRM
  	return skb->sp != NULL;
  #else
  	return 0;
  #endif
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
  static inline struct sec_path *
  secpath_get(struct sec_path *sp)
  {
  	if (sp)
  		atomic_inc(&sp->refcnt);
  	return sp;
  }
  
  extern void __secpath_destroy(struct sec_path *sp);
  
  static inline void
  secpath_put(struct sec_path *sp)
  {
  	if (sp && atomic_dec_and_test(&sp->refcnt))
  		__secpath_destroy(sp);
  }
  
  extern struct sec_path *secpath_dup(struct sec_path *src);
  
  static inline void
  secpath_reset(struct sk_buff *skb)
  {
  #ifdef CONFIG_XFRM
  	secpath_put(skb->sp);
  	skb->sp = NULL;
  #endif
  }
  
  static inline int
6cc329610   David S. Miller   xfrm: Const'ify a...
948
  xfrm_addr_any(const xfrm_address_t *addr, unsigned short family)
a1e59abf8   Patrick McHardy   [XFRM]: Fix wildc...
949
950
951
952
953
954
955
956
957
958
959
  {
  	switch (family) {
  	case AF_INET:
  		return addr->a4 == 0;
  	case AF_INET6:
  		return ipv6_addr_any((struct in6_addr *)&addr->a6);
  	}
  	return 0;
  }
  
  static inline int
21eddb5c1   David S. Miller   xfrm: Const'ify x...
960
  __xfrm4_state_addr_cmp(const struct xfrm_tmpl *tmpl, const struct xfrm_state *x)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
961
962
963
964
965
966
  {
  	return	(tmpl->saddr.a4 &&
  		 tmpl->saddr.a4 != x->props.saddr.a4);
  }
  
  static inline int
21eddb5c1   David S. Miller   xfrm: Const'ify x...
967
  __xfrm6_state_addr_cmp(const struct xfrm_tmpl *tmpl, const struct xfrm_state *x)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
968
969
970
971
972
973
  {
  	return	(!ipv6_addr_any((struct in6_addr*)&tmpl->saddr) &&
  		 ipv6_addr_cmp((struct in6_addr *)&tmpl->saddr, (struct in6_addr*)&x->props.saddr));
  }
  
  static inline int
21eddb5c1   David S. Miller   xfrm: Const'ify x...
974
  xfrm_state_addr_cmp(const struct xfrm_tmpl *tmpl, const struct xfrm_state *x, unsigned short family)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
975
976
977
978
979
980
981
982
983
984
985
  {
  	switch (family) {
  	case AF_INET:
  		return __xfrm4_state_addr_cmp(tmpl, x);
  	case AF_INET6:
  		return __xfrm6_state_addr_cmp(tmpl, x);
  	}
  	return !0;
  }
  
  #ifdef CONFIG_XFRM
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
986
  extern int __xfrm_policy_check(struct sock *, int dir, struct sk_buff *skb, unsigned short family);
d5422efe6   Herbert Xu   [IPSEC]: Added xf...
987
988
989
  static inline int __xfrm_policy_check2(struct sock *sk, int dir,
  				       struct sk_buff *skb,
  				       unsigned int family, int reverse)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
990
  {
f6e1e25d7   Alexey Dobriyan   netns xfrm: xfrm_...
991
  	struct net *net = dev_net(skb->dev);
d5422efe6   Herbert Xu   [IPSEC]: Added xf...
992
  	int ndir = dir | (reverse ? XFRM_POLICY_MASK + 1 : 0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
993
  	if (sk && sk->sk_policy[XFRM_POLICY_IN])
d5422efe6   Herbert Xu   [IPSEC]: Added xf...
994
  		return __xfrm_policy_check(sk, ndir, skb, family);
4e81bb833   Masahide NAKAMURA   [XFRM] POLICY: su...
995

f6e1e25d7   Alexey Dobriyan   netns xfrm: xfrm_...
996
  	return	(!net->xfrm.policy_count[dir] && !skb->sp) ||
adf30907d   Eric Dumazet   net: skb->dst acc...
997
  		(skb_dst(skb)->flags & DST_NOPOLICY) ||
d5422efe6   Herbert Xu   [IPSEC]: Added xf...
998
999
1000
1001
1002
1003
  		__xfrm_policy_check(sk, ndir, skb, family);
  }
  
  static inline int xfrm_policy_check(struct sock *sk, int dir, struct sk_buff *skb, unsigned short family)
  {
  	return __xfrm_policy_check2(sk, dir, skb, family, 0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
  }
  
  static inline int xfrm4_policy_check(struct sock *sk, int dir, struct sk_buff *skb)
  {
  	return xfrm_policy_check(sk, dir, skb, AF_INET);
  }
  
  static inline int xfrm6_policy_check(struct sock *sk, int dir, struct sk_buff *skb)
  {
  	return xfrm_policy_check(sk, dir, skb, AF_INET6);
  }
d5422efe6   Herbert Xu   [IPSEC]: Added xf...
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
  static inline int xfrm4_policy_check_reverse(struct sock *sk, int dir,
  					     struct sk_buff *skb)
  {
  	return __xfrm_policy_check2(sk, dir, skb, AF_INET, 1);
  }
  
  static inline int xfrm6_policy_check_reverse(struct sock *sk, int dir,
  					     struct sk_buff *skb)
  {
  	return __xfrm_policy_check2(sk, dir, skb, AF_INET6, 1);
  }
  
  extern int __xfrm_decode_session(struct sk_buff *skb, struct flowi *fl,
  				 unsigned int family, int reverse);
  
  static inline int xfrm_decode_session(struct sk_buff *skb, struct flowi *fl,
  				      unsigned int family)
  {
  	return __xfrm_decode_session(skb, fl, family, 0);
  }
  
  static inline int xfrm_decode_session_reverse(struct sk_buff *skb,
  					      struct flowi *fl,
  					      unsigned int family)
  {
  	return __xfrm_decode_session(skb, fl, family, 1);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1042
1043
1044
1045
  extern int __xfrm_route_forward(struct sk_buff *skb, unsigned short family);
  
  static inline int xfrm_route_forward(struct sk_buff *skb, unsigned short family)
  {
99a66657b   Alexey Dobriyan   netns xfrm: xfrm_...
1046
1047
1048
  	struct net *net = dev_net(skb->dev);
  
  	return	!net->xfrm.policy_count[XFRM_POLICY_OUT] ||
adf30907d   Eric Dumazet   net: skb->dst acc...
1049
  		(skb_dst(skb)->flags & DST_NOXFRM) ||
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
  		__xfrm_route_forward(skb, family);
  }
  
  static inline int xfrm4_route_forward(struct sk_buff *skb)
  {
  	return xfrm_route_forward(skb, AF_INET);
  }
  
  static inline int xfrm6_route_forward(struct sk_buff *skb)
  {
  	return xfrm_route_forward(skb, AF_INET6);
  }
  
  extern int __xfrm_sk_clone_policy(struct sock *sk);
  
  static inline int xfrm_sk_clone_policy(struct sock *sk)
  {
  	if (unlikely(sk->sk_policy[0] || sk->sk_policy[1]))
  		return __xfrm_sk_clone_policy(sk);
  	return 0;
  }
4666faab0   Herbert Xu   [IPSEC] Kill spur...
1071
  extern int xfrm_policy_delete(struct xfrm_policy *pol, int dir);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
  
  static inline void xfrm_sk_free_policy(struct sock *sk)
  {
  	if (unlikely(sk->sk_policy[0] != NULL)) {
  		xfrm_policy_delete(sk->sk_policy[0], XFRM_POLICY_MAX);
  		sk->sk_policy[0] = NULL;
  	}
  	if (unlikely(sk->sk_policy[1] != NULL)) {
  		xfrm_policy_delete(sk->sk_policy[1], XFRM_POLICY_MAX+1);
  		sk->sk_policy[1] = NULL;
  	}
  }
  
  #else
  
  static inline void xfrm_sk_free_policy(struct sock *sk) {}
  static inline int xfrm_sk_clone_policy(struct sock *sk) { return 0; }
  static inline int xfrm6_route_forward(struct sk_buff *skb) { return 1; }  
  static inline int xfrm4_route_forward(struct sk_buff *skb) { return 1; } 
  static inline int xfrm6_policy_check(struct sock *sk, int dir, struct sk_buff *skb)
  { 
  	return 1; 
  } 
  static inline int xfrm4_policy_check(struct sock *sk, int dir, struct sk_buff *skb)
  {
  	return 1;
  }
  static inline int xfrm_policy_check(struct sock *sk, int dir, struct sk_buff *skb, unsigned short family)
  {
  	return 1;
  }
d5422efe6   Herbert Xu   [IPSEC]: Added xf...
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
  static inline int xfrm_decode_session_reverse(struct sk_buff *skb,
  					      struct flowi *fl,
  					      unsigned int family)
  {
  	return -ENOSYS;
  }
  static inline int xfrm4_policy_check_reverse(struct sock *sk, int dir,
  					     struct sk_buff *skb)
  {
  	return 1;
  }
  static inline int xfrm6_policy_check_reverse(struct sock *sk, int dir,
  					     struct sk_buff *skb)
  {
  	return 1;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1119
1120
1121
  #endif
  
  static __inline__
e8a4e3771   David S. Miller   xfrm: Mark flowi ...
1122
  xfrm_address_t *xfrm_flowi_daddr(const struct flowi *fl, unsigned short family)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1123
1124
1125
  {
  	switch (family){
  	case AF_INET:
7e1dc7b6f   David S. Miller   net: Use flowi4 a...
1126
  		return (xfrm_address_t *)&fl->u.ip4.daddr;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1127
  	case AF_INET6:
7e1dc7b6f   David S. Miller   net: Use flowi4 a...
1128
  		return (xfrm_address_t *)&fl->u.ip6.daddr;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1129
1130
1131
1132
1133
  	}
  	return NULL;
  }
  
  static __inline__
e8a4e3771   David S. Miller   xfrm: Mark flowi ...
1134
  xfrm_address_t *xfrm_flowi_saddr(const struct flowi *fl, unsigned short family)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1135
1136
1137
  {
  	switch (family){
  	case AF_INET:
7e1dc7b6f   David S. Miller   net: Use flowi4 a...
1138
  		return (xfrm_address_t *)&fl->u.ip4.saddr;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1139
  	case AF_INET6:
7e1dc7b6f   David S. Miller   net: Use flowi4 a...
1140
  		return (xfrm_address_t *)&fl->u.ip6.saddr;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1141
1142
1143
  	}
  	return NULL;
  }
9bb182a70   YOSHIFUJI Hideaki   [XFRM] MIP6: Fix ...
1144
  static __inline__
e8a4e3771   David S. Miller   xfrm: Mark flowi ...
1145
  void xfrm_flowi_addr_get(const struct flowi *fl,
9bb182a70   YOSHIFUJI Hideaki   [XFRM] MIP6: Fix ...
1146
1147
1148
1149
1150
  			 xfrm_address_t *saddr, xfrm_address_t *daddr,
  			 unsigned short family)
  {
  	switch(family) {
  	case AF_INET:
7e1dc7b6f   David S. Miller   net: Use flowi4 a...
1151
1152
  		memcpy(&saddr->a4, &fl->u.ip4.saddr, sizeof(saddr->a4));
  		memcpy(&daddr->a4, &fl->u.ip4.daddr, sizeof(daddr->a4));
9bb182a70   YOSHIFUJI Hideaki   [XFRM] MIP6: Fix ...
1153
1154
  		break;
  	case AF_INET6:
4e3fd7a06   Alexey Dobriyan   net: remove ipv6_...
1155
1156
  		*(struct in6_addr *)saddr->a6 = fl->u.ip6.saddr;
  		*(struct in6_addr *)daddr->a6 = fl->u.ip6.daddr;
9bb182a70   YOSHIFUJI Hideaki   [XFRM] MIP6: Fix ...
1157
1158
1159
  		break;
  	}
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1160
  static __inline__ int
f8848067c   David S. Miller   xfrm: Const'ify p...
1161
1162
  __xfrm4_state_addr_check(const struct xfrm_state *x,
  			 const xfrm_address_t *daddr, const xfrm_address_t *saddr)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1163
1164
1165
1166
1167
1168
1169
1170
  {
  	if (daddr->a4 == x->id.daddr.a4 &&
  	    (saddr->a4 == x->props.saddr.a4 || !saddr->a4 || !x->props.saddr.a4))
  		return 1;
  	return 0;
  }
  
  static __inline__ int
f8848067c   David S. Miller   xfrm: Const'ify p...
1171
1172
  __xfrm6_state_addr_check(const struct xfrm_state *x,
  			 const xfrm_address_t *daddr, const xfrm_address_t *saddr)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
  {
  	if (!ipv6_addr_cmp((struct in6_addr *)daddr, (struct in6_addr *)&x->id.daddr) &&
  	    (!ipv6_addr_cmp((struct in6_addr *)saddr, (struct in6_addr *)&x->props.saddr)|| 
  	     ipv6_addr_any((struct in6_addr *)saddr) || 
  	     ipv6_addr_any((struct in6_addr *)&x->props.saddr)))
  		return 1;
  	return 0;
  }
  
  static __inline__ int
f8848067c   David S. Miller   xfrm: Const'ify p...
1183
1184
  xfrm_state_addr_check(const struct xfrm_state *x,
  		      const xfrm_address_t *daddr, const xfrm_address_t *saddr,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
  		      unsigned short family)
  {
  	switch (family) {
  	case AF_INET:
  		return __xfrm4_state_addr_check(x, daddr, saddr);
  	case AF_INET6:
  		return __xfrm6_state_addr_check(x, daddr, saddr);
  	}
  	return 0;
  }
e53820de0   Masahide NAKAMURA   [XFRM] IPV6: Rest...
1195
  static __inline__ int
f8848067c   David S. Miller   xfrm: Const'ify p...
1196
  xfrm_state_addr_flow_check(const struct xfrm_state *x, const struct flowi *fl,
e53820de0   Masahide NAKAMURA   [XFRM] IPV6: Rest...
1197
1198
1199
1200
1201
  			   unsigned short family)
  {
  	switch (family) {
  	case AF_INET:
  		return __xfrm4_state_addr_check(x,
7e1dc7b6f   David S. Miller   net: Use flowi4 a...
1202
1203
  						(const xfrm_address_t *)&fl->u.ip4.daddr,
  						(const xfrm_address_t *)&fl->u.ip4.saddr);
e53820de0   Masahide NAKAMURA   [XFRM] IPV6: Rest...
1204
1205
  	case AF_INET6:
  		return __xfrm6_state_addr_check(x,
7e1dc7b6f   David S. Miller   net: Use flowi4 a...
1206
1207
  						(const xfrm_address_t *)&fl->u.ip6.daddr,
  						(const xfrm_address_t *)&fl->u.ip6.saddr);
e53820de0   Masahide NAKAMURA   [XFRM] IPV6: Rest...
1208
1209
1210
  	}
  	return 0;
  }
f8848067c   David S. Miller   xfrm: Const'ify p...
1211
  static inline int xfrm_state_kern(const struct xfrm_state *x)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1212
1213
1214
  {
  	return atomic_read(&x->tunnel_users);
  }
5794708f1   Masahide NAKAMURA   [XFRM]: Introduce...
1215
1216
  static inline int xfrm_id_proto_match(u8 proto, u8 userproto)
  {
dc00a5256   Masahide NAKAMURA   [XFRM] STATE: All...
1217
1218
1219
1220
  	return (!userproto || proto == userproto ||
  		(userproto == IPSEC_PROTO_ANY && (proto == IPPROTO_AH ||
  						  proto == IPPROTO_ESP ||
  						  proto == IPPROTO_COMP)));
5794708f1   Masahide NAKAMURA   [XFRM]: Introduce...
1221
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1222
1223
1224
  /*
   * xfrm algorithm information
   */
1a6509d99   Herbert Xu   [IPSEC]: Add supp...
1225
1226
1227
  struct xfrm_algo_aead_info {
  	u16 icv_truncbits;
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
  struct xfrm_algo_auth_info {
  	u16 icv_truncbits;
  	u16 icv_fullbits;
  };
  
  struct xfrm_algo_encr_info {
  	u16 blockbits;
  	u16 defkeybits;
  };
  
  struct xfrm_algo_comp_info {
  	u16 threshold;
  };
  
  struct xfrm_algo_desc {
  	char *name;
04ff12609   Herbert Xu   [IPSEC]: Add comp...
1244
  	char *compat;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1245
1246
  	u8 available:1;
  	union {
1a6509d99   Herbert Xu   [IPSEC]: Add supp...
1247
  		struct xfrm_algo_aead_info aead;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
  		struct xfrm_algo_auth_info auth;
  		struct xfrm_algo_encr_info encr;
  		struct xfrm_algo_comp_info comp;
  	} uinfo;
  	struct sadb_alg desc;
  };
  
  /* XFRM tunnel handlers.  */
  struct xfrm_tunnel {
  	int (*handler)(struct sk_buff *skb);
a63374631   jamal   xfrm: use proper ...
1258
  	int (*err_handler)(struct sk_buff *skb, u32 info);
d2acc3479   Herbert Xu   [INET]: Introduce...
1259

b33eab084   Eric Dumazet   tunnels: add __rc...
1260
  	struct xfrm_tunnel __rcu *next;
d2acc3479   Herbert Xu   [INET]: Introduce...
1261
  	int priority;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1262
1263
1264
  };
  
  struct xfrm6_tunnel {
d2acc3479   Herbert Xu   [INET]: Introduce...
1265
1266
  	int (*handler)(struct sk_buff *skb);
  	int (*err_handler)(struct sk_buff *skb, struct inet6_skb_parm *opt,
d5fdd6bab   Brian Haley   ipv6: Use correct...
1267
  			   u8 type, u8 code, int offset, __be32 info);
6f0bcf152   Eric Dumazet   tunnels: add _rcu...
1268
  	struct xfrm6_tunnel __rcu *next;
d2acc3479   Herbert Xu   [INET]: Introduce...
1269
  	int priority;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1270
1271
1272
  };
  
  extern void xfrm_init(void);
a33bc5c15   Neil Horman   xfrm: select sane...
1273
  extern void xfrm4_init(int rt_hash_size);
d62ddc21b   Alexey Dobriyan   netns xfrm: add n...
1274
1275
  extern int xfrm_state_init(struct net *net);
  extern void xfrm_state_fini(struct net *net);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1276
  extern void xfrm4_state_init(void);
c35b7e72c   Daniel Lezcano   [IPV6]: remove if...
1277
1278
1279
  #ifdef CONFIG_XFRM
  extern int xfrm6_init(void);
  extern void xfrm6_fini(void);
0013cabab   Daniel Lezcano   [IPV6]: Make xfrm...
1280
  extern int xfrm6_state_init(void);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1281
  extern void xfrm6_state_fini(void);
c35b7e72c   Daniel Lezcano   [IPV6]: remove if...
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
  #else
  static inline int xfrm6_init(void)
  {
  	return 0;
  }
  static inline void xfrm6_fini(void)
  {
  	;
  }
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1292

558f82ef6   Masahide NAKAMURA   [XFRM]: Define pa...
1293
  #ifdef CONFIG_XFRM_STATISTICS
c68cd1a01   Alexey Dobriyan   netns xfrm: /proc...
1294
1295
  extern int xfrm_proc_init(struct net *net);
  extern void xfrm_proc_fini(struct net *net);
558f82ef6   Masahide NAKAMURA   [XFRM]: Define pa...
1296
  #endif
b27aeadb5   Alexey Dobriyan   netns xfrm: per-n...
1297
1298
1299
1300
1301
1302
1303
1304
  extern int xfrm_sysctl_init(struct net *net);
  #ifdef CONFIG_SYSCTL
  extern void xfrm_sysctl_fini(struct net *net);
  #else
  static inline void xfrm_sysctl_fini(struct net *net)
  {
  }
  #endif
5c1824587   Herbert Xu   ipsec: Fix xfrm_s...
1305
  extern void xfrm_state_walk_init(struct xfrm_state_walk *walk, u8 proto);
284fa7da3   Alexey Dobriyan   netns xfrm: state...
1306
  extern int xfrm_state_walk(struct net *net, struct xfrm_state_walk *walk,
4c563f766   Timo Teras   [XFRM]: Speed up ...
1307
  			   int (*func)(struct xfrm_state *, int, void*), void *);
abb81c4f3   Herbert Xu   ipsec: Use RCU-li...
1308
  extern void xfrm_state_walk_done(struct xfrm_state_walk *walk);
673c09be4   Alexey Dobriyan   netns xfrm: add s...
1309
  extern struct xfrm_state *xfrm_state_alloc(struct net *net);
33765d060   David S. Miller   xfrm: Const'ify x...
1310
1311
  extern struct xfrm_state *xfrm_state_find(const xfrm_address_t *daddr,
  					  const xfrm_address_t *saddr,
b520e9f61   David S. Miller   xfrm: Mark flowi ...
1312
1313
  					  const struct flowi *fl,
  					  struct xfrm_tmpl *tmpl,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1314
1315
  					  struct xfrm_policy *pol, int *err,
  					  unsigned short family);
bd55775c8   Jamal Hadi Salim   xfrm: SA lookups ...
1316
  extern struct xfrm_state *xfrm_stateonly_find(struct net *net, u32 mark,
5447c5e40   Alexey Dobriyan   netns xfrm: findi...
1317
  					       xfrm_address_t *daddr,
628529b6e   Jamal Hadi Salim   [XFRM] Introduce ...
1318
1319
1320
  					       xfrm_address_t *saddr,
  					       unsigned short family,
  					       u8 mode, u8 proto, u32 reqid);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1321
1322
1323
1324
  extern int xfrm_state_check_expire(struct xfrm_state *x);
  extern void xfrm_state_insert(struct xfrm_state *x);
  extern int xfrm_state_add(struct xfrm_state *x);
  extern int xfrm_state_update(struct xfrm_state *x);
bd55775c8   Jamal Hadi Salim   xfrm: SA lookups ...
1325
  extern struct xfrm_state *xfrm_state_lookup(struct net *net, u32 mark,
a70486f0e   David S. Miller   xfrm: Pass const ...
1326
  					    const xfrm_address_t *daddr, __be32 spi,
bd55775c8   Jamal Hadi Salim   xfrm: SA lookups ...
1327
1328
  					    u8 proto, unsigned short family);
  extern struct xfrm_state *xfrm_state_lookup_byaddr(struct net *net, u32 mark,
a70486f0e   David S. Miller   xfrm: Pass const ...
1329
1330
  						   const xfrm_address_t *daddr,
  						   const xfrm_address_t *saddr,
bd55775c8   Jamal Hadi Salim   xfrm: SA lookups ...
1331
1332
  						   u8 proto,
  						   unsigned short family);
41a49cc3c   Masahide NAKAMURA   [XFRM]: Add sorti...
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
  #ifdef CONFIG_XFRM_SUB_POLICY
  extern int xfrm_tmpl_sort(struct xfrm_tmpl **dst, struct xfrm_tmpl **src,
  			  int n, unsigned short family);
  extern int xfrm_state_sort(struct xfrm_state **dst, struct xfrm_state **src,
  			   int n, unsigned short family);
  #else
  static inline int xfrm_tmpl_sort(struct xfrm_tmpl **dst, struct xfrm_tmpl **src,
  				 int n, unsigned short family)
  {
  	return -ENOSYS;
  }
  
  static inline int xfrm_state_sort(struct xfrm_state **dst, struct xfrm_state **src,
  				  int n, unsigned short family)
  {
  	return -ENOSYS;
  }
  #endif
af11e3160   Jamal Hadi Salim   [XFRM] SAD info T...
1351
1352
1353
1354
1355
1356
  
  struct xfrmk_sadinfo {
  	u32 sadhcnt; /* current hash bkts */
  	u32 sadhmcnt; /* max allowed hash bkts */
  	u32 sadcnt; /* current running count */
  };
5a6d34162   Jamal Hadi Salim   [XFRM] SPD info T...
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
  struct xfrmk_spdinfo {
  	u32 incnt;
  	u32 outcnt;
  	u32 fwdcnt;
  	u32 inscnt;
  	u32 outscnt;
  	u32 fwdscnt;
  	u32 spdhcnt;
  	u32 spdhmcnt;
  };
bd55775c8   Jamal Hadi Salim   xfrm: SA lookups ...
1367
1368
  extern struct xfrm_state *xfrm_find_acq_byseq(struct net *net, u32 mark,
  					      u32 seq);
26b15dad9   Jamal Hadi Salim   [IPSEC] Add compl...
1369
  extern int xfrm_state_delete(struct xfrm_state *x);
0e6024519   Alexey Dobriyan   netns xfrm: state...
1370
  extern int xfrm_state_flush(struct net *net, u8 proto, struct xfrm_audit *audit_info);
e071041be   Alexey Dobriyan   netns xfrm: fix "...
1371
1372
  extern void xfrm_sad_getinfo(struct net *net, struct xfrmk_sadinfo *si);
  extern void xfrm_spd_getinfo(struct net *net, struct xfrmk_spdinfo *si);
2cd084678   Steffen Klassert   xfrm: Add support...
1373
  extern u32 xfrm_replay_seqhi(struct xfrm_state *x, __be32 net_seq);
9fdc4883d   Steffen Klassert   xfrm: Move IPsec ...
1374
  extern int xfrm_init_replay(struct xfrm_state *x);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1375
  extern int xfrm_state_mtu(struct xfrm_state *x, int mtu);
a454f0cce   Wei Yongjun   xfrm: Fix initial...
1376
  extern int __xfrm_init_state(struct xfrm_state *x, bool init_replay);
72cb6962a   Herbert Xu   [IPSEC]: Add xfrm...
1377
  extern int xfrm_init_state(struct xfrm_state *x);
227620e29   Herbert Xu   [IPSEC]: Separate...
1378
  extern int xfrm_prepare_input(struct xfrm_state *x, struct sk_buff *skb);
716062fd4   Herbert Xu   [IPSEC]: Merge mo...
1379
1380
  extern int xfrm_input(struct sk_buff *skb, int nexthdr, __be32 spi,
  		      int encap_type);
1bf06cd2e   Herbert Xu   [IPSEC]: Add asyn...
1381
  extern int xfrm_input_resume(struct sk_buff *skb, int nexthdr);
c6581a457   Herbert Xu   [IPSEC]: Add asyn...
1382
  extern int xfrm_output_resume(struct sk_buff *skb, int err);
406ef77c8   Herbert Xu   [IPSEC]: Move com...
1383
  extern int xfrm_output(struct sk_buff *skb);
df9dcb458   Kazunori MIYAZAWA   [IPSEC]: Fix inte...
1384
  extern int xfrm_inner_extract_output(struct xfrm_state *x, struct sk_buff *skb);
36cf9acf9   Herbert Xu   [IPSEC]: Separate...
1385
  extern int xfrm4_extract_header(struct sk_buff *skb);
227620e29   Herbert Xu   [IPSEC]: Separate...
1386
  extern int xfrm4_extract_input(struct xfrm_state *x, struct sk_buff *skb);
c4541b41c   Herbert Xu   [IPSEC]: Move tun...
1387
1388
  extern int xfrm4_rcv_encap(struct sk_buff *skb, int nexthdr, __be32 spi,
  			   int encap_type);
716062fd4   Herbert Xu   [IPSEC]: Merge mo...
1389
  extern int xfrm4_transport_finish(struct sk_buff *skb, int async);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1390
  extern int xfrm4_rcv(struct sk_buff *skb);
c4541b41c   Herbert Xu   [IPSEC]: Move tun...
1391
1392
1393
1394
1395
  
  static inline int xfrm4_rcv_spi(struct sk_buff *skb, int nexthdr, __be32 spi)
  {
  	return xfrm4_rcv_encap(skb, nexthdr, spi, 0);
  }
36cf9acf9   Herbert Xu   [IPSEC]: Separate...
1396
1397
  extern int xfrm4_extract_output(struct xfrm_state *x, struct sk_buff *skb);
  extern int xfrm4_prepare_output(struct xfrm_state *x, struct sk_buff *skb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1398
  extern int xfrm4_output(struct sk_buff *skb);
43a4dea4c   Steffen Klassert   xfrm: Assign the ...
1399
  extern int xfrm4_output_finish(struct sk_buff *skb);
c0d56408e   Kazunori MIYAZAWA   [IPSEC]: Changing...
1400
1401
  extern int xfrm4_tunnel_register(struct xfrm_tunnel *handler, unsigned short family);
  extern int xfrm4_tunnel_deregister(struct xfrm_tunnel *handler, unsigned short family);
36cf9acf9   Herbert Xu   [IPSEC]: Separate...
1402
  extern int xfrm6_extract_header(struct sk_buff *skb);
227620e29   Herbert Xu   [IPSEC]: Separate...
1403
  extern int xfrm6_extract_input(struct xfrm_state *x, struct sk_buff *skb);
33b5ecb8f   Herbert Xu   [IPSEC]: Get next...
1404
  extern int xfrm6_rcv_spi(struct sk_buff *skb, int nexthdr, __be32 spi);
716062fd4   Herbert Xu   [IPSEC]: Merge mo...
1405
  extern int xfrm6_transport_finish(struct sk_buff *skb, int async);
e5bbef20e   Herbert Xu   [IPV6]: Replace s...
1406
  extern int xfrm6_rcv(struct sk_buff *skb);
fbd9a5b47   Masahide NAKAMURA   [XFRM] STATE: Com...
1407
1408
  extern int xfrm6_input_addr(struct sk_buff *skb, xfrm_address_t *daddr,
  			    xfrm_address_t *saddr, u8 proto);
73d605d1a   Kazunori MIYAZAWA   [IPSEC]: changing...
1409
1410
  extern int xfrm6_tunnel_register(struct xfrm6_tunnel *handler, unsigned short family);
  extern int xfrm6_tunnel_deregister(struct xfrm6_tunnel *handler, unsigned short family);
a16647739   Alexey Dobriyan   netns xfrm: xfrm6...
1411
  extern __be32 xfrm6_tunnel_alloc_spi(struct net *net, xfrm_address_t *saddr);
b71d1d426   Eric Dumazet   inet: constify ip...
1412
  extern __be32 xfrm6_tunnel_spi_lookup(struct net *net, const xfrm_address_t *saddr);
36cf9acf9   Herbert Xu   [IPSEC]: Separate...
1413
1414
  extern int xfrm6_extract_output(struct xfrm_state *x, struct sk_buff *skb);
  extern int xfrm6_prepare_output(struct xfrm_state *x, struct sk_buff *skb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1415
  extern int xfrm6_output(struct sk_buff *skb);
43a4dea4c   Steffen Klassert   xfrm: Assign the ...
1416
  extern int xfrm6_output_finish(struct sk_buff *skb);
aee5adb43   Masahide NAKAMURA   [XFRM] STATE: Add...
1417
1418
  extern int xfrm6_find_1stfragopt(struct xfrm_state *x, struct sk_buff *skb,
  				 u8 **prevhdr);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1419
1420
  
  #ifdef CONFIG_XFRM
067b207b2   James Chapman   [UDP]: Cleanup UD...
1421
  extern int xfrm4_udp_encap_rcv(struct sock *sk, struct sk_buff *skb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1422
  extern int xfrm_user_policy(struct sock *sk, int optname, u8 __user *optval, int optlen);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1423
1424
1425
1426
1427
  #else
  static inline int xfrm_user_policy(struct sock *sk, int optname, u8 __user *optval, int optlen)
  {
   	return -ENOPROTOOPT;
  } 
067b207b2   James Chapman   [UDP]: Cleanup UD...
1428
  static inline int xfrm4_udp_encap_rcv(struct sock *sk, struct sk_buff *skb)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1429
1430
1431
1432
1433
  {
   	/* should not happen */
   	kfree_skb(skb);
  	return 0;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1434
  #endif
0331b1f38   Alexey Dobriyan   netns xfrm: add s...
1435
  struct xfrm_policy *xfrm_policy_alloc(struct net *net, gfp_t gfp);
4c563f766   Timo Teras   [XFRM]: Speed up ...
1436

12a169e7d   Herbert Xu   ipsec: Put dumper...
1437
  extern void xfrm_policy_walk_init(struct xfrm_policy_walk *walk, u8 type);
cdcbca7c1   Alexey Dobriyan   netns xfrm: polic...
1438
  extern int xfrm_policy_walk(struct net *net, struct xfrm_policy_walk *walk,
4c563f766   Timo Teras   [XFRM]: Speed up ...
1439
  	int (*func)(struct xfrm_policy *, int, int, void*), void *);
12a169e7d   Herbert Xu   ipsec: Put dumper...
1440
  extern void xfrm_policy_walk_done(struct xfrm_policy_walk *walk);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1441
  int xfrm_policy_insert(int dir, struct xfrm_policy *policy, int excl);
8ca2e93b5   Jamal Hadi Salim   xfrm: SP lookups ...
1442
1443
  struct xfrm_policy *xfrm_policy_bysel_ctx(struct net *net, u32 mark,
  					  u8 type, int dir,
4e81bb833   Masahide NAKAMURA   [XFRM] POLICY: su...
1444
  					  struct xfrm_selector *sel,
ef41aaa0b   Eric Paris   [IPSEC]: xfrm_pol...
1445
1446
  					  struct xfrm_sec_ctx *ctx, int delete,
  					  int *err);
8ca2e93b5   Jamal Hadi Salim   xfrm: SP lookups ...
1447
  struct xfrm_policy *xfrm_policy_byid(struct net *net, u32 mark, u8, int dir, u32 id, int delete, int *err);
33ffbbd52   Alexey Dobriyan   netns xfrm: polic...
1448
  int xfrm_policy_flush(struct net *net, u8 type, struct xfrm_audit *audit_info);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1449
  u32 xfrm_get_acqseq(void);
658b219e9   Herbert Xu   [IPSEC]: Move com...
1450
  extern int xfrm_alloc_spi(struct xfrm_state *x, u32 minspi, u32 maxspi);
bd55775c8   Jamal Hadi Salim   xfrm: SA lookups ...
1451
1452
  struct xfrm_state *xfrm_find_acq(struct net *net, struct xfrm_mark *mark,
  				 u8 mode, u32 reqid, u8 proto,
a70486f0e   David S. Miller   xfrm: Pass const ...
1453
1454
  				 const xfrm_address_t *daddr,
  				 const xfrm_address_t *saddr, int create,
bd55775c8   Jamal Hadi Salim   xfrm: SA lookups ...
1455
  				 unsigned short family);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1456
  extern int xfrm_sk_policy_insert(struct sock *sk, int dir, struct xfrm_policy *pol);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1457

80c9abaab   Shinta Sugimoto   [XFRM]: Extension...
1458
  #ifdef CONFIG_XFRM_MIGRATE
183cad127   David S. Miller   xfrm: Const'ify p...
1459
1460
1461
  extern int km_migrate(const struct xfrm_selector *sel, u8 dir, u8 type,
  		      const struct xfrm_migrate *m, int num_bundles,
  		      const struct xfrm_kmaddress *k);
80c9abaab   Shinta Sugimoto   [XFRM]: Extension...
1462
1463
1464
  extern struct xfrm_state * xfrm_migrate_state_find(struct xfrm_migrate *m);
  extern struct xfrm_state * xfrm_state_migrate(struct xfrm_state *x,
  					      struct xfrm_migrate *m);
b4b7c0b38   David S. Miller   xfrm: Const'ify s...
1465
  extern int xfrm_migrate(const struct xfrm_selector *sel, u8 dir, u8 type,
13c1d1893   Arnaud Ebalard   xfrm: MIGRATE enh...
1466
1467
  			struct xfrm_migrate *m, int num_bundles,
  			struct xfrm_kmaddress *k);
80c9abaab   Shinta Sugimoto   [XFRM]: Extension...
1468
  #endif
5d36b1803   Al Viro   [XFRM]: annotate ...
1469
  extern int km_new_mapping(struct xfrm_state *x, xfrm_address_t *ipaddr, __be16 sport);
6c5c8ca7f   Jamal Hadi Salim   [IPSEC]: Sync ser...
1470
  extern void km_policy_expired(struct xfrm_policy *pol, int dir, int hard, u32 pid);
db983c114   Alexey Dobriyan   netns xfrm: KM re...
1471
  extern int km_report(struct net *net, u8 proto, struct xfrm_selector *sel, xfrm_address_t *addr);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1472
1473
  
  extern void xfrm_input_init(void);
6067b2bab   Al Viro   [XFRM]: xfrm_pars...
1474
  extern int xfrm_parse_spi(struct sk_buff *skb, u8 nexthdr, __be32 *spi, __be32 *seq);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1475
1476
1477
1478
1479
1480
1481
1482
1483
  
  extern void xfrm_probe_algs(void);
  extern int xfrm_count_auth_supported(void);
  extern int xfrm_count_enc_supported(void);
  extern struct xfrm_algo_desc *xfrm_aalg_get_byidx(unsigned int idx);
  extern struct xfrm_algo_desc *xfrm_ealg_get_byidx(unsigned int idx);
  extern struct xfrm_algo_desc *xfrm_aalg_get_byid(int alg_id);
  extern struct xfrm_algo_desc *xfrm_ealg_get_byid(int alg_id);
  extern struct xfrm_algo_desc *xfrm_calg_get_byid(int alg_id);
6f2f19ed9   David S. Miller   xfrm: Pass name a...
1484
1485
1486
1487
  extern struct xfrm_algo_desc *xfrm_aalg_get_byname(const char *name, int probe);
  extern struct xfrm_algo_desc *xfrm_ealg_get_byname(const char *name, int probe);
  extern struct xfrm_algo_desc *xfrm_calg_get_byname(const char *name, int probe);
  extern struct xfrm_algo_desc *xfrm_aead_get_byname(const char *name, int icv_len,
1a6509d99   Herbert Xu   [IPSEC]: Add supp...
1488
  						   int probe);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1489

07d4ee583   Herbert Xu   [IPSEC]: Use HMAC...
1490
  struct hash_desc;
9409f38a0   Herbert Xu   [IPSEC]: Move lin...
1491
  struct scatterlist;
07d4ee583   Herbert Xu   [IPSEC]: Use HMAC...
1492
1493
  typedef int (icv_update_fn_t)(struct hash_desc *, struct scatterlist *,
  			      unsigned int);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1494

ff6acd168   David S. Miller   xfrm: Const'ify a...
1495
1496
  static inline int xfrm_addr_cmp(const xfrm_address_t *a,
  				const xfrm_address_t *b,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1497
1498
1499
1500
1501
  				int family)
  {
  	switch (family) {
  	default:
  	case AF_INET:
a63374631   jamal   xfrm: use proper ...
1502
  		return (__force u32)a->a4 - (__force u32)b->a4;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1503
  	case AF_INET6:
b71d1d426   Eric Dumazet   inet: constify ip...
1504
1505
  		return ipv6_addr_cmp((const struct in6_addr *)a,
  				     (const struct in6_addr *)b);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1506
1507
  	}
  }
77d8d7a68   Herbert Xu   [IPSEC]: Document...
1508
1509
1510
1511
  static inline int xfrm_policy_id2dir(u32 index)
  {
  	return index & 7;
  }
a6483b790   Alexey Dobriyan   netns xfrm: per-n...
1512
1513
  #ifdef CONFIG_XFRM
  static inline int xfrm_aevent_is_on(struct net *net)
f8cd54884   Jamal Hadi Salim   [IPSEC]: Sync ser...
1514
  {
be33690d8   Patrick McHardy   [XFRM]: Fix aeven...
1515
1516
1517
1518
  	struct sock *nlsk;
  	int ret = 0;
  
  	rcu_read_lock();
a6483b790   Alexey Dobriyan   netns xfrm: per-n...
1519
  	nlsk = rcu_dereference(net->xfrm.nlsk);
be33690d8   Patrick McHardy   [XFRM]: Fix aeven...
1520
1521
1522
1523
  	if (nlsk)
  		ret = netlink_has_listeners(nlsk, XFRMNLGRP_AEVENTS);
  	rcu_read_unlock();
  	return ret;
f8cd54884   Jamal Hadi Salim   [IPSEC]: Sync ser...
1524
  }
a6483b790   Alexey Dobriyan   netns xfrm: per-n...
1525
  #endif
f8cd54884   Jamal Hadi Salim   [IPSEC]: Sync ser...
1526

851586218   David S. Miller   xfrm: Pass const ...
1527
  static inline int xfrm_alg_len(const struct xfrm_algo *alg)
0f99be0d1   Eric Dumazet   [XFRM]: xfrm_algo...
1528
1529
1530
  {
  	return sizeof(*alg) + ((alg->alg_key_len + 7) / 8);
  }
851586218   David S. Miller   xfrm: Pass const ...
1531
  static inline int xfrm_alg_auth_len(const struct xfrm_algo_auth *alg)
4447bb33f   Martin Willi   xfrm: Store aalg ...
1532
1533
1534
  {
  	return sizeof(*alg) + ((alg->alg_key_len + 7) / 8);
  }
9736acf39   Steffen Klassert   xfrm: Add basic i...
1535
1536
1537
1538
  static inline int xfrm_replay_state_esn_len(struct xfrm_replay_state_esn *replay_esn)
  {
  	return sizeof(*replay_esn) + replay_esn->bmp_len * sizeof(__u32);
  }
80c9abaab   Shinta Sugimoto   [XFRM]: Extension...
1539
  #ifdef CONFIG_XFRM_MIGRATE
af2f464e3   Steffen Klassert   xfrm: Assign esn ...
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
  static inline int xfrm_replay_clone(struct xfrm_state *x,
  				     struct xfrm_state *orig)
  {
  	x->replay_esn = kzalloc(xfrm_replay_state_esn_len(orig->replay_esn),
  				GFP_KERNEL);
  	if (!x->replay_esn)
  		return -ENOMEM;
  
  	x->replay_esn->bmp_len = orig->replay_esn->bmp_len;
  	x->replay_esn->replay_window = orig->replay_esn->replay_window;
  
  	x->preplay_esn = kmemdup(x->replay_esn,
  				 xfrm_replay_state_esn_len(x->replay_esn),
  				 GFP_KERNEL);
  	if (!x->preplay_esn) {
  		kfree(x->replay_esn);
  		return -ENOMEM;
  	}
  
  	return 0;
  }
80c9abaab   Shinta Sugimoto   [XFRM]: Extension...
1561
1562
  static inline struct xfrm_algo *xfrm_algo_clone(struct xfrm_algo *orig)
  {
0f99be0d1   Eric Dumazet   [XFRM]: xfrm_algo...
1563
  	return kmemdup(orig, xfrm_alg_len(orig), GFP_KERNEL);
80c9abaab   Shinta Sugimoto   [XFRM]: Extension...
1564
  }
4447bb33f   Martin Willi   xfrm: Store aalg ...
1565
1566
1567
1568
  static inline struct xfrm_algo_auth *xfrm_algo_auth_clone(struct xfrm_algo_auth *orig)
  {
  	return kmemdup(orig, xfrm_alg_auth_len(orig), GFP_KERNEL);
  }
80c9abaab   Shinta Sugimoto   [XFRM]: Extension...
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
  static inline void xfrm_states_put(struct xfrm_state **states, int n)
  {
  	int i;
  	for (i = 0; i < n; i++)
  		xfrm_state_put(*(states + i));
  }
  
  static inline void xfrm_states_delete(struct xfrm_state **states, int n)
  {
  	int i;
  	for (i = 0; i < n; i++)
  		xfrm_state_delete(*(states + i));
  }
  #endif
f8cd54884   Jamal Hadi Salim   [IPSEC]: Sync ser...
1583

def8b4faf   Alexey Dobriyan   net: reduce struc...
1584
  #ifdef CONFIG_XFRM
005011211   Herbert Xu   [IPSEC]: Add xfrm...
1585
1586
1587
1588
  static inline struct xfrm_state *xfrm_input_state(struct sk_buff *skb)
  {
  	return skb->sp->xvec[skb->sp->len - 1];
  }
def8b4faf   Alexey Dobriyan   net: reduce struc...
1589
  #endif
005011211   Herbert Xu   [IPSEC]: Add xfrm...
1590

bf825f81b   Jamal Hadi Salim   xfrm: introduce b...
1591
1592
1593
  static inline int xfrm_mark_get(struct nlattr **attrs, struct xfrm_mark *m)
  {
  	if (attrs[XFRMA_MARK])
4efd7e833   Andreas Steffen   xfrm: fix XFRMA_M...
1594
  		memcpy(m, nla_data(attrs[XFRMA_MARK]), sizeof(struct xfrm_mark));
bf825f81b   Jamal Hadi Salim   xfrm: introduce b...
1595
1596
1597
1598
1599
  	else
  		m->v = m->m = 0;
  
  	return m->v & m->m;
  }
e3dfa389f   David S. Miller   xfrm: Pass const ...
1600
  static inline int xfrm_mark_put(struct sk_buff *skb, const struct xfrm_mark *m)
bf825f81b   Jamal Hadi Salim   xfrm: introduce b...
1601
1602
1603
1604
1605
1606
1607
1608
  {
  	if (m->m | m->v)
  		NLA_PUT(skb, XFRMA_MARK, sizeof(struct xfrm_mark), m);
  	return 0;
  
  nla_put_failure:
  	return -1;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1609
  #endif	/* _NET_XFRM_H */