xfrm.h 10.7 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9 10 11 12
#ifndef _LINUX_XFRM_H
#define _LINUX_XFRM_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.
 */
E
Eric Dumazet 已提交
13
typedef union {
A
Al Viro 已提交
14 15
	__be32		a4;
	__be32		a6[4];
L
Linus Torvalds 已提交
16 17 18 19 20 21
} 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.
 */
E
Eric Dumazet 已提交
22
struct xfrm_id {
L
Linus Torvalds 已提交
23
	xfrm_address_t	daddr;
A
Al Viro 已提交
24
	__be32		spi;
L
Linus Torvalds 已提交
25 26 27
	__u8		proto;
};

28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
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

L
Linus Torvalds 已提交
44 45
/* Selector, used as selector both on policy rules (SPD) and SAs. */

E
Eric Dumazet 已提交
46
struct xfrm_selector {
L
Linus Torvalds 已提交
47 48
	xfrm_address_t	daddr;
	xfrm_address_t	saddr;
49 50 51 52
	__be16	dport;
	__be16	dport_mask;
	__be16	sport;
	__be16	sport_mask;
L
Linus Torvalds 已提交
53 54 55 56 57
	__u16	family;
	__u8	prefixlen_d;
	__u8	prefixlen_s;
	__u8	proto;
	int	ifindex;
58
	__kernel_uid32_t	user;
L
Linus Torvalds 已提交
59 60 61 62
};

#define XFRM_INF (~(__u64)0)

E
Eric Dumazet 已提交
63
struct xfrm_lifetime_cfg {
L
Linus Torvalds 已提交
64 65 66 67 68 69 70 71 72 73
	__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;
};

E
Eric Dumazet 已提交
74
struct xfrm_lifetime_cur {
L
Linus Torvalds 已提交
75 76 77 78 79 80
	__u64	bytes;
	__u64	packets;
	__u64	add_time;
	__u64	use_time;
};

E
Eric Dumazet 已提交
81
struct xfrm_replay_state {
L
Linus Torvalds 已提交
82 83 84 85 86
	__u32	oseq;
	__u32	seq;
	__u32	bitmap;
};

87 88
#define XFRMA_REPLAY_ESN_MAX	4096

89 90 91 92 93 94 95 96 97 98
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];
};

L
Linus Torvalds 已提交
99
struct xfrm_algo {
100
	char		alg_name[64];
101
	unsigned int	alg_key_len;    /* in bits */
102
	char		alg_key[0];
L
Linus Torvalds 已提交
103 104
};

105 106 107 108 109 110 111
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];
};

112
struct xfrm_algo_aead {
113 114 115 116
	char		alg_name[64];
	unsigned int	alg_key_len;	/* in bits */
	unsigned int	alg_icv_len;	/* in bits */
	char		alg_key[0];
117 118
};

L
Linus Torvalds 已提交
119 120 121 122 123 124
struct xfrm_stats {
	__u32	replay_window;
	__u32	replay;
	__u32	integrity_failed;
};

E
Eric Dumazet 已提交
125
enum {
126 127
	XFRM_POLICY_TYPE_MAIN	= 0,
	XFRM_POLICY_TYPE_SUB	= 1,
128 129
	XFRM_POLICY_TYPE_MAX	= 2,
	XFRM_POLICY_TYPE_ANY	= 255
130 131
};

E
Eric Dumazet 已提交
132
enum {
L
Linus Torvalds 已提交
133 134 135
	XFRM_POLICY_IN	= 0,
	XFRM_POLICY_OUT	= 1,
	XFRM_POLICY_FWD	= 2,
136
	XFRM_POLICY_MASK = 3,
L
Linus Torvalds 已提交
137 138 139
	XFRM_POLICY_MAX	= 3
};

E
Eric Dumazet 已提交
140
enum {
L
Linus Torvalds 已提交
141 142 143 144 145 146
	XFRM_SHARE_ANY,		/* No limitations */
	XFRM_SHARE_SESSION,	/* For this session only */
	XFRM_SHARE_USER,	/* For this user only */
	XFRM_SHARE_UNIQUE	/* Use once */
};

147 148
#define XFRM_MODE_TRANSPORT 0
#define XFRM_MODE_TUNNEL 1
149 150
#define XFRM_MODE_ROUTEOPTIMIZATION 2
#define XFRM_MODE_IN_TRIGGER 3
D
Diego Beltrami 已提交
151 152
#define XFRM_MODE_BEET 4
#define XFRM_MODE_MAX 5
153

L
Linus Torvalds 已提交
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
/* 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

192 193 194 195
	XFRM_MSG_NEWAE,
#define XFRM_MSG_NEWAE XFRM_MSG_NEWAE
	XFRM_MSG_GETAE,
#define XFRM_MSG_GETAE XFRM_MSG_GETAE
196 197 198 199

	XFRM_MSG_REPORT,
#define XFRM_MSG_REPORT XFRM_MSG_REPORT

200 201 202
	XFRM_MSG_MIGRATE,
#define XFRM_MSG_MIGRATE XFRM_MSG_MIGRATE

J
Jamal Hadi Salim 已提交
203 204 205 206
	XFRM_MSG_NEWSADINFO,
#define XFRM_MSG_NEWSADINFO XFRM_MSG_NEWSADINFO
	XFRM_MSG_GETSADINFO,
#define XFRM_MSG_GETSADINFO XFRM_MSG_GETSADINFO
J
Jamal Hadi Salim 已提交
207 208 209 210 211

	XFRM_MSG_NEWSPDINFO,
#define XFRM_MSG_NEWSPDINFO XFRM_MSG_NEWSPDINFO
	XFRM_MSG_GETSPDINFO,
#define XFRM_MSG_GETSPDINFO XFRM_MSG_GETSPDINFO
212 213 214

	XFRM_MSG_MAPPING,
#define XFRM_MSG_MAPPING XFRM_MSG_MAPPING
215
	__XFRM_MSG_MAX
L
Linus Torvalds 已提交
216
};
217
#define XFRM_MSG_MAX (__XFRM_MSG_MAX - 1)
L
Linus Torvalds 已提交
218

219 220
#define XFRM_NR_MSGTYPES (XFRM_MSG_MAX + 1 - XFRM_MSG_BASE)

221 222 223 224 225 226 227 228 229 230 231 232
/*
 * 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;
};

L
Linus Torvalds 已提交
233 234 235 236 237 238 239 240 241 242 243 244 245 246 247
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;
A
Al Viro 已提交
248 249
	__be16		encap_sport;
	__be16		encap_dport;
L
Linus Torvalds 已提交
250 251 252
	xfrm_address_t	encap_oa;
};

253 254 255 256 257 258 259 260 261 262 263 264 265 266 267
/* 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)
};

268 269 270 271 272 273
struct xfrm_userpolicy_type {
	__u8		type;
	__u16		reserved1;
	__u8		reserved2;
};

L
Linus Torvalds 已提交
274 275 276 277 278 279 280 281
/* 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 */
282 283
	XFRMA_SA,		/* struct xfrm_usersa_info  */
	XFRMA_POLICY,		/*struct xfrm_userpolicy_info */
284
	XFRMA_SEC_CTX,		/* struct xfrm_sec_ctx */
285 286 287 288
	XFRMA_LTIME_VAL,
	XFRMA_REPLAY_VAL,
	XFRMA_REPLAY_THRESH,
	XFRMA_ETIMER_THRESH,
289
	XFRMA_SRCADDR,		/* xfrm_address_t */
290
	XFRMA_COADDR,		/* xfrm_address_t */
291
	XFRMA_LASTUSED,		/* unsigned long  */
292
	XFRMA_POLICY_TYPE,	/* struct xfrm_userpolicy_type */
293
	XFRMA_MIGRATE,
294
	XFRMA_ALG_AEAD,		/* struct xfrm_algo_aead */
295
	XFRMA_KMADDRESS,        /* struct xfrm_user_kmaddress */
296
	XFRMA_ALG_AUTH_TRUNC,	/* struct xfrm_algo_auth */
297
	XFRMA_MARK,		/* struct xfrm_mark */
298
	XFRMA_TFCPAD,		/* __u32 */
299
	XFRMA_REPLAY_ESN_VAL,	/* struct xfrm_replay_esn */
L
Linus Torvalds 已提交
300 301 302 303 304
	__XFRMA_MAX

#define XFRMA_MAX (__XFRMA_MAX - 1)
};

305 306 307 308 309
struct xfrm_mark {
	__u32           v; /* value */
	__u32           m; /* mask */
};

J
Jamal Hadi Salim 已提交
310 311
enum xfrm_sadattr_type_t {
	XFRMA_SAD_UNSPEC,
312 313
	XFRMA_SAD_CNT,
	XFRMA_SAD_HINFO,
J
Jamal Hadi Salim 已提交
314 315 316 317 318
	__XFRMA_SAD_MAX

#define XFRMA_SAD_MAX (__XFRMA_SAD_MAX - 1)
};

319 320 321 322 323
struct xfrmu_sadhinfo {
	__u32 sadhcnt; /* current hash bkts */
	__u32 sadhmcnt; /* max allowed hash bkts */
};

J
Jamal Hadi Salim 已提交
324 325
enum xfrm_spdattr_type_t {
	XFRMA_SPD_UNSPEC,
326 327
	XFRMA_SPD_INFO,
	XFRMA_SPD_HINFO,
J
Jamal Hadi Salim 已提交
328 329 330 331 332
	__XFRMA_SPD_MAX

#define XFRMA_SPD_MAX (__XFRMA_SPD_MAX - 1)
};

333 334 335 336 337 338 339 340 341 342 343 344 345 346
struct xfrmu_spdinfo {
	__u32 incnt;
	__u32 outcnt;
	__u32 fwdcnt;
	__u32 inscnt;
	__u32 outscnt;
	__u32 fwdscnt;
};

struct xfrmu_spdhinfo {
	__u32 spdhcnt;
	__u32 spdhmcnt;
};

L
Linus Torvalds 已提交
347 348 349 350 351 352 353 354 355 356
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;
357
	__u8				mode;		/* XFRM_MODE_xxx */
L
Linus Torvalds 已提交
358 359 360 361
	__u8				replay_window;
	__u8				flags;
#define XFRM_STATE_NOECN	1
#define XFRM_STATE_DECAP_DSCP	2
362
#define XFRM_STATE_NOPMTUDISC	4
363
#define XFRM_STATE_WILDRECV	8
364
#define XFRM_STATE_ICMP		16
365
#define XFRM_STATE_AF_UNSPEC	32
366
#define XFRM_STATE_ALIGN4	64
367
#define XFRM_STATE_ESN		128
L
Linus Torvalds 已提交
368 369 370 371
};

struct xfrm_usersa_id {
	xfrm_address_t			daddr;
372
	__be32				spi;
L
Linus Torvalds 已提交
373 374 375 376
	__u16				family;
	__u8				proto;
};

377 378
struct xfrm_aevent_id {
	struct xfrm_usersa_id		sa_id;
379
	xfrm_address_t			saddr;
380
	__u32				flags;
381
	__u32				reqid;
382 383
};

L
Linus Torvalds 已提交
384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401
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 */
402 403
	/* Automatically expand selector to include matching ICMP payloads. */
#define XFRM_POLICY_ICMP	2
L
Linus Torvalds 已提交
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
	__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;
};

438 439 440 441 442
struct xfrm_user_report {
	__u8				proto;
	struct xfrm_selector		sel;
};

443 444 445 446 447 448 449 450 451
/* 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;
};

452 453 454 455 456 457 458 459 460 461 462 463 464
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;
};

465 466 467 468 469 470 471 472 473
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;
};

474 475
#ifndef __KERNEL__
/* backwards compatibility for userspace */
L
Linus Torvalds 已提交
476 477
#define XFRMGRP_ACQUIRE		1
#define XFRMGRP_EXPIRE		2
478 479
#define XFRMGRP_SA		4
#define XFRMGRP_POLICY		8
480
#define XFRMGRP_REPORT		0x20
481 482 483 484 485 486 487 488 489 490 491 492 493
#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
494 495
	XFRMNLGRP_AEVENTS,
#define XFRMNLGRP_AEVENTS	XFRMNLGRP_AEVENTS
496 497
	XFRMNLGRP_REPORT,
#define XFRMNLGRP_REPORT	XFRMNLGRP_REPORT
498 499
	XFRMNLGRP_MIGRATE,
#define XFRMNLGRP_MIGRATE	XFRMNLGRP_MIGRATE
500 501
	XFRMNLGRP_MAPPING,
#define XFRMNLGRP_MAPPING	XFRMNLGRP_MAPPING
502 503 504
	__XFRMNLGRP_MAX
};
#define XFRMNLGRP_MAX	(__XFRMNLGRP_MAX - 1)
L
Linus Torvalds 已提交
505 506

#endif /* _LINUX_XFRM_H */