Merge with Linux 2.5.74.
[linux-2.6/linux-mips.git] / net / key / af_key.c
blobc14f2f1a18eb762c0a0a9885e42251073fb535b7
1 /*
2 * net/key/af_key.c An implementation of PF_KEYv2 sockets.
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version
7 * 2 of the License, or (at your option) any later version.
9 * Authors: Maxim Giryaev <gem@asplinux.ru>
10 * David S. Miller <davem@redhat.com>
11 * Alexey Kuznetsov <kuznet@ms2.inr.ac.ru>
12 * Kunihiro Ishiguro <kunihiro@ipinfusion.com>
13 * Kazunori MIYAZAWA / USAGI Project <miyazawa@linux-ipv6.org>
14 * Derek Atkins <derek@ihtfp.com>
17 #include <linux/config.h>
18 #include <linux/module.h>
19 #include <linux/kernel.h>
20 #include <linux/socket.h>
21 #include <linux/pfkeyv2.h>
22 #include <linux/ipsec.h>
23 #include <linux/skbuff.h>
24 #include <linux/rtnetlink.h>
25 #include <linux/in.h>
26 #include <linux/in6.h>
27 #include <linux/proc_fs.h>
28 #include <linux/init.h>
29 #include <net/xfrm.h>
31 #include <net/sock.h>
33 #define _X2KEY(x) ((x) == XFRM_INF ? 0 : (x))
34 #define _KEY2X(x) ((x) == 0 ? XFRM_INF : (x))
37 /* List of all pfkey sockets. */
38 HLIST_HEAD(pfkey_table);
39 static DECLARE_WAIT_QUEUE_HEAD(pfkey_table_wait);
40 static rwlock_t pfkey_table_lock = RW_LOCK_UNLOCKED;
41 static atomic_t pfkey_table_users = ATOMIC_INIT(0);
43 static atomic_t pfkey_socks_nr = ATOMIC_INIT(0);
45 struct pfkey_opt {
46 int registered;
47 int promisc;
49 #define pfkey_sk(__sk) ((struct pfkey_opt *)(__sk)->sk_protinfo)
51 static void pfkey_sock_destruct(struct sock *sk)
53 skb_queue_purge(&sk->sk_receive_queue);
55 if (!sock_flag(sk, SOCK_DEAD)) {
56 printk("Attempt to release alive pfkey socket: %p\n", sk);
57 return;
60 BUG_TRAP(!atomic_read(&sk->sk_rmem_alloc));
61 BUG_TRAP(!atomic_read(&sk->sk_wmem_alloc));
63 kfree(pfkey_sk(sk));
65 atomic_dec(&pfkey_socks_nr);
68 static void pfkey_table_grab(void)
70 write_lock_bh(&pfkey_table_lock);
72 if (atomic_read(&pfkey_table_users)) {
73 DECLARE_WAITQUEUE(wait, current);
75 add_wait_queue_exclusive(&pfkey_table_wait, &wait);
76 for(;;) {
77 set_current_state(TASK_UNINTERRUPTIBLE);
78 if (atomic_read(&pfkey_table_users) == 0)
79 break;
80 write_unlock_bh(&pfkey_table_lock);
81 schedule();
82 write_lock_bh(&pfkey_table_lock);
85 __set_current_state(TASK_RUNNING);
86 remove_wait_queue(&pfkey_table_wait, &wait);
90 static __inline__ void pfkey_table_ungrab(void)
92 write_unlock_bh(&pfkey_table_lock);
93 wake_up(&pfkey_table_wait);
96 static __inline__ void pfkey_lock_table(void)
98 /* read_lock() synchronizes us to pfkey_table_grab */
100 read_lock(&pfkey_table_lock);
101 atomic_inc(&pfkey_table_users);
102 read_unlock(&pfkey_table_lock);
105 static __inline__ void pfkey_unlock_table(void)
107 if (atomic_dec_and_test(&pfkey_table_users))
108 wake_up(&pfkey_table_wait);
112 static struct proto_ops pfkey_ops;
114 static void pfkey_insert(struct sock *sk)
116 pfkey_table_grab();
117 sk_add_node(sk, &pfkey_table);
118 pfkey_table_ungrab();
121 static void pfkey_remove(struct sock *sk)
123 pfkey_table_grab();
124 sk_del_node_init(sk);
125 pfkey_table_ungrab();
128 static int pfkey_create(struct socket *sock, int protocol)
130 struct sock *sk;
131 struct pfkey_opt *pfk;
132 int err;
134 if (!capable(CAP_NET_ADMIN))
135 return -EPERM;
136 if (sock->type != SOCK_RAW)
137 return -ESOCKTNOSUPPORT;
138 if (protocol != PF_KEY_V2)
139 return -EPROTONOSUPPORT;
141 err = -ENOMEM;
142 sk = sk_alloc(PF_KEY, GFP_KERNEL, 1, NULL);
143 if (sk == NULL)
144 goto out;
146 sock->ops = &pfkey_ops;
147 sock_init_data(sock, sk);
148 sk_set_owner(sk, THIS_MODULE);
150 err = -ENOMEM;
151 pfk = pfkey_sk(sk) = kmalloc(sizeof(*pfk), GFP_KERNEL);
152 if (!pfk) {
153 sk_free(sk);
154 goto out;
156 memset(pfk, 0, sizeof(*pfk));
158 sk->sk_family = PF_KEY;
159 sk->sk_destruct = pfkey_sock_destruct;
161 atomic_inc(&pfkey_socks_nr);
163 pfkey_insert(sk);
165 return 0;
166 out:
167 return err;
170 static int pfkey_release(struct socket *sock)
172 struct sock *sk = sock->sk;
174 if (!sk)
175 return 0;
177 pfkey_remove(sk);
179 sock_orphan(sk);
180 sock->sk = NULL;
181 skb_queue_purge(&sk->sk_write_queue);
182 sock_put(sk);
184 return 0;
187 static int pfkey_broadcast_one(struct sk_buff *skb, struct sk_buff **skb2,
188 int allocation, struct sock *sk)
190 int err = -ENOBUFS;
192 sock_hold(sk);
193 if (*skb2 == NULL) {
194 if (atomic_read(&skb->users) != 1) {
195 *skb2 = skb_clone(skb, allocation);
196 } else {
197 *skb2 = skb;
198 atomic_inc(&skb->users);
201 if (*skb2 != NULL) {
202 if (atomic_read(&sk->sk_rmem_alloc) <= sk->sk_rcvbuf) {
203 skb_orphan(*skb2);
204 skb_set_owner_r(*skb2, sk);
205 skb_queue_tail(&sk->sk_receive_queue, *skb2);
206 sk->sk_data_ready(sk, (*skb2)->len);
207 *skb2 = NULL;
208 err = 0;
211 sock_put(sk);
212 return err;
215 /* Send SKB to all pfkey sockets matching selected criteria. */
216 #define BROADCAST_ALL 0
217 #define BROADCAST_ONE 1
218 #define BROADCAST_REGISTERED 2
219 #define BROADCAST_PROMISC_ONLY 4
220 static int pfkey_broadcast(struct sk_buff *skb, int allocation,
221 int broadcast_flags, struct sock *one_sk)
223 struct sock *sk;
224 struct hlist_node *node;
225 struct sk_buff *skb2 = NULL;
226 int err = -ESRCH;
228 /* XXX Do we need something like netlink_overrun? I think
229 * XXX PF_KEY socket apps will not mind current behavior.
231 if (!skb)
232 return -ENOMEM;
234 pfkey_lock_table();
235 sk_for_each(sk, node, &pfkey_table) {
236 struct pfkey_opt *pfk = pfkey_sk(sk);
237 int err2;
239 /* Yes, it means that if you are meant to receive this
240 * pfkey message you receive it twice as promiscuous
241 * socket.
243 if (pfk->promisc)
244 pfkey_broadcast_one(skb, &skb2, allocation, sk);
246 /* the exact target will be processed later */
247 if (sk == one_sk)
248 continue;
249 if (broadcast_flags != BROADCAST_ALL) {
250 if (broadcast_flags & BROADCAST_PROMISC_ONLY)
251 continue;
252 if ((broadcast_flags & BROADCAST_REGISTERED) &&
253 !pfk->registered)
254 continue;
255 if (broadcast_flags & BROADCAST_ONE)
256 continue;
259 err2 = pfkey_broadcast_one(skb, &skb2, allocation, sk);
261 /* Error is cleare after succecful sending to at least one
262 * registered KM */
263 if ((broadcast_flags & BROADCAST_REGISTERED) && err)
264 err = err2;
266 pfkey_unlock_table();
268 if (one_sk != NULL)
269 err = pfkey_broadcast_one(skb, &skb2, allocation, one_sk);
271 if (skb2)
272 kfree_skb(skb2);
273 kfree_skb(skb);
274 return err;
277 static inline void pfkey_hdr_dup(struct sadb_msg *new, struct sadb_msg *orig)
279 *new = *orig;
282 static int pfkey_error(struct sadb_msg *orig, int err, struct sock *sk)
284 struct sk_buff *skb = alloc_skb(sizeof(struct sadb_msg) + 16, GFP_KERNEL);
285 struct sadb_msg *hdr;
287 if (!skb)
288 return -ENOBUFS;
290 /* Woe be to the platform trying to support PFKEY yet
291 * having normal errnos outside the 1-255 range, inclusive.
293 err = -err;
294 if (err == ERESTARTSYS ||
295 err == ERESTARTNOHAND ||
296 err == ERESTARTNOINTR)
297 err = EINTR;
298 if (err >= 512)
299 err = EINVAL;
300 if (err <= 0 || err >= 256)
301 BUG();
303 hdr = (struct sadb_msg *) skb_put(skb, sizeof(struct sadb_msg));
304 pfkey_hdr_dup(hdr, orig);
305 hdr->sadb_msg_errno = (uint8_t) err;
306 hdr->sadb_msg_len = (sizeof(struct sadb_msg) /
307 sizeof(uint64_t));
309 pfkey_broadcast(skb, GFP_KERNEL, BROADCAST_ONE, sk);
311 return 0;
314 static u8 sadb_ext_min_len[] = {
315 [SADB_EXT_RESERVED] = (u8) 0,
316 [SADB_EXT_SA] = (u8) sizeof(struct sadb_sa),
317 [SADB_EXT_LIFETIME_CURRENT] = (u8) sizeof(struct sadb_lifetime),
318 [SADB_EXT_LIFETIME_HARD] = (u8) sizeof(struct sadb_lifetime),
319 [SADB_EXT_LIFETIME_SOFT] = (u8) sizeof(struct sadb_lifetime),
320 [SADB_EXT_ADDRESS_SRC] = (u8) sizeof(struct sadb_address),
321 [SADB_EXT_ADDRESS_DST] = (u8) sizeof(struct sadb_address),
322 [SADB_EXT_ADDRESS_PROXY] = (u8) sizeof(struct sadb_address),
323 [SADB_EXT_KEY_AUTH] = (u8) sizeof(struct sadb_key),
324 [SADB_EXT_KEY_ENCRYPT] = (u8) sizeof(struct sadb_key),
325 [SADB_EXT_IDENTITY_SRC] = (u8) sizeof(struct sadb_ident),
326 [SADB_EXT_IDENTITY_DST] = (u8) sizeof(struct sadb_ident),
327 [SADB_EXT_SENSITIVITY] = (u8) sizeof(struct sadb_sens),
328 [SADB_EXT_PROPOSAL] = (u8) sizeof(struct sadb_prop),
329 [SADB_EXT_SUPPORTED_AUTH] = (u8) sizeof(struct sadb_supported),
330 [SADB_EXT_SUPPORTED_ENCRYPT] = (u8) sizeof(struct sadb_supported),
331 [SADB_EXT_SPIRANGE] = (u8) sizeof(struct sadb_spirange),
332 [SADB_X_EXT_KMPRIVATE] = (u8) sizeof(struct sadb_x_kmprivate),
333 [SADB_X_EXT_POLICY] = (u8) sizeof(struct sadb_x_policy),
334 [SADB_X_EXT_SA2] = (u8) sizeof(struct sadb_x_sa2),
335 [SADB_X_EXT_NAT_T_TYPE] = (u8) sizeof(struct sadb_x_nat_t_type),
336 [SADB_X_EXT_NAT_T_SPORT] = (u8) sizeof(struct sadb_x_nat_t_port),
337 [SADB_X_EXT_NAT_T_DPORT] = (u8) sizeof(struct sadb_x_nat_t_port),
338 [SADB_X_EXT_NAT_T_OA] = (u8) sizeof(struct sadb_address),
341 /* Verify sadb_address_{len,prefixlen} against sa_family. */
342 static int verify_address_len(void *p)
344 struct sadb_address *sp = p;
345 struct sockaddr *addr = (struct sockaddr *)(sp + 1);
346 struct sockaddr_in *sin;
347 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
348 struct sockaddr_in6 *sin6;
349 #endif
350 int len;
352 switch (addr->sa_family) {
353 case AF_INET:
354 len = sizeof(*sp) + sizeof(*sin) + (sizeof(uint64_t) - 1);
355 len /= sizeof(uint64_t);
356 if (sp->sadb_address_len != len ||
357 sp->sadb_address_prefixlen > 32)
358 return -EINVAL;
359 break;
360 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
361 case AF_INET6:
362 len = sizeof(*sp) + sizeof(*sin6) + (sizeof(uint64_t) - 1);
363 len /= sizeof(uint64_t);
364 if (sp->sadb_address_len != len ||
365 sp->sadb_address_prefixlen > 128)
366 return -EINVAL;
367 break;
368 #endif
369 default:
370 /* It is user using kernel to keep track of security
371 * associations for another protocol, such as
372 * OSPF/RSVP/RIPV2/MIP. It is user's job to verify
373 * lengths.
375 * XXX Actually, association/policy database is not yet
376 * XXX able to cope with arbitrary sockaddr families.
377 * XXX When it can, remove this -EINVAL. -DaveM
379 return -EINVAL;
380 break;
383 return 0;
386 static int present_and_same_family(struct sadb_address *src,
387 struct sadb_address *dst)
389 struct sockaddr *s_addr, *d_addr;
391 if (!src || !dst)
392 return 0;
394 s_addr = (struct sockaddr *)(src + 1);
395 d_addr = (struct sockaddr *)(dst + 1);
396 if (s_addr->sa_family != d_addr->sa_family)
397 return 0;
398 if (s_addr->sa_family != AF_INET
399 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
400 && s_addr->sa_family != AF_INET6
401 #endif
403 return 0;
405 return 1;
408 static int parse_exthdrs(struct sk_buff *skb, struct sadb_msg *hdr, void **ext_hdrs)
410 char *p = (char *) hdr;
411 int len = skb->len;
413 len -= sizeof(*hdr);
414 p += sizeof(*hdr);
415 while (len > 0) {
416 struct sadb_ext *ehdr = (struct sadb_ext *) p;
417 uint16_t ext_type;
418 int ext_len;
420 ext_len = ehdr->sadb_ext_len;
421 ext_len *= sizeof(uint64_t);
422 ext_type = ehdr->sadb_ext_type;
423 if (ext_len < sizeof(uint64_t) ||
424 ext_len > len ||
425 ext_type == SADB_EXT_RESERVED)
426 return -EINVAL;
428 if (ext_type <= SADB_EXT_MAX) {
429 int min = (int) sadb_ext_min_len[ext_type];
430 if (ext_len < min)
431 return -EINVAL;
432 if (ext_hdrs[ext_type-1] != NULL)
433 return -EINVAL;
434 if (ext_type == SADB_EXT_ADDRESS_SRC ||
435 ext_type == SADB_EXT_ADDRESS_DST ||
436 ext_type == SADB_EXT_ADDRESS_PROXY ||
437 ext_type == SADB_X_EXT_NAT_T_OA) {
438 if (verify_address_len(p))
439 return -EINVAL;
441 ext_hdrs[ext_type-1] = p;
443 p += ext_len;
444 len -= ext_len;
447 return 0;
450 static uint16_t
451 pfkey_satype2proto(uint8_t satype)
453 switch (satype) {
454 case SADB_SATYPE_UNSPEC:
455 return IPSEC_PROTO_ANY;
456 case SADB_SATYPE_AH:
457 return IPPROTO_AH;
458 case SADB_SATYPE_ESP:
459 return IPPROTO_ESP;
460 case SADB_X_SATYPE_IPCOMP:
461 return IPPROTO_COMP;
462 break;
463 default:
464 return 0;
466 /* NOTREACHED */
469 static uint8_t
470 pfkey_proto2satype(uint16_t proto)
472 switch (proto) {
473 case IPPROTO_AH:
474 return SADB_SATYPE_AH;
475 case IPPROTO_ESP:
476 return SADB_SATYPE_ESP;
477 case IPPROTO_COMP:
478 return SADB_X_SATYPE_IPCOMP;
479 break;
480 default:
481 return 0;
483 /* NOTREACHED */
486 /* BTW, this scheme means that there is no way with PFKEY2 sockets to
487 * say specifically 'just raw sockets' as we encode them as 255.
490 static uint8_t pfkey_proto_to_xfrm(uint8_t proto)
492 return (proto == IPSEC_PROTO_ANY ? 0 : proto);
495 static uint8_t pfkey_proto_from_xfrm(uint8_t proto)
497 return (proto ? proto : IPSEC_PROTO_ANY);
500 static int pfkey_sadb_addr2xfrm_addr(struct sadb_address *addr,
501 xfrm_address_t *xaddr)
503 switch (((struct sockaddr*)(addr + 1))->sa_family) {
504 case AF_INET:
505 xaddr->a4 =
506 ((struct sockaddr_in *)(addr + 1))->sin_addr.s_addr;
507 return AF_INET;
508 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
509 case AF_INET6:
510 memcpy(xaddr->a6,
511 &((struct sockaddr_in6 *)(addr + 1))->sin6_addr,
512 sizeof(struct in6_addr));
513 return AF_INET6;
514 #endif
515 default:
516 return 0;
518 /* NOTREACHED */
521 static struct xfrm_state *pfkey_xfrm_state_lookup(struct sadb_msg *hdr, void **ext_hdrs)
523 struct sadb_sa *sa;
524 struct sadb_address *addr;
525 uint16_t proto;
526 unsigned short family;
527 xfrm_address_t *xaddr;
529 sa = (struct sadb_sa *) ext_hdrs[SADB_EXT_SA-1];
530 if (sa == NULL)
531 return NULL;
533 proto = pfkey_satype2proto(hdr->sadb_msg_satype);
534 if (proto == 0)
535 return NULL;
537 /* sadb_address_len should be checked by caller */
538 addr = (struct sadb_address *) ext_hdrs[SADB_EXT_ADDRESS_DST-1];
539 if (addr == NULL)
540 return NULL;
542 family = ((struct sockaddr *)(addr + 1))->sa_family;
543 switch (family) {
544 case AF_INET:
545 xaddr = (xfrm_address_t *)&((struct sockaddr_in *)(addr + 1))->sin_addr;
546 break;
547 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
548 case AF_INET6:
549 xaddr = (xfrm_address_t *)&((struct sockaddr_in6 *)(addr + 1))->sin6_addr;
550 break;
551 #endif
552 default:
553 xaddr = NULL;
556 if (!xaddr)
557 return NULL;
559 return xfrm_state_lookup(xaddr, sa->sadb_sa_spi, proto, family);
562 #define PFKEY_ALIGN8(a) (1 + (((a) - 1) | (8 - 1)))
563 static int
564 pfkey_sockaddr_size(sa_family_t family)
566 switch (family) {
567 case AF_INET:
568 return PFKEY_ALIGN8(sizeof(struct sockaddr_in));
569 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
570 case AF_INET6:
571 return PFKEY_ALIGN8(sizeof(struct sockaddr_in6));
572 #endif
573 default:
574 return 0;
576 /* NOTREACHED */
579 static struct sk_buff * pfkey_xfrm_state2msg(struct xfrm_state *x, int add_keys, int hsc)
581 struct sk_buff *skb;
582 struct sadb_msg *hdr;
583 struct sadb_sa *sa;
584 struct sadb_lifetime *lifetime;
585 struct sadb_address *addr;
586 struct sadb_key *key;
587 struct sadb_x_sa2 *sa2;
588 struct sockaddr_in *sin;
589 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
590 struct sockaddr_in6 *sin6;
591 #endif
592 int size;
593 int auth_key_size = 0;
594 int encrypt_key_size = 0;
595 int sockaddr_size;
596 struct xfrm_encap_tmpl *natt = NULL;
598 /* address family check */
599 sockaddr_size = pfkey_sockaddr_size(x->props.family);
600 if (!sockaddr_size)
601 ERR_PTR(-EINVAL);
603 /* base, SA, (lifetime (HSC),) address(SD), (address(P),)
604 key(AE), (identity(SD),) (sensitivity)> */
605 size = sizeof(struct sadb_msg) +sizeof(struct sadb_sa) +
606 sizeof(struct sadb_lifetime) +
607 ((hsc & 1) ? sizeof(struct sadb_lifetime) : 0) +
608 ((hsc & 2) ? sizeof(struct sadb_lifetime) : 0) +
609 sizeof(struct sadb_address)*2 +
610 sockaddr_size*2 +
611 sizeof(struct sadb_x_sa2);
612 /* identity & sensitivity */
614 if ((x->props.family == AF_INET &&
615 x->sel.saddr.a4 != x->props.saddr.a4)
616 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
617 || (x->props.family == AF_INET6 &&
618 memcmp (x->sel.saddr.a6, x->props.saddr.a6, sizeof (struct in6_addr)))
619 #endif
621 size += sizeof(struct sadb_address) + sockaddr_size;
623 if (add_keys) {
624 if (x->aalg && x->aalg->alg_key_len) {
625 auth_key_size =
626 PFKEY_ALIGN8((x->aalg->alg_key_len + 7) / 8);
627 size += sizeof(struct sadb_key) + auth_key_size;
629 if (x->ealg && x->ealg->alg_key_len) {
630 encrypt_key_size =
631 PFKEY_ALIGN8((x->ealg->alg_key_len+7) / 8);
632 size += sizeof(struct sadb_key) + encrypt_key_size;
635 if (x->encap)
636 natt = x->encap;
638 if (natt && natt->encap_type) {
639 size += sizeof(struct sadb_x_nat_t_type);
640 size += sizeof(struct sadb_x_nat_t_port);
641 size += sizeof(struct sadb_x_nat_t_port);
644 skb = alloc_skb(size + 16, GFP_ATOMIC);
645 if (skb == NULL)
646 return ERR_PTR(-ENOBUFS);
648 /* call should fill header later */
649 hdr = (struct sadb_msg *) skb_put(skb, sizeof(struct sadb_msg));
650 memset(hdr, 0, size); /* XXX do we need this ? */
651 hdr->sadb_msg_len = size / sizeof(uint64_t);
653 /* sa */
654 sa = (struct sadb_sa *) skb_put(skb, sizeof(struct sadb_sa));
655 sa->sadb_sa_len = sizeof(struct sadb_sa)/sizeof(uint64_t);
656 sa->sadb_sa_exttype = SADB_EXT_SA;
657 sa->sadb_sa_spi = x->id.spi;
658 sa->sadb_sa_replay = x->props.replay_window;
659 sa->sadb_sa_state = SADB_SASTATE_DYING;
660 if (x->km.state == XFRM_STATE_VALID && !x->km.dying)
661 sa->sadb_sa_state = SADB_SASTATE_MATURE;
662 else if (x->km.state == XFRM_STATE_ACQ)
663 sa->sadb_sa_state = SADB_SASTATE_LARVAL;
664 else if (x->km.state == XFRM_STATE_EXPIRED)
665 sa->sadb_sa_state = SADB_SASTATE_DEAD;
666 sa->sadb_sa_auth = 0;
667 if (x->aalg) {
668 struct xfrm_algo_desc *a = xfrm_aalg_get_byname(x->aalg->alg_name);
669 sa->sadb_sa_auth = a ? a->desc.sadb_alg_id : 0;
671 sa->sadb_sa_encrypt = 0;
672 BUG_ON(x->ealg && x->calg);
673 if (x->ealg) {
674 struct xfrm_algo_desc *a = xfrm_ealg_get_byname(x->ealg->alg_name);
675 sa->sadb_sa_encrypt = a ? a->desc.sadb_alg_id : 0;
677 /* KAME compatible: sadb_sa_encrypt is overloaded with calg id */
678 if (x->calg) {
679 struct xfrm_algo_desc *a = xfrm_calg_get_byname(x->calg->alg_name);
680 sa->sadb_sa_encrypt = a ? a->desc.sadb_alg_id : 0;
683 sa->sadb_sa_flags = 0;
685 /* hard time */
686 if (hsc & 2) {
687 lifetime = (struct sadb_lifetime *) skb_put(skb,
688 sizeof(struct sadb_lifetime));
689 lifetime->sadb_lifetime_len =
690 sizeof(struct sadb_lifetime)/sizeof(uint64_t);
691 lifetime->sadb_lifetime_exttype = SADB_EXT_LIFETIME_HARD;
692 lifetime->sadb_lifetime_allocations = _X2KEY(x->lft.hard_packet_limit);
693 lifetime->sadb_lifetime_bytes = _X2KEY(x->lft.hard_byte_limit);
694 lifetime->sadb_lifetime_addtime = x->lft.hard_add_expires_seconds;
695 lifetime->sadb_lifetime_usetime = x->lft.hard_use_expires_seconds;
697 /* soft time */
698 if (hsc & 1) {
699 lifetime = (struct sadb_lifetime *) skb_put(skb,
700 sizeof(struct sadb_lifetime));
701 lifetime->sadb_lifetime_len =
702 sizeof(struct sadb_lifetime)/sizeof(uint64_t);
703 lifetime->sadb_lifetime_exttype = SADB_EXT_LIFETIME_SOFT;
704 lifetime->sadb_lifetime_allocations = _X2KEY(x->lft.soft_packet_limit);
705 lifetime->sadb_lifetime_bytes = _X2KEY(x->lft.soft_byte_limit);
706 lifetime->sadb_lifetime_addtime = x->lft.soft_add_expires_seconds;
707 lifetime->sadb_lifetime_usetime = x->lft.soft_use_expires_seconds;
709 /* current time */
710 lifetime = (struct sadb_lifetime *) skb_put(skb,
711 sizeof(struct sadb_lifetime));
712 lifetime->sadb_lifetime_len =
713 sizeof(struct sadb_lifetime)/sizeof(uint64_t);
714 lifetime->sadb_lifetime_exttype = SADB_EXT_LIFETIME_CURRENT;
715 lifetime->sadb_lifetime_allocations = x->curlft.packets;
716 lifetime->sadb_lifetime_bytes = x->curlft.bytes;
717 lifetime->sadb_lifetime_addtime = x->curlft.add_time;
718 lifetime->sadb_lifetime_usetime = x->curlft.use_time;
719 /* src address */
720 addr = (struct sadb_address*) skb_put(skb,
721 sizeof(struct sadb_address)+sockaddr_size);
722 addr->sadb_address_len =
723 (sizeof(struct sadb_address)+sockaddr_size)/
724 sizeof(uint64_t);
725 addr->sadb_address_exttype = SADB_EXT_ADDRESS_SRC;
726 /* "if the ports are non-zero, then the sadb_address_proto field,
727 normally zero, MUST be filled in with the transport
728 protocol's number." - RFC2367 */
729 addr->sadb_address_proto = 0;
730 addr->sadb_address_reserved = 0;
731 if (x->props.family == AF_INET) {
732 addr->sadb_address_prefixlen = 32;
734 sin = (struct sockaddr_in *) (addr + 1);
735 sin->sin_family = AF_INET;
736 sin->sin_addr.s_addr = x->props.saddr.a4;
737 sin->sin_port = 0;
738 memset(sin->sin_zero, 0, sizeof(sin->sin_zero));
740 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
741 else if (x->props.family == AF_INET6) {
742 addr->sadb_address_prefixlen = 128;
744 sin6 = (struct sockaddr_in6 *) (addr + 1);
745 sin6->sin6_family = AF_INET6;
746 sin6->sin6_port = 0;
747 sin6->sin6_flowinfo = 0;
748 memcpy(&sin6->sin6_addr, x->props.saddr.a6,
749 sizeof(struct in6_addr));
750 sin6->sin6_scope_id = 0;
752 #endif
753 else
754 BUG();
756 /* dst address */
757 addr = (struct sadb_address*) skb_put(skb,
758 sizeof(struct sadb_address)+sockaddr_size);
759 addr->sadb_address_len =
760 (sizeof(struct sadb_address)+sockaddr_size)/
761 sizeof(uint64_t);
762 addr->sadb_address_exttype = SADB_EXT_ADDRESS_DST;
763 addr->sadb_address_proto = 0;
764 addr->sadb_address_prefixlen = 32; /* XXX */
765 addr->sadb_address_reserved = 0;
766 if (x->props.family == AF_INET) {
767 sin = (struct sockaddr_in *) (addr + 1);
768 sin->sin_family = AF_INET;
769 sin->sin_addr.s_addr = x->id.daddr.a4;
770 sin->sin_port = 0;
771 memset(sin->sin_zero, 0, sizeof(sin->sin_zero));
773 if (x->sel.saddr.a4 != x->props.saddr.a4) {
774 addr = (struct sadb_address*) skb_put(skb,
775 sizeof(struct sadb_address)+sockaddr_size);
776 addr->sadb_address_len =
777 (sizeof(struct sadb_address)+sockaddr_size)/
778 sizeof(uint64_t);
779 addr->sadb_address_exttype = SADB_EXT_ADDRESS_PROXY;
780 addr->sadb_address_proto =
781 pfkey_proto_from_xfrm(x->sel.proto);
782 addr->sadb_address_prefixlen = x->sel.prefixlen_s;
783 addr->sadb_address_reserved = 0;
785 sin = (struct sockaddr_in *) (addr + 1);
786 sin->sin_family = AF_INET;
787 sin->sin_addr.s_addr = x->sel.saddr.a4;
788 sin->sin_port = x->sel.sport;
789 memset(sin->sin_zero, 0, sizeof(sin->sin_zero));
792 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
793 else if (x->props.family == AF_INET6) {
794 addr->sadb_address_prefixlen = 128;
796 sin6 = (struct sockaddr_in6 *) (addr + 1);
797 sin6->sin6_family = AF_INET6;
798 sin6->sin6_port = 0;
799 sin6->sin6_flowinfo = 0;
800 memcpy(&sin6->sin6_addr, x->id.daddr.a6, sizeof(struct in6_addr));
801 sin6->sin6_scope_id = 0;
803 if (memcmp (x->sel.saddr.a6, x->props.saddr.a6,
804 sizeof(struct in6_addr))) {
805 addr = (struct sadb_address *) skb_put(skb,
806 sizeof(struct sadb_address)+sockaddr_size);
807 addr->sadb_address_len =
808 (sizeof(struct sadb_address)+sockaddr_size)/
809 sizeof(uint64_t);
810 addr->sadb_address_exttype = SADB_EXT_ADDRESS_PROXY;
811 addr->sadb_address_proto =
812 pfkey_proto_from_xfrm(x->sel.proto);
813 addr->sadb_address_prefixlen = x->sel.prefixlen_s;
814 addr->sadb_address_reserved = 0;
816 sin6 = (struct sockaddr_in6 *) (addr + 1);
817 sin6->sin6_family = AF_INET6;
818 sin6->sin6_port = x->sel.sport;
819 sin6->sin6_flowinfo = 0;
820 memcpy(&sin6->sin6_addr, x->sel.saddr.a6,
821 sizeof(struct in6_addr));
822 sin6->sin6_scope_id = 0;
825 #endif
826 else
827 BUG();
829 /* auth key */
830 if (add_keys && auth_key_size) {
831 key = (struct sadb_key *) skb_put(skb,
832 sizeof(struct sadb_key)+auth_key_size);
833 key->sadb_key_len = (sizeof(struct sadb_key) + auth_key_size) /
834 sizeof(uint64_t);
835 key->sadb_key_exttype = SADB_EXT_KEY_AUTH;
836 key->sadb_key_bits = x->aalg->alg_key_len;
837 key->sadb_key_reserved = 0;
838 memcpy(key + 1, x->aalg->alg_key, (x->aalg->alg_key_len+7)/8);
840 /* encrypt key */
841 if (add_keys && encrypt_key_size) {
842 key = (struct sadb_key *) skb_put(skb,
843 sizeof(struct sadb_key)+encrypt_key_size);
844 key->sadb_key_len = (sizeof(struct sadb_key) +
845 encrypt_key_size) / sizeof(uint64_t);
846 key->sadb_key_exttype = SADB_EXT_KEY_ENCRYPT;
847 key->sadb_key_bits = x->ealg->alg_key_len;
848 key->sadb_key_reserved = 0;
849 memcpy(key + 1, x->ealg->alg_key,
850 (x->ealg->alg_key_len+7)/8);
853 /* sa */
854 sa2 = (struct sadb_x_sa2 *) skb_put(skb, sizeof(struct sadb_x_sa2));
855 sa2->sadb_x_sa2_len = sizeof(struct sadb_x_sa2)/sizeof(uint64_t);
856 sa2->sadb_x_sa2_exttype = SADB_X_EXT_SA2;
857 sa2->sadb_x_sa2_mode = x->props.mode + 1;
858 sa2->sadb_x_sa2_reserved1 = 0;
859 sa2->sadb_x_sa2_reserved2 = 0;
860 sa2->sadb_x_sa2_sequence = 0;
861 sa2->sadb_x_sa2_reqid = x->props.reqid;
863 if (natt && natt->encap_type) {
864 struct sadb_x_nat_t_type *n_type;
865 struct sadb_x_nat_t_port *n_port;
867 /* type */
868 n_type = (struct sadb_x_nat_t_type*) skb_put(skb, sizeof(*n_type));
869 n_type->sadb_x_nat_t_type_len = sizeof(*n_type)/sizeof(uint64_t);
870 n_type->sadb_x_nat_t_type_exttype = SADB_X_EXT_NAT_T_TYPE;
871 n_type->sadb_x_nat_t_type_type = natt->encap_type;
872 n_type->sadb_x_nat_t_type_reserved[0] = 0;
873 n_type->sadb_x_nat_t_type_reserved[1] = 0;
874 n_type->sadb_x_nat_t_type_reserved[2] = 0;
876 /* source port */
877 n_port = (struct sadb_x_nat_t_port*) skb_put(skb, sizeof (*n_port));
878 n_port->sadb_x_nat_t_port_len = sizeof(*n_port)/sizeof(uint64_t);
879 n_port->sadb_x_nat_t_port_exttype = SADB_X_EXT_NAT_T_SPORT;
880 n_port->sadb_x_nat_t_port_port = natt->encap_sport;
881 n_port->sadb_x_nat_t_port_reserved = 0;
883 /* dest port */
884 n_port = (struct sadb_x_nat_t_port*) skb_put(skb, sizeof (*n_port));
885 n_port->sadb_x_nat_t_port_len = sizeof(*n_port)/sizeof(uint64_t);
886 n_port->sadb_x_nat_t_port_exttype = SADB_X_EXT_NAT_T_DPORT;
887 n_port->sadb_x_nat_t_port_port = natt->encap_dport;
888 n_port->sadb_x_nat_t_port_reserved = 0;
891 return skb;
894 static struct xfrm_state * pfkey_msg2xfrm_state(struct sadb_msg *hdr,
895 void **ext_hdrs)
897 struct xfrm_state *x;
898 struct sadb_lifetime *lifetime;
899 struct sadb_sa *sa;
900 struct sadb_key *key;
901 uint16_t proto;
904 sa = (struct sadb_sa *) ext_hdrs[SADB_EXT_SA-1];
905 if (!sa ||
906 !present_and_same_family(ext_hdrs[SADB_EXT_ADDRESS_SRC-1],
907 ext_hdrs[SADB_EXT_ADDRESS_DST-1]))
908 return ERR_PTR(-EINVAL);
909 if (hdr->sadb_msg_satype == SADB_SATYPE_ESP &&
910 !ext_hdrs[SADB_EXT_KEY_ENCRYPT-1])
911 return ERR_PTR(-EINVAL);
912 if (hdr->sadb_msg_satype == SADB_SATYPE_AH &&
913 !ext_hdrs[SADB_EXT_KEY_AUTH-1])
914 return ERR_PTR(-EINVAL);
915 if (!!ext_hdrs[SADB_EXT_LIFETIME_HARD-1] !=
916 !!ext_hdrs[SADB_EXT_LIFETIME_SOFT-1])
917 return ERR_PTR(-EINVAL);
919 proto = pfkey_satype2proto(hdr->sadb_msg_satype);
920 if (proto == 0)
921 return ERR_PTR(-EINVAL);
923 /* RFC2367:
925 Only SADB_SASTATE_MATURE SAs may be submitted in an SADB_ADD message.
926 SADB_SASTATE_LARVAL SAs are created by SADB_GETSPI and it is not
927 sensible to add a new SA in the DYING or SADB_SASTATE_DEAD state.
928 Therefore, the sadb_sa_state field of all submitted SAs MUST be
929 SADB_SASTATE_MATURE and the kernel MUST return an error if this is
930 not true.
932 However, KAME setkey always uses SADB_SASTATE_LARVAL.
933 Hence, we have to _ignore_ sadb_sa_state, which is also reasonable.
935 if (sa->sadb_sa_auth > SADB_AALG_MAX ||
936 (hdr->sadb_msg_satype == SADB_X_SATYPE_IPCOMP &&
937 sa->sadb_sa_encrypt > SADB_X_CALG_MAX) ||
938 sa->sadb_sa_encrypt > SADB_EALG_MAX)
939 return ERR_PTR(-EINVAL);
940 key = (struct sadb_key*) ext_hdrs[SADB_EXT_KEY_AUTH-1];
941 if (key != NULL &&
942 sa->sadb_sa_auth != SADB_X_AALG_NULL &&
943 ((key->sadb_key_bits+7) / 8 == 0 ||
944 (key->sadb_key_bits+7) / 8 > key->sadb_key_len * sizeof(uint64_t)))
945 return ERR_PTR(-EINVAL);
946 key = ext_hdrs[SADB_EXT_KEY_ENCRYPT-1];
947 if (key != NULL &&
948 sa->sadb_sa_encrypt != SADB_EALG_NULL &&
949 ((key->sadb_key_bits+7) / 8 == 0 ||
950 (key->sadb_key_bits+7) / 8 > key->sadb_key_len * sizeof(uint64_t)))
951 return ERR_PTR(-EINVAL);
953 x = xfrm_state_alloc();
954 if (x == NULL)
955 return ERR_PTR(-ENOBUFS);
957 x->id.proto = proto;
958 x->id.spi = sa->sadb_sa_spi;
959 x->props.replay_window = sa->sadb_sa_replay;
961 lifetime = (struct sadb_lifetime*) ext_hdrs[SADB_EXT_LIFETIME_HARD-1];
962 if (lifetime != NULL) {
963 x->lft.hard_packet_limit = _KEY2X(lifetime->sadb_lifetime_allocations);
964 x->lft.hard_byte_limit = _KEY2X(lifetime->sadb_lifetime_bytes);
965 x->lft.hard_add_expires_seconds = lifetime->sadb_lifetime_addtime;
966 x->lft.hard_use_expires_seconds = lifetime->sadb_lifetime_usetime;
968 lifetime = (struct sadb_lifetime*) ext_hdrs[SADB_EXT_LIFETIME_SOFT-1];
969 if (lifetime != NULL) {
970 x->lft.soft_packet_limit = _KEY2X(lifetime->sadb_lifetime_allocations);
971 x->lft.soft_byte_limit = _KEY2X(lifetime->sadb_lifetime_bytes);
972 x->lft.soft_add_expires_seconds = lifetime->sadb_lifetime_addtime;
973 x->lft.soft_use_expires_seconds = lifetime->sadb_lifetime_usetime;
975 key = (struct sadb_key*) ext_hdrs[SADB_EXT_KEY_AUTH-1];
976 if (sa->sadb_sa_auth) {
977 int keysize = 0;
978 struct xfrm_algo_desc *a = xfrm_aalg_get_byid(sa->sadb_sa_auth);
979 if (!a)
980 goto out;
981 if (key)
982 keysize = (key->sadb_key_bits + 7) / 8;
983 x->aalg = kmalloc(sizeof(*x->aalg) + keysize, GFP_KERNEL);
984 if (!x->aalg)
985 goto out;
986 strcpy(x->aalg->alg_name, a->name);
987 x->aalg->alg_key_len = 0;
988 if (key) {
989 x->aalg->alg_key_len = key->sadb_key_bits;
990 memcpy(x->aalg->alg_key, key+1, keysize);
992 x->props.aalgo = sa->sadb_sa_auth;
993 /* x->algo.flags = sa->sadb_sa_flags; */
995 if (sa->sadb_sa_encrypt) {
996 if (hdr->sadb_msg_satype == SADB_X_SATYPE_IPCOMP) {
997 struct xfrm_algo_desc *a = xfrm_calg_get_byid(sa->sadb_sa_encrypt);
998 if (!a)
999 goto out;
1000 x->calg = kmalloc(sizeof(*x->calg), GFP_KERNEL);
1001 if (!x->calg)
1002 goto out;
1003 strcpy(x->calg->alg_name, a->name);
1004 x->props.calgo = sa->sadb_sa_encrypt;
1005 } else {
1006 int keysize = 0;
1007 struct xfrm_algo_desc *a = xfrm_ealg_get_byid(sa->sadb_sa_encrypt);
1008 if (!a)
1009 goto out;
1010 key = (struct sadb_key*) ext_hdrs[SADB_EXT_KEY_ENCRYPT-1];
1011 if (key)
1012 keysize = (key->sadb_key_bits + 7) / 8;
1013 x->ealg = kmalloc(sizeof(*x->ealg) + keysize, GFP_KERNEL);
1014 if (!x->ealg)
1015 goto out;
1016 strcpy(x->ealg->alg_name, a->name);
1017 x->ealg->alg_key_len = 0;
1018 if (key) {
1019 x->ealg->alg_key_len = key->sadb_key_bits;
1020 memcpy(x->ealg->alg_key, key+1, keysize);
1022 x->props.ealgo = sa->sadb_sa_encrypt;
1025 /* x->algo.flags = sa->sadb_sa_flags; */
1027 x->props.family = pfkey_sadb_addr2xfrm_addr((struct sadb_address *) ext_hdrs[SADB_EXT_ADDRESS_SRC-1],
1028 &x->props.saddr);
1029 if (!x->props.family)
1030 goto out;
1031 pfkey_sadb_addr2xfrm_addr((struct sadb_address *) ext_hdrs[SADB_EXT_ADDRESS_DST-1],
1032 &x->id.daddr);
1034 if (ext_hdrs[SADB_X_EXT_SA2-1]) {
1035 struct sadb_x_sa2 *sa2 = (void*)ext_hdrs[SADB_X_EXT_SA2-1];
1036 x->props.mode = sa2->sadb_x_sa2_mode;
1037 if (x->props.mode)
1038 x->props.mode--;
1039 x->props.reqid = sa2->sadb_x_sa2_reqid;
1042 if (ext_hdrs[SADB_EXT_ADDRESS_PROXY-1]) {
1043 struct sadb_address *addr = ext_hdrs[SADB_EXT_ADDRESS_PROXY-1];
1045 /* Nobody uses this, but we try. */
1046 pfkey_sadb_addr2xfrm_addr(addr, &x->sel.saddr);
1047 x->sel.prefixlen_s = addr->sadb_address_prefixlen;
1050 if (ext_hdrs[SADB_X_EXT_NAT_T_TYPE-1]) {
1051 struct sadb_x_nat_t_type* n_type;
1052 struct xfrm_encap_tmpl *natt;
1054 x->encap = kmalloc(sizeof(*x->encap), GFP_KERNEL);
1055 if (!x->encap)
1056 goto out;
1058 natt = x->encap;
1059 n_type = ext_hdrs[SADB_X_EXT_NAT_T_TYPE-1];
1060 natt->encap_type = n_type->sadb_x_nat_t_type_type;
1062 if (ext_hdrs[SADB_X_EXT_NAT_T_SPORT-1]) {
1063 struct sadb_x_nat_t_port* n_port =
1064 ext_hdrs[SADB_X_EXT_NAT_T_SPORT-1];
1065 natt->encap_sport = n_port->sadb_x_nat_t_port_port;
1067 if (ext_hdrs[SADB_X_EXT_NAT_T_DPORT-1]) {
1068 struct sadb_x_nat_t_port* n_port =
1069 ext_hdrs[SADB_X_EXT_NAT_T_DPORT-1];
1070 natt->encap_dport = n_port->sadb_x_nat_t_port_port;
1074 x->type = xfrm_get_type(proto, x->props.family);
1075 if (x->type == NULL)
1076 goto out;
1077 if (x->type->init_state(x, NULL))
1078 goto out;
1079 x->km.seq = hdr->sadb_msg_seq;
1080 x->km.state = XFRM_STATE_VALID;
1081 return x;
1083 out:
1084 x->km.state = XFRM_STATE_DEAD;
1085 xfrm_state_put(x);
1086 return ERR_PTR(-ENOBUFS);
1089 static int pfkey_reserved(struct sock *sk, struct sk_buff *skb, struct sadb_msg *hdr, void **ext_hdrs)
1091 return -EOPNOTSUPP;
1094 static int pfkey_getspi(struct sock *sk, struct sk_buff *skb, struct sadb_msg *hdr, void **ext_hdrs)
1096 struct sk_buff *resp_skb;
1097 struct sadb_x_sa2 *sa2;
1098 struct sadb_address *saddr, *daddr;
1099 struct sadb_msg *out_hdr;
1100 struct xfrm_state *x = NULL;
1101 u8 mode;
1102 u16 reqid;
1103 u8 proto;
1104 unsigned short family;
1105 xfrm_address_t *xsaddr = NULL, *xdaddr = NULL;
1107 if (!present_and_same_family(ext_hdrs[SADB_EXT_ADDRESS_SRC-1],
1108 ext_hdrs[SADB_EXT_ADDRESS_DST-1]))
1109 return -EINVAL;
1111 proto = pfkey_satype2proto(hdr->sadb_msg_satype);
1112 if (proto == 0)
1113 return -EINVAL;
1115 if ((sa2 = ext_hdrs[SADB_X_EXT_SA2-1]) != NULL) {
1116 mode = sa2->sadb_x_sa2_mode - 1;
1117 reqid = sa2->sadb_x_sa2_reqid;
1118 } else {
1119 mode = 0;
1120 reqid = 0;
1123 saddr = ext_hdrs[SADB_EXT_ADDRESS_SRC-1];
1124 daddr = ext_hdrs[SADB_EXT_ADDRESS_DST-1];
1126 family = ((struct sockaddr *)(saddr + 1))->sa_family;
1127 switch (family) {
1128 case AF_INET:
1129 xdaddr = (xfrm_address_t *)&((struct sockaddr_in *)(daddr + 1))->sin_addr.s_addr;
1130 xsaddr = (xfrm_address_t *)&((struct sockaddr_in *)(saddr + 1))->sin_addr.s_addr;
1131 break;
1132 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
1133 case AF_INET6:
1134 xdaddr = (xfrm_address_t *)&((struct sockaddr_in6 *)(daddr + 1))->sin6_addr;
1135 xsaddr = (xfrm_address_t *)&((struct sockaddr_in6 *)(saddr + 1))->sin6_addr;
1136 break;
1137 #endif
1139 if (xdaddr)
1140 x = xfrm_find_acq(mode, reqid, proto, xdaddr, xsaddr, 1, family);
1142 if (x == NULL)
1143 return -ENOENT;
1145 resp_skb = ERR_PTR(-ENOENT);
1147 spin_lock_bh(&x->lock);
1148 if (x->km.state != XFRM_STATE_DEAD) {
1149 struct sadb_spirange *range = ext_hdrs[SADB_EXT_SPIRANGE-1];
1150 u32 min_spi, max_spi;
1152 if (range != NULL) {
1153 min_spi = range->sadb_spirange_min;
1154 max_spi = range->sadb_spirange_max;
1155 } else {
1156 min_spi = htonl(0x100);
1157 max_spi = htonl(0x0fffffff);
1159 xfrm_alloc_spi(x, min_spi, max_spi);
1160 if (x->id.spi)
1161 resp_skb = pfkey_xfrm_state2msg(x, 0, 3);
1163 spin_unlock_bh(&x->lock);
1165 if (IS_ERR(resp_skb)) {
1166 xfrm_state_put(x);
1167 return PTR_ERR(resp_skb);
1170 out_hdr = (struct sadb_msg *) resp_skb->data;
1171 out_hdr->sadb_msg_version = hdr->sadb_msg_version;
1172 out_hdr->sadb_msg_type = SADB_GETSPI;
1173 out_hdr->sadb_msg_satype = pfkey_proto2satype(proto);
1174 out_hdr->sadb_msg_errno = 0;
1175 out_hdr->sadb_msg_reserved = 0;
1176 out_hdr->sadb_msg_seq = hdr->sadb_msg_seq;
1177 out_hdr->sadb_msg_pid = hdr->sadb_msg_pid;
1179 xfrm_state_put(x);
1181 pfkey_broadcast(resp_skb, GFP_KERNEL, BROADCAST_ONE, sk);
1183 return 0;
1186 static int pfkey_acquire(struct sock *sk, struct sk_buff *skb, struct sadb_msg *hdr, void **ext_hdrs)
1188 struct xfrm_state *x;
1190 if (hdr->sadb_msg_len != sizeof(struct sadb_msg)/8)
1191 return -EOPNOTSUPP;
1193 if (hdr->sadb_msg_seq == 0 || hdr->sadb_msg_errno == 0)
1194 return 0;
1196 x = xfrm_find_acq_byseq(hdr->sadb_msg_seq);
1197 if (x == NULL)
1198 return 0;
1200 spin_lock_bh(&x->lock);
1201 if (x->km.state == XFRM_STATE_ACQ) {
1202 x->km.state = XFRM_STATE_ERROR;
1203 wake_up(&km_waitq);
1205 spin_unlock_bh(&x->lock);
1206 xfrm_state_put(x);
1207 return 0;
1211 static int pfkey_add(struct sock *sk, struct sk_buff *skb, struct sadb_msg *hdr, void **ext_hdrs)
1213 struct sk_buff *out_skb;
1214 struct sadb_msg *out_hdr;
1215 struct xfrm_state *x;
1216 int err;
1218 xfrm_probe_algs();
1220 x = pfkey_msg2xfrm_state(hdr, ext_hdrs);
1221 if (IS_ERR(x))
1222 return PTR_ERR(x);
1224 if (hdr->sadb_msg_type == SADB_ADD)
1225 err = xfrm_state_add(x);
1226 else
1227 err = xfrm_state_update(x);
1229 if (err < 0) {
1230 x->km.state = XFRM_STATE_DEAD;
1231 xfrm_state_put(x);
1232 return err;
1235 out_skb = pfkey_xfrm_state2msg(x, 0, 3);
1236 if (IS_ERR(out_skb))
1237 return PTR_ERR(out_skb); /* XXX Should we return 0 here ? */
1239 out_hdr = (struct sadb_msg *) out_skb->data;
1240 out_hdr->sadb_msg_version = hdr->sadb_msg_version;
1241 out_hdr->sadb_msg_type = hdr->sadb_msg_type;
1242 out_hdr->sadb_msg_satype = pfkey_proto2satype(x->id.proto);
1243 out_hdr->sadb_msg_errno = 0;
1244 out_hdr->sadb_msg_reserved = 0;
1245 out_hdr->sadb_msg_seq = hdr->sadb_msg_seq;
1246 out_hdr->sadb_msg_pid = hdr->sadb_msg_pid;
1248 pfkey_broadcast(out_skb, GFP_ATOMIC, BROADCAST_ALL, sk);
1250 return 0;
1253 static int pfkey_delete(struct sock *sk, struct sk_buff *skb, struct sadb_msg *hdr, void **ext_hdrs)
1255 struct xfrm_state *x;
1257 if (!ext_hdrs[SADB_EXT_SA-1] ||
1258 !present_and_same_family(ext_hdrs[SADB_EXT_ADDRESS_SRC-1],
1259 ext_hdrs[SADB_EXT_ADDRESS_DST-1]))
1260 return -EINVAL;
1262 x = pfkey_xfrm_state_lookup(hdr, ext_hdrs);
1263 if (x == NULL)
1264 return -ESRCH;
1266 if (xfrm_state_kern(x)) {
1267 xfrm_state_put(x);
1268 return -EPERM;
1271 xfrm_state_delete(x);
1272 xfrm_state_put(x);
1274 pfkey_broadcast(skb_clone(skb, GFP_KERNEL), GFP_KERNEL,
1275 BROADCAST_ALL, sk);
1277 return 0;
1280 static int pfkey_get(struct sock *sk, struct sk_buff *skb, struct sadb_msg *hdr, void **ext_hdrs)
1282 struct sk_buff *out_skb;
1283 struct sadb_msg *out_hdr;
1284 struct xfrm_state *x;
1286 if (!ext_hdrs[SADB_EXT_SA-1] ||
1287 !present_and_same_family(ext_hdrs[SADB_EXT_ADDRESS_SRC-1],
1288 ext_hdrs[SADB_EXT_ADDRESS_DST-1]))
1289 return -EINVAL;
1291 x = pfkey_xfrm_state_lookup(hdr, ext_hdrs);
1292 if (x == NULL)
1293 return -ESRCH;
1295 out_skb = pfkey_xfrm_state2msg(x, 1, 3);
1296 xfrm_state_put(x);
1297 if (IS_ERR(out_skb))
1298 return PTR_ERR(out_skb);
1300 out_hdr = (struct sadb_msg *) out_skb->data;
1301 out_hdr->sadb_msg_version = hdr->sadb_msg_version;
1302 out_hdr->sadb_msg_type = SADB_DUMP;
1303 out_hdr->sadb_msg_satype = pfkey_proto2satype(x->id.proto);
1304 out_hdr->sadb_msg_errno = 0;
1305 out_hdr->sadb_msg_reserved = 0;
1306 out_hdr->sadb_msg_seq = hdr->sadb_msg_seq;
1307 out_hdr->sadb_msg_pid = hdr->sadb_msg_pid;
1308 pfkey_broadcast(out_skb, GFP_ATOMIC, BROADCAST_ONE, sk);
1310 return 0;
1313 static struct sk_buff *compose_sadb_supported(struct sadb_msg *orig, int allocation)
1315 struct sk_buff *skb;
1316 struct sadb_msg *hdr;
1317 int len, auth_len, enc_len, i;
1319 auth_len = xfrm_count_auth_supported();
1320 if (auth_len) {
1321 auth_len *= sizeof(struct sadb_alg);
1322 auth_len += sizeof(struct sadb_supported);
1325 enc_len = xfrm_count_enc_supported();
1326 if (enc_len) {
1327 enc_len *= sizeof(struct sadb_alg);
1328 enc_len += sizeof(struct sadb_supported);
1331 len = enc_len + auth_len + sizeof(struct sadb_msg);
1333 skb = alloc_skb(len + 16, allocation);
1334 if (!skb)
1335 goto out_put_algs;
1337 hdr = (struct sadb_msg *) skb_put(skb, sizeof(*hdr));
1338 pfkey_hdr_dup(hdr, orig);
1339 hdr->sadb_msg_errno = 0;
1340 hdr->sadb_msg_len = len / sizeof(uint64_t);
1342 if (auth_len) {
1343 struct sadb_supported *sp;
1344 struct sadb_alg *ap;
1346 sp = (struct sadb_supported *) skb_put(skb, auth_len);
1347 ap = (struct sadb_alg *) (sp + 1);
1349 sp->sadb_supported_len = auth_len / sizeof(uint64_t);
1350 sp->sadb_supported_exttype = SADB_EXT_SUPPORTED_AUTH;
1352 for (i = 0; ; i++) {
1353 struct xfrm_algo_desc *aalg = xfrm_aalg_get_byidx(i);
1354 if (!aalg)
1355 break;
1356 if (aalg->available)
1357 *ap++ = aalg->desc;
1361 if (enc_len) {
1362 struct sadb_supported *sp;
1363 struct sadb_alg *ap;
1365 sp = (struct sadb_supported *) skb_put(skb, enc_len);
1366 ap = (struct sadb_alg *) (sp + 1);
1368 sp->sadb_supported_len = enc_len / sizeof(uint64_t);
1369 sp->sadb_supported_exttype = SADB_EXT_SUPPORTED_ENCRYPT;
1371 for (i = 0; ; i++) {
1372 struct xfrm_algo_desc *ealg = xfrm_ealg_get_byidx(i);
1373 if (!ealg)
1374 break;
1375 if (ealg->available)
1376 *ap++ = ealg->desc;
1380 out_put_algs:
1381 return skb;
1384 static int pfkey_register(struct sock *sk, struct sk_buff *skb, struct sadb_msg *hdr, void **ext_hdrs)
1386 struct pfkey_opt *pfk = pfkey_sk(sk);
1387 struct sk_buff *supp_skb;
1389 if (hdr->sadb_msg_satype > SADB_SATYPE_MAX)
1390 return -EINVAL;
1392 if (hdr->sadb_msg_satype != SADB_SATYPE_UNSPEC) {
1393 if (pfk->registered&(1<<hdr->sadb_msg_satype))
1394 return -EEXIST;
1395 pfk->registered |= (1<<hdr->sadb_msg_satype);
1398 xfrm_probe_algs();
1400 supp_skb = compose_sadb_supported(hdr, GFP_KERNEL);
1401 if (!supp_skb) {
1402 if (hdr->sadb_msg_satype != SADB_SATYPE_UNSPEC)
1403 pfk->registered &= ~(1<<hdr->sadb_msg_satype);
1405 return -ENOBUFS;
1408 pfkey_broadcast(supp_skb, GFP_KERNEL, BROADCAST_REGISTERED, sk);
1410 return 0;
1413 static int pfkey_flush(struct sock *sk, struct sk_buff *skb, struct sadb_msg *hdr, void **ext_hdrs)
1415 unsigned proto;
1416 struct sk_buff *skb_out;
1417 struct sadb_msg *hdr_out;
1419 proto = pfkey_satype2proto(hdr->sadb_msg_satype);
1420 if (proto == 0)
1421 return -EINVAL;
1423 skb_out = alloc_skb(sizeof(struct sadb_msg) + 16, GFP_KERNEL);
1424 if (!skb_out)
1425 return -ENOBUFS;
1427 xfrm_state_flush(proto);
1429 hdr_out = (struct sadb_msg *) skb_put(skb_out, sizeof(struct sadb_msg));
1430 pfkey_hdr_dup(hdr_out, hdr);
1431 hdr_out->sadb_msg_errno = (uint8_t) 0;
1432 hdr_out->sadb_msg_len = (sizeof(struct sadb_msg) / sizeof(uint64_t));
1434 pfkey_broadcast(skb_out, GFP_KERNEL, BROADCAST_ALL, NULL);
1436 return 0;
1439 struct pfkey_dump_data
1441 struct sk_buff *skb;
1442 struct sadb_msg *hdr;
1443 struct sock *sk;
1446 static int dump_sa(struct xfrm_state *x, int count, void *ptr)
1448 struct pfkey_dump_data *data = ptr;
1449 struct sk_buff *out_skb;
1450 struct sadb_msg *out_hdr;
1452 out_skb = pfkey_xfrm_state2msg(x, 1, 3);
1453 if (IS_ERR(out_skb))
1454 return PTR_ERR(out_skb);
1456 out_hdr = (struct sadb_msg *) out_skb->data;
1457 out_hdr->sadb_msg_version = data->hdr->sadb_msg_version;
1458 out_hdr->sadb_msg_type = SADB_DUMP;
1459 out_hdr->sadb_msg_satype = pfkey_proto2satype(x->id.proto);
1460 out_hdr->sadb_msg_errno = 0;
1461 out_hdr->sadb_msg_reserved = 0;
1462 out_hdr->sadb_msg_seq = count;
1463 out_hdr->sadb_msg_pid = data->hdr->sadb_msg_pid;
1464 pfkey_broadcast(out_skb, GFP_ATOMIC, BROADCAST_ONE, data->sk);
1465 return 0;
1468 static int pfkey_dump(struct sock *sk, struct sk_buff *skb, struct sadb_msg *hdr, void **ext_hdrs)
1470 u8 proto;
1471 struct pfkey_dump_data data = { .skb = skb, .hdr = hdr, .sk = sk };
1473 proto = pfkey_satype2proto(hdr->sadb_msg_satype);
1474 if (proto == 0)
1475 return -EINVAL;
1477 return xfrm_state_walk(proto, dump_sa, &data);
1480 static int pfkey_promisc(struct sock *sk, struct sk_buff *skb, struct sadb_msg *hdr, void **ext_hdrs)
1482 struct pfkey_opt *pfk = pfkey_sk(sk);
1483 int satype = hdr->sadb_msg_satype;
1485 if (hdr->sadb_msg_len == (sizeof(*hdr) / sizeof(uint64_t))) {
1486 /* XXX we mangle packet... */
1487 hdr->sadb_msg_errno = 0;
1488 if (satype != 0 && satype != 1)
1489 return -EINVAL;
1490 pfk->promisc = satype;
1492 pfkey_broadcast(skb_clone(skb, GFP_KERNEL), GFP_KERNEL, BROADCAST_ALL, NULL);
1493 return 0;
1496 static int check_reqid(struct xfrm_policy *xp, int dir, int count, void *ptr)
1498 int i;
1499 u16 reqid = *(u16*)ptr;
1501 for (i=0; i<xp->xfrm_nr; i++) {
1502 if (xp->xfrm_vec[i].reqid == reqid)
1503 return -EEXIST;
1505 return 0;
1508 static u16 gen_reqid(void)
1510 u16 start;
1511 static u16 reqid = IPSEC_MANUAL_REQID_MAX;
1513 start = reqid;
1514 do {
1515 ++reqid;
1516 if (reqid == 0)
1517 reqid = IPSEC_MANUAL_REQID_MAX+1;
1518 if (xfrm_policy_walk(check_reqid, (void*)&reqid) != -EEXIST)
1519 return reqid;
1520 } while (reqid != start);
1521 return 0;
1524 static int
1525 parse_ipsecrequest(struct xfrm_policy *xp, struct sadb_x_ipsecrequest *rq)
1527 struct xfrm_tmpl *t = xp->xfrm_vec + xp->xfrm_nr;
1528 struct sockaddr_in *sin;
1529 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
1530 struct sockaddr_in6 *sin6;
1531 #endif
1533 if (xp->xfrm_nr >= XFRM_MAX_DEPTH)
1534 return -ELOOP;
1536 if (rq->sadb_x_ipsecrequest_mode == 0)
1537 return -EINVAL;
1539 t->id.proto = rq->sadb_x_ipsecrequest_proto; /* XXX check proto */
1540 t->mode = rq->sadb_x_ipsecrequest_mode-1;
1541 if (rq->sadb_x_ipsecrequest_level == IPSEC_LEVEL_USE)
1542 t->optional = 1;
1543 else if (rq->sadb_x_ipsecrequest_level == IPSEC_LEVEL_UNIQUE) {
1544 t->reqid = rq->sadb_x_ipsecrequest_reqid;
1545 if (t->reqid > IPSEC_MANUAL_REQID_MAX)
1546 t->reqid = 0;
1547 if (!t->reqid && !(t->reqid = gen_reqid()))
1548 return -ENOBUFS;
1551 /* addresses present only in tunnel mode */
1552 if (t->mode) {
1553 switch (xp->family) {
1554 case AF_INET:
1555 sin = (void*)(rq+1);
1556 if (sin->sin_family != AF_INET)
1557 return -EINVAL;
1558 t->saddr.a4 = sin->sin_addr.s_addr;
1559 sin++;
1560 if (sin->sin_family != AF_INET)
1561 return -EINVAL;
1562 t->id.daddr.a4 = sin->sin_addr.s_addr;
1563 break;
1564 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
1565 case AF_INET6:
1566 sin6 = (void *)(rq+1);
1567 if (sin6->sin6_family != AF_INET6)
1568 return -EINVAL;
1569 memcpy(t->saddr.a6, &sin6->sin6_addr, sizeof(struct in6_addr));
1570 sin6++;
1571 if (sin6->sin6_family != AF_INET6)
1572 return -EINVAL;
1573 memcpy(t->id.daddr.a6, &sin6->sin6_addr, sizeof(struct in6_addr));
1574 break;
1575 #endif
1576 default:
1577 return -EINVAL;
1580 /* No way to set this via kame pfkey */
1581 t->aalgos = t->ealgos = t->calgos = ~0;
1582 xp->xfrm_nr++;
1583 return 0;
1586 static int
1587 parse_ipsecrequests(struct xfrm_policy *xp, struct sadb_x_policy *pol)
1589 int err;
1590 int len = pol->sadb_x_policy_len*8 - sizeof(struct sadb_x_policy);
1591 struct sadb_x_ipsecrequest *rq = (void*)(pol+1);
1593 while (len >= sizeof(struct sadb_x_ipsecrequest)) {
1594 if ((err = parse_ipsecrequest(xp, rq)) < 0)
1595 return err;
1596 len -= rq->sadb_x_ipsecrequest_len;
1597 rq = (void*)((u8*)rq + rq->sadb_x_ipsecrequest_len);
1599 return 0;
1602 static int pfkey_xfrm_policy2msg_size(struct xfrm_policy *xp)
1604 int sockaddr_size = pfkey_sockaddr_size(xp->family);
1605 int socklen = (xp->family == AF_INET ?
1606 sizeof(struct sockaddr_in) :
1607 sizeof(struct sockaddr_in6));
1609 return sizeof(struct sadb_msg) +
1610 (sizeof(struct sadb_lifetime) * 3) +
1611 (sizeof(struct sadb_address) * 2) +
1612 (sockaddr_size * 2) +
1613 sizeof(struct sadb_x_policy) +
1614 (xp->xfrm_nr * (sizeof(struct sadb_x_ipsecrequest) +
1615 (socklen * 2)));
1618 static struct sk_buff * pfkey_xfrm_policy2msg_prep(struct xfrm_policy *xp)
1620 struct sk_buff *skb;
1621 int size;
1623 size = pfkey_xfrm_policy2msg_size(xp);
1625 skb = alloc_skb(size + 16, GFP_ATOMIC);
1626 if (skb == NULL)
1627 return ERR_PTR(-ENOBUFS);
1629 return skb;
1632 static void pfkey_xfrm_policy2msg(struct sk_buff *skb, struct xfrm_policy *xp, int dir)
1634 struct sadb_msg *hdr;
1635 struct sadb_address *addr;
1636 struct sadb_lifetime *lifetime;
1637 struct sadb_x_policy *pol;
1638 struct sockaddr_in *sin;
1639 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
1640 struct sockaddr_in6 *sin6;
1641 #endif
1642 int i;
1643 int size;
1644 int sockaddr_size = pfkey_sockaddr_size(xp->family);
1645 int socklen = (xp->family == AF_INET ?
1646 sizeof(struct sockaddr_in) :
1647 sizeof(struct sockaddr_in6));
1649 size = pfkey_xfrm_policy2msg_size(xp);
1651 /* call should fill header later */
1652 hdr = (struct sadb_msg *) skb_put(skb, sizeof(struct sadb_msg));
1653 memset(hdr, 0, size); /* XXX do we need this ? */
1655 /* src address */
1656 addr = (struct sadb_address*) skb_put(skb,
1657 sizeof(struct sadb_address)+sockaddr_size);
1658 addr->sadb_address_len =
1659 (sizeof(struct sadb_address)+sockaddr_size)/
1660 sizeof(uint64_t);
1661 addr->sadb_address_exttype = SADB_EXT_ADDRESS_SRC;
1662 addr->sadb_address_proto = pfkey_proto_from_xfrm(xp->selector.proto);
1663 addr->sadb_address_prefixlen = xp->selector.prefixlen_s;
1664 addr->sadb_address_reserved = 0;
1665 /* src address */
1666 if (xp->family == AF_INET) {
1667 sin = (struct sockaddr_in *) (addr + 1);
1668 sin->sin_family = AF_INET;
1669 sin->sin_addr.s_addr = xp->selector.saddr.a4;
1670 sin->sin_port = xp->selector.sport;
1671 memset(sin->sin_zero, 0, sizeof(sin->sin_zero));
1673 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
1674 else if (xp->family == AF_INET6) {
1675 sin6 = (struct sockaddr_in6 *) (addr + 1);
1676 sin6->sin6_family = AF_INET6;
1677 sin6->sin6_port = xp->selector.sport;
1678 sin6->sin6_flowinfo = 0;
1679 memcpy(&sin6->sin6_addr, xp->selector.saddr.a6,
1680 sizeof(struct in6_addr));;
1681 sin6->sin6_scope_id = 0;
1683 #endif
1684 else
1685 BUG();
1687 /* dst address */
1688 addr = (struct sadb_address*) skb_put(skb,
1689 sizeof(struct sadb_address)+sockaddr_size);
1690 addr->sadb_address_len =
1691 (sizeof(struct sadb_address)+sockaddr_size)/
1692 sizeof(uint64_t);
1693 addr->sadb_address_exttype = SADB_EXT_ADDRESS_DST;
1694 addr->sadb_address_proto = pfkey_proto_from_xfrm(xp->selector.proto);
1695 addr->sadb_address_prefixlen = xp->selector.prefixlen_d;
1696 addr->sadb_address_reserved = 0;
1697 if (xp->family == AF_INET) {
1698 sin = (struct sockaddr_in *) (addr + 1);
1699 sin->sin_family = AF_INET;
1700 sin->sin_addr.s_addr = xp->selector.daddr.a4;
1701 sin->sin_port = xp->selector.dport;
1702 memset(sin->sin_zero, 0, sizeof(sin->sin_zero));
1704 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
1705 else if (xp->family == AF_INET6) {
1706 sin6 = (struct sockaddr_in6 *) (addr + 1);
1707 sin6->sin6_family = AF_INET6;
1708 sin6->sin6_port = xp->selector.dport;
1709 sin6->sin6_flowinfo = 0;
1710 memcpy(&sin6->sin6_addr, xp->selector.daddr.a6,
1711 sizeof(struct in6_addr));
1712 sin6->sin6_scope_id = 0;
1714 #endif
1715 else
1716 BUG();
1718 /* hard time */
1719 lifetime = (struct sadb_lifetime *) skb_put(skb,
1720 sizeof(struct sadb_lifetime));
1721 lifetime->sadb_lifetime_len =
1722 sizeof(struct sadb_lifetime)/sizeof(uint64_t);
1723 lifetime->sadb_lifetime_exttype = SADB_EXT_LIFETIME_HARD;
1724 lifetime->sadb_lifetime_allocations = _X2KEY(xp->lft.hard_packet_limit);
1725 lifetime->sadb_lifetime_bytes = _X2KEY(xp->lft.hard_byte_limit);
1726 lifetime->sadb_lifetime_addtime = xp->lft.hard_add_expires_seconds;
1727 lifetime->sadb_lifetime_usetime = xp->lft.hard_use_expires_seconds;
1728 /* soft time */
1729 lifetime = (struct sadb_lifetime *) skb_put(skb,
1730 sizeof(struct sadb_lifetime));
1731 lifetime->sadb_lifetime_len =
1732 sizeof(struct sadb_lifetime)/sizeof(uint64_t);
1733 lifetime->sadb_lifetime_exttype = SADB_EXT_LIFETIME_SOFT;
1734 lifetime->sadb_lifetime_allocations = _X2KEY(xp->lft.soft_packet_limit);
1735 lifetime->sadb_lifetime_bytes = _X2KEY(xp->lft.soft_byte_limit);
1736 lifetime->sadb_lifetime_addtime = xp->lft.soft_add_expires_seconds;
1737 lifetime->sadb_lifetime_usetime = xp->lft.soft_use_expires_seconds;
1738 /* current time */
1739 lifetime = (struct sadb_lifetime *) skb_put(skb,
1740 sizeof(struct sadb_lifetime));
1741 lifetime->sadb_lifetime_len =
1742 sizeof(struct sadb_lifetime)/sizeof(uint64_t);
1743 lifetime->sadb_lifetime_exttype = SADB_EXT_LIFETIME_CURRENT;
1744 lifetime->sadb_lifetime_allocations = xp->curlft.packets;
1745 lifetime->sadb_lifetime_bytes = xp->curlft.bytes;
1746 lifetime->sadb_lifetime_addtime = xp->curlft.add_time;
1747 lifetime->sadb_lifetime_usetime = xp->curlft.use_time;
1749 pol = (struct sadb_x_policy *) skb_put(skb, sizeof(struct sadb_x_policy));
1750 pol->sadb_x_policy_len = sizeof(struct sadb_x_policy)/sizeof(uint64_t);
1751 pol->sadb_x_policy_exttype = SADB_X_EXT_POLICY;
1752 pol->sadb_x_policy_type = IPSEC_POLICY_DISCARD;
1753 if (xp->action == XFRM_POLICY_ALLOW) {
1754 if (xp->xfrm_nr)
1755 pol->sadb_x_policy_type = IPSEC_POLICY_IPSEC;
1756 else
1757 pol->sadb_x_policy_type = IPSEC_POLICY_NONE;
1759 pol->sadb_x_policy_dir = dir+1;
1760 pol->sadb_x_policy_id = xp->index;
1762 for (i=0; i<xp->xfrm_nr; i++) {
1763 struct sadb_x_ipsecrequest *rq;
1764 struct xfrm_tmpl *t = xp->xfrm_vec + i;
1765 int req_size;
1767 req_size = sizeof(struct sadb_x_ipsecrequest);
1768 if (t->mode)
1769 req_size += 2*socklen;
1770 else
1771 size -= 2*socklen;
1772 rq = (void*)skb_put(skb, req_size);
1773 pol->sadb_x_policy_len += req_size/8;
1774 rq->sadb_x_ipsecrequest_len = req_size;
1775 rq->sadb_x_ipsecrequest_proto = t->id.proto;
1776 rq->sadb_x_ipsecrequest_mode = t->mode+1;
1777 rq->sadb_x_ipsecrequest_level = IPSEC_LEVEL_REQUIRE;
1778 if (t->reqid)
1779 rq->sadb_x_ipsecrequest_level = IPSEC_LEVEL_UNIQUE;
1780 if (t->optional)
1781 rq->sadb_x_ipsecrequest_level = IPSEC_LEVEL_USE;
1782 rq->sadb_x_ipsecrequest_reqid = t->reqid;
1783 if (t->mode) {
1784 switch (xp->family) {
1785 case AF_INET:
1786 sin = (void*)(rq+1);
1787 sin->sin_family = AF_INET;
1788 sin->sin_addr.s_addr = t->saddr.a4;
1789 sin->sin_port = 0;
1790 memset(sin->sin_zero, 0, sizeof(sin->sin_zero));
1791 sin++;
1792 sin->sin_family = AF_INET;
1793 sin->sin_addr.s_addr = t->id.daddr.a4;
1794 sin->sin_port = 0;
1795 memset(sin->sin_zero, 0, sizeof(sin->sin_zero));
1796 break;
1797 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
1798 case AF_INET6:
1799 sin6 = (void*)(rq+1);
1800 sin6->sin6_family = AF_INET6;
1801 sin6->sin6_port = 0;
1802 sin6->sin6_flowinfo = 0;
1803 memcpy(&sin6->sin6_addr, t->saddr.a6,
1804 sizeof(struct in6_addr));
1805 sin6->sin6_scope_id = 0;
1807 sin6++;
1808 sin6->sin6_family = AF_INET6;
1809 sin6->sin6_port = 0;
1810 sin6->sin6_flowinfo = 0;
1811 memcpy(&sin6->sin6_addr, t->id.daddr.a6,
1812 sizeof(struct in6_addr));
1813 sin6->sin6_scope_id = 0;
1814 break;
1815 #endif
1816 default:
1817 break;
1821 hdr->sadb_msg_len = size / sizeof(uint64_t);
1822 hdr->sadb_msg_reserved = atomic_read(&xp->refcnt);
1825 static int pfkey_spdadd(struct sock *sk, struct sk_buff *skb, struct sadb_msg *hdr, void **ext_hdrs)
1827 int err;
1828 struct sadb_lifetime *lifetime;
1829 struct sadb_address *sa;
1830 struct sadb_x_policy *pol;
1831 struct xfrm_policy *xp;
1832 struct sk_buff *out_skb;
1833 struct sadb_msg *out_hdr;
1835 if (!present_and_same_family(ext_hdrs[SADB_EXT_ADDRESS_SRC-1],
1836 ext_hdrs[SADB_EXT_ADDRESS_DST-1]) ||
1837 !ext_hdrs[SADB_X_EXT_POLICY-1])
1838 return -EINVAL;
1840 pol = ext_hdrs[SADB_X_EXT_POLICY-1];
1841 if (pol->sadb_x_policy_type > IPSEC_POLICY_IPSEC)
1842 return -EINVAL;
1843 if (!pol->sadb_x_policy_dir || pol->sadb_x_policy_dir >= IPSEC_DIR_MAX)
1844 return -EINVAL;
1846 xp = xfrm_policy_alloc(GFP_KERNEL);
1847 if (xp == NULL)
1848 return -ENOBUFS;
1850 xp->action = (pol->sadb_x_policy_type == IPSEC_POLICY_DISCARD ?
1851 XFRM_POLICY_BLOCK : XFRM_POLICY_ALLOW);
1853 sa = ext_hdrs[SADB_EXT_ADDRESS_SRC-1],
1854 xp->family = pfkey_sadb_addr2xfrm_addr(sa, &xp->selector.saddr);
1855 if (!xp->family) {
1856 err = -EINVAL;
1857 goto out;
1859 xp->selector.prefixlen_s = sa->sadb_address_prefixlen;
1860 xp->selector.proto = pfkey_proto_to_xfrm(sa->sadb_address_proto);
1861 xp->selector.sport = ((struct sockaddr_in *)(sa+1))->sin_port;
1862 if (xp->selector.sport)
1863 xp->selector.sport_mask = ~0;
1865 sa = ext_hdrs[SADB_EXT_ADDRESS_DST-1],
1866 pfkey_sadb_addr2xfrm_addr(sa, &xp->selector.daddr);
1867 xp->selector.prefixlen_d = sa->sadb_address_prefixlen;
1869 /* Amusing, we set this twice. KAME apps appear to set same value
1870 * in both addresses.
1872 xp->selector.proto = pfkey_proto_to_xfrm(sa->sadb_address_proto);
1874 xp->selector.dport = ((struct sockaddr_in *)(sa+1))->sin_port;
1875 if (xp->selector.dport)
1876 xp->selector.dport_mask = ~0;
1878 xp->lft.soft_byte_limit = XFRM_INF;
1879 xp->lft.hard_byte_limit = XFRM_INF;
1880 xp->lft.soft_packet_limit = XFRM_INF;
1881 xp->lft.hard_packet_limit = XFRM_INF;
1882 if ((lifetime = ext_hdrs[SADB_EXT_LIFETIME_HARD-1]) != NULL) {
1883 xp->lft.hard_packet_limit = _KEY2X(lifetime->sadb_lifetime_allocations);
1884 xp->lft.hard_byte_limit = _KEY2X(lifetime->sadb_lifetime_bytes);
1885 xp->lft.hard_add_expires_seconds = lifetime->sadb_lifetime_addtime;
1886 xp->lft.hard_use_expires_seconds = lifetime->sadb_lifetime_usetime;
1888 if ((lifetime = ext_hdrs[SADB_EXT_LIFETIME_SOFT-1]) != NULL) {
1889 xp->lft.soft_packet_limit = _KEY2X(lifetime->sadb_lifetime_allocations);
1890 xp->lft.soft_byte_limit = _KEY2X(lifetime->sadb_lifetime_bytes);
1891 xp->lft.soft_add_expires_seconds = lifetime->sadb_lifetime_addtime;
1892 xp->lft.soft_use_expires_seconds = lifetime->sadb_lifetime_usetime;
1894 xp->xfrm_nr = 0;
1895 if (pol->sadb_x_policy_type == IPSEC_POLICY_IPSEC &&
1896 (err = parse_ipsecrequests(xp, pol)) < 0)
1897 goto out;
1899 out_skb = pfkey_xfrm_policy2msg_prep(xp);
1900 if (IS_ERR(out_skb)) {
1901 err = PTR_ERR(out_skb);
1902 goto out;
1905 err = xfrm_policy_insert(pol->sadb_x_policy_dir-1, xp,
1906 hdr->sadb_msg_type != SADB_X_SPDUPDATE);
1907 if (err) {
1908 kfree_skb(out_skb);
1909 goto out;
1912 pfkey_xfrm_policy2msg(out_skb, xp, pol->sadb_x_policy_dir-1);
1914 xfrm_pol_put(xp);
1916 out_hdr = (struct sadb_msg *) out_skb->data;
1917 out_hdr->sadb_msg_version = hdr->sadb_msg_version;
1918 out_hdr->sadb_msg_type = hdr->sadb_msg_type;
1919 out_hdr->sadb_msg_satype = 0;
1920 out_hdr->sadb_msg_errno = 0;
1921 out_hdr->sadb_msg_seq = hdr->sadb_msg_seq;
1922 out_hdr->sadb_msg_pid = hdr->sadb_msg_pid;
1923 pfkey_broadcast(out_skb, GFP_ATOMIC, BROADCAST_ALL, sk);
1924 return 0;
1926 out:
1927 kfree(xp);
1928 return err;
1931 static int pfkey_spddelete(struct sock *sk, struct sk_buff *skb, struct sadb_msg *hdr, void **ext_hdrs)
1933 int err;
1934 struct sadb_address *sa;
1935 struct sadb_x_policy *pol;
1936 struct xfrm_policy *xp;
1937 struct sk_buff *out_skb;
1938 struct sadb_msg *out_hdr;
1939 struct xfrm_selector sel;
1941 if (!present_and_same_family(ext_hdrs[SADB_EXT_ADDRESS_SRC-1],
1942 ext_hdrs[SADB_EXT_ADDRESS_DST-1]) ||
1943 !ext_hdrs[SADB_X_EXT_POLICY-1])
1944 return -EINVAL;
1946 pol = ext_hdrs[SADB_X_EXT_POLICY-1];
1947 if (!pol->sadb_x_policy_dir || pol->sadb_x_policy_dir >= IPSEC_DIR_MAX)
1948 return -EINVAL;
1950 memset(&sel, 0, sizeof(sel));
1952 sa = ext_hdrs[SADB_EXT_ADDRESS_SRC-1],
1953 pfkey_sadb_addr2xfrm_addr(sa, &sel.saddr);
1954 sel.prefixlen_s = sa->sadb_address_prefixlen;
1955 sel.proto = pfkey_proto_to_xfrm(sa->sadb_address_proto);
1956 sel.sport = ((struct sockaddr_in *)(sa+1))->sin_port;
1957 if (sel.sport)
1958 sel.sport_mask = ~0;
1960 sa = ext_hdrs[SADB_EXT_ADDRESS_DST-1],
1961 pfkey_sadb_addr2xfrm_addr(sa, &sel.daddr);
1962 sel.prefixlen_d = sa->sadb_address_prefixlen;
1963 sel.proto = pfkey_proto_to_xfrm(sa->sadb_address_proto);
1964 sel.dport = ((struct sockaddr_in *)(sa+1))->sin_port;
1965 if (sel.dport)
1966 sel.dport_mask = ~0;
1968 xp = xfrm_policy_bysel(pol->sadb_x_policy_dir-1, &sel, 1);
1969 if (xp == NULL)
1970 return -ENOENT;
1972 err = 0;
1974 out_skb = pfkey_xfrm_policy2msg_prep(xp);
1975 if (IS_ERR(out_skb)) {
1976 err = PTR_ERR(out_skb);
1977 goto out;
1979 pfkey_xfrm_policy2msg(out_skb, xp, pol->sadb_x_policy_dir-1);
1981 out_hdr = (struct sadb_msg *) out_skb->data;
1982 out_hdr->sadb_msg_version = hdr->sadb_msg_version;
1983 out_hdr->sadb_msg_type = SADB_X_SPDDELETE;
1984 out_hdr->sadb_msg_satype = 0;
1985 out_hdr->sadb_msg_errno = 0;
1986 out_hdr->sadb_msg_seq = hdr->sadb_msg_seq;
1987 out_hdr->sadb_msg_pid = hdr->sadb_msg_pid;
1988 pfkey_broadcast(out_skb, GFP_ATOMIC, BROADCAST_ALL, sk);
1989 err = 0;
1991 out:
1992 if (xp) {
1993 xfrm_policy_kill(xp);
1995 return err;
1998 static int pfkey_spdget(struct sock *sk, struct sk_buff *skb, struct sadb_msg *hdr, void **ext_hdrs)
2000 int err;
2001 struct sadb_x_policy *pol;
2002 struct xfrm_policy *xp;
2003 struct sk_buff *out_skb;
2004 struct sadb_msg *out_hdr;
2006 if ((pol = ext_hdrs[SADB_X_EXT_POLICY-1]) == NULL)
2007 return -EINVAL;
2009 xp = xfrm_policy_byid(0, pol->sadb_x_policy_id,
2010 hdr->sadb_msg_type == SADB_X_SPDDELETE2);
2011 if (xp == NULL)
2012 return -ENOENT;
2014 err = 0;
2016 out_skb = pfkey_xfrm_policy2msg_prep(xp);
2017 if (IS_ERR(out_skb)) {
2018 err = PTR_ERR(out_skb);
2019 goto out;
2021 pfkey_xfrm_policy2msg(out_skb, xp, pol->sadb_x_policy_dir-1);
2023 out_hdr = (struct sadb_msg *) out_skb->data;
2024 out_hdr->sadb_msg_version = hdr->sadb_msg_version;
2025 out_hdr->sadb_msg_type = hdr->sadb_msg_type;
2026 out_hdr->sadb_msg_satype = 0;
2027 out_hdr->sadb_msg_errno = 0;
2028 out_hdr->sadb_msg_seq = hdr->sadb_msg_seq;
2029 out_hdr->sadb_msg_pid = hdr->sadb_msg_pid;
2030 pfkey_broadcast(out_skb, GFP_ATOMIC, BROADCAST_ALL, sk);
2031 err = 0;
2033 out:
2034 if (xp) {
2035 if (hdr->sadb_msg_type == SADB_X_SPDDELETE2)
2036 xfrm_policy_kill(xp);
2037 else
2038 xfrm_pol_put(xp);
2040 return err;
2043 static int dump_sp(struct xfrm_policy *xp, int dir, int count, void *ptr)
2045 struct pfkey_dump_data *data = ptr;
2046 struct sk_buff *out_skb;
2047 struct sadb_msg *out_hdr;
2049 out_skb = pfkey_xfrm_policy2msg_prep(xp);
2050 if (IS_ERR(out_skb))
2051 return PTR_ERR(out_skb);
2053 pfkey_xfrm_policy2msg(out_skb, xp, dir);
2055 out_hdr = (struct sadb_msg *) out_skb->data;
2056 out_hdr->sadb_msg_version = data->hdr->sadb_msg_version;
2057 out_hdr->sadb_msg_type = SADB_X_SPDDUMP;
2058 out_hdr->sadb_msg_satype = SADB_SATYPE_UNSPEC;
2059 out_hdr->sadb_msg_errno = 0;
2060 out_hdr->sadb_msg_seq = count;
2061 out_hdr->sadb_msg_pid = data->hdr->sadb_msg_pid;
2062 pfkey_broadcast(out_skb, GFP_ATOMIC, BROADCAST_ONE, data->sk);
2063 return 0;
2066 static int pfkey_spddump(struct sock *sk, struct sk_buff *skb, struct sadb_msg *hdr, void **ext_hdrs)
2068 struct pfkey_dump_data data = { .skb = skb, .hdr = hdr, .sk = sk };
2070 return xfrm_policy_walk(dump_sp, &data);
2073 static int pfkey_spdflush(struct sock *sk, struct sk_buff *skb, struct sadb_msg *hdr, void **ext_hdrs)
2075 struct sk_buff *skb_out;
2076 struct sadb_msg *hdr_out;
2078 skb_out = alloc_skb(sizeof(struct sadb_msg) + 16, GFP_KERNEL);
2079 if (!skb_out)
2080 return -ENOBUFS;
2082 xfrm_policy_flush();
2084 hdr_out = (struct sadb_msg *) skb_put(skb_out, sizeof(struct sadb_msg));
2085 pfkey_hdr_dup(hdr_out, hdr);
2086 hdr_out->sadb_msg_errno = (uint8_t) 0;
2087 hdr_out->sadb_msg_len = (sizeof(struct sadb_msg) / sizeof(uint64_t));
2088 pfkey_broadcast(skb_out, GFP_KERNEL, BROADCAST_ALL, NULL);
2090 return 0;
2093 typedef int (*pfkey_handler)(struct sock *sk, struct sk_buff *skb,
2094 struct sadb_msg *hdr, void **ext_hdrs);
2095 static pfkey_handler pfkey_funcs[SADB_MAX + 1] = {
2096 [SADB_RESERVED] = pfkey_reserved,
2097 [SADB_GETSPI] = pfkey_getspi,
2098 [SADB_UPDATE] = pfkey_add,
2099 [SADB_ADD] = pfkey_add,
2100 [SADB_DELETE] = pfkey_delete,
2101 [SADB_GET] = pfkey_get,
2102 [SADB_ACQUIRE] = pfkey_acquire,
2103 [SADB_REGISTER] = pfkey_register,
2104 [SADB_EXPIRE] = NULL,
2105 [SADB_FLUSH] = pfkey_flush,
2106 [SADB_DUMP] = pfkey_dump,
2107 [SADB_X_PROMISC] = pfkey_promisc,
2108 [SADB_X_PCHANGE] = NULL,
2109 [SADB_X_SPDUPDATE] = pfkey_spdadd,
2110 [SADB_X_SPDADD] = pfkey_spdadd,
2111 [SADB_X_SPDDELETE] = pfkey_spddelete,
2112 [SADB_X_SPDGET] = pfkey_spdget,
2113 [SADB_X_SPDACQUIRE] = NULL,
2114 [SADB_X_SPDDUMP] = pfkey_spddump,
2115 [SADB_X_SPDFLUSH] = pfkey_spdflush,
2116 [SADB_X_SPDSETIDX] = pfkey_spdadd,
2117 [SADB_X_SPDDELETE2] = pfkey_spdget,
2120 static int pfkey_process(struct sock *sk, struct sk_buff *skb, struct sadb_msg *hdr)
2122 void *ext_hdrs[SADB_EXT_MAX];
2123 int err;
2125 pfkey_broadcast(skb_clone(skb, GFP_KERNEL), GFP_KERNEL,
2126 BROADCAST_PROMISC_ONLY, NULL);
2128 memset(ext_hdrs, 0, sizeof(ext_hdrs));
2129 err = parse_exthdrs(skb, hdr, ext_hdrs);
2130 if (!err) {
2131 err = -EOPNOTSUPP;
2132 if (pfkey_funcs[hdr->sadb_msg_type])
2133 err = pfkey_funcs[hdr->sadb_msg_type](sk, skb, hdr, ext_hdrs);
2135 return err;
2138 static struct sadb_msg *pfkey_get_base_msg(struct sk_buff *skb, int *errp)
2140 struct sadb_msg *hdr = NULL;
2142 if (skb->len < sizeof(*hdr)) {
2143 *errp = -EMSGSIZE;
2144 } else {
2145 hdr = (struct sadb_msg *) skb->data;
2146 if (hdr->sadb_msg_version != PF_KEY_V2 ||
2147 hdr->sadb_msg_reserved != 0 ||
2148 (hdr->sadb_msg_type <= SADB_RESERVED ||
2149 hdr->sadb_msg_type > SADB_MAX)) {
2150 hdr = NULL;
2151 *errp = -EINVAL;
2152 } else if (hdr->sadb_msg_len != (skb->len /
2153 sizeof(uint64_t)) ||
2154 hdr->sadb_msg_len < (sizeof(struct sadb_msg) /
2155 sizeof(uint64_t))) {
2156 hdr = NULL;
2157 *errp = -EMSGSIZE;
2158 } else {
2159 *errp = 0;
2162 return hdr;
2165 static inline int aalg_tmpl_set(struct xfrm_tmpl *t, struct xfrm_algo_desc *d)
2167 return t->aalgos & (1 << d->desc.sadb_alg_id);
2170 static inline int ealg_tmpl_set(struct xfrm_tmpl *t, struct xfrm_algo_desc *d)
2172 return t->ealgos & (1 << d->desc.sadb_alg_id);
2175 static int count_ah_combs(struct xfrm_tmpl *t)
2177 int i, sz = 0;
2179 for (i = 0; ; i++) {
2180 struct xfrm_algo_desc *aalg = xfrm_aalg_get_byidx(i);
2181 if (!aalg)
2182 break;
2183 if (aalg_tmpl_set(t, aalg) && aalg->available)
2184 sz += sizeof(struct sadb_comb);
2186 return sz + sizeof(struct sadb_prop);
2189 static int count_esp_combs(struct xfrm_tmpl *t)
2191 int i, k, sz = 0;
2193 for (i = 0; ; i++) {
2194 struct xfrm_algo_desc *ealg = xfrm_ealg_get_byidx(i);
2195 if (!ealg)
2196 break;
2198 if (!(ealg_tmpl_set(t, ealg) && ealg->available))
2199 continue;
2201 for (k = 1; ; k++) {
2202 struct xfrm_algo_desc *aalg = xfrm_aalg_get_byidx(k);
2203 if (!aalg)
2204 break;
2206 if (aalg_tmpl_set(t, aalg) && aalg->available)
2207 sz += sizeof(struct sadb_comb);
2210 return sz + sizeof(struct sadb_prop);
2213 static void dump_ah_combs(struct sk_buff *skb, struct xfrm_tmpl *t)
2215 struct sadb_prop *p;
2216 int i;
2218 p = (struct sadb_prop*)skb_put(skb, sizeof(struct sadb_prop));
2219 p->sadb_prop_len = sizeof(struct sadb_prop)/8;
2220 p->sadb_prop_exttype = SADB_EXT_PROPOSAL;
2221 p->sadb_prop_replay = 32;
2222 memset(p->sadb_prop_reserved, 0, sizeof(p->sadb_prop_reserved));
2224 for (i = 0; ; i++) {
2225 struct xfrm_algo_desc *aalg = xfrm_aalg_get_byidx(i);
2226 if (!aalg)
2227 break;
2229 if (aalg_tmpl_set(t, aalg) && aalg->available) {
2230 struct sadb_comb *c;
2231 c = (struct sadb_comb*)skb_put(skb, sizeof(struct sadb_comb));
2232 memset(c, 0, sizeof(*c));
2233 p->sadb_prop_len += sizeof(struct sadb_comb)/8;
2234 c->sadb_comb_auth = aalg->desc.sadb_alg_id;
2235 c->sadb_comb_auth_minbits = aalg->desc.sadb_alg_minbits;
2236 c->sadb_comb_auth_maxbits = aalg->desc.sadb_alg_maxbits;
2237 c->sadb_comb_hard_addtime = 24*60*60;
2238 c->sadb_comb_soft_addtime = 20*60*60;
2239 c->sadb_comb_hard_usetime = 8*60*60;
2240 c->sadb_comb_soft_usetime = 7*60*60;
2245 static void dump_esp_combs(struct sk_buff *skb, struct xfrm_tmpl *t)
2247 struct sadb_prop *p;
2248 int i, k;
2250 p = (struct sadb_prop*)skb_put(skb, sizeof(struct sadb_prop));
2251 p->sadb_prop_len = sizeof(struct sadb_prop)/8;
2252 p->sadb_prop_exttype = SADB_EXT_PROPOSAL;
2253 p->sadb_prop_replay = 32;
2254 memset(p->sadb_prop_reserved, 0, sizeof(p->sadb_prop_reserved));
2256 for (i=0; ; i++) {
2257 struct xfrm_algo_desc *ealg = xfrm_ealg_get_byidx(i);
2258 if (!ealg)
2259 break;
2261 if (!(ealg_tmpl_set(t, ealg) && ealg->available))
2262 continue;
2264 for (k = 1; ; k++) {
2265 struct sadb_comb *c;
2266 struct xfrm_algo_desc *aalg = xfrm_aalg_get_byidx(k);
2267 if (!aalg)
2268 break;
2269 if (!(aalg_tmpl_set(t, aalg) && aalg->available))
2270 continue;
2271 c = (struct sadb_comb*)skb_put(skb, sizeof(struct sadb_comb));
2272 memset(c, 0, sizeof(*c));
2273 p->sadb_prop_len += sizeof(struct sadb_comb)/8;
2274 c->sadb_comb_auth = aalg->desc.sadb_alg_id;
2275 c->sadb_comb_auth_minbits = aalg->desc.sadb_alg_minbits;
2276 c->sadb_comb_auth_maxbits = aalg->desc.sadb_alg_maxbits;
2277 c->sadb_comb_encrypt = ealg->desc.sadb_alg_id;
2278 c->sadb_comb_encrypt_minbits = ealg->desc.sadb_alg_minbits;
2279 c->sadb_comb_encrypt_maxbits = ealg->desc.sadb_alg_maxbits;
2280 c->sadb_comb_hard_addtime = 24*60*60;
2281 c->sadb_comb_soft_addtime = 20*60*60;
2282 c->sadb_comb_hard_usetime = 8*60*60;
2283 c->sadb_comb_soft_usetime = 7*60*60;
2288 static int pfkey_send_notify(struct xfrm_state *x, int hard)
2290 struct sk_buff *out_skb;
2291 struct sadb_msg *out_hdr;
2292 int hsc = (hard ? 2 : 1);
2294 out_skb = pfkey_xfrm_state2msg(x, 0, hsc);
2295 if (IS_ERR(out_skb))
2296 return PTR_ERR(out_skb);
2298 out_hdr = (struct sadb_msg *) out_skb->data;
2299 out_hdr->sadb_msg_version = PF_KEY_V2;
2300 out_hdr->sadb_msg_type = SADB_EXPIRE;
2301 out_hdr->sadb_msg_satype = pfkey_proto2satype(x->id.proto);
2302 out_hdr->sadb_msg_errno = 0;
2303 out_hdr->sadb_msg_reserved = 0;
2304 out_hdr->sadb_msg_seq = 0;
2305 out_hdr->sadb_msg_pid = 0;
2307 pfkey_broadcast(out_skb, GFP_ATOMIC, BROADCAST_REGISTERED, NULL);
2308 return 0;
2311 static u32 get_acqseq(void)
2313 u32 res;
2314 static u32 acqseq;
2315 static spinlock_t acqseq_lock = SPIN_LOCK_UNLOCKED;
2317 spin_lock_bh(&acqseq_lock);
2318 res = (++acqseq ? : ++acqseq);
2319 spin_unlock_bh(&acqseq_lock);
2320 return res;
2323 static int pfkey_send_acquire(struct xfrm_state *x, struct xfrm_tmpl *t, struct xfrm_policy *xp, int dir)
2325 struct sk_buff *skb;
2326 struct sadb_msg *hdr;
2327 struct sadb_address *addr;
2328 struct sadb_x_policy *pol;
2329 struct sockaddr_in *sin;
2330 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
2331 struct sockaddr_in6 *sin6;
2332 #endif
2333 int sockaddr_size;
2334 int size;
2336 sockaddr_size = pfkey_sockaddr_size(x->props.family);
2337 if (!sockaddr_size)
2338 return -EINVAL;
2340 size = sizeof(struct sadb_msg) +
2341 (sizeof(struct sadb_address) * 2) +
2342 (sockaddr_size * 2) +
2343 sizeof(struct sadb_x_policy);
2345 if (x->id.proto == IPPROTO_AH)
2346 size += count_ah_combs(t);
2347 else if (x->id.proto == IPPROTO_ESP)
2348 size += count_esp_combs(t);
2350 skb = alloc_skb(size + 16, GFP_ATOMIC);
2351 if (skb == NULL)
2352 return -ENOMEM;
2354 hdr = (struct sadb_msg *) skb_put(skb, sizeof(struct sadb_msg));
2355 hdr->sadb_msg_version = PF_KEY_V2;
2356 hdr->sadb_msg_type = SADB_ACQUIRE;
2357 hdr->sadb_msg_satype = pfkey_proto2satype(x->id.proto);
2358 hdr->sadb_msg_len = size / sizeof(uint64_t);
2359 hdr->sadb_msg_errno = 0;
2360 hdr->sadb_msg_reserved = 0;
2361 hdr->sadb_msg_seq = x->km.seq = get_acqseq();
2362 hdr->sadb_msg_pid = 0;
2364 /* src address */
2365 addr = (struct sadb_address*) skb_put(skb,
2366 sizeof(struct sadb_address)+sockaddr_size);
2367 addr->sadb_address_len =
2368 (sizeof(struct sadb_address)+sockaddr_size)/
2369 sizeof(uint64_t);
2370 addr->sadb_address_exttype = SADB_EXT_ADDRESS_SRC;
2371 addr->sadb_address_proto = 0;
2372 addr->sadb_address_reserved = 0;
2373 if (x->props.family == AF_INET) {
2374 addr->sadb_address_prefixlen = 32;
2376 sin = (struct sockaddr_in *) (addr + 1);
2377 sin->sin_family = AF_INET;
2378 sin->sin_addr.s_addr = x->props.saddr.a4;
2379 sin->sin_port = 0;
2380 memset(sin->sin_zero, 0, sizeof(sin->sin_zero));
2382 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
2383 else if (x->props.family == AF_INET6) {
2384 addr->sadb_address_prefixlen = 128;
2386 sin6 = (struct sockaddr_in6 *) (addr + 1);
2387 sin6->sin6_family = AF_INET6;
2388 sin6->sin6_port = 0;
2389 sin6->sin6_flowinfo = 0;
2390 memcpy(&sin6->sin6_addr,
2391 x->props.saddr.a6, sizeof(struct in6_addr));
2392 sin6->sin6_scope_id = 0;
2394 #endif
2395 else
2396 BUG();
2398 /* dst address */
2399 addr = (struct sadb_address*) skb_put(skb,
2400 sizeof(struct sadb_address)+sockaddr_size);
2401 addr->sadb_address_len =
2402 (sizeof(struct sadb_address)+sockaddr_size)/
2403 sizeof(uint64_t);
2404 addr->sadb_address_exttype = SADB_EXT_ADDRESS_DST;
2405 addr->sadb_address_proto = 0;
2406 addr->sadb_address_reserved = 0;
2407 if (x->props.family == AF_INET) {
2408 addr->sadb_address_prefixlen = 32;
2410 sin = (struct sockaddr_in *) (addr + 1);
2411 sin->sin_family = AF_INET;
2412 sin->sin_addr.s_addr = x->id.daddr.a4;
2413 sin->sin_port = 0;
2414 memset(sin->sin_zero, 0, sizeof(sin->sin_zero));
2416 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
2417 else if (x->props.family == AF_INET6) {
2418 addr->sadb_address_prefixlen = 128;
2420 sin6 = (struct sockaddr_in6 *) (addr + 1);
2421 sin6->sin6_family = AF_INET6;
2422 sin6->sin6_port = 0;
2423 sin6->sin6_flowinfo = 0;
2424 memcpy(&sin6->sin6_addr,
2425 x->id.daddr.a6, sizeof(struct in6_addr));
2426 sin6->sin6_scope_id = 0;
2428 #endif
2429 else
2430 BUG();
2432 pol = (struct sadb_x_policy *) skb_put(skb, sizeof(struct sadb_x_policy));
2433 pol->sadb_x_policy_len = sizeof(struct sadb_x_policy)/sizeof(uint64_t);
2434 pol->sadb_x_policy_exttype = SADB_X_EXT_POLICY;
2435 pol->sadb_x_policy_type = IPSEC_POLICY_IPSEC;
2436 pol->sadb_x_policy_dir = dir+1;
2437 pol->sadb_x_policy_id = xp->index;
2439 /* Set sadb_comb's. */
2440 if (x->id.proto == IPPROTO_AH)
2441 dump_ah_combs(skb, t);
2442 else if (x->id.proto == IPPROTO_ESP)
2443 dump_esp_combs(skb, t);
2445 return pfkey_broadcast(skb, GFP_ATOMIC, BROADCAST_REGISTERED, NULL);
2448 static struct xfrm_policy *pfkey_compile_policy(u16 family, int opt,
2449 u8 *data, int len, int *dir)
2451 struct xfrm_policy *xp;
2452 struct sadb_x_policy *pol = (struct sadb_x_policy*)data;
2454 switch (family) {
2455 case AF_INET:
2456 if (opt != IP_IPSEC_POLICY) {
2457 *dir = -EOPNOTSUPP;
2458 return NULL;
2460 break;
2461 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
2462 case AF_INET6:
2463 if (opt != IPV6_IPSEC_POLICY) {
2464 *dir = -EOPNOTSUPP;
2465 return NULL;
2467 break;
2468 #endif
2469 default:
2470 *dir = -EINVAL;
2471 return NULL;
2474 *dir = -EINVAL;
2476 if (len < sizeof(struct sadb_x_policy) ||
2477 pol->sadb_x_policy_len*8 > len ||
2478 pol->sadb_x_policy_type > IPSEC_POLICY_BYPASS ||
2479 (!pol->sadb_x_policy_dir || pol->sadb_x_policy_dir > IPSEC_DIR_OUTBOUND))
2480 return NULL;
2482 xp = xfrm_policy_alloc(GFP_ATOMIC);
2483 if (xp == NULL) {
2484 *dir = -ENOBUFS;
2485 return NULL;
2488 xp->action = (pol->sadb_x_policy_type == IPSEC_POLICY_DISCARD ?
2489 XFRM_POLICY_BLOCK : XFRM_POLICY_ALLOW);
2491 xp->lft.soft_byte_limit = XFRM_INF;
2492 xp->lft.hard_byte_limit = XFRM_INF;
2493 xp->lft.soft_packet_limit = XFRM_INF;
2494 xp->lft.hard_packet_limit = XFRM_INF;
2495 xp->family = family;
2497 xp->xfrm_nr = 0;
2498 if (pol->sadb_x_policy_type == IPSEC_POLICY_IPSEC &&
2499 (*dir = parse_ipsecrequests(xp, pol)) < 0)
2500 goto out;
2502 *dir = pol->sadb_x_policy_dir-1;
2503 return xp;
2505 out:
2506 kfree(xp);
2507 return NULL;
2510 static int pfkey_send_new_mapping(struct xfrm_state *x, xfrm_address_t *ipaddr, u16 sport)
2512 struct sk_buff *skb;
2513 struct sadb_msg *hdr;
2514 struct sadb_sa *sa;
2515 struct sadb_address *addr;
2516 struct sadb_x_nat_t_port *n_port;
2517 struct sockaddr_in *sin;
2518 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
2519 struct sockaddr_in6 *sin6;
2520 #endif
2521 int sockaddr_size;
2522 int size;
2523 __u8 satype = (x->id.proto == IPPROTO_ESP ? SADB_SATYPE_ESP : 0);
2524 struct xfrm_encap_tmpl *natt = NULL;
2526 sockaddr_size = pfkey_sockaddr_size(x->props.family);
2527 if (!sockaddr_size)
2528 return -EINVAL;
2530 if (!satype)
2531 return -EINVAL;
2533 if (!x->encap)
2534 return -EINVAL;
2536 natt = x->encap;
2538 /* Build an SADB_X_NAT_T_NEW_MAPPING message:
2540 * HDR | SA | ADDRESS_SRC (old addr) | NAT_T_SPORT (old port) |
2541 * ADDRESS_DST (new addr) | NAT_T_DPORT (new port)
2544 size = sizeof(struct sadb_msg) +
2545 sizeof(struct sadb_sa) +
2546 (sizeof(struct sadb_address) * 2) +
2547 (sockaddr_size * 2) +
2548 (sizeof(struct sadb_x_nat_t_port) * 2);
2550 skb = alloc_skb(size + 16, GFP_ATOMIC);
2551 if (skb == NULL)
2552 return -ENOMEM;
2554 hdr = (struct sadb_msg *) skb_put(skb, sizeof(struct sadb_msg));
2555 hdr->sadb_msg_version = PF_KEY_V2;
2556 hdr->sadb_msg_type = SADB_X_NAT_T_NEW_MAPPING;
2557 hdr->sadb_msg_satype = satype;
2558 hdr->sadb_msg_len = size / sizeof(uint64_t);
2559 hdr->sadb_msg_errno = 0;
2560 hdr->sadb_msg_reserved = 0;
2561 hdr->sadb_msg_seq = x->km.seq = get_acqseq();
2562 hdr->sadb_msg_pid = 0;
2564 /* SA */
2565 sa = (struct sadb_sa *) skb_put(skb, sizeof(struct sadb_sa));
2566 sa->sadb_sa_len = sizeof(struct sadb_sa)/sizeof(uint64_t);
2567 sa->sadb_sa_exttype = SADB_EXT_SA;
2568 sa->sadb_sa_spi = x->id.spi;
2569 sa->sadb_sa_replay = 0;
2570 sa->sadb_sa_state = 0;
2571 sa->sadb_sa_auth = 0;
2572 sa->sadb_sa_encrypt = 0;
2573 sa->sadb_sa_flags = 0;
2575 /* ADDRESS_SRC (old addr) */
2576 addr = (struct sadb_address*)
2577 skb_put(skb, sizeof(struct sadb_address)+sockaddr_size);
2578 addr->sadb_address_len =
2579 (sizeof(struct sadb_address)+sockaddr_size)/
2580 sizeof(uint64_t);
2581 addr->sadb_address_exttype = SADB_EXT_ADDRESS_SRC;
2582 addr->sadb_address_proto = 0;
2583 addr->sadb_address_reserved = 0;
2584 if (x->props.family == AF_INET) {
2585 addr->sadb_address_prefixlen = 32;
2587 sin = (struct sockaddr_in *) (addr + 1);
2588 sin->sin_family = AF_INET;
2589 sin->sin_addr.s_addr = x->props.saddr.a4;
2590 sin->sin_port = 0;
2591 memset(sin->sin_zero, 0, sizeof(sin->sin_zero));
2593 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
2594 else if (x->props.family == AF_INET6) {
2595 addr->sadb_address_prefixlen = 128;
2597 sin6 = (struct sockaddr_in6 *) (addr + 1);
2598 sin6->sin6_family = AF_INET6;
2599 sin6->sin6_port = 0;
2600 sin6->sin6_flowinfo = 0;
2601 memcpy(&sin6->sin6_addr,
2602 x->props.saddr.a6, sizeof(struct in6_addr));
2603 sin6->sin6_scope_id = 0;
2605 #endif
2606 else
2607 BUG();
2609 /* NAT_T_SPORT (old port) */
2610 n_port = (struct sadb_x_nat_t_port*) skb_put(skb, sizeof (*n_port));
2611 n_port->sadb_x_nat_t_port_len = sizeof(*n_port)/sizeof(uint64_t);
2612 n_port->sadb_x_nat_t_port_exttype = SADB_X_EXT_NAT_T_SPORT;
2613 n_port->sadb_x_nat_t_port_port = natt->encap_sport;
2614 n_port->sadb_x_nat_t_port_reserved = 0;
2616 /* ADDRESS_DST (new addr) */
2617 addr = (struct sadb_address*)
2618 skb_put(skb, sizeof(struct sadb_address)+sockaddr_size);
2619 addr->sadb_address_len =
2620 (sizeof(struct sadb_address)+sockaddr_size)/
2621 sizeof(uint64_t);
2622 addr->sadb_address_exttype = SADB_EXT_ADDRESS_SRC;
2623 addr->sadb_address_proto = 0;
2624 addr->sadb_address_reserved = 0;
2625 if (x->props.family == AF_INET) {
2626 addr->sadb_address_prefixlen = 32;
2628 sin = (struct sockaddr_in *) (addr + 1);
2629 sin->sin_family = AF_INET;
2630 sin->sin_addr.s_addr = ipaddr->a4;
2631 sin->sin_port = 0;
2632 memset(sin->sin_zero, 0, sizeof(sin->sin_zero));
2634 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
2635 else if (x->props.family == AF_INET6) {
2636 addr->sadb_address_prefixlen = 128;
2638 sin6 = (struct sockaddr_in6 *) (addr + 1);
2639 sin6->sin6_family = AF_INET6;
2640 sin6->sin6_port = 0;
2641 sin6->sin6_flowinfo = 0;
2642 memcpy(&sin6->sin6_addr, &ipaddr->a6, sizeof(struct in6_addr));
2643 sin6->sin6_scope_id = 0;
2645 #endif
2646 else
2647 BUG();
2649 /* NAT_T_DPORT (new port) */
2650 n_port = (struct sadb_x_nat_t_port*) skb_put(skb, sizeof (*n_port));
2651 n_port->sadb_x_nat_t_port_len = sizeof(*n_port)/sizeof(uint64_t);
2652 n_port->sadb_x_nat_t_port_exttype = SADB_X_EXT_NAT_T_DPORT;
2653 n_port->sadb_x_nat_t_port_port = sport;
2654 n_port->sadb_x_nat_t_port_reserved = 0;
2656 return pfkey_broadcast(skb, GFP_ATOMIC, BROADCAST_REGISTERED, NULL);
2659 static int pfkey_sendmsg(struct kiocb *kiocb,
2660 struct socket *sock, struct msghdr *msg, int len)
2662 struct sock *sk = sock->sk;
2663 struct sk_buff *skb = NULL;
2664 struct sadb_msg *hdr = NULL;
2665 int err;
2667 err = -EOPNOTSUPP;
2668 if (msg->msg_flags & MSG_OOB)
2669 goto out;
2671 err = -EMSGSIZE;
2672 if ((unsigned)len > sk->sk_sndbuf - 32)
2673 goto out;
2675 err = -ENOBUFS;
2676 skb = alloc_skb(len, GFP_KERNEL);
2677 if (skb == NULL)
2678 goto out;
2680 err = -EFAULT;
2681 if (memcpy_fromiovec(skb_put(skb,len), msg->msg_iov, len))
2682 goto out;
2684 hdr = pfkey_get_base_msg(skb, &err);
2685 if (!hdr)
2686 goto out;
2688 down(&xfrm_cfg_sem);
2689 err = pfkey_process(sk, skb, hdr);
2690 up(&xfrm_cfg_sem);
2692 out:
2693 if (err && hdr && pfkey_error(hdr, err, sk) == 0)
2694 err = 0;
2695 if (skb)
2696 kfree_skb(skb);
2698 return err ? : len;
2701 static int pfkey_recvmsg(struct kiocb *kiocb,
2702 struct socket *sock, struct msghdr *msg, int len,
2703 int flags)
2705 struct sock *sk = sock->sk;
2706 struct sk_buff *skb;
2707 int copied, err;
2709 err = -EINVAL;
2710 if (flags & ~(MSG_PEEK|MSG_DONTWAIT|MSG_TRUNC))
2711 goto out;
2713 msg->msg_namelen = 0;
2714 skb = skb_recv_datagram(sk, flags, flags & MSG_DONTWAIT, &err);
2715 if (skb == NULL)
2716 goto out;
2718 copied = skb->len;
2719 if (copied > len) {
2720 msg->msg_flags |= MSG_TRUNC;
2721 copied = len;
2724 skb->h.raw = skb->data;
2725 err = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
2726 if (err)
2727 goto out_free;
2729 sock_recv_timestamp(msg, sk, skb);
2731 err = (flags & MSG_TRUNC) ? skb->len : copied;
2733 out_free:
2734 skb_free_datagram(sk, skb);
2735 out:
2736 return err;
2739 static struct proto_ops pfkey_ops = {
2740 .family = PF_KEY,
2741 .owner = THIS_MODULE,
2742 /* Operations that make no sense on pfkey sockets. */
2743 .bind = sock_no_bind,
2744 .connect = sock_no_connect,
2745 .socketpair = sock_no_socketpair,
2746 .accept = sock_no_accept,
2747 .getname = sock_no_getname,
2748 .ioctl = sock_no_ioctl,
2749 .listen = sock_no_listen,
2750 .shutdown = sock_no_shutdown,
2751 .setsockopt = sock_no_setsockopt,
2752 .getsockopt = sock_no_getsockopt,
2753 .mmap = sock_no_mmap,
2754 .sendpage = sock_no_sendpage,
2756 /* Now the operations that really occur. */
2757 .release = pfkey_release,
2758 .poll = datagram_poll,
2759 .sendmsg = pfkey_sendmsg,
2760 .recvmsg = pfkey_recvmsg,
2763 static struct net_proto_family pfkey_family_ops = {
2764 .family = PF_KEY,
2765 .create = pfkey_create,
2766 .owner = THIS_MODULE,
2769 #ifdef CONFIG_PROC_FS
2770 static int pfkey_read_proc(char *buffer, char **start, off_t offset,
2771 int length, int *eof, void *data)
2773 off_t pos = 0;
2774 off_t begin = 0;
2775 int len = 0;
2776 struct sock *s;
2777 struct hlist_node *node;
2779 len += sprintf(buffer,"sk RefCnt Rmem Wmem User Inode\n");
2781 read_lock(&pfkey_table_lock);
2783 sk_for_each(s, node, &pfkey_table) {
2784 len += sprintf(buffer+len,"%p %-6d %-6u %-6u %-6u %-6lu",
2786 atomic_read(&s->sk_refcnt),
2787 atomic_read(&s->sk_rmem_alloc),
2788 atomic_read(&s->sk_wmem_alloc),
2789 sock_i_uid(s),
2790 sock_i_ino(s)
2793 buffer[len++] = '\n';
2795 pos = begin + len;
2796 if (pos < offset) {
2797 len = 0;
2798 begin = pos;
2800 if(pos > offset + length)
2801 goto done;
2803 *eof = 1;
2805 done:
2806 read_unlock(&pfkey_table_lock);
2808 *start = buffer + (offset - begin);
2809 len -= (offset - begin);
2811 if (len > length)
2812 len = length;
2813 if (len < 0)
2814 len = 0;
2816 return len;
2818 #endif
2820 static struct xfrm_mgr pfkeyv2_mgr =
2822 .id = "pfkeyv2",
2823 .notify = pfkey_send_notify,
2824 .acquire = pfkey_send_acquire,
2825 .compile_policy = pfkey_compile_policy,
2826 .new_mapping = pfkey_send_new_mapping,
2829 static void __exit ipsec_pfkey_exit(void)
2831 xfrm_unregister_km(&pfkeyv2_mgr);
2832 remove_proc_entry("net/pfkey", 0);
2833 sock_unregister(PF_KEY);
2836 static int __init ipsec_pfkey_init(void)
2838 sock_register(&pfkey_family_ops);
2839 #ifdef CONFIG_PROC_FS
2840 create_proc_read_entry("net/pfkey", 0, 0, pfkey_read_proc, NULL);
2841 #endif
2842 xfrm_register_km(&pfkeyv2_mgr);
2843 return 0;
2846 module_init(ipsec_pfkey_init);
2847 module_exit(ipsec_pfkey_exit);
2848 MODULE_LICENSE("GPL");