1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37#ifndef _NETINET6_IPSEC_H_
38#define _NETINET6_IPSEC_H_
39#include <sys/appleapiopts.h>
40
41#include <net/pfkeyv2.h>
42#ifdef KERNEL_PRIVATE
43#include <netkey/keydb.h>
44
45
46
47
48
49
50
51struct secpolicyindex {
52 u_int8_t dir;
53 struct sockaddr_storage src;
54 struct sockaddr_storage dst;
55 u_int8_t prefs;
56 u_int8_t prefd;
57 u_int16_t ul_proto;
58#ifdef notyet
59 uid_t uids;
60 uid_t uidd;
61 gid_t gids;
62 gid_t gidd;
63#endif
64};
65
66
67struct secpolicy {
68 LIST_ENTRY(secpolicy) chain;
69
70 int refcnt;
71 struct secpolicyindex spidx;
72 u_int32_t id;
73 u_int state;
74#define IPSEC_SPSTATE_DEAD 0
75#define IPSEC_SPSTATE_ALIVE 1
76
77 u_int policy;
78 struct ipsecrequest *req;
79
80
81
82
83
84
85
86
87
88
89 long created;
90 long lastused;
91 long lifetime;
92 long validtime;
93};
94
95
96struct ipsecrequest {
97 struct ipsecrequest *next;
98
99
100 struct secasindex saidx;
101
102 u_int level;
103
104 struct secasvar *sav;
105 struct secpolicy *sp;
106};
107
108
109struct inpcbpolicy {
110 struct secpolicy *sp_in;
111 struct secpolicy *sp_out;
112 int priv;
113};
114
115
116struct secspacq {
117 LIST_ENTRY(secspacq) chain;
118
119 struct secpolicyindex spidx;
120
121 long created;
122 int count;
123
124};
125#endif
126
127
128#define IPSEC_PORT_ANY 0
129#define IPSEC_ULPROTO_ANY 255
130#define IPSEC_PROTO_ANY 255
131
132
133
134#define IPSEC_MODE_ANY 0
135#define IPSEC_MODE_TRANSPORT 1
136#define IPSEC_MODE_TUNNEL 2
137
138
139
140
141
142
143#define IPSEC_DIR_ANY 0
144#define IPSEC_DIR_INBOUND 1
145#define IPSEC_DIR_OUTBOUND 2
146#define IPSEC_DIR_MAX 3
147#define IPSEC_DIR_INVALID 4
148
149
150
151
152
153
154
155#define IPSEC_POLICY_DISCARD 0
156#define IPSEC_POLICY_NONE 1
157#define IPSEC_POLICY_IPSEC 2
158#define IPSEC_POLICY_ENTRUST 3
159#define IPSEC_POLICY_BYPASS 4
160
161
162#define IPSEC_LEVEL_DEFAULT 0
163#define IPSEC_LEVEL_USE 1
164#define IPSEC_LEVEL_REQUIRE 2
165#define IPSEC_LEVEL_UNIQUE 3
166
167#define IPSEC_MANUAL_REQID_MAX 0x3fff
168
169
170
171
172
173
174
175
176
177
178#define IPSEC_REPLAYWSIZE 32
179
180
181struct ipsecstat {
182 u_quad_t in_success;
183 u_quad_t in_polvio;
184
185 u_quad_t in_nosa;
186 u_quad_t in_inval;
187 u_quad_t in_nomem;
188 u_quad_t in_badspi;
189 u_quad_t in_ahreplay;
190 u_quad_t in_espreplay;
191 u_quad_t in_ahauthsucc;
192 u_quad_t in_ahauthfail;
193 u_quad_t in_espauthsucc;
194 u_quad_t in_espauthfail;
195 u_quad_t in_esphist[256];
196 u_quad_t in_ahhist[256];
197 u_quad_t in_comphist[256];
198 u_quad_t out_success;
199 u_quad_t out_polvio;
200
201 u_quad_t out_nosa;
202 u_quad_t out_inval;
203 u_quad_t out_nomem;
204 u_quad_t out_noroute;
205 u_quad_t out_esphist[256];
206 u_quad_t out_ahhist[256];
207 u_quad_t out_comphist[256];
208};
209
210#ifdef KERNEL_PRIVATE
211
212
213
214
215
216
217#define IPSECCTL_STATS 1
218#define IPSECCTL_DEF_POLICY 2
219#define IPSECCTL_DEF_ESP_TRANSLEV 3
220#define IPSECCTL_DEF_ESP_NETLEV 4
221#define IPSECCTL_DEF_AH_TRANSLEV 5
222#define IPSECCTL_DEF_AH_NETLEV 6
223#if 0
224#define IPSECCTL_INBOUND_CALL_IKE 7
225#endif
226#define IPSECCTL_AH_CLEARTOS 8
227#define IPSECCTL_AH_OFFSETMASK 9
228#define IPSECCTL_DFBIT 10
229#define IPSECCTL_ECN 11
230#define IPSECCTL_DEBUG 12
231#define IPSECCTL_ESP_RANDPAD 13
232#define IPSECCTL_MAXID 14
233
234#define IPSECCTL_NAMES { \
235 { 0, 0 }, \
236 { 0, 0 }, \
237 { "def_policy", CTLTYPE_INT }, \
238 { "esp_trans_deflev", CTLTYPE_INT }, \
239 { "esp_net_deflev", CTLTYPE_INT }, \
240 { "ah_trans_deflev", CTLTYPE_INT }, \
241 { "ah_net_deflev", CTLTYPE_INT }, \
242 { 0, 0 }, \
243 { "ah_cleartos", CTLTYPE_INT }, \
244 { "ah_offsetmask", CTLTYPE_INT }, \
245 { "dfbit", CTLTYPE_INT }, \
246 { "ecn", CTLTYPE_INT }, \
247 { "debug", CTLTYPE_INT }, \
248 { "esp_randpad", CTLTYPE_INT }, \
249}
250
251#define IPSEC6CTL_NAMES { \
252 { 0, 0 }, \
253 { 0, 0 }, \
254 { "def_policy", CTLTYPE_INT }, \
255 { "esp_trans_deflev", CTLTYPE_INT }, \
256 { "esp_net_deflev", CTLTYPE_INT }, \
257 { "ah_trans_deflev", CTLTYPE_INT }, \
258 { "ah_net_deflev", CTLTYPE_INT }, \
259 { 0, 0 }, \
260 { 0, 0 }, \
261 { 0, 0 }, \
262 { 0, 0 }, \
263 { "ecn", CTLTYPE_INT }, \
264 { "debug", CTLTYPE_INT }, \
265 { "esp_randpad", CTLTYPE_INT }, \
266}
267
268#ifdef KERNEL
269struct ipsec_output_state {
270 struct mbuf *m;
271 struct route *ro;
272 struct sockaddr *dst;
273};
274
275struct ipsec_history {
276 int ih_proto;
277 u_int32_t ih_spi;
278};
279
280extern int ipsec_debug;
281
282extern struct ipsecstat ipsecstat;
283extern struct secpolicy ip4_def_policy;
284extern int ip4_esp_trans_deflev;
285extern int ip4_esp_net_deflev;
286extern int ip4_ah_trans_deflev;
287extern int ip4_ah_net_deflev;
288extern int ip4_ah_cleartos;
289extern int ip4_ah_offsetmask;
290extern int ip4_ipsec_dfbit;
291extern int ip4_ipsec_ecn;
292extern int ip4_esp_randpad;
293
294#define ipseclog(x) do { if (ipsec_debug) log x; } while (0)
295
296extern struct secpolicy *ipsec4_getpolicybysock(struct mbuf *, u_int,
297 struct socket *, int *);
298extern struct secpolicy *ipsec4_getpolicybyaddr(struct mbuf *, u_int, int,
299 int *);
300
301struct inpcb;
302extern int ipsec_init_policy(struct socket *so, struct inpcbpolicy **);
303extern int ipsec_copy_policy(struct inpcbpolicy *, struct inpcbpolicy *);
304extern u_int ipsec_get_reqlevel(struct ipsecrequest *);
305
306extern int ipsec4_set_policy(struct inpcb *inp, int optname,
307 caddr_t request, size_t len, int priv);
308extern int ipsec4_get_policy(struct inpcb *inpcb, caddr_t request,
309 size_t len, struct mbuf **mp);
310extern int ipsec4_delete_pcbpolicy(struct inpcb *);
311extern int ipsec4_in_reject_so(struct mbuf *, struct socket *);
312extern int ipsec4_in_reject(struct mbuf *, struct inpcb *);
313
314struct secas;
315struct tcpcb;
316extern int ipsec_chkreplay(u_int32_t, struct secasvar *);
317extern int ipsec_updatereplay(u_int32_t, struct secasvar *);
318
319extern size_t ipsec4_hdrsiz(struct mbuf *, u_int, struct inpcb *);
320extern size_t ipsec_hdrsiz_tcp(struct tcpcb *);
321
322struct ip;
323extern const char *ipsec4_logpacketstr(struct ip *, u_int32_t);
324extern const char *ipsec_logsastr(struct secasvar *);
325
326extern void ipsec_dumpmbuf(struct mbuf *);
327
328extern int ipsec4_output(struct ipsec_output_state *, struct secpolicy *, int);
329extern int ipsec4_tunnel_validate(struct mbuf *, int, u_int, struct secasvar *);
330extern struct mbuf *ipsec_copypkt(struct mbuf *);
331extern void ipsec_delaux(struct mbuf *);
332extern int ipsec_setsocket(struct mbuf *, struct socket *);
333extern struct socket *ipsec_getsocket(struct mbuf *);
334extern int ipsec_addhist(struct mbuf *, int, u_int32_t);
335extern struct ipsec_history *ipsec_gethist(struct mbuf *, int *);
336extern void ipsec_clearhist(struct mbuf *);
337#endif KERNEL
338#endif KERNEL_PRIVATE
339
340#ifndef KERNEL
341extern caddr_t ipsec_set_policy(char *, int);
342extern int ipsec_get_policylen(caddr_t);
343extern char *ipsec_dump_policy(caddr_t, char *);
344
345extern const char *ipsec_strerror(void);
346#endif KERNEL
347
348#endif _NETINET6_IPSEC_H_
349