hc
2024-11-01 2f529f9b558ca1c1bd74be7437a84e4711743404
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
#ifndef _LINUX_XFRM_H
#define _LINUX_XFRM_H
 
#include <linux/in6.h>
#include <linux/types.h>
 
/* All of the structures in this file may not change size as they are
 * passed into the kernel from userspace via netlink sockets.
 */
 
/* Structure to encapsulate addresses. I do not want to use
 * "standard" structure. My apologies.
 */
typedef union {
   __be32        a4;
   __be32        a6[4];
   struct in6_addr    in6;
} xfrm_address_t;
 
/* Ident of a specific xfrm_state. It is used on input to lookup
 * the state by (spi,daddr,ah/esp) or to store information about
 * spi, protocol and tunnel address on output.
 */
struct xfrm_id {
   xfrm_address_t    daddr;
   __be32        spi;
   __u8        proto;
};
 
struct xfrm_sec_ctx {
   __u8    ctx_doi;
   __u8    ctx_alg;
   __u16    ctx_len;
   __u32    ctx_sid;
   char    ctx_str[0];
};
 
/* Security Context Domains of Interpretation */
#define XFRM_SC_DOI_RESERVED 0
#define XFRM_SC_DOI_LSM 1
 
/* Security Context Algorithms */
#define XFRM_SC_ALG_RESERVED 0
#define XFRM_SC_ALG_SELINUX 1
 
/* Selector, used as selector both on policy rules (SPD) and SAs. */
 
struct xfrm_selector {
   xfrm_address_t    daddr;
   xfrm_address_t    saddr;
   __be16    dport;
   __be16    dport_mask;
   __be16    sport;
   __be16    sport_mask;
   __u16    family;
   __u8    prefixlen_d;
   __u8    prefixlen_s;
   __u8    proto;
   int    ifindex;
   __kernel_uid32_t    user;
};
 
#define XFRM_INF (~(__u64)0)
 
struct xfrm_lifetime_cfg {
   __u64    soft_byte_limit;
   __u64    hard_byte_limit;
   __u64    soft_packet_limit;
   __u64    hard_packet_limit;
   __u64    soft_add_expires_seconds;
   __u64    hard_add_expires_seconds;
   __u64    soft_use_expires_seconds;
   __u64    hard_use_expires_seconds;
};
 
struct xfrm_lifetime_cur {
   __u64    bytes;
   __u64    packets;
   __u64    add_time;
   __u64    use_time;
};
 
struct xfrm_replay_state {
   __u32    oseq;
   __u32    seq;
   __u32    bitmap;
};
 
#define XFRMA_REPLAY_ESN_MAX    4096
 
struct xfrm_replay_state_esn {
   unsigned int    bmp_len;
   __u32        oseq;
   __u32        seq;
   __u32        oseq_hi;
   __u32        seq_hi;
   __u32        replay_window;
   __u32        bmp[0];
};
 
struct xfrm_algo {
   char        alg_name[64];
   unsigned int    alg_key_len;    /* in bits */
   char        alg_key[0];
};
 
struct xfrm_algo_auth {
   char        alg_name[64];
   unsigned int    alg_key_len;    /* in bits */
   unsigned int    alg_trunc_len;  /* in bits */
   char        alg_key[0];
};
 
struct xfrm_algo_aead {
   char        alg_name[64];
   unsigned int    alg_key_len;    /* in bits */
   unsigned int    alg_icv_len;    /* in bits */
   char        alg_key[0];
};
 
struct xfrm_stats {
   __u32    replay_window;
   __u32    replay;
   __u32    integrity_failed;
};
 
enum {
   XFRM_POLICY_TYPE_MAIN    = 0,
   XFRM_POLICY_TYPE_SUB    = 1,
   XFRM_POLICY_TYPE_MAX    = 2,
   XFRM_POLICY_TYPE_ANY    = 255
};
 
enum {
   XFRM_POLICY_IN    = 0,
   XFRM_POLICY_OUT    = 1,
   XFRM_POLICY_FWD    = 2,
   XFRM_POLICY_MASK = 3,
   XFRM_POLICY_MAX    = 3
};
 
enum {
   XFRM_SHARE_ANY,        /* No limitations */
   XFRM_SHARE_SESSION,    /* For this session only */
   XFRM_SHARE_USER,    /* For this user only */
   XFRM_SHARE_UNIQUE    /* Use once */
};
 
#define XFRM_MODE_TRANSPORT 0
#define XFRM_MODE_TUNNEL 1
#define XFRM_MODE_ROUTEOPTIMIZATION 2
#define XFRM_MODE_IN_TRIGGER 3
#define XFRM_MODE_BEET 4
#define XFRM_MODE_MAX 5
 
/* Netlink configuration messages.  */
enum {
   XFRM_MSG_BASE = 0x10,
 
   XFRM_MSG_NEWSA = 0x10,
#define XFRM_MSG_NEWSA XFRM_MSG_NEWSA
   XFRM_MSG_DELSA,
#define XFRM_MSG_DELSA XFRM_MSG_DELSA
   XFRM_MSG_GETSA,
#define XFRM_MSG_GETSA XFRM_MSG_GETSA
 
   XFRM_MSG_NEWPOLICY,
#define XFRM_MSG_NEWPOLICY XFRM_MSG_NEWPOLICY
   XFRM_MSG_DELPOLICY,
#define XFRM_MSG_DELPOLICY XFRM_MSG_DELPOLICY
   XFRM_MSG_GETPOLICY,
#define XFRM_MSG_GETPOLICY XFRM_MSG_GETPOLICY
 
   XFRM_MSG_ALLOCSPI,
#define XFRM_MSG_ALLOCSPI XFRM_MSG_ALLOCSPI
   XFRM_MSG_ACQUIRE,
#define XFRM_MSG_ACQUIRE XFRM_MSG_ACQUIRE
   XFRM_MSG_EXPIRE,
#define XFRM_MSG_EXPIRE XFRM_MSG_EXPIRE
 
   XFRM_MSG_UPDPOLICY,
#define XFRM_MSG_UPDPOLICY XFRM_MSG_UPDPOLICY
   XFRM_MSG_UPDSA,
#define XFRM_MSG_UPDSA XFRM_MSG_UPDSA
 
   XFRM_MSG_POLEXPIRE,
#define XFRM_MSG_POLEXPIRE XFRM_MSG_POLEXPIRE
 
   XFRM_MSG_FLUSHSA,
#define XFRM_MSG_FLUSHSA XFRM_MSG_FLUSHSA
   XFRM_MSG_FLUSHPOLICY,
#define XFRM_MSG_FLUSHPOLICY XFRM_MSG_FLUSHPOLICY
 
   XFRM_MSG_NEWAE,
#define XFRM_MSG_NEWAE XFRM_MSG_NEWAE
   XFRM_MSG_GETAE,
#define XFRM_MSG_GETAE XFRM_MSG_GETAE
 
   XFRM_MSG_REPORT,
#define XFRM_MSG_REPORT XFRM_MSG_REPORT
 
   XFRM_MSG_MIGRATE,
#define XFRM_MSG_MIGRATE XFRM_MSG_MIGRATE
 
   XFRM_MSG_NEWSADINFO,
#define XFRM_MSG_NEWSADINFO XFRM_MSG_NEWSADINFO
   XFRM_MSG_GETSADINFO,
#define XFRM_MSG_GETSADINFO XFRM_MSG_GETSADINFO
 
   XFRM_MSG_NEWSPDINFO,
#define XFRM_MSG_NEWSPDINFO XFRM_MSG_NEWSPDINFO
   XFRM_MSG_GETSPDINFO,
#define XFRM_MSG_GETSPDINFO XFRM_MSG_GETSPDINFO
 
   XFRM_MSG_MAPPING,
#define XFRM_MSG_MAPPING XFRM_MSG_MAPPING
   __XFRM_MSG_MAX
};
#define XFRM_MSG_MAX (__XFRM_MSG_MAX - 1)
 
#define XFRM_NR_MSGTYPES (XFRM_MSG_MAX + 1 - XFRM_MSG_BASE)
 
/*
 * Generic LSM security context for comunicating to user space
 * NOTE: Same format as sadb_x_sec_ctx
 */
struct xfrm_user_sec_ctx {
   __u16            len;
   __u16            exttype;
   __u8            ctx_alg;  /* LSMs: e.g., selinux == 1 */
   __u8            ctx_doi;
   __u16            ctx_len;
};
 
struct xfrm_user_tmpl {
   struct xfrm_id        id;
   __u16            family;
   xfrm_address_t        saddr;
   __u32            reqid;
   __u8            mode;
   __u8            share;
   __u8            optional;
   __u32            aalgos;
   __u32            ealgos;
   __u32            calgos;
};
 
struct xfrm_encap_tmpl {
   __u16        encap_type;
   __be16        encap_sport;
   __be16        encap_dport;
   xfrm_address_t    encap_oa;
};
 
/* AEVENT flags  */
enum xfrm_ae_ftype_t {
   XFRM_AE_UNSPEC,
   XFRM_AE_RTHR=1,    /* replay threshold*/
   XFRM_AE_RVAL=2, /* replay value */
   XFRM_AE_LVAL=4, /* lifetime value */
   XFRM_AE_ETHR=8, /* expiry timer threshold */
   XFRM_AE_CR=16, /* Event cause is replay update */
   XFRM_AE_CE=32, /* Event cause is timer expiry */
   XFRM_AE_CU=64, /* Event cause is policy update */
   __XFRM_AE_MAX
 
#define XFRM_AE_MAX (__XFRM_AE_MAX - 1)
};
 
struct xfrm_userpolicy_type {
   __u8        type;
   __u16        reserved1;
   __u8        reserved2;
};
 
/* Netlink message attributes.  */
enum xfrm_attr_type_t {
   XFRMA_UNSPEC,
   XFRMA_ALG_AUTH,        /* struct xfrm_algo */
   XFRMA_ALG_CRYPT,    /* struct xfrm_algo */
   XFRMA_ALG_COMP,        /* struct xfrm_algo */
   XFRMA_ENCAP,        /* struct xfrm_algo + struct xfrm_encap_tmpl */
   XFRMA_TMPL,        /* 1 or more struct xfrm_user_tmpl */
   XFRMA_SA,        /* struct xfrm_usersa_info  */
   XFRMA_POLICY,        /*struct xfrm_userpolicy_info */
   XFRMA_SEC_CTX,        /* struct xfrm_sec_ctx */
   XFRMA_LTIME_VAL,
   XFRMA_REPLAY_VAL,
   XFRMA_REPLAY_THRESH,
   XFRMA_ETIMER_THRESH,
   XFRMA_SRCADDR,        /* xfrm_address_t */
   XFRMA_COADDR,        /* xfrm_address_t */
   XFRMA_LASTUSED,        /* unsigned long  */
   XFRMA_POLICY_TYPE,    /* struct xfrm_userpolicy_type */
   XFRMA_MIGRATE,
   XFRMA_ALG_AEAD,        /* struct xfrm_algo_aead */
   XFRMA_KMADDRESS,        /* struct xfrm_user_kmaddress */
   XFRMA_ALG_AUTH_TRUNC,    /* struct xfrm_algo_auth */
   XFRMA_MARK,        /* struct xfrm_mark */
   XFRMA_TFCPAD,        /* __u32 */
   XFRMA_REPLAY_ESN_VAL,    /* struct xfrm_replay_state_esn */
   XFRMA_SA_EXTRA_FLAGS,    /* __u32 */
   XFRMA_PROTO,        /* __u8 */
   XFRMA_ADDRESS_FILTER,    /* struct xfrm_address_filter */
   XFRMA_PAD,
   XFRMA_OFFLOAD_DEV,    /* struct xfrm_user_offload */
   XFRMA_SET_MARK,        /* __u32 */
   XFRMA_SET_MARK_MASK,    /* __u32 */
   XFRMA_IF_ID,        /* __u32 */
   __XFRMA_MAX
 
#define XFRMA_OUTPUT_MARK XFRMA_SET_MARK    /* Compatibility */
#define XFRMA_MAX (__XFRMA_MAX - 1)
};
 
struct xfrm_mark {
   __u32           v; /* value */
   __u32           m; /* mask */
};
 
enum xfrm_sadattr_type_t {
   XFRMA_SAD_UNSPEC,
   XFRMA_SAD_CNT,
   XFRMA_SAD_HINFO,
   __XFRMA_SAD_MAX
 
#define XFRMA_SAD_MAX (__XFRMA_SAD_MAX - 1)
};
 
struct xfrmu_sadhinfo {
   __u32 sadhcnt; /* current hash bkts */
   __u32 sadhmcnt; /* max allowed hash bkts */
};
 
enum xfrm_spdattr_type_t {
   XFRMA_SPD_UNSPEC,
   XFRMA_SPD_INFO,
   XFRMA_SPD_HINFO,
   XFRMA_SPD_IPV4_HTHRESH,
   XFRMA_SPD_IPV6_HTHRESH,
   __XFRMA_SPD_MAX
 
#define XFRMA_SPD_MAX (__XFRMA_SPD_MAX - 1)
};
 
struct xfrmu_spdinfo {
   __u32 incnt;
   __u32 outcnt;
   __u32 fwdcnt;
   __u32 inscnt;
   __u32 outscnt;
   __u32 fwdscnt;
};
 
struct xfrmu_spdhinfo {
   __u32 spdhcnt;
   __u32 spdhmcnt;
};
 
struct xfrmu_spdhthresh {
   __u8 lbits;
   __u8 rbits;
};
 
struct xfrm_usersa_info {
   struct xfrm_selector        sel;
   struct xfrm_id            id;
   xfrm_address_t            saddr;
   struct xfrm_lifetime_cfg    lft;
   struct xfrm_lifetime_cur    curlft;
   struct xfrm_stats        stats;
   __u32                seq;
   __u32                reqid;
   __u16                family;
   __u8                mode;        /* XFRM_MODE_xxx */
   __u8                replay_window;
   __u8                flags;
#define XFRM_STATE_NOECN    1
#define XFRM_STATE_DECAP_DSCP    2
#define XFRM_STATE_NOPMTUDISC    4
#define XFRM_STATE_WILDRECV    8
#define XFRM_STATE_ICMP        16
#define XFRM_STATE_AF_UNSPEC    32
#define XFRM_STATE_ALIGN4    64
#define XFRM_STATE_ESN        128
};
 
#define XFRM_SA_XFLAG_DONT_ENCAP_DSCP    1
#define XFRM_SA_XFLAG_OSEQ_MAY_WRAP    2
 
struct xfrm_usersa_id {
   xfrm_address_t            daddr;
   __be32                spi;
   __u16                family;
   __u8                proto;
};
 
struct xfrm_aevent_id {
   struct xfrm_usersa_id        sa_id;
   xfrm_address_t            saddr;
   __u32                flags;
   __u32                reqid;
};
 
struct xfrm_userspi_info {
   struct xfrm_usersa_info        info;
   __u32                min;
   __u32                max;
};
 
struct xfrm_userpolicy_info {
   struct xfrm_selector        sel;
   struct xfrm_lifetime_cfg    lft;
   struct xfrm_lifetime_cur    curlft;
   __u32                priority;
   __u32                index;
   __u8                dir;
   __u8                action;
#define XFRM_POLICY_ALLOW    0
#define XFRM_POLICY_BLOCK    1
   __u8                flags;
#define XFRM_POLICY_LOCALOK    1    /* Allow user to override global policy */
   /* Automatically expand selector to include matching ICMP payloads. */
#define XFRM_POLICY_ICMP    2
   __u8                share;
};
 
struct xfrm_userpolicy_id {
   struct xfrm_selector        sel;
   __u32                index;
   __u8                dir;
};
 
struct xfrm_user_acquire {
   struct xfrm_id            id;
   xfrm_address_t            saddr;
   struct xfrm_selector        sel;
   struct xfrm_userpolicy_info    policy;
   __u32                aalgos;
   __u32                ealgos;
   __u32                calgos;
   __u32                seq;
};
 
struct xfrm_user_expire {
   struct xfrm_usersa_info        state;
   __u8                hard;
};
 
struct xfrm_user_polexpire {
   struct xfrm_userpolicy_info    pol;
   __u8                hard;
};
 
struct xfrm_usersa_flush {
   __u8                proto;
};
 
struct xfrm_user_report {
   __u8                proto;
   struct xfrm_selector        sel;
};
 
/* Used by MIGRATE to pass addresses IKE should use to perform
 * SA negotiation with the peer */
struct xfrm_user_kmaddress {
   xfrm_address_t                  local;
   xfrm_address_t                  remote;
   __u32                reserved;
   __u16                family;
};
 
struct xfrm_user_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;
};
 
struct xfrm_user_mapping {
   struct xfrm_usersa_id        id;
   __u32                reqid;
   xfrm_address_t            old_saddr;
   xfrm_address_t            new_saddr;
   __be16                old_sport;
   __be16                new_sport;
};
 
struct xfrm_address_filter {
   xfrm_address_t            saddr;
   xfrm_address_t            daddr;
   __u16                family;
   __u8                splen;
   __u8                dplen;
};
 
struct xfrm_user_offload {
   int                ifindex;
   __u8                flags;
};
/* This flag was exposed without any kernel code that supporting it.
 * Unfortunately, strongswan has the code that uses sets this flag,
 * which makes impossible to reuse this bit.
 *
 * So leave it here to make sure that it won't be reused by mistake.
 */
#define XFRM_OFFLOAD_IPV6    1
#define XFRM_OFFLOAD_INBOUND    2
 
#ifndef __KERNEL__
/* backwards compatibility for userspace */
#define XFRMGRP_ACQUIRE        1
#define XFRMGRP_EXPIRE        2
#define XFRMGRP_SA        4
#define XFRMGRP_POLICY        8
#define XFRMGRP_REPORT        0x20
#endif
 
enum xfrm_nlgroups {
   XFRMNLGRP_NONE,
#define XFRMNLGRP_NONE        XFRMNLGRP_NONE
   XFRMNLGRP_ACQUIRE,
#define XFRMNLGRP_ACQUIRE    XFRMNLGRP_ACQUIRE
   XFRMNLGRP_EXPIRE,
#define XFRMNLGRP_EXPIRE    XFRMNLGRP_EXPIRE
   XFRMNLGRP_SA,
#define XFRMNLGRP_SA        XFRMNLGRP_SA
   XFRMNLGRP_POLICY,
#define XFRMNLGRP_POLICY    XFRMNLGRP_POLICY
   XFRMNLGRP_AEVENTS,
#define XFRMNLGRP_AEVENTS    XFRMNLGRP_AEVENTS
   XFRMNLGRP_REPORT,
#define XFRMNLGRP_REPORT    XFRMNLGRP_REPORT
   XFRMNLGRP_MIGRATE,
#define XFRMNLGRP_MIGRATE    XFRMNLGRP_MIGRATE
   XFRMNLGRP_MAPPING,
#define XFRMNLGRP_MAPPING    XFRMNLGRP_MAPPING
   __XFRMNLGRP_MAX
};
#define XFRMNLGRP_MAX    (__XFRMNLGRP_MAX - 1)
 
#endif /* _LINUX_XFRM_H */