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