File Index
Files and directories
Sign in
FILE

af_key.c

File preview with syntax highlighting.

linux-6.19.14/net/key/af_key.c C
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*
   3 * net/key/af_key.c	An implementation of PF_KEYv2 sockets.
   4 *
   5 * Authors:	Maxim Giryaev	<gem@asplinux.ru>
   6 *		David S. Miller	<davem@redhat.com>
   7 *		Alexey Kuznetsov <kuznet@ms2.inr.ac.ru>
   8 *		Kunihiro Ishiguro <kunihiro@ipinfusion.com>
   9 *		Kazunori MIYAZAWA / USAGI Project <miyazawa@linux-ipv6.org>
  10 *		Derek Atkins <derek@ihtfp.com>
  11 */
  12
  13#include <linux/capability.h>
  14#include <linux/module.h>
  15#include <linux/kernel.h>
  16#include <linux/socket.h>
  17#include <linux/pfkeyv2.h>
  18#include <linux/ipsec.h>
  19#include <linux/skbuff.h>
  20#include <linux/rtnetlink.h>
  21#include <linux/in.h>
  22#include <linux/in6.h>
  23#include <linux/proc_fs.h>
  24#include <linux/init.h>
  25#include <linux/slab.h>
  26#include <net/net_namespace.h>
  27#include <net/netns/generic.h>
  28#include <net/xfrm.h>
  29
  30#include <net/sock.h>
  31
  32#define _X2KEY(x) ((x) == XFRM_INF ? 0 : (x))
  33#define _KEY2X(x) ((x) == 0 ? XFRM_INF : (x))
  34
  35static unsigned int pfkey_net_id __read_mostly;
  36struct netns_pfkey {
  37	/* List of all pfkey sockets. */
  38	struct hlist_head table;
  39	atomic_t socks_nr;
  40};
  41static DEFINE_MUTEX(pfkey_mutex);
  42
  43#define DUMMY_MARK 0
  44static const struct xfrm_mark dummy_mark = {0, 0};
  45struct pfkey_sock {
  46	/* struct sock must be the first member of struct pfkey_sock */
  47	struct sock	sk;
  48	int		registered;
  49	int		promisc;
  50
  51	struct {
  52		uint8_t		msg_version;
  53		uint32_t	msg_portid;
  54		int		(*dump)(struct pfkey_sock *sk);
  55		void		(*done)(struct pfkey_sock *sk);
  56		union {
  57			struct xfrm_policy_walk	policy;
  58			struct xfrm_state_walk	state;
  59		} u;
  60		struct sk_buff	*skb;
  61	} dump;
  62	struct mutex dump_lock;
  63};
  64
  65static int parse_sockaddr_pair(struct sockaddr *sa, int ext_len,
  66			       xfrm_address_t *saddr, xfrm_address_t *daddr,
  67			       u16 *family);
  68
  69static inline struct pfkey_sock *pfkey_sk(struct sock *sk)
  70{
  71	return (struct pfkey_sock *)sk;
  72}
  73
  74static int pfkey_can_dump(const struct sock *sk)
  75{
  76	if (3 * atomic_read(&sk->sk_rmem_alloc) <= 2 * sk->sk_rcvbuf)
  77		return 1;
  78	return 0;
  79}
  80
  81static void pfkey_terminate_dump(struct pfkey_sock *pfk)
  82{
  83	if (pfk->dump.dump) {
  84		if (pfk->dump.skb) {
  85			kfree_skb(pfk->dump.skb);
  86			pfk->dump.skb = NULL;
  87		}
  88		pfk->dump.done(pfk);
  89		pfk->dump.dump = NULL;
  90		pfk->dump.done = NULL;
  91	}
  92}
  93
  94static void pfkey_sock_destruct(struct sock *sk)
  95{
  96	struct net *net = sock_net(sk);
  97	struct netns_pfkey *net_pfkey = net_generic(net, pfkey_net_id);
  98
  99	pfkey_terminate_dump(pfkey_sk(sk));
 100	skb_queue_purge(&sk->sk_receive_queue);
 101
 102	if (!sock_flag(sk, SOCK_DEAD)) {
 103		pr_err("Attempt to release alive pfkey socket: %p\n", sk);
 104		return;
 105	}
 106
 107	WARN_ON(atomic_read(&sk->sk_rmem_alloc));
 108	WARN_ON(refcount_read(&sk->sk_wmem_alloc));
 109
 110	atomic_dec(&net_pfkey->socks_nr);
 111}
 112
 113static const struct proto_ops pfkey_ops;
 114
 115static void pfkey_insert(struct sock *sk)
 116{
 117	struct net *net = sock_net(sk);
 118	struct netns_pfkey *net_pfkey = net_generic(net, pfkey_net_id);
 119
 120	mutex_lock(&pfkey_mutex);
 121	sk_add_node_rcu(sk, &net_pfkey->table);
 122	mutex_unlock(&pfkey_mutex);
 123}
 124
 125static void pfkey_remove(struct sock *sk)
 126{
 127	mutex_lock(&pfkey_mutex);
 128	sk_del_node_init_rcu(sk);
 129	mutex_unlock(&pfkey_mutex);
 130}
 131
 132static struct proto key_proto = {
 133	.name	  = "KEY",
 134	.owner	  = THIS_MODULE,
 135	.obj_size = sizeof(struct pfkey_sock),
 136};
 137
 138static int pfkey_create(struct net *net, struct socket *sock, int protocol,
 139			int kern)
 140{
 141	struct netns_pfkey *net_pfkey = net_generic(net, pfkey_net_id);
 142	struct sock *sk;
 143	struct pfkey_sock *pfk;
 144
 145	if (!ns_capable(net->user_ns, CAP_NET_ADMIN))
 146		return -EPERM;
 147	if (sock->type != SOCK_RAW)
 148		return -ESOCKTNOSUPPORT;
 149	if (protocol != PF_KEY_V2)
 150		return -EPROTONOSUPPORT;
 151
 152	sk = sk_alloc(net, PF_KEY, GFP_KERNEL, &key_proto, kern);
 153	if (sk == NULL)
 154		return -ENOMEM;
 155
 156	pfk = pfkey_sk(sk);
 157	mutex_init(&pfk->dump_lock);
 158
 159	sock->ops = &pfkey_ops;
 160	sock_init_data(sock, sk);
 161
 162	sk->sk_family = PF_KEY;
 163	sk->sk_destruct = pfkey_sock_destruct;
 164
 165	atomic_inc(&net_pfkey->socks_nr);
 166
 167	pfkey_insert(sk);
 168
 169	return 0;
 170}
 171
 172static int pfkey_release(struct socket *sock)
 173{
 174	struct sock *sk = sock->sk;
 175
 176	if (!sk)
 177		return 0;
 178
 179	pfkey_remove(sk);
 180
 181	sock_orphan(sk);
 182	sock->sk = NULL;
 183	skb_queue_purge(&sk->sk_write_queue);
 184
 185	synchronize_rcu();
 186	sock_put(sk);
 187
 188	return 0;
 189}
 190
 191static int pfkey_broadcast_one(struct sk_buff *skb, gfp_t allocation,
 192			       struct sock *sk)
 193{
 194	int err = -ENOBUFS;
 195
 196	if (atomic_read(&sk->sk_rmem_alloc) > sk->sk_rcvbuf)
 197		return err;
 198
 199	skb = skb_clone(skb, allocation);
 200
 201	if (skb) {
 202		skb_set_owner_r(skb, sk);
 203		skb_queue_tail(&sk->sk_receive_queue, skb);
 204		sk->sk_data_ready(sk);
 205		err = 0;
 206	}
 207	return err;
 208}
 209
 210/* Send SKB to all pfkey sockets matching selected criteria.  */
 211#define BROADCAST_ALL		0
 212#define BROADCAST_ONE		1
 213#define BROADCAST_REGISTERED	2
 214#define BROADCAST_PROMISC_ONLY	4
 215static int pfkey_broadcast(struct sk_buff *skb, gfp_t allocation,
 216			   int broadcast_flags, struct sock *one_sk,
 217			   struct net *net)
 218{
 219	struct netns_pfkey *net_pfkey = net_generic(net, pfkey_net_id);
 220	struct sock *sk;
 221	int err = -ESRCH;
 222
 223	/* XXX Do we need something like netlink_overrun?  I think
 224	 * XXX PF_KEY socket apps will not mind current behavior.
 225	 */
 226	if (!skb)
 227		return -ENOMEM;
 228
 229	rcu_read_lock();
 230	sk_for_each_rcu(sk, &net_pfkey->table) {
 231		struct pfkey_sock *pfk = pfkey_sk(sk);
 232		int err2;
 233
 234		/* Yes, it means that if you are meant to receive this
 235		 * pfkey message you receive it twice as promiscuous
 236		 * socket.
 237		 */
 238		if (pfk->promisc)
 239			pfkey_broadcast_one(skb, GFP_ATOMIC, sk);
 240
 241		/* the exact target will be processed later */
 242		if (sk == one_sk)
 243			continue;
 244		if (broadcast_flags != BROADCAST_ALL) {
 245			if (broadcast_flags & BROADCAST_PROMISC_ONLY)
 246				continue;
 247			if ((broadcast_flags & BROADCAST_REGISTERED) &&
 248			    !pfk->registered)
 249				continue;
 250			if (broadcast_flags & BROADCAST_ONE)
 251				continue;
 252		}
 253
 254		err2 = pfkey_broadcast_one(skb, GFP_ATOMIC, sk);
 255
 256		/* Error is cleared after successful sending to at least one
 257		 * registered KM */
 258		if ((broadcast_flags & BROADCAST_REGISTERED) && err)
 259			err = err2;
 260	}
 261	rcu_read_unlock();
 262
 263	if (one_sk != NULL)
 264		err = pfkey_broadcast_one(skb, allocation, one_sk);
 265
 266	kfree_skb(skb);
 267	return err;
 268}
 269
 270static int pfkey_do_dump(struct pfkey_sock *pfk)
 271{
 272	struct sadb_msg *hdr;
 273	int rc;
 274
 275	mutex_lock(&pfk->dump_lock);
 276	if (!pfk->dump.dump) {
 277		rc = 0;
 278		goto out;
 279	}
 280
 281	rc = pfk->dump.dump(pfk);
 282	if (rc == -ENOBUFS) {
 283		rc = 0;
 284		goto out;
 285	}
 286
 287	if (pfk->dump.skb) {
 288		if (!pfkey_can_dump(&pfk->sk)) {
 289			rc = 0;
 290			goto out;
 291		}
 292
 293		hdr = (struct sadb_msg *) pfk->dump.skb->data;
 294		hdr->sadb_msg_seq = 0;
 295		hdr->sadb_msg_errno = rc;
 296		pfkey_broadcast(pfk->dump.skb, GFP_ATOMIC, BROADCAST_ONE,
 297				&pfk->sk, sock_net(&pfk->sk));
 298		pfk->dump.skb = NULL;
 299	}
 300
 301	pfkey_terminate_dump(pfk);
 302
 303out:
 304	mutex_unlock(&pfk->dump_lock);
 305	return rc;
 306}
 307
 308static inline void pfkey_hdr_dup(struct sadb_msg *new,
 309				 const struct sadb_msg *orig)
 310{
 311	*new = *orig;
 312}
 313
 314static int pfkey_error(const struct sadb_msg *orig, int err, struct sock *sk)
 315{
 316	struct sk_buff *skb = alloc_skb(sizeof(struct sadb_msg) + 16, GFP_KERNEL);
 317	struct sadb_msg *hdr;
 318
 319	if (!skb)
 320		return -ENOBUFS;
 321
 322	/* Woe be to the platform trying to support PFKEY yet
 323	 * having normal errnos outside the 1-255 range, inclusive.
 324	 */
 325	err = -err;
 326	if (err == ERESTARTSYS ||
 327	    err == ERESTARTNOHAND ||
 328	    err == ERESTARTNOINTR)
 329		err = EINTR;
 330	if (err >= 512)
 331		err = EINVAL;
 332	BUG_ON(err <= 0 || err >= 256);
 333
 334	hdr = skb_put(skb, sizeof(struct sadb_msg));
 335	pfkey_hdr_dup(hdr, orig);
 336	hdr->sadb_msg_errno = (uint8_t) err;
 337	hdr->sadb_msg_len = (sizeof(struct sadb_msg) /
 338			     sizeof(uint64_t));
 339
 340	pfkey_broadcast(skb, GFP_KERNEL, BROADCAST_ONE, sk, sock_net(sk));
 341
 342	return 0;
 343}
 344
 345static const u8 sadb_ext_min_len[] = {
 346	[SADB_EXT_RESERVED]		= (u8) 0,
 347	[SADB_EXT_SA]			= (u8) sizeof(struct sadb_sa),
 348	[SADB_EXT_LIFETIME_CURRENT]	= (u8) sizeof(struct sadb_lifetime),
 349	[SADB_EXT_LIFETIME_HARD]	= (u8) sizeof(struct sadb_lifetime),
 350	[SADB_EXT_LIFETIME_SOFT]	= (u8) sizeof(struct sadb_lifetime),
 351	[SADB_EXT_ADDRESS_SRC]		= (u8) sizeof(struct sadb_address),
 352	[SADB_EXT_ADDRESS_DST]		= (u8) sizeof(struct sadb_address),
 353	[SADB_EXT_ADDRESS_PROXY]	= (u8) sizeof(struct sadb_address),
 354	[SADB_EXT_KEY_AUTH]		= (u8) sizeof(struct sadb_key),
 355	[SADB_EXT_KEY_ENCRYPT]		= (u8) sizeof(struct sadb_key),
 356	[SADB_EXT_IDENTITY_SRC]		= (u8) sizeof(struct sadb_ident),
 357	[SADB_EXT_IDENTITY_DST]		= (u8) sizeof(struct sadb_ident),
 358	[SADB_EXT_SENSITIVITY]		= (u8) sizeof(struct sadb_sens),
 359	[SADB_EXT_PROPOSAL]		= (u8) sizeof(struct sadb_prop),
 360	[SADB_EXT_SUPPORTED_AUTH]	= (u8) sizeof(struct sadb_supported),
 361	[SADB_EXT_SUPPORTED_ENCRYPT]	= (u8) sizeof(struct sadb_supported),
 362	[SADB_EXT_SPIRANGE]		= (u8) sizeof(struct sadb_spirange),
 363	[SADB_X_EXT_KMPRIVATE]		= (u8) sizeof(struct sadb_x_kmprivate),
 364	[SADB_X_EXT_POLICY]		= (u8) sizeof(struct sadb_x_policy),
 365	[SADB_X_EXT_SA2]		= (u8) sizeof(struct sadb_x_sa2),
 366	[SADB_X_EXT_NAT_T_TYPE]		= (u8) sizeof(struct sadb_x_nat_t_type),
 367	[SADB_X_EXT_NAT_T_SPORT]	= (u8) sizeof(struct sadb_x_nat_t_port),
 368	[SADB_X_EXT_NAT_T_DPORT]	= (u8) sizeof(struct sadb_x_nat_t_port),
 369	[SADB_X_EXT_NAT_T_OA]		= (u8) sizeof(struct sadb_address),
 370	[SADB_X_EXT_SEC_CTX]		= (u8) sizeof(struct sadb_x_sec_ctx),
 371	[SADB_X_EXT_KMADDRESS]		= (u8) sizeof(struct sadb_x_kmaddress),
 372	[SADB_X_EXT_FILTER]		= (u8) sizeof(struct sadb_x_filter),
 373};
 374
 375/* Verify sadb_address_{len,prefixlen} against sa_family.  */
 376static int verify_address_len(const void *p)
 377{
 378	const struct sadb_address *sp = p;
 379	const struct sockaddr *addr = (const struct sockaddr *)(sp + 1);
 380	const struct sockaddr_in *sin;
 381#if IS_ENABLED(CONFIG_IPV6)
 382	const struct sockaddr_in6 *sin6;
 383#endif
 384	int len;
 385
 386	if (sp->sadb_address_len <
 387	    DIV_ROUND_UP(sizeof(*sp) + offsetofend(typeof(*addr), sa_family),
 388			 sizeof(uint64_t)))
 389		return -EINVAL;
 390
 391	switch (addr->sa_family) {
 392	case AF_INET:
 393		len = DIV_ROUND_UP(sizeof(*sp) + sizeof(*sin), sizeof(uint64_t));
 394		if (sp->sadb_address_len != len ||
 395		    sp->sadb_address_prefixlen > 32)
 396			return -EINVAL;
 397		break;
 398#if IS_ENABLED(CONFIG_IPV6)
 399	case AF_INET6:
 400		len = DIV_ROUND_UP(sizeof(*sp) + sizeof(*sin6), sizeof(uint64_t));
 401		if (sp->sadb_address_len != len ||
 402		    sp->sadb_address_prefixlen > 128)
 403			return -EINVAL;
 404		break;
 405#endif
 406	default:
 407		/* It is user using kernel to keep track of security
 408		 * associations for another protocol, such as
 409		 * OSPF/RSVP/RIPV2/MIP.  It is user's job to verify
 410		 * lengths.
 411		 *
 412		 * XXX Actually, association/policy database is not yet
 413		 * XXX able to cope with arbitrary sockaddr families.
 414		 * XXX When it can, remove this -EINVAL.  -DaveM
 415		 */
 416		return -EINVAL;
 417	}
 418
 419	return 0;
 420}
 421
 422static inline int sadb_key_len(const struct sadb_key *key)
 423{
 424	int key_bytes = DIV_ROUND_UP(key->sadb_key_bits, 8);
 425
 426	return DIV_ROUND_UP(sizeof(struct sadb_key) + key_bytes,
 427			    sizeof(uint64_t));
 428}
 429
 430static int verify_key_len(const void *p)
 431{
 432	const struct sadb_key *key = p;
 433
 434	if (sadb_key_len(key) > key->sadb_key_len)
 435		return -EINVAL;
 436
 437	return 0;
 438}
 439
 440static inline int pfkey_sec_ctx_len(const struct sadb_x_sec_ctx *sec_ctx)
 441{
 442	return DIV_ROUND_UP(sizeof(struct sadb_x_sec_ctx) +
 443			    sec_ctx->sadb_x_ctx_len,
 444			    sizeof(uint64_t));
 445}
 446
 447static inline int verify_sec_ctx_len(const void *p)
 448{
 449	const struct sadb_x_sec_ctx *sec_ctx = p;
 450	int len = sec_ctx->sadb_x_ctx_len;
 451
 452	if (len > PAGE_SIZE)
 453		return -EINVAL;
 454
 455	len = pfkey_sec_ctx_len(sec_ctx);
 456
 457	if (sec_ctx->sadb_x_sec_len != len)
 458		return -EINVAL;
 459
 460	return 0;
 461}
 462
 463static inline struct xfrm_user_sec_ctx *pfkey_sadb2xfrm_user_sec_ctx(const struct sadb_x_sec_ctx *sec_ctx,
 464								     gfp_t gfp)
 465{
 466	struct xfrm_user_sec_ctx *uctx = NULL;
 467	int ctx_size = sec_ctx->sadb_x_ctx_len;
 468
 469	uctx = kmalloc((sizeof(*uctx)+ctx_size), gfp);
 470
 471	if (!uctx)
 472		return NULL;
 473
 474	uctx->len = pfkey_sec_ctx_len(sec_ctx);
 475	uctx->exttype = sec_ctx->sadb_x_sec_exttype;
 476	uctx->ctx_doi = sec_ctx->sadb_x_ctx_doi;
 477	uctx->ctx_alg = sec_ctx->sadb_x_ctx_alg;
 478	uctx->ctx_len = sec_ctx->sadb_x_ctx_len;
 479	memcpy(uctx + 1, sec_ctx + 1,
 480	       uctx->ctx_len);
 481
 482	return uctx;
 483}
 484
 485static int present_and_same_family(const struct sadb_address *src,
 486				   const struct sadb_address *dst)
 487{
 488	const struct sockaddr *s_addr, *d_addr;
 489
 490	if (!src || !dst)
 491		return 0;
 492
 493	s_addr = (const struct sockaddr *)(src + 1);
 494	d_addr = (const struct sockaddr *)(dst + 1);
 495	if (s_addr->sa_family != d_addr->sa_family)
 496		return 0;
 497	if (s_addr->sa_family != AF_INET
 498#if IS_ENABLED(CONFIG_IPV6)
 499	    && s_addr->sa_family != AF_INET6
 500#endif
 501		)
 502		return 0;
 503
 504	return 1;
 505}
 506
 507static int parse_exthdrs(struct sk_buff *skb, const struct sadb_msg *hdr, void **ext_hdrs)
 508{
 509	const char *p = (char *) hdr;
 510	int len = skb->len;
 511
 512	len -= sizeof(*hdr);
 513	p += sizeof(*hdr);
 514	while (len > 0) {
 515		const struct sadb_ext *ehdr = (const struct sadb_ext *) p;
 516		uint16_t ext_type;
 517		int ext_len;
 518
 519		if (len < sizeof(*ehdr))
 520			return -EINVAL;
 521
 522		ext_len  = ehdr->sadb_ext_len;
 523		ext_len *= sizeof(uint64_t);
 524		ext_type = ehdr->sadb_ext_type;
 525		if (ext_len < sizeof(uint64_t) ||
 526		    ext_len > len ||
 527		    ext_type == SADB_EXT_RESERVED)
 528			return -EINVAL;
 529
 530		if (ext_type <= SADB_EXT_MAX) {
 531			int min = (int) sadb_ext_min_len[ext_type];
 532			if (ext_len < min)
 533				return -EINVAL;
 534			if (ext_hdrs[ext_type-1] != NULL)
 535				return -EINVAL;
 536			switch (ext_type) {
 537			case SADB_EXT_ADDRESS_SRC:
 538			case SADB_EXT_ADDRESS_DST:
 539			case SADB_EXT_ADDRESS_PROXY:
 540			case SADB_X_EXT_NAT_T_OA:
 541				if (verify_address_len(p))
 542					return -EINVAL;
 543				break;
 544			case SADB_X_EXT_SEC_CTX:
 545				if (verify_sec_ctx_len(p))
 546					return -EINVAL;
 547				break;
 548			case SADB_EXT_KEY_AUTH:
 549			case SADB_EXT_KEY_ENCRYPT:
 550				if (verify_key_len(p))
 551					return -EINVAL;
 552				break;
 553			default:
 554				break;
 555			}
 556			ext_hdrs[ext_type-1] = (void *) p;
 557		}
 558		p   += ext_len;
 559		len -= ext_len;
 560	}
 561
 562	return 0;
 563}
 564
 565static uint16_t
 566pfkey_satype2proto(uint8_t satype)
 567{
 568	switch (satype) {
 569	case SADB_SATYPE_UNSPEC:
 570		return IPSEC_PROTO_ANY;
 571	case SADB_SATYPE_AH:
 572		return IPPROTO_AH;
 573	case SADB_SATYPE_ESP:
 574		return IPPROTO_ESP;
 575	case SADB_X_SATYPE_IPCOMP:
 576		return IPPROTO_COMP;
 577	default:
 578		return 0;
 579	}
 580	/* NOTREACHED */
 581}
 582
 583static uint8_t
 584pfkey_proto2satype(uint16_t proto)
 585{
 586	switch (proto) {
 587	case IPPROTO_AH:
 588		return SADB_SATYPE_AH;
 589	case IPPROTO_ESP:
 590		return SADB_SATYPE_ESP;
 591	case IPPROTO_COMP:
 592		return SADB_X_SATYPE_IPCOMP;
 593	default:
 594		return 0;
 595	}
 596	/* NOTREACHED */
 597}
 598
 599/* BTW, this scheme means that there is no way with PFKEY2 sockets to
 600 * say specifically 'just raw sockets' as we encode them as 255.
 601 */
 602
 603static uint8_t pfkey_proto_to_xfrm(uint8_t proto)
 604{
 605	return proto == IPSEC_PROTO_ANY ? 0 : proto;
 606}
 607
 608static uint8_t pfkey_proto_from_xfrm(uint8_t proto)
 609{
 610	return proto ? proto : IPSEC_PROTO_ANY;
 611}
 612
 613static inline int pfkey_sockaddr_len(sa_family_t family)
 614{
 615	switch (family) {
 616	case AF_INET:
 617		return sizeof(struct sockaddr_in);
 618#if IS_ENABLED(CONFIG_IPV6)
 619	case AF_INET6:
 620		return sizeof(struct sockaddr_in6);
 621#endif
 622	}
 623	return 0;
 624}
 625
 626static
 627int pfkey_sockaddr_extract(const struct sockaddr *sa, xfrm_address_t *xaddr)
 628{
 629	switch (sa->sa_family) {
 630	case AF_INET:
 631		xaddr->a4 =
 632			((struct sockaddr_in *)sa)->sin_addr.s_addr;
 633		return AF_INET;
 634#if IS_ENABLED(CONFIG_IPV6)
 635	case AF_INET6:
 636		memcpy(xaddr->a6,
 637		       &((struct sockaddr_in6 *)sa)->sin6_addr,
 638		       sizeof(struct in6_addr));
 639		return AF_INET6;
 640#endif
 641	}
 642	return 0;
 643}
 644
 645static
 646int pfkey_sadb_addr2xfrm_addr(const struct sadb_address *addr, xfrm_address_t *xaddr)
 647{
 648	return pfkey_sockaddr_extract((struct sockaddr *)(addr + 1),
 649				      xaddr);
 650}
 651
 652static struct  xfrm_state *pfkey_xfrm_state_lookup(struct net *net, const struct sadb_msg *hdr, void * const *ext_hdrs)
 653{
 654	const struct sadb_sa *sa;
 655	const struct sadb_address *addr;
 656	uint16_t proto;
 657	unsigned short family;
 658	xfrm_address_t *xaddr;
 659
 660	sa = ext_hdrs[SADB_EXT_SA - 1];
 661	if (sa == NULL)
 662		return NULL;
 663
 664	proto = pfkey_satype2proto(hdr->sadb_msg_satype);
 665	if (proto == 0)
 666		return NULL;
 667
 668	/* sadb_address_len should be checked by caller */
 669	addr = ext_hdrs[SADB_EXT_ADDRESS_DST - 1];
 670	if (addr == NULL)
 671		return NULL;
 672
 673	family = ((const struct sockaddr *)(addr + 1))->sa_family;
 674	switch (family) {
 675	case AF_INET:
 676		xaddr = (xfrm_address_t *)&((const struct sockaddr_in *)(addr + 1))->sin_addr;
 677		break;
 678#if IS_ENABLED(CONFIG_IPV6)
 679	case AF_INET6:
 680		xaddr = (xfrm_address_t *)&((const struct sockaddr_in6 *)(addr + 1))->sin6_addr;
 681		break;
 682#endif
 683	default:
 684		xaddr = NULL;
 685	}
 686
 687	if (!xaddr)
 688		return NULL;
 689
 690	return xfrm_state_lookup(net, DUMMY_MARK, xaddr, sa->sadb_sa_spi, proto, family);
 691}
 692
 693#define PFKEY_ALIGN8(a) (1 + (((a) - 1) | (8 - 1)))
 694
 695static int
 696pfkey_sockaddr_size(sa_family_t family)
 697{
 698	return PFKEY_ALIGN8(pfkey_sockaddr_len(family));
 699}
 700
 701static inline int pfkey_mode_from_xfrm(int mode)
 702{
 703	switch(mode) {
 704	case XFRM_MODE_TRANSPORT:
 705		return IPSEC_MODE_TRANSPORT;
 706	case XFRM_MODE_TUNNEL:
 707		return IPSEC_MODE_TUNNEL;
 708	case XFRM_MODE_BEET:
 709		return IPSEC_MODE_BEET;
 710	default:
 711		return -1;
 712	}
 713}
 714
 715static inline int pfkey_mode_to_xfrm(int mode)
 716{
 717	switch(mode) {
 718	case IPSEC_MODE_ANY:	/*XXX*/
 719	case IPSEC_MODE_TRANSPORT:
 720		return XFRM_MODE_TRANSPORT;
 721	case IPSEC_MODE_TUNNEL:
 722		return XFRM_MODE_TUNNEL;
 723	case IPSEC_MODE_BEET:
 724		return XFRM_MODE_BEET;
 725	default:
 726		return -1;
 727	}
 728}
 729
 730static unsigned int pfkey_sockaddr_fill(const xfrm_address_t *xaddr, __be16 port,
 731					struct sockaddr *sa,
 732					unsigned short family)
 733{
 734	switch (family) {
 735	case AF_INET:
 736	    {
 737		struct sockaddr_in *sin = (struct sockaddr_in *)sa;
 738		sin->sin_family = AF_INET;
 739		sin->sin_port = port;
 740		sin->sin_addr.s_addr = xaddr->a4;
 741		memset(sin->sin_zero, 0, sizeof(sin->sin_zero));
 742		return 32;
 743	    }
 744#if IS_ENABLED(CONFIG_IPV6)
 745	case AF_INET6:
 746	    {
 747		struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sa;
 748		sin6->sin6_family = AF_INET6;
 749		sin6->sin6_port = port;
 750		sin6->sin6_flowinfo = 0;
 751		sin6->sin6_addr = xaddr->in6;
 752		sin6->sin6_scope_id = 0;
 753		return 128;
 754	    }
 755#endif
 756	}
 757	return 0;
 758}
 759
 760static unsigned int pfkey_sockaddr_fill_zero_tail(const xfrm_address_t *xaddr,
 761						  __be16 port,
 762						  struct sockaddr *sa,
 763						  unsigned short family)
 764{
 765	unsigned int prefixlen;
 766	int sockaddr_len = pfkey_sockaddr_len(family);
 767	int sockaddr_size = pfkey_sockaddr_size(family);
 768
 769	prefixlen = pfkey_sockaddr_fill(xaddr, port, sa, family);
 770	if (sockaddr_size > sockaddr_len)
 771		memset((u8 *)sa + sockaddr_len, 0, sockaddr_size - sockaddr_len);
 772
 773	return prefixlen;
 774}
 775
 776static struct sk_buff *__pfkey_xfrm_state2msg(const struct xfrm_state *x,
 777					      int add_keys, int hsc)
 778{
 779	struct sk_buff *skb;
 780	struct sadb_msg *hdr;
 781	struct sadb_sa *sa;
 782	struct sadb_lifetime *lifetime;
 783	struct sadb_address *addr;
 784	struct sadb_key *key;
 785	struct sadb_x_sa2 *sa2;
 786	struct sadb_x_sec_ctx *sec_ctx;
 787	struct xfrm_sec_ctx *xfrm_ctx;
 788	int ctx_size = 0;
 789	int size;
 790	int auth_key_size = 0;
 791	int encrypt_key_size = 0;
 792	int sockaddr_size;
 793	struct xfrm_encap_tmpl *natt = NULL;
 794	int mode;
 795
 796	/* address family check */
 797	sockaddr_size = pfkey_sockaddr_size(x->props.family);
 798	if (!sockaddr_size)
 799		return ERR_PTR(-EINVAL);
 800
 801	/* base, SA, (lifetime (HSC),) address(SD), (address(P),)
 802	   key(AE), (identity(SD),) (sensitivity)> */
 803	size = sizeof(struct sadb_msg) +sizeof(struct sadb_sa) +
 804		sizeof(struct sadb_lifetime) +
 805		((hsc & 1) ? sizeof(struct sadb_lifetime) : 0) +
 806		((hsc & 2) ? sizeof(struct sadb_lifetime) : 0) +
 807			sizeof(struct sadb_address)*2 +
 808				sockaddr_size*2 +
 809					sizeof(struct sadb_x_sa2);
 810
 811	if ((xfrm_ctx = x->security)) {
 812		ctx_size = PFKEY_ALIGN8(xfrm_ctx->ctx_len);
 813		size += sizeof(struct sadb_x_sec_ctx) + ctx_size;
 814	}
 815
 816	/* identity & sensitivity */
 817	if (!xfrm_addr_equal(&x->sel.saddr, &x->props.saddr, x->props.family))
 818		size += sizeof(struct sadb_address) + sockaddr_size;
 819
 820	if (add_keys) {
 821		if (x->aalg && x->aalg->alg_key_len) {
 822			auth_key_size =
 823				PFKEY_ALIGN8((x->aalg->alg_key_len + 7) / 8);
 824			size += sizeof(struct sadb_key) + auth_key_size;
 825		}
 826		if (x->ealg && x->ealg->alg_key_len) {
 827			encrypt_key_size =
 828				PFKEY_ALIGN8((x->ealg->alg_key_len+7) / 8);
 829			size += sizeof(struct sadb_key) + encrypt_key_size;
 830		}
 831	}
 832	if (x->encap)
 833		natt = x->encap;
 834
 835	if (natt && natt->encap_type) {
 836		size += sizeof(struct sadb_x_nat_t_type);
 837		size += sizeof(struct sadb_x_nat_t_port);
 838		size += sizeof(struct sadb_x_nat_t_port);
 839	}
 840
 841	skb =  alloc_skb(size + 16, GFP_ATOMIC);
 842	if (skb == NULL)
 843		return ERR_PTR(-ENOBUFS);
 844
 845	/* call should fill header later */
 846	hdr = skb_put(skb, sizeof(struct sadb_msg));
 847	memset(hdr, 0, size);	/* XXX do we need this ? */
 848	hdr->sadb_msg_len = size / sizeof(uint64_t);
 849
 850	/* sa */
 851	sa = skb_put(skb, sizeof(struct sadb_sa));
 852	sa->sadb_sa_len = sizeof(struct sadb_sa)/sizeof(uint64_t);
 853	sa->sadb_sa_exttype = SADB_EXT_SA;
 854	sa->sadb_sa_spi = x->id.spi;
 855	sa->sadb_sa_replay = x->props.replay_window;
 856	switch (x->km.state) {
 857	case XFRM_STATE_VALID:
 858		sa->sadb_sa_state = x->km.dying ?
 859			SADB_SASTATE_DYING : SADB_SASTATE_MATURE;
 860		break;
 861	case XFRM_STATE_ACQ:
 862		sa->sadb_sa_state = SADB_SASTATE_LARVAL;
 863		break;
 864	default:
 865		sa->sadb_sa_state = SADB_SASTATE_DEAD;
 866		break;
 867	}
 868	sa->sadb_sa_auth = 0;
 869	if (x->aalg) {
 870		struct xfrm_algo_desc *a = xfrm_aalg_get_byname(x->aalg->alg_name, 0);
 871		sa->sadb_sa_auth = (a && a->pfkey_supported) ?
 872					a->desc.sadb_alg_id : 0;
 873	}
 874	sa->sadb_sa_encrypt = 0;
 875	BUG_ON(x->ealg && x->calg);
 876	if (x->ealg) {
 877		struct xfrm_algo_desc *a = xfrm_ealg_get_byname(x->ealg->alg_name, 0);
 878		sa->sadb_sa_encrypt = (a && a->pfkey_supported) ?
 879					a->desc.sadb_alg_id : 0;
 880	}
 881	/* KAME compatible: sadb_sa_encrypt is overloaded with calg id */
 882	if (x->calg) {
 883		struct xfrm_algo_desc *a = xfrm_calg_get_byname(x->calg->alg_name, 0);
 884		sa->sadb_sa_encrypt = (a && a->pfkey_supported) ?
 885					a->desc.sadb_alg_id : 0;
 886	}
 887
 888	sa->sadb_sa_flags = 0;
 889	if (x->props.flags & XFRM_STATE_NOECN)
 890		sa->sadb_sa_flags |= SADB_SAFLAGS_NOECN;
 891	if (x->props.flags & XFRM_STATE_DECAP_DSCP)
 892		sa->sadb_sa_flags |= SADB_SAFLAGS_DECAP_DSCP;
 893	if (x->props.flags & XFRM_STATE_NOPMTUDISC)
 894		sa->sadb_sa_flags |= SADB_SAFLAGS_NOPMTUDISC;
 895
 896	/* hard time */
 897	if (hsc & 2) {
 898		lifetime = skb_put(skb, sizeof(struct sadb_lifetime));
 899		lifetime->sadb_lifetime_len =
 900			sizeof(struct sadb_lifetime)/sizeof(uint64_t);
 901		lifetime->sadb_lifetime_exttype = SADB_EXT_LIFETIME_HARD;
 902		lifetime->sadb_lifetime_allocations =  _X2KEY(x->lft.hard_packet_limit);
 903		lifetime->sadb_lifetime_bytes = _X2KEY(x->lft.hard_byte_limit);
 904		lifetime->sadb_lifetime_addtime = x->lft.hard_add_expires_seconds;
 905		lifetime->sadb_lifetime_usetime = x->lft.hard_use_expires_seconds;
 906	}
 907	/* soft time */
 908	if (hsc & 1) {
 909		lifetime = skb_put(skb, sizeof(struct sadb_lifetime));
 910		lifetime->sadb_lifetime_len =
 911			sizeof(struct sadb_lifetime)/sizeof(uint64_t);
 912		lifetime->sadb_lifetime_exttype = SADB_EXT_LIFETIME_SOFT;
 913		lifetime->sadb_lifetime_allocations =  _X2KEY(x->lft.soft_packet_limit);
 914		lifetime->sadb_lifetime_bytes = _X2KEY(x->lft.soft_byte_limit);
 915		lifetime->sadb_lifetime_addtime = x->lft.soft_add_expires_seconds;
 916		lifetime->sadb_lifetime_usetime = x->lft.soft_use_expires_seconds;
 917	}
 918	/* current time */
 919	lifetime = skb_put(skb, sizeof(struct sadb_lifetime));
 920	lifetime->sadb_lifetime_len =
 921		sizeof(struct sadb_lifetime)/sizeof(uint64_t);
 922	lifetime->sadb_lifetime_exttype = SADB_EXT_LIFETIME_CURRENT;
 923	lifetime->sadb_lifetime_allocations = x->curlft.packets;
 924	lifetime->sadb_lifetime_bytes = x->curlft.bytes;
 925	lifetime->sadb_lifetime_addtime = x->curlft.add_time;
 926	lifetime->sadb_lifetime_usetime = x->curlft.use_time;
 927	/* src address */
 928	addr = skb_put(skb, sizeof(struct sadb_address) + sockaddr_size);
 929	addr->sadb_address_len =
 930		(sizeof(struct sadb_address)+sockaddr_size)/
 931			sizeof(uint64_t);
 932	addr->sadb_address_exttype = SADB_EXT_ADDRESS_SRC;
 933	/* "if the ports are non-zero, then the sadb_address_proto field,
 934	   normally zero, MUST be filled in with the transport
 935	   protocol's number." - RFC2367 */
 936	addr->sadb_address_proto = 0;
 937	addr->sadb_address_reserved = 0;
 938
 939	addr->sadb_address_prefixlen =
 940		pfkey_sockaddr_fill(&x->props.saddr, 0,
 941				    (struct sockaddr *) (addr + 1),
 942				    x->props.family);
 943	BUG_ON(!addr->sadb_address_prefixlen);
 944
 945	/* dst address */
 946	addr = skb_put(skb, sizeof(struct sadb_address) + sockaddr_size);
 947	addr->sadb_address_len =
 948		(sizeof(struct sadb_address)+sockaddr_size)/
 949			sizeof(uint64_t);
 950	addr->sadb_address_exttype = SADB_EXT_ADDRESS_DST;
 951	addr->sadb_address_proto = 0;
 952	addr->sadb_address_reserved = 0;
 953
 954	addr->sadb_address_prefixlen =
 955		pfkey_sockaddr_fill(&x->id.daddr, 0,
 956				    (struct sockaddr *) (addr + 1),
 957				    x->props.family);
 958	BUG_ON(!addr->sadb_address_prefixlen);
 959
 960	if (!xfrm_addr_equal(&x->sel.saddr, &x->props.saddr,
 961			     x->props.family)) {
 962		addr = skb_put(skb,
 963			       sizeof(struct sadb_address) + sockaddr_size);
 964		addr->sadb_address_len =
 965			(sizeof(struct sadb_address)+sockaddr_size)/
 966			sizeof(uint64_t);
 967		addr->sadb_address_exttype = SADB_EXT_ADDRESS_PROXY;
 968		addr->sadb_address_proto =
 969			pfkey_proto_from_xfrm(x->sel.proto);
 970		addr->sadb_address_prefixlen = x->sel.prefixlen_s;
 971		addr->sadb_address_reserved = 0;
 972
 973		pfkey_sockaddr_fill(&x->sel.saddr, x->sel.sport,
 974				    (struct sockaddr *) (addr + 1),
 975				    x->props.family);
 976	}
 977
 978	/* auth key */
 979	if (add_keys && auth_key_size) {
 980		key = skb_put(skb, sizeof(struct sadb_key) + auth_key_size);
 981		key->sadb_key_len = (sizeof(struct sadb_key) + auth_key_size) /
 982			sizeof(uint64_t);
 983		key->sadb_key_exttype = SADB_EXT_KEY_AUTH;
 984		key->sadb_key_bits = x->aalg->alg_key_len;
 985		key->sadb_key_reserved = 0;
 986		memcpy(key + 1, x->aalg->alg_key, (x->aalg->alg_key_len+7)/8);
 987	}
 988	/* encrypt key */
 989	if (add_keys && encrypt_key_size) {
 990		key = skb_put(skb, sizeof(struct sadb_key) + encrypt_key_size);
 991		key->sadb_key_len = (sizeof(struct sadb_key) +
 992				     encrypt_key_size) / sizeof(uint64_t);
 993		key->sadb_key_exttype = SADB_EXT_KEY_ENCRYPT;
 994		key->sadb_key_bits = x->ealg->alg_key_len;
 995		key->sadb_key_reserved = 0;
 996		memcpy(key + 1, x->ealg->alg_key,
 997		       (x->ealg->alg_key_len+7)/8);
 998	}
 999
1000	/* sa */
1001	sa2 = skb_put(skb, sizeof(struct sadb_x_sa2));
1002	sa2->sadb_x_sa2_len = sizeof(struct sadb_x_sa2)/sizeof(uint64_t);
1003	sa2->sadb_x_sa2_exttype = SADB_X_EXT_SA2;
1004	if ((mode = pfkey_mode_from_xfrm(x->props.mode)) < 0) {
1005		kfree_skb(skb);
1006		return ERR_PTR(-EINVAL);
1007	}
1008	sa2->sadb_x_sa2_mode = mode;
1009	sa2->sadb_x_sa2_reserved1 = 0;
1010	sa2->sadb_x_sa2_reserved2 = 0;
1011	sa2->sadb_x_sa2_sequence = 0;
1012	sa2->sadb_x_sa2_reqid = x->props.reqid;
1013
1014	if (natt && natt->encap_type) {
1015		struct sadb_x_nat_t_type *n_type;
1016		struct sadb_x_nat_t_port *n_port;
1017
1018		/* type */
1019		n_type = skb_put(skb, sizeof(*n_type));
1020		n_type->sadb_x_nat_t_type_len = sizeof(*n_type)/sizeof(uint64_t);
1021		n_type->sadb_x_nat_t_type_exttype = SADB_X_EXT_NAT_T_TYPE;
1022		n_type->sadb_x_nat_t_type_type = natt->encap_type;
1023		n_type->sadb_x_nat_t_type_reserved[0] = 0;
1024		n_type->sadb_x_nat_t_type_reserved[1] = 0;
1025		n_type->sadb_x_nat_t_type_reserved[2] = 0;
1026
1027		/* source port */
1028		n_port = skb_put(skb, sizeof(*n_port));
1029		n_port->sadb_x_nat_t_port_len = sizeof(*n_port)/sizeof(uint64_t);
1030		n_port->sadb_x_nat_t_port_exttype = SADB_X_EXT_NAT_T_SPORT;
1031		n_port->sadb_x_nat_t_port_port = natt->encap_sport;
1032		n_port->sadb_x_nat_t_port_reserved = 0;
1033
1034		/* dest port */
1035		n_port = skb_put(skb, sizeof(*n_port));
1036		n_port->sadb_x_nat_t_port_len = sizeof(*n_port)/sizeof(uint64_t);
1037		n_port->sadb_x_nat_t_port_exttype = SADB_X_EXT_NAT_T_DPORT;
1038		n_port->sadb_x_nat_t_port_port = natt->encap_dport;
1039		n_port->sadb_x_nat_t_port_reserved = 0;
1040	}
1041
1042	/* security context */
1043	if (xfrm_ctx) {
1044		sec_ctx = skb_put(skb,
1045				  sizeof(struct sadb_x_sec_ctx) + ctx_size);
1046		sec_ctx->sadb_x_sec_len =
1047		  (sizeof(struct sadb_x_sec_ctx) + ctx_size) / sizeof(uint64_t);
1048		sec_ctx->sadb_x_sec_exttype = SADB_X_EXT_SEC_CTX;
1049		sec_ctx->sadb_x_ctx_doi = xfrm_ctx->ctx_doi;
1050		sec_ctx->sadb_x_ctx_alg = xfrm_ctx->ctx_alg;
1051		sec_ctx->sadb_x_ctx_len = xfrm_ctx->ctx_len;
1052		memcpy(sec_ctx + 1, xfrm_ctx->ctx_str,
1053		       xfrm_ctx->ctx_len);
1054	}
1055
1056	return skb;
1057}
1058
1059
1060static inline struct sk_buff *pfkey_xfrm_state2msg(const struct xfrm_state *x)
1061{
1062	struct sk_buff *skb;
1063
1064	skb = __pfkey_xfrm_state2msg(x, 1, 3);
1065
1066	return skb;
1067}
1068
1069static inline struct sk_buff *pfkey_xfrm_state2msg_expire(const struct xfrm_state *x,
1070							  int hsc)
1071{
1072	return __pfkey_xfrm_state2msg(x, 0, hsc);
1073}
1074
1075static struct xfrm_state * pfkey_msg2xfrm_state(struct net *net,
1076						const struct sadb_msg *hdr,
1077						void * const *ext_hdrs)
1078{
1079	struct xfrm_state *x;
1080	const struct sadb_lifetime *lifetime;
1081	const struct sadb_sa *sa;
1082	const struct sadb_key *key;
1083	const struct sadb_x_sec_ctx *sec_ctx;
1084	uint16_t proto;
1085	int err;
1086
1087
1088	sa = ext_hdrs[SADB_EXT_SA - 1];
1089	if (!sa ||
1090	    !present_and_same_family(ext_hdrs[SADB_EXT_ADDRESS_SRC-1],
1091				     ext_hdrs[SADB_EXT_ADDRESS_DST-1]))
1092		return ERR_PTR(-EINVAL);
1093	if (hdr->sadb_msg_satype == SADB_SATYPE_ESP &&
1094	    !ext_hdrs[SADB_EXT_KEY_ENCRYPT-1])
1095		return ERR_PTR(-EINVAL);
1096	if (hdr->sadb_msg_satype == SADB_SATYPE_AH &&
1097	    !ext_hdrs[SADB_EXT_KEY_AUTH-1])
1098		return ERR_PTR(-EINVAL);
1099	if (!!ext_hdrs[SADB_EXT_LIFETIME_HARD-1] !=
1100	    !!ext_hdrs[SADB_EXT_LIFETIME_SOFT-1])
1101		return ERR_PTR(-EINVAL);
1102
1103	proto = pfkey_satype2proto(hdr->sadb_msg_satype);
1104	if (proto == 0)
1105		return ERR_PTR(-EINVAL);
1106
1107	/* default error is no buffer space */
1108	err = -ENOBUFS;
1109
1110	/* RFC2367:
1111
1112   Only SADB_SASTATE_MATURE SAs may be submitted in an SADB_ADD message.
1113   SADB_SASTATE_LARVAL SAs are created by SADB_GETSPI and it is not
1114   sensible to add a new SA in the DYING or SADB_SASTATE_DEAD state.
1115   Therefore, the sadb_sa_state field of all submitted SAs MUST be
1116   SADB_SASTATE_MATURE and the kernel MUST return an error if this is
1117   not true.
1118
1119	   However, KAME setkey always uses SADB_SASTATE_LARVAL.
1120	   Hence, we have to _ignore_ sadb_sa_state, which is also reasonable.
1121	 */
1122	if (sa->sadb_sa_auth > SADB_AALG_MAX ||
1123	    (hdr->sadb_msg_satype == SADB_X_SATYPE_IPCOMP &&
1124	     sa->sadb_sa_encrypt > SADB_X_CALG_MAX) ||
1125	    sa->sadb_sa_encrypt > SADB_EALG_MAX)
1126		return ERR_PTR(-EINVAL);
1127	key = ext_hdrs[SADB_EXT_KEY_AUTH - 1];
1128	if (key != NULL &&
1129	    sa->sadb_sa_auth != SADB_X_AALG_NULL &&
1130	    key->sadb_key_bits == 0)
1131		return ERR_PTR(-EINVAL);
1132	key = ext_hdrs[SADB_EXT_KEY_ENCRYPT-1];
1133	if (key != NULL &&
1134	    sa->sadb_sa_encrypt != SADB_EALG_NULL &&
1135	    key->sadb_key_bits == 0)
1136		return ERR_PTR(-EINVAL);
1137
1138	x = xfrm_state_alloc(net);
1139	if (x == NULL)
1140		return ERR_PTR(-ENOBUFS);
1141
1142	x->id.proto = proto;
1143	x->id.spi = sa->sadb_sa_spi;
1144	x->props.replay_window = min_t(unsigned int, sa->sadb_sa_replay,
1145					(sizeof(x->replay.bitmap) * 8));
1146	if (sa->sadb_sa_flags & SADB_SAFLAGS_NOECN)
1147		x->props.flags |= XFRM_STATE_NOECN;
1148	if (sa->sadb_sa_flags & SADB_SAFLAGS_DECAP_DSCP)
1149		x->props.flags |= XFRM_STATE_DECAP_DSCP;
1150	if (sa->sadb_sa_flags & SADB_SAFLAGS_NOPMTUDISC)
1151		x->props.flags |= XFRM_STATE_NOPMTUDISC;
1152
1153	lifetime = ext_hdrs[SADB_EXT_LIFETIME_HARD - 1];
1154	if (lifetime != NULL) {
1155		x->lft.hard_packet_limit = _KEY2X(lifetime->sadb_lifetime_allocations);
1156		x->lft.hard_byte_limit = _KEY2X(lifetime->sadb_lifetime_bytes);
1157		x->lft.hard_add_expires_seconds = lifetime->sadb_lifetime_addtime;
1158		x->lft.hard_use_expires_seconds = lifetime->sadb_lifetime_usetime;
1159	}
1160	lifetime = ext_hdrs[SADB_EXT_LIFETIME_SOFT - 1];
1161	if (lifetime != NULL) {
1162		x->lft.soft_packet_limit = _KEY2X(lifetime->sadb_lifetime_allocations);
1163		x->lft.soft_byte_limit = _KEY2X(lifetime->sadb_lifetime_bytes);
1164		x->lft.soft_add_expires_seconds = lifetime->sadb_lifetime_addtime;
1165		x->lft.soft_use_expires_seconds = lifetime->sadb_lifetime_usetime;
1166	}
1167
1168	sec_ctx = ext_hdrs[SADB_X_EXT_SEC_CTX - 1];
1169	if (sec_ctx != NULL) {
1170		struct xfrm_user_sec_ctx *uctx = pfkey_sadb2xfrm_user_sec_ctx(sec_ctx, GFP_KERNEL);
1171
1172		if (!uctx)
1173			goto out;
1174
1175		err = security_xfrm_state_alloc(x, uctx);
1176		kfree(uctx);
1177
1178		if (err)
1179			goto out;
1180	}
1181
1182	err = -ENOBUFS;
1183	key = ext_hdrs[SADB_EXT_KEY_AUTH - 1];
1184	if (sa->sadb_sa_auth) {
1185		int keysize = 0;
1186		struct xfrm_algo_desc *a = xfrm_aalg_get_byid(sa->sadb_sa_auth);
1187		if (!a || !a->pfkey_supported) {
1188			err = -ENOSYS;
1189			goto out;
1190		}
1191		if (key)
1192			keysize = (key->sadb_key_bits + 7) / 8;
1193		x->aalg = kmalloc(sizeof(*x->aalg) + keysize, GFP_KERNEL);
1194		if (!x->aalg) {
1195			err = -ENOMEM;
1196			goto out;
1197		}
1198		strcpy(x->aalg->alg_name, a->name);
1199		x->aalg->alg_key_len = 0;
1200		if (key) {
1201			x->aalg->alg_key_len = key->sadb_key_bits;
1202			memcpy(x->aalg->alg_key, key+1, keysize);
1203		}
1204		x->aalg->alg_trunc_len = a->uinfo.auth.icv_truncbits;
1205		x->props.aalgo = sa->sadb_sa_auth;
1206		/* x->algo.flags = sa->sadb_sa_flags; */
1207	}
1208	if (sa->sadb_sa_encrypt) {
1209		if (hdr->sadb_msg_satype == SADB_X_SATYPE_IPCOMP) {
1210			struct xfrm_algo_desc *a = xfrm_calg_get_byid(sa->sadb_sa_encrypt);
1211			if (!a || !a->pfkey_supported) {
1212				err = -ENOSYS;
1213				goto out;
1214			}
1215			x->calg = kmalloc(sizeof(*x->calg), GFP_KERNEL);
1216			if (!x->calg) {
1217				err = -ENOMEM;
1218				goto out;
1219			}
1220			strcpy(x->calg->alg_name, a->name);
1221			x->props.calgo = sa->sadb_sa_encrypt;
1222		} else {
1223			int keysize = 0;
1224			struct xfrm_algo_desc *a = xfrm_ealg_get_byid(sa->sadb_sa_encrypt);
1225			if (!a || !a->pfkey_supported) {
1226				err = -ENOSYS;
1227				goto out;
1228			}
1229			key = (struct sadb_key*) ext_hdrs[SADB_EXT_KEY_ENCRYPT-1];
1230			if (key)
1231				keysize = (key->sadb_key_bits + 7) / 8;
1232			x->ealg = kmalloc(sizeof(*x->ealg) + keysize, GFP_KERNEL);
1233			if (!x->ealg) {
1234				err = -ENOMEM;
1235				goto out;
1236			}
1237			strcpy(x->ealg->alg_name, a->name);
1238			x->ealg->alg_key_len = 0;
1239			if (key) {
1240				x->ealg->alg_key_len = key->sadb_key_bits;
1241				memcpy(x->ealg->alg_key, key+1, keysize);
1242			}
1243			x->props.ealgo = sa->sadb_sa_encrypt;
1244			x->geniv = a->uinfo.encr.geniv;
1245		}
1246	}
1247	/* x->algo.flags = sa->sadb_sa_flags; */
1248
1249	x->props.family = pfkey_sadb_addr2xfrm_addr((struct sadb_address *) ext_hdrs[SADB_EXT_ADDRESS_SRC-1],
1250						    &x->props.saddr);
1251	pfkey_sadb_addr2xfrm_addr((struct sadb_address *) ext_hdrs[SADB_EXT_ADDRESS_DST-1],
1252				  &x->id.daddr);
1253
1254	if (ext_hdrs[SADB_X_EXT_SA2-1]) {
1255		const struct sadb_x_sa2 *sa2 = ext_hdrs[SADB_X_EXT_SA2-1];
1256		int mode = pfkey_mode_to_xfrm(sa2->sadb_x_sa2_mode);
1257		if (mode < 0) {
1258			err = -EINVAL;
1259			goto out;
1260		}
1261		x->props.mode = mode;
1262		x->props.reqid = sa2->sadb_x_sa2_reqid;
1263	}
1264
1265	if (ext_hdrs[SADB_EXT_ADDRESS_PROXY-1]) {
1266		const struct sadb_address *addr = ext_hdrs[SADB_EXT_ADDRESS_PROXY-1];
1267
1268		/* Nobody uses this, but we try. */
1269		x->sel.family = pfkey_sadb_addr2xfrm_addr(addr, &x->sel.saddr);
1270		x->sel.prefixlen_s = addr->sadb_address_prefixlen;
1271	}
1272
1273	if (!x->sel.family)
1274		x->sel.family = x->props.family;
1275
1276	if (ext_hdrs[SADB_X_EXT_NAT_T_TYPE-1]) {
1277		const struct sadb_x_nat_t_type* n_type;
1278		struct xfrm_encap_tmpl *natt;
1279
1280		x->encap = kzalloc(sizeof(*x->encap), GFP_KERNEL);
1281		if (!x->encap) {
1282			err = -ENOMEM;
1283			goto out;
1284		}
1285
1286		natt = x->encap;
1287		n_type = ext_hdrs[SADB_X_EXT_NAT_T_TYPE-1];
1288		natt->encap_type = n_type->sadb_x_nat_t_type_type;
1289
1290		if (ext_hdrs[SADB_X_EXT_NAT_T_SPORT-1]) {
1291			const struct sadb_x_nat_t_port *n_port =
1292				ext_hdrs[SADB_X_EXT_NAT_T_SPORT-1];
1293			natt->encap_sport = n_port->sadb_x_nat_t_port_port;
1294		}
1295		if (ext_hdrs[SADB_X_EXT_NAT_T_DPORT-1]) {
1296			const struct sadb_x_nat_t_port *n_port =
1297				ext_hdrs[SADB_X_EXT_NAT_T_DPORT-1];
1298			natt->encap_dport = n_port->sadb_x_nat_t_port_port;
1299		}
1300	}
1301
1302	err = xfrm_init_state(x);
1303	if (err)
1304		goto out;
1305
1306	x->km.seq = hdr->sadb_msg_seq;
1307	return x;
1308
1309out:
1310	x->km.state = XFRM_STATE_DEAD;
1311	xfrm_state_put(x);
1312	return ERR_PTR(err);
1313}
1314
1315static int pfkey_reserved(struct sock *sk, struct sk_buff *skb, const struct sadb_msg *hdr, void * const *ext_hdrs)
1316{
1317	return -EOPNOTSUPP;
1318}
1319
1320static int pfkey_getspi(struct sock *sk, struct sk_buff *skb, const struct sadb_msg *hdr, void * const *ext_hdrs)
1321{
1322	struct net *net = sock_net(sk);
1323	struct sk_buff *resp_skb;
1324	struct sadb_x_sa2 *sa2;
1325	struct sadb_address *saddr, *daddr;
1326	struct sadb_msg *out_hdr;
1327	struct sadb_spirange *range;
1328	struct xfrm_state *x = NULL;
1329	int mode;
1330	int err;
1331	u32 min_spi, max_spi;
1332	u32 reqid;
1333	u8 proto;
1334	unsigned short family;
1335	xfrm_address_t *xsaddr = NULL, *xdaddr = NULL;
1336
1337	if (!present_and_same_family(ext_hdrs[SADB_EXT_ADDRESS_SRC-1],
1338				     ext_hdrs[SADB_EXT_ADDRESS_DST-1]))
1339		return -EINVAL;
1340
1341	proto = pfkey_satype2proto(hdr->sadb_msg_satype);
1342	if (proto == 0)
1343		return -EINVAL;
1344
1345	if ((sa2 = ext_hdrs[SADB_X_EXT_SA2-1]) != NULL) {
1346		mode = pfkey_mode_to_xfrm(sa2->sadb_x_sa2_mode);
1347		if (mode < 0)
1348			return -EINVAL;
1349		reqid = sa2->sadb_x_sa2_reqid;
1350	} else {
1351		mode = 0;
1352		reqid = 0;
1353	}
1354
1355	saddr = ext_hdrs[SADB_EXT_ADDRESS_SRC-1];
1356	daddr = ext_hdrs[SADB_EXT_ADDRESS_DST-1];
1357
1358	family = ((struct sockaddr *)(saddr + 1))->sa_family;
1359	switch (family) {
1360	case AF_INET:
1361		xdaddr = (xfrm_address_t *)&((struct sockaddr_in *)(daddr + 1))->sin_addr.s_addr;
1362		xsaddr = (xfrm_address_t *)&((struct sockaddr_in *)(saddr + 1))->sin_addr.s_addr;
1363		break;
1364#if IS_ENABLED(CONFIG_IPV6)
1365	case AF_INET6:
1366		xdaddr = (xfrm_address_t *)&((struct sockaddr_in6 *)(daddr + 1))->sin6_addr;
1367		xsaddr = (xfrm_address_t *)&((struct sockaddr_in6 *)(saddr + 1))->sin6_addr;
1368		break;
1369#endif
1370	}
1371
1372	if (hdr->sadb_msg_seq) {
1373		x = xfrm_find_acq_byseq(net, DUMMY_MARK, hdr->sadb_msg_seq, UINT_MAX);
1374		if (x && !xfrm_addr_equal(&x->id.daddr, xdaddr, family)) {
1375			xfrm_state_put(x);
1376			x = NULL;
1377		}
1378	}
1379
1380	if (!x)
1381		x = xfrm_find_acq(net, &dummy_mark, mode, reqid, 0, UINT_MAX,
1382				  proto, xdaddr, xsaddr, 1, family);
1383
1384	if (x == NULL)
1385		return -ENOENT;
1386
1387	min_spi = 0x100;
1388	max_spi = 0x0fffffff;
1389
1390	range = ext_hdrs[SADB_EXT_SPIRANGE-1];
1391	if (range) {
1392		min_spi = range->sadb_spirange_min;
1393		max_spi = range->sadb_spirange_max;
1394	}
1395
1396	err = verify_spi_info(x->id.proto, min_spi, max_spi, NULL);
1397	if (err) {
1398		xfrm_state_put(x);
1399		return err;
1400	}
1401
1402	err = xfrm_alloc_spi(x, min_spi, max_spi, NULL);
1403	resp_skb = err ? ERR_PTR(err) : pfkey_xfrm_state2msg(x);
1404
1405	if (IS_ERR(resp_skb)) {
1406		xfrm_state_put(x);
1407		return  PTR_ERR(resp_skb);
1408	}
1409
1410	out_hdr = (struct sadb_msg *) resp_skb->data;
1411	out_hdr->sadb_msg_version = hdr->sadb_msg_version;
1412	out_hdr->sadb_msg_type = SADB_GETSPI;
1413	out_hdr->sadb_msg_satype = pfkey_proto2satype(proto);
1414	out_hdr->sadb_msg_errno = 0;
1415	out_hdr->sadb_msg_reserved = 0;
1416	out_hdr->sadb_msg_seq = hdr->sadb_msg_seq;
1417	out_hdr->sadb_msg_pid = hdr->sadb_msg_pid;
1418
1419	xfrm_state_put(x);
1420
1421	pfkey_broadcast(resp_skb, GFP_KERNEL, BROADCAST_ONE, sk, net);
1422
1423	return 0;
1424}
1425
1426static int pfkey_acquire(struct sock *sk, struct sk_buff *skb, const struct sadb_msg *hdr, void * const *ext_hdrs)
1427{
1428	struct net *net = sock_net(sk);
1429	struct xfrm_state *x;
1430
1431	if (hdr->sadb_msg_len != sizeof(struct sadb_msg)/8)
1432		return -EOPNOTSUPP;
1433
1434	if (hdr->sadb_msg_seq == 0 || hdr->sadb_msg_errno == 0)
1435		return 0;
1436
1437	x = xfrm_find_acq_byseq(net, DUMMY_MARK, hdr->sadb_msg_seq, UINT_MAX);
1438	if (x == NULL)
1439		return 0;
1440
1441	spin_lock_bh(&x->lock);
1442	if (x->km.state == XFRM_STATE_ACQ)
1443		x->km.state = XFRM_STATE_ERROR;
1444
1445	spin_unlock_bh(&x->lock);
1446	xfrm_state_put(x);
1447	return 0;
1448}
1449
1450static inline int event2poltype(int event)
1451{
1452	switch (event) {
1453	case XFRM_MSG_DELPOLICY:
1454		return SADB_X_SPDDELETE;
1455	case XFRM_MSG_NEWPOLICY:
1456		return SADB_X_SPDADD;
1457	case XFRM_MSG_UPDPOLICY:
1458		return SADB_X_SPDUPDATE;
1459	case XFRM_MSG_POLEXPIRE:
1460	//	return SADB_X_SPDEXPIRE;
1461	default:
1462		pr_err("pfkey: Unknown policy event %d\n", event);
1463		break;
1464	}
1465
1466	return 0;
1467}
1468
1469static inline int event2keytype(int event)
1470{
1471	switch (event) {
1472	case XFRM_MSG_DELSA:
1473		return SADB_DELETE;
1474	case XFRM_MSG_NEWSA:
1475		return SADB_ADD;
1476	case XFRM_MSG_UPDSA:
1477		return SADB_UPDATE;
1478	case XFRM_MSG_EXPIRE:
1479		return SADB_EXPIRE;
1480	default:
1481		pr_err("pfkey: Unknown SA event %d\n", event);
1482		break;
1483	}
1484
1485	return 0;
1486}
1487
1488/* ADD/UPD/DEL */
1489static int key_notify_sa(struct xfrm_state *x, const struct km_event *c)
1490{
1491	struct sk_buff *skb;
1492	struct sadb_msg *hdr;
1493
1494	skb = pfkey_xfrm_state2msg(x);
1495
1496	if (IS_ERR(skb))
1497		return PTR_ERR(skb);
1498
1499	hdr = (struct sadb_msg *) skb->data;
1500	hdr->sadb_msg_version = PF_KEY_V2;
1501	hdr->sadb_msg_type = event2keytype(c->event);
1502	hdr->sadb_msg_satype = pfkey_proto2satype(x->id.proto);
1503	hdr->sadb_msg_errno = 0;
1504	hdr->sadb_msg_reserved = 0;
1505	hdr->sadb_msg_seq = c->seq;
1506	hdr->sadb_msg_pid = c->portid;
1507
1508	pfkey_broadcast(skb, GFP_ATOMIC, BROADCAST_ALL, NULL, xs_net(x));
1509
1510	return 0;
1511}
1512
1513static int pfkey_add(struct sock *sk, struct sk_buff *skb, const struct sadb_msg *hdr, void * const *ext_hdrs)
1514{
1515	struct net *net = sock_net(sk);
1516	struct xfrm_state *x;
1517	int err;
1518	struct km_event c;
1519
1520	x = pfkey_msg2xfrm_state(net, hdr, ext_hdrs);
1521	if (IS_ERR(x))
1522		return PTR_ERR(x);
1523
1524	xfrm_state_hold(x);
1525	if (hdr->sadb_msg_type == SADB_ADD)
1526		err = xfrm_state_add(x);
1527	else
1528		err = xfrm_state_update(x);
1529
1530	xfrm_audit_state_add(x, err ? 0 : 1, true);
1531
1532	if (err < 0) {
1533		x->km.state = XFRM_STATE_DEAD;
1534		__xfrm_state_put(x);
1535		goto out;
1536	}
1537
1538	if (hdr->sadb_msg_type == SADB_ADD)
1539		c.event = XFRM_MSG_NEWSA;
1540	else
1541		c.event = XFRM_MSG_UPDSA;
1542	c.seq = hdr->sadb_msg_seq;
1543	c.portid = hdr->sadb_msg_pid;
1544	km_state_notify(x, &c);
1545out:
1546	xfrm_state_put(x);
1547	return err;
1548}
1549
1550static int pfkey_delete(struct sock *sk, struct sk_buff *skb, const struct sadb_msg *hdr, void * const *ext_hdrs)
1551{
1552	struct net *net = sock_net(sk);
1553	struct xfrm_state *x;
1554	struct km_event c;
1555	int err;
1556
1557	if (!ext_hdrs[SADB_EXT_SA-1] ||
1558	    !present_and_same_family(ext_hdrs[SADB_EXT_ADDRESS_SRC-1],
1559				     ext_hdrs[SADB_EXT_ADDRESS_DST-1]))
1560		return -EINVAL;
1561
1562	x = pfkey_xfrm_state_lookup(net, hdr, ext_hdrs);
1563	if (x == NULL)
1564		return -ESRCH;
1565
1566	if ((err = security_xfrm_state_delete(x)))
1567		goto out;
1568
1569	if (xfrm_state_kern(x)) {
1570		err = -EPERM;
1571		goto out;
1572	}
1573
1574	err = xfrm_state_delete(x);
1575
1576	if (err < 0)
1577		goto out;
1578
1579	c.seq = hdr->sadb_msg_seq;
1580	c.portid = hdr->sadb_msg_pid;
1581	c.event = XFRM_MSG_DELSA;
1582	km_state_notify(x, &c);
1583out:
1584	xfrm_audit_state_delete(x, err ? 0 : 1, true);
1585	xfrm_state_put(x);
1586
1587	return err;
1588}
1589
1590static int pfkey_get(struct sock *sk, struct sk_buff *skb, const struct sadb_msg *hdr, void * const *ext_hdrs)
1591{
1592	struct net *net = sock_net(sk);
1593	__u8 proto;
1594	struct sk_buff *out_skb;
1595	struct sadb_msg *out_hdr;
1596	struct xfrm_state *x;
1597
1598	if (!ext_hdrs[SADB_EXT_SA-1] ||
1599	    !present_and_same_family(ext_hdrs[SADB_EXT_ADDRESS_SRC-1],
1600				     ext_hdrs[SADB_EXT_ADDRESS_DST-1]))
1601		return -EINVAL;
1602
1603	x = pfkey_xfrm_state_lookup(net, hdr, ext_hdrs);
1604	if (x == NULL)
1605		return -ESRCH;
1606
1607	out_skb = pfkey_xfrm_state2msg(x);
1608	proto = x->id.proto;
1609	xfrm_state_put(x);
1610	if (IS_ERR(out_skb))
1611		return  PTR_ERR(out_skb);
1612
1613	out_hdr = (struct sadb_msg *) out_skb->data;
1614	out_hdr->sadb_msg_version = hdr->sadb_msg_version;
1615	out_hdr->sadb_msg_type = SADB_GET;
1616	out_hdr->sadb_msg_satype = pfkey_proto2satype(proto);
1617	out_hdr->sadb_msg_errno = 0;
1618	out_hdr->sadb_msg_reserved = 0;
1619	out_hdr->sadb_msg_seq = hdr->sadb_msg_seq;
1620	out_hdr->sadb_msg_pid = hdr->sadb_msg_pid;
1621	pfkey_broadcast(out_skb, GFP_ATOMIC, BROADCAST_ONE, sk, sock_net(sk));
1622
1623	return 0;
1624}
1625
1626static struct sk_buff *compose_sadb_supported(const struct sadb_msg *orig,
1627					      gfp_t allocation)
1628{
1629	struct sk_buff *skb;
1630	struct sadb_msg *hdr;
1631	int len, auth_len, enc_len, i;
1632
1633	auth_len = xfrm_count_pfkey_auth_supported();
1634	if (auth_len) {
1635		auth_len *= sizeof(struct sadb_alg);
1636		auth_len += sizeof(struct sadb_supported);
1637	}
1638
1639	enc_len = xfrm_count_pfkey_enc_supported();
1640	if (enc_len) {
1641		enc_len *= sizeof(struct sadb_alg);
1642		enc_len += sizeof(struct sadb_supported);
1643	}
1644
1645	len = enc_len + auth_len + sizeof(struct sadb_msg);
1646
1647	skb = alloc_skb(len + 16, allocation);
1648	if (!skb)
1649		goto out_put_algs;
1650
1651	hdr = skb_put(skb, sizeof(*hdr));
1652	pfkey_hdr_dup(hdr, orig);
1653	hdr->sadb_msg_errno = 0;
1654	hdr->sadb_msg_len = len / sizeof(uint64_t);
1655
1656	if (auth_len) {
1657		struct sadb_supported *sp;
1658		struct sadb_alg *ap;
1659
1660		sp = skb_put(skb, auth_len);
1661		ap = (struct sadb_alg *) (sp + 1);
1662
1663		sp->sadb_supported_len = auth_len / sizeof(uint64_t);
1664		sp->sadb_supported_exttype = SADB_EXT_SUPPORTED_AUTH;
1665
1666		for (i = 0; ; i++) {
1667			struct xfrm_algo_desc *aalg = xfrm_aalg_get_byidx(i);
1668			if (!aalg)
1669				break;
1670			if (!aalg->pfkey_supported)
1671				continue;
1672			if (aalg->available)
1673				*ap++ = aalg->desc;
1674		}
1675	}
1676
1677	if (enc_len) {
1678		struct sadb_supported *sp;
1679		struct sadb_alg *ap;
1680
1681		sp = skb_put(skb, enc_len);
1682		ap = (struct sadb_alg *) (sp + 1);
1683
1684		sp->sadb_supported_len = enc_len / sizeof(uint64_t);
1685		sp->sadb_supported_exttype = SADB_EXT_SUPPORTED_ENCRYPT;
1686
1687		for (i = 0; ; i++) {
1688			struct xfrm_algo_desc *ealg = xfrm_ealg_get_byidx(i);
1689			if (!ealg)
1690				break;
1691			if (!ealg->pfkey_supported)
1692				continue;
1693			if (ealg->available)
1694				*ap++ = ealg->desc;
1695		}
1696	}
1697
1698out_put_algs:
1699	return skb;
1700}
1701
1702static int pfkey_register(struct sock *sk, struct sk_buff *skb, const struct sadb_msg *hdr, void * const *ext_hdrs)
1703{
1704	struct pfkey_sock *pfk = pfkey_sk(sk);
1705	struct sk_buff *supp_skb;
1706
1707	if (hdr->sadb_msg_satype > SADB_SATYPE_MAX)
1708		return -EINVAL;
1709
1710	if (hdr->sadb_msg_satype != SADB_SATYPE_UNSPEC) {
1711		if (pfk->registered&(1<<hdr->sadb_msg_satype))
1712			return -EEXIST;
1713		pfk->registered |= (1<<hdr->sadb_msg_satype);
1714	}
1715
1716	mutex_lock(&pfkey_mutex);
1717	xfrm_probe_algs();
1718
1719	supp_skb = compose_sadb_supported(hdr, GFP_KERNEL | __GFP_ZERO);
1720	mutex_unlock(&pfkey_mutex);
1721
1722	if (!supp_skb) {
1723		if (hdr->sadb_msg_satype != SADB_SATYPE_UNSPEC)
1724			pfk->registered &= ~(1<<hdr->sadb_msg_satype);
1725
1726		return -ENOBUFS;
1727	}
1728
1729	pfkey_broadcast(supp_skb, GFP_KERNEL, BROADCAST_REGISTERED, sk,
1730			sock_net(sk));
1731	return 0;
1732}
1733
1734static int unicast_flush_resp(struct sock *sk, const struct sadb_msg *ihdr)
1735{
1736	struct sk_buff *skb;
1737	struct sadb_msg *hdr;
1738
1739	skb = alloc_skb(sizeof(struct sadb_msg) + 16, GFP_ATOMIC);
1740	if (!skb)
1741		return -ENOBUFS;
1742
1743	hdr = skb_put_data(skb, ihdr, sizeof(struct sadb_msg));
1744	hdr->sadb_msg_errno = (uint8_t) 0;
1745	hdr->sadb_msg_len = (sizeof(struct sadb_msg) / sizeof(uint64_t));
1746
1747	return pfkey_broadcast(skb, GFP_ATOMIC, BROADCAST_ONE, sk,
1748			       sock_net(sk));
1749}
1750
1751static int key_notify_sa_flush(const struct km_event *c)
1752{
1753	struct sk_buff *skb;
1754	struct sadb_msg *hdr;
1755
1756	skb = alloc_skb(sizeof(struct sadb_msg) + 16, GFP_ATOMIC);
1757	if (!skb)
1758		return -ENOBUFS;
1759	hdr = skb_put(skb, sizeof(struct sadb_msg));
1760	hdr->sadb_msg_satype = pfkey_proto2satype(c->data.proto);
1761	hdr->sadb_msg_type = SADB_FLUSH;
1762	hdr->sadb_msg_seq = c->seq;
1763	hdr->sadb_msg_pid = c->portid;
1764	hdr->sadb_msg_version = PF_KEY_V2;
1765	hdr->sadb_msg_errno = (uint8_t) 0;
1766	hdr->sadb_msg_len = (sizeof(struct sadb_msg) / sizeof(uint64_t));
1767	hdr->sadb_msg_reserved = 0;
1768
1769	pfkey_broadcast(skb, GFP_ATOMIC, BROADCAST_ALL, NULL, c->net);
1770
1771	return 0;
1772}
1773
1774static int pfkey_flush(struct sock *sk, struct sk_buff *skb, const struct sadb_msg *hdr, void * const *ext_hdrs)
1775{
1776	struct net *net = sock_net(sk);
1777	unsigned int proto;
1778	struct km_event c;
1779	int err, err2;
1780
1781	proto = pfkey_satype2proto(hdr->sadb_msg_satype);
1782	if (proto == 0)
1783		return -EINVAL;
1784
1785	err = xfrm_state_flush(net, proto, true);
1786	err2 = unicast_flush_resp(sk, hdr);
1787	if (err || err2) {
1788		if (err == -ESRCH) /* empty table - go quietly */
1789			err = 0;
1790		return err ? err : err2;
1791	}
1792
1793	c.data.proto = proto;
1794	c.seq = hdr->sadb_msg_seq;
1795	c.portid = hdr->sadb_msg_pid;
1796	c.event = XFRM_MSG_FLUSHSA;
1797	c.net = net;
1798	km_state_notify(NULL, &c);
1799
1800	return 0;
1801}
1802
1803static int dump_sa(struct xfrm_state *x, int count, void *ptr)
1804{
1805	struct pfkey_sock *pfk = ptr;
1806	struct sk_buff *out_skb;
1807	struct sadb_msg *out_hdr;
1808
1809	if (!pfkey_can_dump(&pfk->sk))
1810		return -ENOBUFS;
1811
1812	out_skb = pfkey_xfrm_state2msg(x);
1813	if (IS_ERR(out_skb))
1814		return PTR_ERR(out_skb);
1815
1816	out_hdr = (struct sadb_msg *) out_skb->data;
1817	out_hdr->sadb_msg_version = pfk->dump.msg_version;
1818	out_hdr->sadb_msg_type = SADB_DUMP;
1819	out_hdr->sadb_msg_satype = pfkey_proto2satype(x->id.proto);
1820	out_hdr->sadb_msg_errno = 0;
1821	out_hdr->sadb_msg_reserved = 0;
1822	out_hdr->sadb_msg_seq = count + 1;
1823	out_hdr->sadb_msg_pid = pfk->dump.msg_portid;
1824
1825	if (pfk->dump.skb)
1826		pfkey_broadcast(pfk->dump.skb, GFP_ATOMIC, BROADCAST_ONE,
1827				&pfk->sk, sock_net(&pfk->sk));
1828	pfk->dump.skb = out_skb;
1829
1830	return 0;
1831}
1832
1833static int pfkey_dump_sa(struct pfkey_sock *pfk)
1834{
1835	struct net *net = sock_net(&pfk->sk);
1836	return xfrm_state_walk(net, &pfk->dump.u.state, dump_sa, (void *) pfk);
1837}
1838
1839static void pfkey_dump_sa_done(struct pfkey_sock *pfk)
1840{
1841	struct net *net = sock_net(&pfk->sk);
1842
1843	xfrm_state_walk_done(&pfk->dump.u.state, net);
1844}
1845
1846static int pfkey_dump(struct sock *sk, struct sk_buff *skb, const struct sadb_msg *hdr, void * const *ext_hdrs)
1847{
1848	u8 proto;
1849	struct xfrm_address_filter *filter = NULL;
1850	struct pfkey_sock *pfk = pfkey_sk(sk);
1851
1852	mutex_lock(&pfk->dump_lock);
1853	if (pfk->dump.dump != NULL) {
1854		mutex_unlock(&pfk->dump_lock);
1855		return -EBUSY;
1856	}
1857
1858	proto = pfkey_satype2proto(hdr->sadb_msg_satype);
1859	if (proto == 0) {
1860		mutex_unlock(&pfk->dump_lock);
1861		return -EINVAL;
1862	}
1863
1864	if (ext_hdrs[SADB_X_EXT_FILTER - 1]) {
1865		struct sadb_x_filter *xfilter = ext_hdrs[SADB_X_EXT_FILTER - 1];
1866
1867		if ((xfilter->sadb_x_filter_splen >
1868			(sizeof(xfrm_address_t) << 3)) ||
1869		    (xfilter->sadb_x_filter_dplen >
1870			(sizeof(xfrm_address_t) << 3))) {
1871			mutex_unlock(&pfk->dump_lock);
1872			return -EINVAL;
1873		}
1874		filter = kmalloc(sizeof(*filter), GFP_KERNEL);
1875		if (filter == NULL) {
1876			mutex_unlock(&pfk->dump_lock);
1877			return -ENOMEM;
1878		}
1879
1880		memcpy(&filter->saddr, &xfilter->sadb_x_filter_saddr,
1881		       sizeof(xfrm_address_t));
1882		memcpy(&filter->daddr, &xfilter->sadb_x_filter_daddr,
1883		       sizeof(xfrm_address_t));
1884		filter->family = xfilter->sadb_x_filter_family;
1885		filter->splen = xfilter->sadb_x_filter_splen;
1886		filter->dplen = xfilter->sadb_x_filter_dplen;
1887	}
1888
1889	pfk->dump.msg_version = hdr->sadb_msg_version;
1890	pfk->dump.msg_portid = hdr->sadb_msg_pid;
1891	pfk->dump.dump = pfkey_dump_sa;
1892	pfk->dump.done = pfkey_dump_sa_done;
1893	xfrm_state_walk_init(&pfk->dump.u.state, proto, filter);
1894	mutex_unlock(&pfk->dump_lock);
1895
1896	return pfkey_do_dump(pfk);
1897}
1898
1899static int pfkey_promisc(struct sock *sk, struct sk_buff *skb, const struct sadb_msg *hdr, void * const *ext_hdrs)
1900{
1901	struct pfkey_sock *pfk = pfkey_sk(sk);
1902	int satype = hdr->sadb_msg_satype;
1903	bool reset_errno = false;
1904
1905	if (hdr->sadb_msg_len == (sizeof(*hdr) / sizeof(uint64_t))) {
1906		reset_errno = true;
1907		if (satype != 0 && satype != 1)
1908			return -EINVAL;
1909		pfk->promisc = satype;
1910	}
1911	if (reset_errno && skb_cloned(skb))
1912		skb = skb_copy(skb, GFP_KERNEL);
1913	else
1914		skb = skb_clone(skb, GFP_KERNEL);
1915
1916	if (reset_errno && skb) {
1917		struct sadb_msg *new_hdr = (struct sadb_msg *) skb->data;
1918		new_hdr->sadb_msg_errno = 0;
1919	}
1920
1921	pfkey_broadcast(skb, GFP_KERNEL, BROADCAST_ALL, NULL, sock_net(sk));
1922	return 0;
1923}
1924
1925static int check_reqid(struct xfrm_policy *xp, int dir, int count, void *ptr)
1926{
1927	int i;
1928	u32 reqid = *(u32*)ptr;
1929
1930	for (i=0; i<xp->xfrm_nr; i++) {
1931		if (xp->xfrm_vec[i].reqid == reqid)
1932			return -EEXIST;
1933	}
1934	return 0;
1935}
1936
1937static u32 gen_reqid(struct net *net)
1938{
1939	struct xfrm_policy_walk walk;
1940	u32 start;
1941	int rc;
1942	static u32 reqid = IPSEC_MANUAL_REQID_MAX;
1943
1944	start = reqid;
1945	do {
1946		++reqid;
1947		if (reqid == 0)
1948			reqid = IPSEC_MANUAL_REQID_MAX+1;
1949		xfrm_policy_walk_init(&walk, XFRM_POLICY_TYPE_MAIN);
1950		rc = xfrm_policy_walk(net, &walk, check_reqid, (void*)&reqid);
1951		xfrm_policy_walk_done(&walk, net);
1952		if (rc != -EEXIST)
1953			return reqid;
1954	} while (reqid != start);
1955	return 0;
1956}
1957
1958static int
1959parse_ipsecrequest(struct xfrm_policy *xp, struct sadb_x_policy *pol,
1960		   struct sadb_x_ipsecrequest *rq)
1961{
1962	struct net *net = xp_net(xp);
1963	struct xfrm_tmpl *t = xp->xfrm_vec + xp->xfrm_nr;
1964	int mode;
1965
1966	if (xp->xfrm_nr >= XFRM_MAX_DEPTH)
1967		return -ELOOP;
1968
1969	if (rq->sadb_x_ipsecrequest_mode == 0)
1970		return -EINVAL;
1971	if (!xfrm_id_proto_valid(rq->sadb_x_ipsecrequest_proto))
1972		return -EINVAL;
1973
1974	t->id.proto = rq->sadb_x_ipsecrequest_proto;
1975	if ((mode = pfkey_mode_to_xfrm(rq->sadb_x_ipsecrequest_mode)) < 0)
1976		return -EINVAL;
1977	t->mode = mode;
1978	if (rq->sadb_x_ipsecrequest_level == IPSEC_LEVEL_USE) {
1979		if ((mode == XFRM_MODE_TUNNEL || mode == XFRM_MODE_BEET) &&
1980		    pol->sadb_x_policy_dir == IPSEC_DIR_OUTBOUND)
1981			return -EINVAL;
1982		t->optional = 1;
1983	} else if (rq->sadb_x_ipsecrequest_level == IPSEC_LEVEL_UNIQUE) {
1984		t->reqid = rq->sadb_x_ipsecrequest_reqid;
1985		if (t->reqid > IPSEC_MANUAL_REQID_MAX)
1986			t->reqid = 0;
1987		if (!t->reqid && !(t->reqid = gen_reqid(net)))
1988			return -ENOBUFS;
1989	}
1990
1991	/* addresses present only in tunnel mode */
1992	if (t->mode == XFRM_MODE_TUNNEL) {
1993		int err;
1994
1995		err = parse_sockaddr_pair(
1996			(struct sockaddr *)(rq + 1),
1997			rq->sadb_x_ipsecrequest_len - sizeof(*rq),
1998			&t->saddr, &t->id.daddr, &t->encap_family);
1999		if (err)
2000			return err;
2001	} else
2002		t->encap_family = xp->family;
2003
2004	/* No way to set this via kame pfkey */
2005	t->allalgs = 1;
2006	xp->xfrm_nr++;
2007	return 0;
2008}
2009
2010static int
2011parse_ipsecrequests(struct xfrm_policy *xp, struct sadb_x_policy *pol)
2012{
2013	int err;
2014	int len = pol->sadb_x_policy_len*8 - sizeof(struct sadb_x_policy);
2015	struct sadb_x_ipsecrequest *rq = (void*)(pol+1);
2016
2017	if (pol->sadb_x_policy_len * 8 < sizeof(struct sadb_x_policy))
2018		return -EINVAL;
2019
2020	while (len >= sizeof(*rq)) {
2021		if (len < rq->sadb_x_ipsecrequest_len ||
2022		    rq->sadb_x_ipsecrequest_len < sizeof(*rq))
2023			return -EINVAL;
2024
2025		if ((err = parse_ipsecrequest(xp, pol, rq)) < 0)
2026			return err;
2027		len -= rq->sadb_x_ipsecrequest_len;
2028		rq = (void*)((u8*)rq + rq->sadb_x_ipsecrequest_len);
2029	}
2030	return 0;
2031}
2032
2033static inline int pfkey_xfrm_policy2sec_ctx_size(const struct xfrm_policy *xp)
2034{
2035	struct xfrm_sec_ctx *xfrm_ctx = xp->security;
2036
2037	if (xfrm_ctx) {
2038		int len = sizeof(struct sadb_x_sec_ctx);
2039		len += xfrm_ctx->ctx_len;
2040		return PFKEY_ALIGN8(len);
2041	}
2042	return 0;
2043}
2044
2045static int pfkey_xfrm_policy2msg_size(const struct xfrm_policy *xp)
2046{
2047	const struct xfrm_tmpl *t;
2048	int sockaddr_size = pfkey_sockaddr_size(xp->family);
2049	int socklen = 0;
2050	int i;
2051
2052	for (i=0; i<xp->xfrm_nr; i++) {
2053		t = xp->xfrm_vec + i;
2054		socklen += pfkey_sockaddr_len(t->encap_family);
2055	}
2056
2057	return sizeof(struct sadb_msg) +
2058		(sizeof(struct sadb_lifetime) * 3) +
2059		(sizeof(struct sadb_address) * 2) +
2060		(sockaddr_size * 2) +
2061		sizeof(struct sadb_x_policy) +
2062		(xp->xfrm_nr * sizeof(struct sadb_x_ipsecrequest)) +
2063		(socklen * 2) +
2064		pfkey_xfrm_policy2sec_ctx_size(xp);
2065}
2066
2067static struct sk_buff * pfkey_xfrm_policy2msg_prep(const struct xfrm_policy *xp)
2068{
2069	struct sk_buff *skb;
2070	int size;
2071
2072	size = pfkey_xfrm_policy2msg_size(xp);
2073
2074	skb =  alloc_skb(size + 16, GFP_ATOMIC);
2075	if (skb == NULL)
2076		return ERR_PTR(-ENOBUFS);
2077
2078	return skb;
2079}
2080
2081static int pfkey_xfrm_policy2msg(struct sk_buff *skb, const struct xfrm_policy *xp, int dir)
2082{
2083	struct sadb_msg *hdr;
2084	struct sadb_address *addr;
2085	struct sadb_lifetime *lifetime;
2086	struct sadb_x_policy *pol;
2087	struct sadb_x_sec_ctx *sec_ctx;
2088	struct xfrm_sec_ctx *xfrm_ctx;
2089	int i;
2090	int size;
2091	int sockaddr_size = pfkey_sockaddr_size(xp->family);
2092	int socklen = pfkey_sockaddr_len(xp->family);
2093
2094	size = pfkey_xfrm_policy2msg_size(xp);
2095
2096	/* call should fill header later */
2097	hdr = skb_put(skb, sizeof(struct sadb_msg));
2098	memset(hdr, 0, size);	/* XXX do we need this ? */
2099
2100	/* src address */
2101	addr = skb_put(skb, sizeof(struct sadb_address) + sockaddr_size);
2102	addr->sadb_address_len =
2103		(sizeof(struct sadb_address)+sockaddr_size)/
2104			sizeof(uint64_t);
2105	addr->sadb_address_exttype = SADB_EXT_ADDRESS_SRC;
2106	addr->sadb_address_proto = pfkey_proto_from_xfrm(xp->selector.proto);
2107	addr->sadb_address_prefixlen = xp->selector.prefixlen_s;
2108	addr->sadb_address_reserved = 0;
2109	if (!pfkey_sockaddr_fill(&xp->selector.saddr,
2110				 xp->selector.sport,
2111				 (struct sockaddr *) (addr + 1),
2112				 xp->family))
2113		BUG();
2114
2115	/* dst address */
2116	addr = skb_put(skb, sizeof(struct sadb_address) + sockaddr_size);
2117	addr->sadb_address_len =
2118		(sizeof(struct sadb_address)+sockaddr_size)/
2119			sizeof(uint64_t);
2120	addr->sadb_address_exttype = SADB_EXT_ADDRESS_DST;
2121	addr->sadb_address_proto = pfkey_proto_from_xfrm(xp->selector.proto);
2122	addr->sadb_address_prefixlen = xp->selector.prefixlen_d;
2123	addr->sadb_address_reserved = 0;
2124
2125	pfkey_sockaddr_fill(&xp->selector.daddr, xp->selector.dport,
2126			    (struct sockaddr *) (addr + 1),
2127			    xp->family);
2128
2129	/* hard time */
2130	lifetime = skb_put(skb, sizeof(struct sadb_lifetime));
2131	lifetime->sadb_lifetime_len =
2132		sizeof(struct sadb_lifetime)/sizeof(uint64_t);
2133	lifetime->sadb_lifetime_exttype = SADB_EXT_LIFETIME_HARD;
2134	lifetime->sadb_lifetime_allocations =  _X2KEY(xp->lft.hard_packet_limit);
2135	lifetime->sadb_lifetime_bytes = _X2KEY(xp->lft.hard_byte_limit);
2136	lifetime->sadb_lifetime_addtime = xp->lft.hard_add_expires_seconds;
2137	lifetime->sadb_lifetime_usetime = xp->lft.hard_use_expires_seconds;
2138	/* soft time */
2139	lifetime = skb_put(skb, sizeof(struct sadb_lifetime));
2140	lifetime->sadb_lifetime_len =
2141		sizeof(struct sadb_lifetime)/sizeof(uint64_t);
2142	lifetime->sadb_lifetime_exttype = SADB_EXT_LIFETIME_SOFT;
2143	lifetime->sadb_lifetime_allocations =  _X2KEY(xp->lft.soft_packet_limit);
2144	lifetime->sadb_lifetime_bytes = _X2KEY(xp->lft.soft_byte_limit);
2145	lifetime->sadb_lifetime_addtime = xp->lft.soft_add_expires_seconds;
2146	lifetime->sadb_lifetime_usetime = xp->lft.soft_use_expires_seconds;
2147	/* current time */
2148	lifetime = skb_put(skb, sizeof(struct sadb_lifetime));
2149	lifetime->sadb_lifetime_len =
2150		sizeof(struct sadb_lifetime)/sizeof(uint64_t);
2151	lifetime->sadb_lifetime_exttype = SADB_EXT_LIFETIME_CURRENT;
2152	lifetime->sadb_lifetime_allocations = xp->curlft.packets;
2153	lifetime->sadb_lifetime_bytes = xp->curlft.bytes;
2154	lifetime->sadb_lifetime_addtime = xp->curlft.add_time;
2155	lifetime->sadb_lifetime_usetime = xp->curlft.use_time;
2156
2157	pol = skb_put(skb, sizeof(struct sadb_x_policy));
2158	pol->sadb_x_policy_len = sizeof(struct sadb_x_policy)/sizeof(uint64_t);
2159	pol->sadb_x_policy_exttype = SADB_X_EXT_POLICY;
2160	pol->sadb_x_policy_type = IPSEC_POLICY_DISCARD;
2161	if (xp->action == XFRM_POLICY_ALLOW) {
2162		if (xp->xfrm_nr)
2163			pol->sadb_x_policy_type = IPSEC_POLICY_IPSEC;
2164		else
2165			pol->sadb_x_policy_type = IPSEC_POLICY_NONE;
2166	}
2167	pol->sadb_x_policy_dir = dir+1;
2168	pol->sadb_x_policy_reserved = 0;
2169	pol->sadb_x_policy_id = xp->index;
2170	pol->sadb_x_policy_priority = xp->priority;
2171
2172	for (i=0; i<xp->xfrm_nr; i++) {
2173		const struct xfrm_tmpl *t = xp->xfrm_vec + i;
2174		struct sadb_x_ipsecrequest *rq;
2175		int req_size;
2176		int mode;
2177
2178		req_size = sizeof(struct sadb_x_ipsecrequest);
2179		if (t->mode == XFRM_MODE_TUNNEL) {
2180			socklen = pfkey_sockaddr_len(t->encap_family);
2181			req_size += socklen * 2;
2182		} else {
2183			size -= 2*socklen;
2184		}
2185		rq = skb_put(skb, req_size);
2186		pol->sadb_x_policy_len += req_size/8;
2187		memset(rq, 0, sizeof(*rq));
2188		rq->sadb_x_ipsecrequest_len = req_size;
2189		rq->sadb_x_ipsecrequest_proto = t->id.proto;
2190		if ((mode = pfkey_mode_from_xfrm(t->mode)) < 0)
2191			return -EINVAL;
2192		rq->sadb_x_ipsecrequest_mode = mode;
2193		rq->sadb_x_ipsecrequest_level = IPSEC_LEVEL_REQUIRE;
2194		if (t->reqid)
2195			rq->sadb_x_ipsecrequest_level = IPSEC_LEVEL_UNIQUE;
2196		if (t->optional)
2197			rq->sadb_x_ipsecrequest_level = IPSEC_LEVEL_USE;
2198		rq->sadb_x_ipsecrequest_reqid = t->reqid;
2199
2200		if (t->mode == XFRM_MODE_TUNNEL) {
2201			u8 *sa = (void *)(rq + 1);
2202			pfkey_sockaddr_fill(&t->saddr, 0,
2203					    (struct sockaddr *)sa,
2204					    t->encap_family);
2205			pfkey_sockaddr_fill(&t->id.daddr, 0,
2206					    (struct sockaddr *) (sa + socklen),
2207					    t->encap_family);
2208		}
2209	}
2210
2211	/* security context */
2212	if ((xfrm_ctx = xp->security)) {
2213		int ctx_size = pfkey_xfrm_policy2sec_ctx_size(xp);
2214
2215		sec_ctx = skb_put(skb, ctx_size);
2216		sec_ctx->sadb_x_sec_len = ctx_size / sizeof(uint64_t);
2217		sec_ctx->sadb_x_sec_exttype = SADB_X_EXT_SEC_CTX;
2218		sec_ctx->sadb_x_ctx_doi = xfrm_ctx->ctx_doi;
2219		sec_ctx->sadb_x_ctx_alg = xfrm_ctx->ctx_alg;
2220		sec_ctx->sadb_x_ctx_len = xfrm_ctx->ctx_len;
2221		memcpy(sec_ctx + 1, xfrm_ctx->ctx_str,
2222		       xfrm_ctx->ctx_len);
2223	}
2224
2225	hdr->sadb_msg_len = size / sizeof(uint64_t);
2226	hdr->sadb_msg_reserved = refcount_read(&xp->refcnt);
2227
2228	return 0;
2229}
2230
2231static int key_notify_policy(struct xfrm_policy *xp, int dir, const struct km_event *c)
2232{
2233	struct sk_buff *out_skb;
2234	struct sadb_msg *out_hdr;
2235	int err;
2236
2237	out_skb = pfkey_xfrm_policy2msg_prep(xp);
2238	if (IS_ERR(out_skb))
2239		return PTR_ERR(out_skb);
2240
2241	err = pfkey_xfrm_policy2msg(out_skb, xp, dir);
2242	if (err < 0) {
2243		kfree_skb(out_skb);
2244		return err;
2245	}
2246
2247	out_hdr = (struct sadb_msg *) out_skb->data;
2248	out_hdr->sadb_msg_version = PF_KEY_V2;
2249
2250	if (c->data.byid && c->event == XFRM_MSG_DELPOLICY)
2251		out_hdr->sadb_msg_type = SADB_X_SPDDELETE2;
2252	else
2253		out_hdr->sadb_msg_type = event2poltype(c->event);
2254	out_hdr->sadb_msg_errno = 0;
2255	out_hdr->sadb_msg_seq = c->seq;
2256	out_hdr->sadb_msg_pid = c->portid;
2257	pfkey_broadcast(out_skb, GFP_ATOMIC, BROADCAST_ALL, NULL, xp_net(xp));
2258	return 0;
2259
2260}
2261
2262static int pfkey_spdadd(struct sock *sk, struct sk_buff *skb, const struct sadb_msg *hdr, void * const *ext_hdrs)
2263{
2264	struct net *net = sock_net(sk);
2265	int err = 0;
2266	struct sadb_lifetime *lifetime;
2267	struct sadb_address *sa;
2268	struct sadb_x_policy *pol;
2269	struct xfrm_policy *xp;
2270	struct km_event c;
2271	struct sadb_x_sec_ctx *sec_ctx;
2272
2273	if (!present_and_same_family(ext_hdrs[SADB_EXT_ADDRESS_SRC-1],
2274				     ext_hdrs[SADB_EXT_ADDRESS_DST-1]) ||
2275	    !ext_hdrs[SADB_X_EXT_POLICY-1])
2276		return -EINVAL;
2277
2278	pol = ext_hdrs[SADB_X_EXT_POLICY-1];
2279	if (pol->sadb_x_policy_type > IPSEC_POLICY_IPSEC)
2280		return -EINVAL;
2281	if (!pol->sadb_x_policy_dir || pol->sadb_x_policy_dir >= IPSEC_DIR_MAX)
2282		return -EINVAL;
2283
2284	xp = xfrm_policy_alloc(net, GFP_KERNEL);
2285	if (xp == NULL)
2286		return -ENOBUFS;
2287
2288	xp->action = (pol->sadb_x_policy_type == IPSEC_POLICY_DISCARD ?
2289		      XFRM_POLICY_BLOCK : XFRM_POLICY_ALLOW);
2290	xp->priority = pol->sadb_x_policy_priority;
2291
2292	sa = ext_hdrs[SADB_EXT_ADDRESS_SRC-1];
2293	xp->family = pfkey_sadb_addr2xfrm_addr(sa, &xp->selector.saddr);
2294	xp->selector.family = xp->family;
2295	xp->selector.prefixlen_s = sa->sadb_address_prefixlen;
2296	xp->selector.proto = pfkey_proto_to_xfrm(sa->sadb_address_proto);
2297	xp->selector.sport = ((struct sockaddr_in *)(sa+1))->sin_port;
2298	if (xp->selector.sport)
2299		xp->selector.sport_mask = htons(0xffff);
2300
2301	sa = ext_hdrs[SADB_EXT_ADDRESS_DST-1];
2302	pfkey_sadb_addr2xfrm_addr(sa, &xp->selector.daddr);
2303	xp->selector.prefixlen_d = sa->sadb_address_prefixlen;
2304
2305	/* Amusing, we set this twice.  KAME apps appear to set same value
2306	 * in both addresses.
2307	 */
2308	xp->selector.proto = pfkey_proto_to_xfrm(sa->sadb_address_proto);
2309
2310	xp->selector.dport = ((struct sockaddr_in *)(sa+1))->sin_port;
2311	if (xp->selector.dport)
2312		xp->selector.dport_mask = htons(0xffff);
2313
2314	sec_ctx = ext_hdrs[SADB_X_EXT_SEC_CTX - 1];
2315	if (sec_ctx != NULL) {
2316		struct xfrm_user_sec_ctx *uctx = pfkey_sadb2xfrm_user_sec_ctx(sec_ctx, GFP_KERNEL);
2317
2318		if (!uctx) {
2319			err = -ENOBUFS;
2320			goto out;
2321		}
2322
2323		err = security_xfrm_policy_alloc(&xp->security, uctx, GFP_KERNEL);
2324		kfree(uctx);
2325
2326		if (err)
2327			goto out;
2328	}
2329
2330	xp->lft.soft_byte_limit = XFRM_INF;
2331	xp->lft.hard_byte_limit = XFRM_INF;
2332	xp->lft.soft_packet_limit = XFRM_INF;
2333	xp->lft.hard_packet_limit = XFRM_INF;
2334	if ((lifetime = ext_hdrs[SADB_EXT_LIFETIME_HARD-1]) != NULL) {
2335		xp->lft.hard_packet_limit = _KEY2X(lifetime->sadb_lifetime_allocations);
2336		xp->lft.hard_byte_limit = _KEY2X(lifetime->sadb_lifetime_bytes);
2337		xp->lft.hard_add_expires_seconds = lifetime->sadb_lifetime_addtime;
2338		xp->lft.hard_use_expires_seconds = lifetime->sadb_lifetime_usetime;
2339	}
2340	if ((lifetime = ext_hdrs[SADB_EXT_LIFETIME_SOFT-1]) != NULL) {
2341		xp->lft.soft_packet_limit = _KEY2X(lifetime->sadb_lifetime_allocations);
2342		xp->lft.soft_byte_limit = _KEY2X(lifetime->sadb_lifetime_bytes);
2343		xp->lft.soft_add_expires_seconds = lifetime->sadb_lifetime_addtime;
2344		xp->lft.soft_use_expires_seconds = lifetime->sadb_lifetime_usetime;
2345	}
2346	xp->xfrm_nr = 0;
2347	if (pol->sadb_x_policy_type == IPSEC_POLICY_IPSEC &&
2348	    (err = parse_ipsecrequests(xp, pol)) < 0)
2349		goto out;
2350
2351	err = xfrm_policy_insert(pol->sadb_x_policy_dir-1, xp,
2352				 hdr->sadb_msg_type != SADB_X_SPDUPDATE);
2353
2354	xfrm_audit_policy_add(xp, err ? 0 : 1, true);
2355
2356	if (err)
2357		goto out;
2358
2359	if (hdr->sadb_msg_type == SADB_X_SPDUPDATE)
2360		c.event = XFRM_MSG_UPDPOLICY;
2361	else
2362		c.event = XFRM_MSG_NEWPOLICY;
2363
2364	c.seq = hdr->sadb_msg_seq;
2365	c.portid = hdr->sadb_msg_pid;
2366
2367	km_policy_notify(xp, pol->sadb_x_policy_dir-1, &c);
2368	xfrm_pol_put(xp);
2369	return 0;
2370
2371out:
2372	xp->walk.dead = 1;
2373	xfrm_policy_destroy(xp);
2374	return err;
2375}
2376
2377static int pfkey_spddelete(struct sock *sk, struct sk_buff *skb, const struct sadb_msg *hdr, void * const *ext_hdrs)
2378{
2379	struct net *net = sock_net(sk);
2380	int err;
2381	struct sadb_address *sa;
2382	struct sadb_x_policy *pol;
2383	struct xfrm_policy *xp;
2384	struct xfrm_selector sel;
2385	struct km_event c;
2386	struct sadb_x_sec_ctx *sec_ctx;
2387	struct xfrm_sec_ctx *pol_ctx = NULL;
2388
2389	if (!present_and_same_family(ext_hdrs[SADB_EXT_ADDRESS_SRC-1],
2390				     ext_hdrs[SADB_EXT_ADDRESS_DST-1]) ||
2391	    !ext_hdrs[SADB_X_EXT_POLICY-1])
2392		return -EINVAL;
2393
2394	pol = ext_hdrs[SADB_X_EXT_POLICY-1];
2395	if (!pol->sadb_x_policy_dir || pol->sadb_x_policy_dir >= IPSEC_DIR_MAX)
2396		return -EINVAL;
2397
2398	memset(&sel, 0, sizeof(sel));
2399
2400	sa = ext_hdrs[SADB_EXT_ADDRESS_SRC-1];
2401	sel.family = pfkey_sadb_addr2xfrm_addr(sa, &sel.saddr);
2402	sel.prefixlen_s = sa->sadb_address_prefixlen;
2403	sel.proto = pfkey_proto_to_xfrm(sa->sadb_address_proto);
2404	sel.sport = ((struct sockaddr_in *)(sa+1))->sin_port;
2405	if (sel.sport)
2406		sel.sport_mask = htons(0xffff);
2407
2408	sa = ext_hdrs[SADB_EXT_ADDRESS_DST-1];
2409	pfkey_sadb_addr2xfrm_addr(sa, &sel.daddr);
2410	sel.prefixlen_d = sa->sadb_address_prefixlen;
2411	sel.proto = pfkey_proto_to_xfrm(sa->sadb_address_proto);
2412	sel.dport = ((struct sockaddr_in *)(sa+1))->sin_port;
2413	if (sel.dport)
2414		sel.dport_mask = htons(0xffff);
2415
2416	sec_ctx = ext_hdrs[SADB_X_EXT_SEC_CTX - 1];
2417	if (sec_ctx != NULL) {
2418		struct xfrm_user_sec_ctx *uctx = pfkey_sadb2xfrm_user_sec_ctx(sec_ctx, GFP_KERNEL);
2419
2420		if (!uctx)
2421			return -ENOMEM;
2422
2423		err = security_xfrm_policy_alloc(&pol_ctx, uctx, GFP_KERNEL);
2424		kfree(uctx);
2425		if (err)
2426			return err;
2427	}
2428
2429	xp = xfrm_policy_bysel_ctx(net, &dummy_mark, 0, XFRM_POLICY_TYPE_MAIN,
2430				   pol->sadb_x_policy_dir - 1, &sel, pol_ctx,
2431				   1, &err);
2432	security_xfrm_policy_free(pol_ctx);
2433	if (xp == NULL)
2434		return -ENOENT;
2435
2436	xfrm_audit_policy_delete(xp, err ? 0 : 1, true);
2437
2438	if (err)
2439		goto out;
2440
2441	c.seq = hdr->sadb_msg_seq;
2442	c.portid = hdr->sadb_msg_pid;
2443	c.data.byid = 0;
2444	c.event = XFRM_MSG_DELPOLICY;
2445	km_policy_notify(xp, pol->sadb_x_policy_dir-1, &c);
2446
2447out:
2448	xfrm_pol_put(xp);
2449	return err;
2450}
2451
2452static int key_pol_get_resp(struct sock *sk, struct xfrm_policy *xp, const struct sadb_msg *hdr, int dir)
2453{
2454	int err;
2455	struct sk_buff *out_skb;
2456	struct sadb_msg *out_hdr;
2457	err = 0;
2458
2459	out_skb = pfkey_xfrm_policy2msg_prep(xp);
2460	if (IS_ERR(out_skb)) {
2461		err =  PTR_ERR(out_skb);
2462		goto out;
2463	}
2464	err = pfkey_xfrm_policy2msg(out_skb, xp, dir);
2465	if (err < 0) {
2466		kfree_skb(out_skb);
2467		goto out;
2468	}
2469
2470	out_hdr = (struct sadb_msg *) out_skb->data;
2471	out_hdr->sadb_msg_version = hdr->sadb_msg_version;
2472	out_hdr->sadb_msg_type = hdr->sadb_msg_type;
2473	out_hdr->sadb_msg_satype = 0;
2474	out_hdr->sadb_msg_errno = 0;
2475	out_hdr->sadb_msg_seq = hdr->sadb_msg_seq;
2476	out_hdr->sadb_msg_pid = hdr->sadb_msg_pid;
2477	pfkey_broadcast(out_skb, GFP_ATOMIC, BROADCAST_ONE, sk, xp_net(xp));
2478	err = 0;
2479
2480out:
2481	return err;
2482}
2483
2484static int pfkey_sockaddr_pair_size(sa_family_t family)
2485{
2486	return PFKEY_ALIGN8(pfkey_sockaddr_len(family) * 2);
2487}
2488
2489static int parse_sockaddr_pair(struct sockaddr *sa, int ext_len,
2490			       xfrm_address_t *saddr, xfrm_address_t *daddr,
2491			       u16 *family)
2492{
2493	int af, socklen;
2494
2495	if (ext_len < 2 || ext_len < pfkey_sockaddr_pair_size(sa->sa_family))
2496		return -EINVAL;
2497
2498	af = pfkey_sockaddr_extract(sa, saddr);
2499	if (!af)
2500		return -EINVAL;
2501
2502	socklen = pfkey_sockaddr_len(af);
2503	if (pfkey_sockaddr_extract((struct sockaddr *) (((u8 *)sa) + socklen),
2504				   daddr) != af)
2505		return -EINVAL;
2506
2507	*family = af;
2508	return 0;
2509}
2510
2511#ifdef CONFIG_NET_KEY_MIGRATE
2512static int ipsecrequests_to_migrate(struct sadb_x_ipsecrequest *rq1, int len,
2513				    struct xfrm_migrate *m)
2514{
2515	int err;
2516	struct sadb_x_ipsecrequest *rq2;
2517	int mode;
2518
2519	if (len < sizeof(*rq1) ||
2520	    len < rq1->sadb_x_ipsecrequest_len ||
2521	    rq1->sadb_x_ipsecrequest_len < sizeof(*rq1))
2522		return -EINVAL;
2523
2524	/* old endoints */
2525	err = parse_sockaddr_pair((struct sockaddr *)(rq1 + 1),
2526				  rq1->sadb_x_ipsecrequest_len - sizeof(*rq1),
2527				  &m->old_saddr, &m->old_daddr,
2528				  &m->old_family);
2529	if (err)
2530		return err;
2531
2532	rq2 = (struct sadb_x_ipsecrequest *)((u8 *)rq1 + rq1->sadb_x_ipsecrequest_len);
2533	len -= rq1->sadb_x_ipsecrequest_len;
2534
2535	if (len <= sizeof(*rq2) ||
2536	    len < rq2->sadb_x_ipsecrequest_len ||
2537	    rq2->sadb_x_ipsecrequest_len < sizeof(*rq2))
2538		return -EINVAL;
2539
2540	/* new endpoints */
2541	err = parse_sockaddr_pair((struct sockaddr *)(rq2 + 1),
2542				  rq2->sadb_x_ipsecrequest_len - sizeof(*rq2),
2543				  &m->new_saddr, &m->new_daddr,
2544				  &m->new_family);
2545	if (err)
2546		return err;
2547
2548	if (rq1->sadb_x_ipsecrequest_proto != rq2->sadb_x_ipsecrequest_proto ||
2549	    rq1->sadb_x_ipsecrequest_mode != rq2->sadb_x_ipsecrequest_mode ||
2550	    rq1->sadb_x_ipsecrequest_reqid != rq2->sadb_x_ipsecrequest_reqid)
2551		return -EINVAL;
2552
2553	m->proto = rq1->sadb_x_ipsecrequest_proto;
2554	if ((mode = pfkey_mode_to_xfrm(rq1->sadb_x_ipsecrequest_mode)) < 0)
2555		return -EINVAL;
2556	m->mode = mode;
2557	m->reqid = rq1->sadb_x_ipsecrequest_reqid;
2558
2559	return ((int)(rq1->sadb_x_ipsecrequest_len +
2560		      rq2->sadb_x_ipsecrequest_len));
2561}
2562
2563static int pfkey_migrate(struct sock *sk, struct sk_buff *skb,
2564			 const struct sadb_msg *hdr, void * const *ext_hdrs)
2565{
2566	int i, len, ret, err = -EINVAL;
2567	u8 dir;
2568	struct sadb_address *sa;
2569	struct sadb_x_kmaddress *kma;
2570	struct sadb_x_policy *pol;
2571	struct sadb_x_ipsecrequest *rq;
2572	struct xfrm_selector sel;
2573	struct xfrm_migrate m[XFRM_MAX_DEPTH];
2574	struct xfrm_kmaddress k;
2575	struct net *net = sock_net(sk);
2576
2577	if (!present_and_same_family(ext_hdrs[SADB_EXT_ADDRESS_SRC - 1],
2578				     ext_hdrs[SADB_EXT_ADDRESS_DST - 1]) ||
2579	    !ext_hdrs[SADB_X_EXT_POLICY - 1]) {
2580		err = -EINVAL;
2581		goto out;
2582	}
2583
2584	kma = ext_hdrs[SADB_X_EXT_KMADDRESS - 1];
2585	pol = ext_hdrs[SADB_X_EXT_POLICY - 1];
2586
2587	if (pol->sadb_x_policy_dir >= IPSEC_DIR_MAX) {
2588		err = -EINVAL;
2589		goto out;
2590	}
2591
2592	if (kma) {
2593		/* convert sadb_x_kmaddress to xfrm_kmaddress */
2594		k.reserved = kma->sadb_x_kmaddress_reserved;
2595		ret = parse_sockaddr_pair((struct sockaddr *)(kma + 1),
2596					  8*(kma->sadb_x_kmaddress_len) - sizeof(*kma),
2597					  &k.local, &k.remote, &k.family);
2598		if (ret < 0) {
2599			err = ret;
2600			goto out;
2601		}
2602	}
2603
2604	dir = pol->sadb_x_policy_dir - 1;
2605	memset(&sel, 0, sizeof(sel));
2606
2607	/* set source address info of selector */
2608	sa = ext_hdrs[SADB_EXT_ADDRESS_SRC - 1];
2609	sel.family = pfkey_sadb_addr2xfrm_addr(sa, &sel.saddr);
2610	sel.prefixlen_s = sa->sadb_address_prefixlen;
2611	sel.proto = pfkey_proto_to_xfrm(sa->sadb_address_proto);
2612	sel.sport = ((struct sockaddr_in *)(sa + 1))->sin_port;
2613	if (sel.sport)
2614		sel.sport_mask = htons(0xffff);
2615
2616	/* set destination address info of selector */
2617	sa = ext_hdrs[SADB_EXT_ADDRESS_DST - 1];
2618	pfkey_sadb_addr2xfrm_addr(sa, &sel.daddr);
2619	sel.prefixlen_d = sa->sadb_address_prefixlen;
2620	sel.proto = pfkey_proto_to_xfrm(sa->sadb_address_proto);
2621	sel.dport = ((struct sockaddr_in *)(sa + 1))->sin_port;
2622	if (sel.dport)
2623		sel.dport_mask = htons(0xffff);
2624
2625	rq = (struct sadb_x_ipsecrequest *)(pol + 1);
2626
2627	/* extract ipsecrequests */
2628	i = 0;
2629	len = pol->sadb_x_policy_len * 8 - sizeof(struct sadb_x_policy);
2630
2631	while (len > 0 && i < XFRM_MAX_DEPTH) {
2632		ret = ipsecrequests_to_migrate(rq, len, &m[i]);
2633		if (ret < 0) {
2634			err = ret;
2635			goto out;
2636		} else {
2637			rq = (struct sadb_x_ipsecrequest *)((u8 *)rq + ret);
2638			len -= ret;
2639			i++;
2640		}
2641	}
2642
2643	if (!i || len > 0) {
2644		err = -EINVAL;
2645		goto out;
2646	}
2647
2648	return xfrm_migrate(&sel, dir, XFRM_POLICY_TYPE_MAIN, m, i,
2649			    kma ? &k : NULL, net, NULL, 0, NULL, NULL);
2650
2651 out:
2652	return err;
2653}
2654#else
2655static int pfkey_migrate(struct sock *sk, struct sk_buff *skb,
2656			 const struct sadb_msg *hdr, void * const *ext_hdrs)
2657{
2658	return -ENOPROTOOPT;
2659}
2660#endif
2661
2662
2663static int pfkey_spdget(struct sock *sk, struct sk_buff *skb, const struct sadb_msg *hdr, void * const *ext_hdrs)
2664{
2665	struct net *net = sock_net(sk);
2666	unsigned int dir;
2667	int err = 0, delete;
2668	struct sadb_x_policy *pol;
2669	struct xfrm_policy *xp;
2670	struct km_event c;
2671
2672	if ((pol = ext_hdrs[SADB_X_EXT_POLICY-1]) == NULL)
2673		return -EINVAL;
2674
2675	dir = xfrm_policy_id2dir(pol->sadb_x_policy_id);
2676	if (dir >= XFRM_POLICY_MAX)
2677		return -EINVAL;
2678
2679	delete = (hdr->sadb_msg_type == SADB_X_SPDDELETE2);
2680	xp = xfrm_policy_byid(net, &dummy_mark, 0, XFRM_POLICY_TYPE_MAIN,
2681			      dir, pol->sadb_x_policy_id, delete, &err);
2682	if (xp == NULL)
2683		return -ENOENT;
2684
2685	if (delete) {
2686		xfrm_audit_policy_delete(xp, err ? 0 : 1, true);
2687
2688		if (err)
2689			goto out;
2690		c.seq = hdr->sadb_msg_seq;
2691		c.portid = hdr->sadb_msg_pid;
2692		c.data.byid = 1;
2693		c.event = XFRM_MSG_DELPOLICY;
2694		km_policy_notify(xp, dir, &c);
2695	} else {
2696		err = key_pol_get_resp(sk, xp, hdr, dir);
2697	}
2698
2699out:
2700	xfrm_pol_put(xp);
2701	return err;
2702}
2703
2704static int dump_sp(struct xfrm_policy *xp, int dir, int count, void *ptr)
2705{
2706	struct pfkey_sock *pfk = ptr;
2707	struct sk_buff *out_skb;
2708	struct sadb_msg *out_hdr;
2709	int err;
2710
2711	if (!pfkey_can_dump(&pfk->sk))
2712		return -ENOBUFS;
2713
2714	out_skb = pfkey_xfrm_policy2msg_prep(xp);
2715	if (IS_ERR(out_skb))
2716		return PTR_ERR(out_skb);
2717
2718	err = pfkey_xfrm_policy2msg(out_skb, xp, dir);
2719	if (err < 0) {
2720		kfree_skb(out_skb);
2721		return err;
2722	}
2723
2724	out_hdr = (struct sadb_msg *) out_skb->data;
2725	out_hdr->sadb_msg_version = pfk->dump.msg_version;
2726	out_hdr->sadb_msg_type = SADB_X_SPDDUMP;
2727	out_hdr->sadb_msg_satype = SADB_SATYPE_UNSPEC;
2728	out_hdr->sadb_msg_errno = 0;
2729	out_hdr->sadb_msg_seq = count + 1;
2730	out_hdr->sadb_msg_pid = pfk->dump.msg_portid;
2731
2732	if (pfk->dump.skb)
2733		pfkey_broadcast(pfk->dump.skb, GFP_ATOMIC, BROADCAST_ONE,
2734				&pfk->sk, sock_net(&pfk->sk));
2735	pfk->dump.skb = out_skb;
2736
2737	return 0;
2738}
2739
2740static int pfkey_dump_sp(struct pfkey_sock *pfk)
2741{
2742	struct net *net = sock_net(&pfk->sk);
2743	return xfrm_policy_walk(net, &pfk->dump.u.policy, dump_sp, (void *) pfk);
2744}
2745
2746static void pfkey_dump_sp_done(struct pfkey_sock *pfk)
2747{
2748	struct net *net = sock_net((struct sock *)pfk);
2749
2750	xfrm_policy_walk_done(&pfk->dump.u.policy, net);
2751}
2752
2753static int pfkey_spddump(struct sock *sk, struct sk_buff *skb, const struct sadb_msg *hdr, void * const *ext_hdrs)
2754{
2755	struct pfkey_sock *pfk = pfkey_sk(sk);
2756
2757	mutex_lock(&pfk->dump_lock);
2758	if (pfk->dump.dump != NULL) {
2759		mutex_unlock(&pfk->dump_lock);
2760		return -EBUSY;
2761	}
2762
2763	pfk->dump.msg_version = hdr->sadb_msg_version;
2764	pfk->dump.msg_portid = hdr->sadb_msg_pid;
2765	pfk->dump.dump = pfkey_dump_sp;
2766	pfk->dump.done = pfkey_dump_sp_done;
2767	xfrm_policy_walk_init(&pfk->dump.u.policy, XFRM_POLICY_TYPE_MAIN);
2768	mutex_unlock(&pfk->dump_lock);
2769
2770	return pfkey_do_dump(pfk);
2771}
2772
2773static int key_notify_policy_flush(const struct km_event *c)
2774{
2775	struct sk_buff *skb_out;
2776	struct sadb_msg *hdr;
2777
2778	skb_out = alloc_skb(sizeof(struct sadb_msg) + 16, GFP_ATOMIC);
2779	if (!skb_out)
2780		return -ENOBUFS;
2781	hdr = skb_put(skb_out, sizeof(struct sadb_msg));
2782	hdr->sadb_msg_type = SADB_X_SPDFLUSH;
2783	hdr->sadb_msg_seq = c->seq;
2784	hdr->sadb_msg_pid = c->portid;
2785	hdr->sadb_msg_version = PF_KEY_V2;
2786	hdr->sadb_msg_errno = (uint8_t) 0;
2787	hdr->sadb_msg_satype = SADB_SATYPE_UNSPEC;
2788	hdr->sadb_msg_len = (sizeof(struct sadb_msg) / sizeof(uint64_t));
2789	hdr->sadb_msg_reserved = 0;
2790	pfkey_broadcast(skb_out, GFP_ATOMIC, BROADCAST_ALL, NULL, c->net);
2791	return 0;
2792
2793}
2794
2795static int pfkey_spdflush(struct sock *sk, struct sk_buff *skb, const struct sadb_msg *hdr, void * const *ext_hdrs)
2796{
2797	struct net *net = sock_net(sk);
2798	struct km_event c;
2799	int err, err2;
2800
2801	err = xfrm_policy_flush(net, XFRM_POLICY_TYPE_MAIN, true);
2802	err2 = unicast_flush_resp(sk, hdr);
2803	if (err || err2) {
2804		if (err == -ESRCH) /* empty table - old silent behavior */
2805			return 0;
2806		return err;
2807	}
2808
2809	c.data.type = XFRM_POLICY_TYPE_MAIN;
2810	c.event = XFRM_MSG_FLUSHPOLICY;
2811	c.portid = hdr->sadb_msg_pid;
2812	c.seq = hdr->sadb_msg_seq;
2813	c.net = net;
2814	km_policy_notify(NULL, 0, &c);
2815
2816	return 0;
2817}
2818
2819typedef int (*pfkey_handler)(struct sock *sk, struct sk_buff *skb,
2820			     const struct sadb_msg *hdr, void * const *ext_hdrs);
2821static const pfkey_handler pfkey_funcs[SADB_MAX + 1] = {
2822	[SADB_RESERVED]		= pfkey_reserved,
2823	[SADB_GETSPI]		= pfkey_getspi,
2824	[SADB_UPDATE]		= pfkey_add,
2825	[SADB_ADD]		= pfkey_add,
2826	[SADB_DELETE]		= pfkey_delete,
2827	[SADB_GET]		= pfkey_get,
2828	[SADB_ACQUIRE]		= pfkey_acquire,
2829	[SADB_REGISTER]		= pfkey_register,
2830	[SADB_EXPIRE]		= NULL,
2831	[SADB_FLUSH]		= pfkey_flush,
2832	[SADB_DUMP]		= pfkey_dump,
2833	[SADB_X_PROMISC]	= pfkey_promisc,
2834	[SADB_X_PCHANGE]	= NULL,
2835	[SADB_X_SPDUPDATE]	= pfkey_spdadd,
2836	[SADB_X_SPDADD]		= pfkey_spdadd,
2837	[SADB_X_SPDDELETE]	= pfkey_spddelete,
2838	[SADB_X_SPDGET]		= pfkey_spdget,
2839	[SADB_X_SPDACQUIRE]	= NULL,
2840	[SADB_X_SPDDUMP]	= pfkey_spddump,
2841	[SADB_X_SPDFLUSH]	= pfkey_spdflush,
2842	[SADB_X_SPDSETIDX]	= pfkey_spdadd,
2843	[SADB_X_SPDDELETE2]	= pfkey_spdget,
2844	[SADB_X_MIGRATE]	= pfkey_migrate,
2845};
2846
2847static int pfkey_process(struct sock *sk, struct sk_buff *skb, const struct sadb_msg *hdr)
2848{
2849	void *ext_hdrs[SADB_EXT_MAX];
2850	int err;
2851
2852	/* Non-zero return value of pfkey_broadcast() does not always signal
2853	 * an error and even on an actual error we may still want to process
2854	 * the message so rather ignore the return value.
2855	 */
2856	pfkey_broadcast(skb_clone(skb, GFP_KERNEL), GFP_KERNEL,
2857			BROADCAST_PROMISC_ONLY, NULL, sock_net(sk));
2858
2859	memset(ext_hdrs, 0, sizeof(ext_hdrs));
2860	err = parse_exthdrs(skb, hdr, ext_hdrs);
2861	if (!err) {
2862		err = -EOPNOTSUPP;
2863		if (pfkey_funcs[hdr->sadb_msg_type])
2864			err = pfkey_funcs[hdr->sadb_msg_type](sk, skb, hdr, ext_hdrs);
2865	}
2866	return err;
2867}
2868
2869static struct sadb_msg *pfkey_get_base_msg(struct sk_buff *skb, int *errp)
2870{
2871	struct sadb_msg *hdr = NULL;
2872
2873	if (skb->len < sizeof(*hdr)) {
2874		*errp = -EMSGSIZE;
2875	} else {
2876		hdr = (struct sadb_msg *) skb->data;
2877		if (hdr->sadb_msg_version != PF_KEY_V2 ||
2878		    hdr->sadb_msg_reserved != 0 ||
2879		    (hdr->sadb_msg_type <= SADB_RESERVED ||
2880		     hdr->sadb_msg_type > SADB_MAX)) {
2881			hdr = NULL;
2882			*errp = -EINVAL;
2883		} else if (hdr->sadb_msg_len != (skb->len /
2884						 sizeof(uint64_t)) ||
2885			   hdr->sadb_msg_len < (sizeof(struct sadb_msg) /
2886						sizeof(uint64_t))) {
2887			hdr = NULL;
2888			*errp = -EMSGSIZE;
2889		} else {
2890			*errp = 0;
2891		}
2892	}
2893	return hdr;
2894}
2895
2896static inline int aalg_tmpl_set(const struct xfrm_tmpl *t,
2897				const struct xfrm_algo_desc *d)
2898{
2899	unsigned int id = d->desc.sadb_alg_id;
2900
2901	if (id >= sizeof(t->aalgos) * 8)
2902		return 0;
2903
2904	return (t->aalgos >> id) & 1;
2905}
2906
2907static inline int ealg_tmpl_set(const struct xfrm_tmpl *t,
2908				const struct xfrm_algo_desc *d)
2909{
2910	unsigned int id = d->desc.sadb_alg_id;
2911
2912	if (id >= sizeof(t->ealgos) * 8)
2913		return 0;
2914
2915	return (t->ealgos >> id) & 1;
2916}
2917
2918static int count_ah_combs(const struct xfrm_tmpl *t)
2919{
2920	int i, sz = 0;
2921
2922	for (i = 0; ; i++) {
2923		const struct xfrm_algo_desc *aalg = xfrm_aalg_get_byidx(i);
2924		if (!aalg)
2925			break;
2926		if (!aalg->pfkey_supported)
2927			continue;
2928		if (aalg_tmpl_set(t, aalg))
2929			sz += sizeof(struct sadb_comb);
2930	}
2931	return sz + sizeof(struct sadb_prop);
2932}
2933
2934static int count_esp_combs(const struct xfrm_tmpl *t)
2935{
2936	int i, k, sz = 0;
2937
2938	for (i = 0; ; i++) {
2939		const struct xfrm_algo_desc *ealg = xfrm_ealg_get_byidx(i);
2940		if (!ealg)
2941			break;
2942
2943		if (!ealg->pfkey_supported)
2944			continue;
2945
2946		if (!(ealg_tmpl_set(t, ealg)))
2947			continue;
2948
2949		for (k = 1; ; k++) {
2950			const struct xfrm_algo_desc *aalg = xfrm_aalg_get_byidx(k);
2951			if (!aalg)
2952				break;
2953
2954			if (!aalg->pfkey_supported)
2955				continue;
2956
2957			if (aalg_tmpl_set(t, aalg))
2958				sz += sizeof(struct sadb_comb);
2959		}
2960	}
2961	return sz + sizeof(struct sadb_prop);
2962}
2963
2964static int dump_ah_combs(struct sk_buff *skb, const struct xfrm_tmpl *t)
2965{
2966	struct sadb_prop *p;
2967	int sz = 0;
2968	int i;
2969
2970	p = skb_put(skb, sizeof(struct sadb_prop));
2971	p->sadb_prop_len = sizeof(struct sadb_prop)/8;
2972	p->sadb_prop_exttype = SADB_EXT_PROPOSAL;
2973	p->sadb_prop_replay = 32;
2974	memset(p->sadb_prop_reserved, 0, sizeof(p->sadb_prop_reserved));
2975
2976	for (i = 0; ; i++) {
2977		const struct xfrm_algo_desc *aalg = xfrm_aalg_get_byidx(i);
2978		if (!aalg)
2979			break;
2980
2981		if (!aalg->pfkey_supported)
2982			continue;
2983
2984		if (aalg_tmpl_set(t, aalg) && aalg->available) {
2985			struct sadb_comb *c;
2986			c = skb_put_zero(skb, sizeof(struct sadb_comb));
2987			p->sadb_prop_len += sizeof(struct sadb_comb)/8;
2988			c->sadb_comb_auth = aalg->desc.sadb_alg_id;
2989			c->sadb_comb_auth_minbits = aalg->desc.sadb_alg_minbits;
2990			c->sadb_comb_auth_maxbits = aalg->desc.sadb_alg_maxbits;
2991			c->sadb_comb_hard_addtime = 24*60*60;
2992			c->sadb_comb_soft_addtime = 20*60*60;
2993			c->sadb_comb_hard_usetime = 8*60*60;
2994			c->sadb_comb_soft_usetime = 7*60*60;
2995			sz += sizeof(*c);
2996		}
2997	}
2998
2999	return sz + sizeof(*p);
3000}
3001
3002static int dump_esp_combs(struct sk_buff *skb, const struct xfrm_tmpl *t)
3003{
3004	struct sadb_prop *p;
3005	int sz = 0;
3006	int i, k;
3007
3008	p = skb_put(skb, sizeof(struct sadb_prop));
3009	p->sadb_prop_len = sizeof(struct sadb_prop)/8;
3010	p->sadb_prop_exttype = SADB_EXT_PROPOSAL;
3011	p->sadb_prop_replay = 32;
3012	memset(p->sadb_prop_reserved, 0, sizeof(p->sadb_prop_reserved));
3013
3014	for (i=0; ; i++) {
3015		const struct xfrm_algo_desc *ealg = xfrm_ealg_get_byidx(i);
3016		if (!ealg)
3017			break;
3018
3019		if (!ealg->pfkey_supported)
3020			continue;
3021
3022		if (!(ealg_tmpl_set(t, ealg) && ealg->available))
3023			continue;
3024
3025		for (k = 1; ; k++) {
3026			struct sadb_comb *c;
3027			const struct xfrm_algo_desc *aalg = xfrm_aalg_get_byidx(k);
3028			if (!aalg)
3029				break;
3030			if (!aalg->pfkey_supported)
3031				continue;
3032			if (!(aalg_tmpl_set(t, aalg) && aalg->available))
3033				continue;
3034			c = skb_put(skb, sizeof(struct sadb_comb));
3035			memset(c, 0, sizeof(*c));
3036			p->sadb_prop_len += sizeof(struct sadb_comb)/8;
3037			c->sadb_comb_auth = aalg->desc.sadb_alg_id;
3038			c->sadb_comb_auth_minbits = aalg->desc.sadb_alg_minbits;
3039			c->sadb_comb_auth_maxbits = aalg->desc.sadb_alg_maxbits;
3040			c->sadb_comb_encrypt = ealg->desc.sadb_alg_id;
3041			c->sadb_comb_encrypt_minbits = ealg->desc.sadb_alg_minbits;
3042			c->sadb_comb_encrypt_maxbits = ealg->desc.sadb_alg_maxbits;
3043			c->sadb_comb_hard_addtime = 24*60*60;
3044			c->sadb_comb_soft_addtime = 20*60*60;
3045			c->sadb_comb_hard_usetime = 8*60*60;
3046			c->sadb_comb_soft_usetime = 7*60*60;
3047			sz += sizeof(*c);
3048		}
3049	}
3050
3051	return sz + sizeof(*p);
3052}
3053
3054static int key_notify_policy_expire(struct xfrm_policy *xp, const struct km_event *c)
3055{
3056	return 0;
3057}
3058
3059static int key_notify_sa_expire(struct xfrm_state *x, const struct km_event *c)
3060{
3061	struct sk_buff *out_skb;
3062	struct sadb_msg *out_hdr;
3063	int hard;
3064	int hsc;
3065
3066	hard = c->data.hard;
3067	if (hard)
3068		hsc = 2;
3069	else
3070		hsc = 1;
3071
3072	out_skb = pfkey_xfrm_state2msg_expire(x, hsc);
3073	if (IS_ERR(out_skb))
3074		return PTR_ERR(out_skb);
3075
3076	out_hdr = (struct sadb_msg *) out_skb->data;
3077	out_hdr->sadb_msg_version = PF_KEY_V2;
3078	out_hdr->sadb_msg_type = SADB_EXPIRE;
3079	out_hdr->sadb_msg_satype = pfkey_proto2satype(x->id.proto);
3080	out_hdr->sadb_msg_errno = 0;
3081	out_hdr->sadb_msg_reserved = 0;
3082	out_hdr->sadb_msg_seq = 0;
3083	out_hdr->sadb_msg_pid = 0;
3084
3085	pfkey_broadcast(out_skb, GFP_ATOMIC, BROADCAST_REGISTERED, NULL,
3086			xs_net(x));
3087	return 0;
3088}
3089
3090static int pfkey_send_notify(struct xfrm_state *x, const struct km_event *c)
3091{
3092	struct net *net = x ? xs_net(x) : c->net;
3093	struct netns_pfkey *net_pfkey = net_generic(net, pfkey_net_id);
3094
3095	if (atomic_read(&net_pfkey->socks_nr) == 0)
3096		return 0;
3097
3098	switch (c->event) {
3099	case XFRM_MSG_EXPIRE:
3100		return key_notify_sa_expire(x, c);
3101	case XFRM_MSG_DELSA:
3102	case XFRM_MSG_NEWSA:
3103	case XFRM_MSG_UPDSA:
3104		return key_notify_sa(x, c);
3105	case XFRM_MSG_FLUSHSA:
3106		return key_notify_sa_flush(c);
3107	case XFRM_MSG_NEWAE: /* not yet supported */
3108		break;
3109	default:
3110		pr_err("pfkey: Unknown SA event %d\n", c->event);
3111		break;
3112	}
3113
3114	return 0;
3115}
3116
3117static int pfkey_send_policy_notify(struct xfrm_policy *xp, int dir, const struct km_event *c)
3118{
3119	if (xp && xp->type != XFRM_POLICY_TYPE_MAIN)
3120		return 0;
3121
3122	switch (c->event) {
3123	case XFRM_MSG_POLEXPIRE:
3124		return key_notify_policy_expire(xp, c);
3125	case XFRM_MSG_DELPOLICY:
3126	case XFRM_MSG_NEWPOLICY:
3127	case XFRM_MSG_UPDPOLICY:
3128		return key_notify_policy(xp, dir, c);
3129	case XFRM_MSG_FLUSHPOLICY:
3130		if (c->data.type != XFRM_POLICY_TYPE_MAIN)
3131			break;
3132		return key_notify_policy_flush(c);
3133	default:
3134		pr_err("pfkey: Unknown policy event %d\n", c->event);
3135		break;
3136	}
3137
3138	return 0;
3139}
3140
3141static u32 get_acqseq(void)
3142{
3143	u32 res;
3144	static atomic_t acqseq;
3145
3146	do {
3147		res = atomic_inc_return(&acqseq);
3148	} while (!res);
3149	return res;
3150}
3151
3152static bool pfkey_is_alive(const struct km_event *c)
3153{
3154	struct netns_pfkey *net_pfkey = net_generic(c->net, pfkey_net_id);
3155	struct sock *sk;
3156	bool is_alive = false;
3157
3158	rcu_read_lock();
3159	sk_for_each_rcu(sk, &net_pfkey->table) {
3160		if (pfkey_sk(sk)->registered) {
3161			is_alive = true;
3162			break;
3163		}
3164	}
3165	rcu_read_unlock();
3166
3167	return is_alive;
3168}
3169
3170static int pfkey_send_acquire(struct xfrm_state *x, struct xfrm_tmpl *t, struct xfrm_policy *xp)
3171{
3172	struct sk_buff *skb;
3173	struct sadb_msg *hdr;
3174	struct sadb_address *addr;
3175	struct sadb_x_policy *pol;
3176	int sockaddr_size;
3177	int size;
3178	struct sadb_x_sec_ctx *sec_ctx;
3179	struct xfrm_sec_ctx *xfrm_ctx;
3180	int ctx_size = 0;
3181	int alg_size = 0;
3182
3183	sockaddr_size = pfkey_sockaddr_size(x->props.family);
3184	if (!sockaddr_size)
3185		return -EINVAL;
3186
3187	size = sizeof(struct sadb_msg) +
3188		(sizeof(struct sadb_address) * 2) +
3189		(sockaddr_size * 2) +
3190		sizeof(struct sadb_x_policy);
3191
3192	if (x->id.proto == IPPROTO_AH)
3193		alg_size = count_ah_combs(t);
3194	else if (x->id.proto == IPPROTO_ESP)
3195		alg_size = count_esp_combs(t);
3196
3197	if ((xfrm_ctx = x->security)) {
3198		ctx_size = PFKEY_ALIGN8(xfrm_ctx->ctx_len);
3199		size +=  sizeof(struct sadb_x_sec_ctx) + ctx_size;
3200	}
3201
3202	skb =  alloc_skb(size + alg_size + 16, GFP_ATOMIC);
3203	if (skb == NULL)
3204		return -ENOMEM;
3205
3206	hdr = skb_put(skb, sizeof(struct sadb_msg));
3207	hdr->sadb_msg_version = PF_KEY_V2;
3208	hdr->sadb_msg_type = SADB_ACQUIRE;
3209	hdr->sadb_msg_satype = pfkey_proto2satype(x->id.proto);
3210	hdr->sadb_msg_len = size / sizeof(uint64_t);
3211	hdr->sadb_msg_errno = 0;
3212	hdr->sadb_msg_reserved = 0;
3213	hdr->sadb_msg_seq = x->km.seq = get_acqseq();
3214	hdr->sadb_msg_pid = 0;
3215
3216	/* src address */
3217	addr = skb_put(skb, sizeof(struct sadb_address) + sockaddr_size);
3218	addr->sadb_address_len =
3219		(sizeof(struct sadb_address)+sockaddr_size)/
3220			sizeof(uint64_t);
3221	addr->sadb_address_exttype = SADB_EXT_ADDRESS_SRC;
3222	addr->sadb_address_proto = 0;
3223	addr->sadb_address_reserved = 0;
3224	addr->sadb_address_prefixlen =
3225		pfkey_sockaddr_fill_zero_tail(&x->props.saddr, 0,
3226					      (struct sockaddr *)(addr + 1),
3227					      x->props.family);
3228	if (!addr->sadb_address_prefixlen)
3229		BUG();
3230
3231	/* dst address */
3232	addr = skb_put(skb, sizeof(struct sadb_address) + sockaddr_size);
3233	addr->sadb_address_len =
3234		(sizeof(struct sadb_address)+sockaddr_size)/
3235			sizeof(uint64_t);
3236	addr->sadb_address_exttype = SADB_EXT_ADDRESS_DST;
3237	addr->sadb_address_proto = 0;
3238	addr->sadb_address_reserved = 0;
3239	addr->sadb_address_prefixlen =
3240		pfkey_sockaddr_fill_zero_tail(&x->id.daddr, 0,
3241					      (struct sockaddr *)(addr + 1),
3242					      x->props.family);
3243	if (!addr->sadb_address_prefixlen)
3244		BUG();
3245
3246	pol = skb_put(skb, sizeof(struct sadb_x_policy));
3247	pol->sadb_x_policy_len = sizeof(struct sadb_x_policy)/sizeof(uint64_t);
3248	pol->sadb_x_policy_exttype = SADB_X_EXT_POLICY;
3249	pol->sadb_x_policy_type = IPSEC_POLICY_IPSEC;
3250	pol->sadb_x_policy_dir = XFRM_POLICY_OUT + 1;
3251	pol->sadb_x_policy_reserved = 0;
3252	pol->sadb_x_policy_id = xp->index;
3253	pol->sadb_x_policy_priority = xp->priority;
3254
3255	/* Set sadb_comb's. */
3256	alg_size = 0;
3257	if (x->id.proto == IPPROTO_AH)
3258		alg_size = dump_ah_combs(skb, t);
3259	else if (x->id.proto == IPPROTO_ESP)
3260		alg_size = dump_esp_combs(skb, t);
3261
3262	hdr->sadb_msg_len += alg_size / 8;
3263
3264	/* security context */
3265	if (xfrm_ctx) {
3266		sec_ctx = skb_put(skb,
3267				  sizeof(struct sadb_x_sec_ctx) + ctx_size);
3268		sec_ctx->sadb_x_sec_len =
3269		  (sizeof(struct sadb_x_sec_ctx) + ctx_size) / sizeof(uint64_t);
3270		sec_ctx->sadb_x_sec_exttype = SADB_X_EXT_SEC_CTX;
3271		sec_ctx->sadb_x_ctx_doi = xfrm_ctx->ctx_doi;
3272		sec_ctx->sadb_x_ctx_alg = xfrm_ctx->ctx_alg;
3273		sec_ctx->sadb_x_ctx_len = xfrm_ctx->ctx_len;
3274		memcpy(sec_ctx + 1, xfrm_ctx->ctx_str,
3275		       xfrm_ctx->ctx_len);
3276	}
3277
3278	return pfkey_broadcast(skb, GFP_ATOMIC, BROADCAST_REGISTERED, NULL,
3279			       xs_net(x));
3280}
3281
3282static struct xfrm_policy *pfkey_compile_policy(struct sock *sk, int opt,
3283						u8 *data, int len, int *dir)
3284{
3285	struct net *net = sock_net(sk);
3286	struct xfrm_policy *xp;
3287	struct sadb_x_policy *pol = (struct sadb_x_policy*)data;
3288	struct sadb_x_sec_ctx *sec_ctx;
3289
3290	switch (sk->sk_family) {
3291	case AF_INET:
3292		if (opt != IP_IPSEC_POLICY) {
3293			*dir = -EOPNOTSUPP;
3294			return NULL;
3295		}
3296		break;
3297#if IS_ENABLED(CONFIG_IPV6)
3298	case AF_INET6:
3299		if (opt != IPV6_IPSEC_POLICY) {
3300			*dir = -EOPNOTSUPP;
3301			return NULL;
3302		}
3303		break;
3304#endif
3305	default:
3306		*dir = -EINVAL;
3307		return NULL;
3308	}
3309
3310	*dir = -EINVAL;
3311
3312	if (len < sizeof(struct sadb_x_policy) ||
3313	    pol->sadb_x_policy_len*8 > len ||
3314	    pol->sadb_x_policy_type > IPSEC_POLICY_BYPASS ||
3315	    (!pol->sadb_x_policy_dir || pol->sadb_x_policy_dir > IPSEC_DIR_OUTBOUND))
3316		return NULL;
3317
3318	xp = xfrm_policy_alloc(net, GFP_ATOMIC);
3319	if (xp == NULL) {
3320		*dir = -ENOBUFS;
3321		return NULL;
3322	}
3323
3324	xp->action = (pol->sadb_x_policy_type == IPSEC_POLICY_DISCARD ?
3325		      XFRM_POLICY_BLOCK : XFRM_POLICY_ALLOW);
3326
3327	xp->lft.soft_byte_limit = XFRM_INF;
3328	xp->lft.hard_byte_limit = XFRM_INF;
3329	xp->lft.soft_packet_limit = XFRM_INF;
3330	xp->lft.hard_packet_limit = XFRM_INF;
3331	xp->family = sk->sk_family;
3332
3333	xp->xfrm_nr = 0;
3334	if (pol->sadb_x_policy_type == IPSEC_POLICY_IPSEC &&
3335	    (*dir = parse_ipsecrequests(xp, pol)) < 0)
3336		goto out;
3337
3338	/* security context too */
3339	if (len >= (pol->sadb_x_policy_len*8 +
3340	    sizeof(struct sadb_x_sec_ctx))) {
3341		char *p = (char *)pol;
3342		struct xfrm_user_sec_ctx *uctx;
3343
3344		p += pol->sadb_x_policy_len*8;
3345		sec_ctx = (struct sadb_x_sec_ctx *)p;
3346		if (len < pol->sadb_x_policy_len*8 +
3347		    sec_ctx->sadb_x_sec_len*8) {
3348			*dir = -EINVAL;
3349			goto out;
3350		}
3351		if ((*dir = verify_sec_ctx_len(p)))
3352			goto out;
3353		uctx = pfkey_sadb2xfrm_user_sec_ctx(sec_ctx, GFP_ATOMIC);
3354		*dir = security_xfrm_policy_alloc(&xp->security, uctx, GFP_ATOMIC);
3355		kfree(uctx);
3356
3357		if (*dir)
3358			goto out;
3359	}
3360
3361	*dir = pol->sadb_x_policy_dir-1;
3362	return xp;
3363
3364out:
3365	xp->walk.dead = 1;
3366	xfrm_policy_destroy(xp);
3367	return NULL;
3368}
3369
3370static int pfkey_send_new_mapping(struct xfrm_state *x, xfrm_address_t *ipaddr, __be16 sport)
3371{
3372	struct sk_buff *skb;
3373	struct sadb_msg *hdr;
3374	struct sadb_sa *sa;
3375	struct sadb_address *addr;
3376	struct sadb_x_nat_t_port *n_port;
3377	int sockaddr_size;
3378	int size;
3379	__u8 satype = (x->id.proto == IPPROTO_ESP ? SADB_SATYPE_ESP : 0);
3380	struct xfrm_encap_tmpl *natt = NULL;
3381
3382	sockaddr_size = pfkey_sockaddr_size(x->props.family);
3383	if (!sockaddr_size)
3384		return -EINVAL;
3385
3386	if (!satype)
3387		return -EINVAL;
3388
3389	if (!x->encap)
3390		return -EINVAL;
3391
3392	natt = x->encap;
3393
3394	/* Build an SADB_X_NAT_T_NEW_MAPPING message:
3395	 *
3396	 * HDR | SA | ADDRESS_SRC (old addr) | NAT_T_SPORT (old port) |
3397	 * ADDRESS_DST (new addr) | NAT_T_DPORT (new port)
3398	 */
3399
3400	size = sizeof(struct sadb_msg) +
3401		sizeof(struct sadb_sa) +
3402		(sizeof(struct sadb_address) * 2) +
3403		(sockaddr_size * 2) +
3404		(sizeof(struct sadb_x_nat_t_port) * 2);
3405
3406	skb =  alloc_skb(size + 16, GFP_ATOMIC);
3407	if (skb == NULL)
3408		return -ENOMEM;
3409
3410	hdr = skb_put(skb, sizeof(struct sadb_msg));
3411	hdr->sadb_msg_version = PF_KEY_V2;
3412	hdr->sadb_msg_type = SADB_X_NAT_T_NEW_MAPPING;
3413	hdr->sadb_msg_satype = satype;
3414	hdr->sadb_msg_len = size / sizeof(uint64_t);
3415	hdr->sadb_msg_errno = 0;
3416	hdr->sadb_msg_reserved = 0;
3417	hdr->sadb_msg_seq = x->km.seq;
3418	hdr->sadb_msg_pid = 0;
3419
3420	/* SA */
3421	sa = skb_put(skb, sizeof(struct sadb_sa));
3422	sa->sadb_sa_len = sizeof(struct sadb_sa)/sizeof(uint64_t);
3423	sa->sadb_sa_exttype = SADB_EXT_SA;
3424	sa->sadb_sa_spi = x->id.spi;
3425	sa->sadb_sa_replay = 0;
3426	sa->sadb_sa_state = 0;
3427	sa->sadb_sa_auth = 0;
3428	sa->sadb_sa_encrypt = 0;
3429	sa->sadb_sa_flags = 0;
3430
3431	/* ADDRESS_SRC (old addr) */
3432	addr = skb_put(skb, sizeof(struct sadb_address) + sockaddr_size);
3433	addr->sadb_address_len =
3434		(sizeof(struct sadb_address)+sockaddr_size)/
3435			sizeof(uint64_t);
3436	addr->sadb_address_exttype = SADB_EXT_ADDRESS_SRC;
3437	addr->sadb_address_proto = 0;
3438	addr->sadb_address_reserved = 0;
3439	addr->sadb_address_prefixlen =
3440		pfkey_sockaddr_fill_zero_tail(&x->props.saddr, 0,
3441					      (struct sockaddr *)(addr + 1),
3442					      x->props.family);
3443	if (!addr->sadb_address_prefixlen)
3444		BUG();
3445
3446	/* NAT_T_SPORT (old port) */
3447	n_port = skb_put(skb, sizeof(*n_port));
3448	n_port->sadb_x_nat_t_port_len = sizeof(*n_port)/sizeof(uint64_t);
3449	n_port->sadb_x_nat_t_port_exttype = SADB_X_EXT_NAT_T_SPORT;
3450	n_port->sadb_x_nat_t_port_port = natt->encap_sport;
3451	n_port->sadb_x_nat_t_port_reserved = 0;
3452
3453	/* ADDRESS_DST (new addr) */
3454	addr = skb_put(skb, sizeof(struct sadb_address) + sockaddr_size);
3455	addr->sadb_address_len =
3456		(sizeof(struct sadb_address)+sockaddr_size)/
3457			sizeof(uint64_t);
3458	addr->sadb_address_exttype = SADB_EXT_ADDRESS_DST;
3459	addr->sadb_address_proto = 0;
3460	addr->sadb_address_reserved = 0;
3461	addr->sadb_address_prefixlen =
3462		pfkey_sockaddr_fill_zero_tail(ipaddr, 0,
3463					      (struct sockaddr *)(addr + 1),
3464					      x->props.family);
3465	if (!addr->sadb_address_prefixlen)
3466		BUG();
3467
3468	/* NAT_T_DPORT (new port) */
3469	n_port = skb_put(skb, sizeof(*n_port));
3470	n_port->sadb_x_nat_t_port_len = sizeof(*n_port)/sizeof(uint64_t);
3471	n_port->sadb_x_nat_t_port_exttype = SADB_X_EXT_NAT_T_DPORT;
3472	n_port->sadb_x_nat_t_port_port = sport;
3473	n_port->sadb_x_nat_t_port_reserved = 0;
3474
3475	return pfkey_broadcast(skb, GFP_ATOMIC, BROADCAST_REGISTERED, NULL,
3476			       xs_net(x));
3477}
3478
3479#ifdef CONFIG_NET_KEY_MIGRATE
3480static int set_sadb_address(struct sk_buff *skb, int sasize, int type,
3481			    const struct xfrm_selector *sel)
3482{
3483	struct sadb_address *addr;
3484	addr = skb_put(skb, sizeof(struct sadb_address) + sasize);
3485	addr->sadb_address_len = (sizeof(struct sadb_address) + sasize)/8;
3486	addr->sadb_address_exttype = type;
3487	addr->sadb_address_proto = sel->proto;
3488	addr->sadb_address_reserved = 0;
3489
3490	switch (type) {
3491	case SADB_EXT_ADDRESS_SRC:
3492		addr->sadb_address_prefixlen = sel->prefixlen_s;
3493		pfkey_sockaddr_fill_zero_tail(&sel->saddr, 0,
3494					      (struct sockaddr *)(addr + 1),
3495					      sel->family);
3496		break;
3497	case SADB_EXT_ADDRESS_DST:
3498		addr->sadb_address_prefixlen = sel->prefixlen_d;
3499		pfkey_sockaddr_fill_zero_tail(&sel->daddr, 0,
3500					      (struct sockaddr *)(addr + 1),
3501					      sel->family);
3502		break;
3503	default:
3504		return -EINVAL;
3505	}
3506
3507	return 0;
3508}
3509
3510
3511static int set_sadb_kmaddress(struct sk_buff *skb, const struct xfrm_kmaddress *k)
3512{
3513	struct sadb_x_kmaddress *kma;
3514	u8 *sa;
3515	int family = k->family;
3516	int socklen = pfkey_sockaddr_len(family);
3517	int size_req;
3518
3519	size_req = (sizeof(struct sadb_x_kmaddress) +
3520		    pfkey_sockaddr_pair_size(family));
3521
3522	kma = skb_put_zero(skb, size_req);
3523	kma->sadb_x_kmaddress_len = size_req / 8;
3524	kma->sadb_x_kmaddress_exttype = SADB_X_EXT_KMADDRESS;
3525	kma->sadb_x_kmaddress_reserved = k->reserved;
3526
3527	sa = (u8 *)(kma + 1);
3528	if (!pfkey_sockaddr_fill(&k->local, 0, (struct sockaddr *)sa, family) ||
3529	    !pfkey_sockaddr_fill(&k->remote, 0, (struct sockaddr *)(sa+socklen), family))
3530		return -EINVAL;
3531
3532	return 0;
3533}
3534
3535static int set_ipsecrequest(struct sk_buff *skb,
3536			    uint8_t proto, uint8_t mode, int level,
3537			    uint32_t reqid, sa_family_t family,
3538			    const xfrm_address_t *src, const xfrm_address_t *dst)
3539{
3540	struct sadb_x_ipsecrequest *rq;
3541	u8 *sa;
3542	int socklen = pfkey_sockaddr_len(family);
3543	int size_req;
3544
3545	size_req = sizeof(struct sadb_x_ipsecrequest) +
3546		   pfkey_sockaddr_pair_size(family);
3547
3548	rq = skb_put_zero(skb, size_req);
3549	rq->sadb_x_ipsecrequest_len = size_req;
3550	rq->sadb_x_ipsecrequest_proto = proto;
3551	rq->sadb_x_ipsecrequest_mode = mode;
3552	rq->sadb_x_ipsecrequest_level = level;
3553	rq->sadb_x_ipsecrequest_reqid = reqid;
3554
3555	sa = (u8 *) (rq + 1);
3556	if (!pfkey_sockaddr_fill(src, 0, (struct sockaddr *)sa, family) ||
3557	    !pfkey_sockaddr_fill(dst, 0, (struct sockaddr *)(sa + socklen), family))
3558		return -EINVAL;
3559
3560	return 0;
3561}
3562#endif
3563
3564#ifdef CONFIG_NET_KEY_MIGRATE
3565static int pfkey_send_migrate(const struct xfrm_selector *sel, u8 dir, u8 type,
3566			      const struct xfrm_migrate *m, int num_bundles,
3567			      const struct xfrm_kmaddress *k,
3568			      const struct xfrm_encap_tmpl *encap)
3569{
3570	int i;
3571	int sasize_sel;
3572	int size = 0;
3573	int size_pol = 0;
3574	struct sk_buff *skb;
3575	struct sadb_msg *hdr;
3576	struct sadb_x_policy *pol;
3577	const struct xfrm_migrate *mp;
3578
3579	if (type != XFRM_POLICY_TYPE_MAIN)
3580		return 0;
3581
3582	if (num_bundles <= 0 || num_bundles > XFRM_MAX_DEPTH)
3583		return -EINVAL;
3584
3585	if (k != NULL) {
3586		/* addresses for KM */
3587		size += PFKEY_ALIGN8(sizeof(struct sadb_x_kmaddress) +
3588				     pfkey_sockaddr_pair_size(k->family));
3589	}
3590
3591	/* selector */
3592	sasize_sel = pfkey_sockaddr_size(sel->family);
3593	if (!sasize_sel)
3594		return -EINVAL;
3595	size += (sizeof(struct sadb_address) + sasize_sel) * 2;
3596
3597	/* policy info */
3598	size_pol += sizeof(struct sadb_x_policy);
3599
3600	/* ipsecrequests */
3601	for (i = 0, mp = m; i < num_bundles; i++, mp++) {
3602		int pair_size;
3603
3604		pair_size = pfkey_sockaddr_pair_size(mp->old_family);
3605		if (!pair_size)
3606			return -EINVAL;
3607		size_pol += sizeof(struct sadb_x_ipsecrequest) + pair_size;
3608
3609		pair_size = pfkey_sockaddr_pair_size(mp->new_family);
3610		if (!pair_size)
3611			return -EINVAL;
3612		size_pol += sizeof(struct sadb_x_ipsecrequest) + pair_size;
3613	}
3614
3615	size += sizeof(struct sadb_msg) + size_pol;
3616
3617	/* alloc buffer */
3618	skb = alloc_skb(size, GFP_ATOMIC);
3619	if (skb == NULL)
3620		return -ENOMEM;
3621
3622	hdr = skb_put(skb, sizeof(struct sadb_msg));
3623	hdr->sadb_msg_version = PF_KEY_V2;
3624	hdr->sadb_msg_type = SADB_X_MIGRATE;
3625	hdr->sadb_msg_satype = pfkey_proto2satype(m->proto);
3626	hdr->sadb_msg_len = size / 8;
3627	hdr->sadb_msg_errno = 0;
3628	hdr->sadb_msg_reserved = 0;
3629	hdr->sadb_msg_seq = 0;
3630	hdr->sadb_msg_pid = 0;
3631
3632	/* Addresses to be used by KM for negotiation, if ext is available */
3633	if (k != NULL && (set_sadb_kmaddress(skb, k) < 0))
3634		goto err;
3635
3636	/* selector src */
3637	set_sadb_address(skb, sasize_sel, SADB_EXT_ADDRESS_SRC, sel);
3638
3639	/* selector dst */
3640	set_sadb_address(skb, sasize_sel, SADB_EXT_ADDRESS_DST, sel);
3641
3642	/* policy information */
3643	pol = skb_put(skb, sizeof(struct sadb_x_policy));
3644	pol->sadb_x_policy_len = size_pol / 8;
3645	pol->sadb_x_policy_exttype = SADB_X_EXT_POLICY;
3646	pol->sadb_x_policy_type = IPSEC_POLICY_IPSEC;
3647	pol->sadb_x_policy_dir = dir + 1;
3648	pol->sadb_x_policy_reserved = 0;
3649	pol->sadb_x_policy_id = 0;
3650	pol->sadb_x_policy_priority = 0;
3651
3652	for (i = 0, mp = m; i < num_bundles; i++, mp++) {
3653		/* old ipsecrequest */
3654		int mode = pfkey_mode_from_xfrm(mp->mode);
3655		if (mode < 0)
3656			goto err;
3657		if (set_ipsecrequest(skb, mp->proto, mode,
3658				     (mp->reqid ?  IPSEC_LEVEL_UNIQUE : IPSEC_LEVEL_REQUIRE),
3659				     mp->reqid, mp->old_family,
3660				     &mp->old_saddr, &mp->old_daddr) < 0)
3661			goto err;
3662
3663		/* new ipsecrequest */
3664		if (set_ipsecrequest(skb, mp->proto, mode,
3665				     (mp->reqid ? IPSEC_LEVEL_UNIQUE : IPSEC_LEVEL_REQUIRE),
3666				     mp->reqid, mp->new_family,
3667				     &mp->new_saddr, &mp->new_daddr) < 0)
3668			goto err;
3669	}
3670
3671	/* broadcast migrate message to sockets */
3672	pfkey_broadcast(skb, GFP_ATOMIC, BROADCAST_ALL, NULL, &init_net);
3673
3674	return 0;
3675
3676err:
3677	kfree_skb(skb);
3678	return -EINVAL;
3679}
3680#else
3681static int pfkey_send_migrate(const struct xfrm_selector *sel, u8 dir, u8 type,
3682			      const struct xfrm_migrate *m, int num_bundles,
3683			      const struct xfrm_kmaddress *k,
3684			      const struct xfrm_encap_tmpl *encap)
3685{
3686	return -ENOPROTOOPT;
3687}
3688#endif
3689
3690static int pfkey_sendmsg(struct socket *sock, struct msghdr *msg, size_t len)
3691{
3692	struct sock *sk = sock->sk;
3693	struct sk_buff *skb = NULL;
3694	struct sadb_msg *hdr = NULL;
3695	int err;
3696	struct net *net = sock_net(sk);
3697
3698	err = -EOPNOTSUPP;
3699	if (msg->msg_flags & MSG_OOB)
3700		goto out;
3701
3702	err = -EMSGSIZE;
3703	if ((unsigned int)len > sk->sk_sndbuf - 32)
3704		goto out;
3705
3706	err = -ENOBUFS;
3707	skb = alloc_skb(len, GFP_KERNEL);
3708	if (skb == NULL)
3709		goto out;
3710
3711	err = -EFAULT;
3712	if (memcpy_from_msg(skb_put(skb,len), msg, len))
3713		goto out;
3714
3715	hdr = pfkey_get_base_msg(skb, &err);
3716	if (!hdr)
3717		goto out;
3718
3719	mutex_lock(&net->xfrm.xfrm_cfg_mutex);
3720	err = pfkey_process(sk, skb, hdr);
3721	mutex_unlock(&net->xfrm.xfrm_cfg_mutex);
3722
3723out:
3724	if (err && hdr && pfkey_error(hdr, err, sk) == 0)
3725		err = 0;
3726	kfree_skb(skb);
3727
3728	return err ? : len;
3729}
3730
3731static int pfkey_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
3732			 int flags)
3733{
3734	struct sock *sk = sock->sk;
3735	struct pfkey_sock *pfk = pfkey_sk(sk);
3736	struct sk_buff *skb;
3737	int copied, err;
3738
3739	err = -EINVAL;
3740	if (flags & ~(MSG_PEEK|MSG_DONTWAIT|MSG_TRUNC|MSG_CMSG_COMPAT))
3741		goto out;
3742
3743	skb = skb_recv_datagram(sk, flags, &err);
3744	if (skb == NULL)
3745		goto out;
3746
3747	copied = skb->len;
3748	if (copied > len) {
3749		msg->msg_flags |= MSG_TRUNC;
3750		copied = len;
3751	}
3752
3753	skb_reset_transport_header(skb);
3754	err = skb_copy_datagram_msg(skb, 0, msg, copied);
3755	if (err)
3756		goto out_free;
3757
3758	sock_recv_cmsgs(msg, sk, skb);
3759
3760	err = (flags & MSG_TRUNC) ? skb->len : copied;
3761
3762	if (pfk->dump.dump != NULL &&
3763	    3 * atomic_read(&sk->sk_rmem_alloc) <= sk->sk_rcvbuf)
3764		pfkey_do_dump(pfk);
3765
3766out_free:
3767	skb_free_datagram(sk, skb);
3768out:
3769	return err;
3770}
3771
3772static const struct proto_ops pfkey_ops = {
3773	.family		=	PF_KEY,
3774	.owner		=	THIS_MODULE,
3775	/* Operations that make no sense on pfkey sockets. */
3776	.bind		=	sock_no_bind,
3777	.connect	=	sock_no_connect,
3778	.socketpair	=	sock_no_socketpair,
3779	.accept		=	sock_no_accept,
3780	.getname	=	sock_no_getname,
3781	.ioctl		=	sock_no_ioctl,
3782	.listen		=	sock_no_listen,
3783	.shutdown	=	sock_no_shutdown,
3784	.mmap		=	sock_no_mmap,
3785
3786	/* Now the operations that really occur. */
3787	.release	=	pfkey_release,
3788	.poll		=	datagram_poll,
3789	.sendmsg	=	pfkey_sendmsg,
3790	.recvmsg	=	pfkey_recvmsg,
3791};
3792
3793static const struct net_proto_family pfkey_family_ops = {
3794	.family	=	PF_KEY,
3795	.create	=	pfkey_create,
3796	.owner	=	THIS_MODULE,
3797};
3798
3799#ifdef CONFIG_PROC_FS
3800static int pfkey_seq_show(struct seq_file *f, void *v)
3801{
3802	struct sock *s = sk_entry(v);
3803
3804	if (v == SEQ_START_TOKEN)
3805		seq_printf(f ,"sk       RefCnt Rmem   Wmem   User   Inode\n");
3806	else
3807		seq_printf(f, "%pK %-6d %-6u %-6u %-6u %-6lu\n",
3808			       s,
3809			       refcount_read(&s->sk_refcnt),
3810			       sk_rmem_alloc_get(s),
3811			       sk_wmem_alloc_get(s),
3812			       from_kuid_munged(seq_user_ns(f), sk_uid(s)),
3813			       sock_i_ino(s)
3814			       );
3815	return 0;
3816}
3817
3818static void *pfkey_seq_start(struct seq_file *f, loff_t *ppos)
3819	__acquires(rcu)
3820{
3821	struct net *net = seq_file_net(f);
3822	struct netns_pfkey *net_pfkey = net_generic(net, pfkey_net_id);
3823
3824	rcu_read_lock();
3825	return seq_hlist_start_head_rcu(&net_pfkey->table, *ppos);
3826}
3827
3828static void *pfkey_seq_next(struct seq_file *f, void *v, loff_t *ppos)
3829{
3830	struct net *net = seq_file_net(f);
3831	struct netns_pfkey *net_pfkey = net_generic(net, pfkey_net_id);
3832
3833	return seq_hlist_next_rcu(v, &net_pfkey->table, ppos);
3834}
3835
3836static void pfkey_seq_stop(struct seq_file *f, void *v)
3837	__releases(rcu)
3838{
3839	rcu_read_unlock();
3840}
3841
3842static const struct seq_operations pfkey_seq_ops = {
3843	.start	= pfkey_seq_start,
3844	.next	= pfkey_seq_next,
3845	.stop	= pfkey_seq_stop,
3846	.show	= pfkey_seq_show,
3847};
3848
3849static int __net_init pfkey_init_proc(struct net *net)
3850{
3851	struct proc_dir_entry *e;
3852
3853	e = proc_create_net("pfkey", 0, net->proc_net, &pfkey_seq_ops,
3854			sizeof(struct seq_net_private));
3855	if (e == NULL)
3856		return -ENOMEM;
3857
3858	return 0;
3859}
3860
3861static void __net_exit pfkey_exit_proc(struct net *net)
3862{
3863	remove_proc_entry("pfkey", net->proc_net);
3864}
3865#else
3866static inline int pfkey_init_proc(struct net *net)
3867{
3868	return 0;
3869}
3870
3871static inline void pfkey_exit_proc(struct net *net)
3872{
3873}
3874#endif
3875
3876static struct xfrm_mgr pfkeyv2_mgr =
3877{
3878	.notify		= pfkey_send_notify,
3879	.acquire	= pfkey_send_acquire,
3880	.compile_policy	= pfkey_compile_policy,
3881	.new_mapping	= pfkey_send_new_mapping,
3882	.notify_policy	= pfkey_send_policy_notify,
3883	.migrate	= pfkey_send_migrate,
3884	.is_alive	= pfkey_is_alive,
3885};
3886
3887static int __net_init pfkey_net_init(struct net *net)
3888{
3889	struct netns_pfkey *net_pfkey = net_generic(net, pfkey_net_id);
3890	int rv;
3891
3892	INIT_HLIST_HEAD(&net_pfkey->table);
3893	atomic_set(&net_pfkey->socks_nr, 0);
3894
3895	rv = pfkey_init_proc(net);
3896
3897	return rv;
3898}
3899
3900static void __net_exit pfkey_net_exit(struct net *net)
3901{
3902	struct netns_pfkey *net_pfkey = net_generic(net, pfkey_net_id);
3903
3904	pfkey_exit_proc(net);
3905	WARN_ON(!hlist_empty(&net_pfkey->table));
3906}
3907
3908static struct pernet_operations pfkey_net_ops = {
3909	.init = pfkey_net_init,
3910	.exit = pfkey_net_exit,
3911	.id   = &pfkey_net_id,
3912	.size = sizeof(struct netns_pfkey),
3913};
3914
3915static void __exit ipsec_pfkey_exit(void)
3916{
3917	xfrm_unregister_km(&pfkeyv2_mgr);
3918	sock_unregister(PF_KEY);
3919	unregister_pernet_subsys(&pfkey_net_ops);
3920	proto_unregister(&key_proto);
3921}
3922
3923static int __init ipsec_pfkey_init(void)
3924{
3925	int err = proto_register(&key_proto, 0);
3926
3927	pr_warn_once("PFKEY is deprecated and scheduled to be removed in 2027, "
3928	             "please contact the netdev mailing list\n");
3929	if (err != 0)
3930		goto out;
3931
3932	err = register_pernet_subsys(&pfkey_net_ops);
3933	if (err != 0)
3934		goto out_unregister_key_proto;
3935	err = sock_register(&pfkey_family_ops);
3936	if (err != 0)
3937		goto out_unregister_pernet;
3938	xfrm_register_km(&pfkeyv2_mgr);
3939out:
3940	return err;
3941
3942out_unregister_pernet:
3943	unregister_pernet_subsys(&pfkey_net_ops);
3944out_unregister_key_proto:
3945	proto_unregister(&key_proto);
3946	goto out;
3947}
3948
3949module_init(ipsec_pfkey_init);
3950module_exit(ipsec_pfkey_exit);
3951MODULE_DESCRIPTION("PF_KEY socket helpers");
3952MODULE_LICENSE("GPL");
3953MODULE_ALIAS_NETPROTO(PF_KEY);
~/ Read-only file preview.