1 /* $Id: pfkey.c,v 1.27.2.3 2005/02/18 10:09:55 vanhu Exp $ */
4 * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. Neither the name of the project nor the names of its contributors
16 * may be used to endorse or promote products derived from this software
17 * without specific prior written permission.
19 * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
43 #include <netinet/in.h>
44 #include <arpa/inet.h>
48 # include <linux/udp.h>
50 # if defined(__NetBSD__) || defined(__FreeBSD__)
51 # include <netinet/udp.h>
55 #include <sys/types.h>
56 #include <sys/param.h>
57 #include <sys/socket.h>
58 #include <sys/queue.h>
59 //#include <sys/sysctl.h>
61 #include <net/route.h>
62 #include <net/pfkeyv2.h>
64 #include <netinet/in.h>
65 #ifndef HAVE_NETINET6_IPSEC
66 #include <netinet/ipsec.h>
68 #include <netinet6/ipsec.h>
81 #include "localconf.h"
82 #include "remoteconf.h"
83 #include "isakmp_var.h"
85 #include "isakmp_inf.h"
86 #include "ipsec_doi.h"
91 #include "algorithm.h"
98 #include "nattraversal.h"
99 #include "crypto_openssl.h"
100 #include "grabmyaddr.h"
102 #if defined(SADB_X_EALG_RIJNDAELCBC) && !defined(SADB_X_EALG_AESCBC)
103 #define SADB_X_EALG_AESCBC SADB_X_EALG_RIJNDAELCBC
107 static u_int ipsecdoi2pfkey_aalg __P((u_int));
108 static u_int ipsecdoi2pfkey_ealg __P((u_int));
109 static u_int ipsecdoi2pfkey_calg __P((u_int));
110 static u_int ipsecdoi2pfkey_alg __P((u_int, u_int));
111 static u_int keylen_aalg __P((u_int));
112 static u_int keylen_ealg __P((u_int, int));
114 static int pk_recvgetspi __P((caddr_t *));
115 static int pk_recvupdate __P((caddr_t *));
116 static int pk_recvadd __P((caddr_t *));
117 static int pk_recvdelete __P((caddr_t *));
118 static int pk_recvacquire __P((caddr_t *));
119 static int pk_recvexpire __P((caddr_t *));
120 static int pk_recvflush __P((caddr_t *));
121 static int getsadbpolicy __P((caddr_t *, int *, int, struct ph2handle *));
122 static int pk_recvspdupdate __P((caddr_t *));
123 static int pk_recvspdadd __P((caddr_t *));
124 static int pk_recvspddelete __P((caddr_t *));
125 static int pk_recvspdexpire __P((caddr_t *));
126 static int pk_recvspdget __P((caddr_t *));
127 static int pk_recvspddump __P((caddr_t *));
128 static int pk_recvspdflush __P((caddr_t *));
129 static struct sadb_msg *pk_recv __P((int, int *));
131 static int (*pkrecvf[]) __P((caddr_t *)) = {
139 NULL, /* SABD_REGISTER */
142 NULL, /* SADB_DUMP */
143 NULL, /* SADB_X_PROMISC */
144 NULL, /* SADB_X_PCHANGE */
149 NULL, /* SADB_X_SPDACQUIRE */
152 NULL, /* SADB_X_SPDSETIDX */
154 NULL, /* SADB_X_SPDDELETE2 */
155 NULL, /* SADB_X_NAT_T_NEW_MAPPING */
158 static int addnewsp __P((caddr_t *));
160 /* cope with old kame headers - ugly */
161 #ifndef SADB_X_AALG_MD5
162 #define SADB_X_AALG_MD5 SADB_AALG_MD5
164 #ifndef SADB_X_AALG_SHA
165 #define SADB_X_AALG_SHA SADB_AALG_SHA
167 #ifndef SADB_X_AALG_NULL
168 #define SADB_X_AALG_NULL SADB_AALG_NULL
171 #ifndef SADB_X_EALG_BLOWFISHCBC
172 #define SADB_X_EALG_BLOWFISHCBC SADB_EALG_BLOWFISHCBC
174 #ifndef SADB_X_EALG_CAST128CBC
175 #define SADB_X_EALG_CAST128CBC SADB_EALG_CAST128CBC
177 #ifndef SADB_X_EALG_RC5CBC
178 #ifdef SADB_EALG_RC5CBC
179 #define SADB_X_EALG_RC5CBC SADB_EALG_RC5CBC
184 * PF_KEY packet handler
191 struct sadb_msg *msg;
193 caddr_t mhp[SADB_EXT_MAX + 1];
196 /* receive pfkey message. */
198 msg = (struct sadb_msg *)pk_recv(lcconf->sock_pfkey, &len);
201 plog(LLV_ERROR, LOCATION, NULL,
202 "failed to recv from pfkey (%s)\n",
206 /* short message - msg not ready */
211 plog(LLV_DEBUG, LOCATION, NULL, "get pfkey %s message\n",
212 s_pfkey_type(msg->sadb_msg_type));
213 plogdump(LLV_DEBUG2, msg, msg->sadb_msg_len << 3);
216 if (msg->sadb_msg_errno) {
219 /* when SPD is empty, treat the state as no error. */
220 if (msg->sadb_msg_type == SADB_X_SPDDUMP &&
221 msg->sadb_msg_errno == ENOENT)
226 plog(pri, LOCATION, NULL,
227 "pfkey %s failed: %s\n",
228 s_pfkey_type(msg->sadb_msg_type),
229 strerror(msg->sadb_msg_errno));
234 /* check pfkey message. */
235 if (pfkey_align(msg, mhp)) {
236 plog(LLV_ERROR, LOCATION, NULL,
237 "libipsec failed pfkey align (%s)\n",
241 if (pfkey_check(mhp)) {
242 plog(LLV_ERROR, LOCATION, NULL,
243 "libipsec failed pfkey check (%s)\n",
247 msg = (struct sadb_msg *)mhp[0];
250 if (msg->sadb_msg_type >= ARRAYLEN(pkrecvf)) {
251 plog(LLV_ERROR, LOCATION, NULL,
252 "unknown PF_KEY message type=%u\n",
257 if (pkrecvf[msg->sadb_msg_type] == NULL) {
258 plog(LLV_INFO, LOCATION, NULL,
259 "unsupported PF_KEY message %s\n",
260 s_pfkey_type(msg->sadb_msg_type));
264 if ((pkrecvf[msg->sadb_msg_type])(mhp) < 0)
278 pfkey_dump_sadb(satype)
283 pid_t pid = getpid();
284 struct sadb_msg *msg = NULL;
288 if ((s = pfkey_open()) < 0) {
289 plog(LLV_ERROR, LOCATION, NULL,
290 "libipsec failed pfkey open: %s\n",
295 plog(LLV_DEBUG, LOCATION, NULL, "call pfkey_send_dump\n");
296 if (pfkey_send_dump(s, satype) < 0) {
297 plog(LLV_ERROR, LOCATION, NULL,
298 "libipsec failed dump: %s\n", ipsec_strerror());
305 msg = pk_recv(s, &len);
313 if (msg->sadb_msg_type != SADB_DUMP || msg->sadb_msg_pid != pid)
316 ml = msg->sadb_msg_len << 3;
317 bl = buf ? buf->l : 0;
318 buf = vrealloc(buf, bl + ml);
320 plog(LLV_ERROR, LOCATION, NULL,
321 "failed to reallocate buffer to dump.\n");
324 memcpy(buf->v + bl, msg, ml);
326 if (msg->sadb_msg_seq == 0)
343 #ifdef ENABLE_ADMINPORT
348 pfkey_flush_sadb(proto)
353 /* convert to SADB_SATYPE */
354 if ((satype = admin2pfkey_proto(proto)) < 0)
357 plog(LLV_DEBUG, LOCATION, NULL, "call pfkey_send_flush\n");
358 if (pfkey_send_flush(lcconf->sock_pfkey, satype) < 0) {
359 plog(LLV_ERROR, LOCATION, NULL,
360 "libipsec failed send flush (%s)\n", ipsec_strerror());
369 * These are the SATYPEs that we manage. We register to get
370 * PF_KEY messages related to these SATYPEs, and we also use
371 * this list to determine which SATYPEs to delete SAs for when
372 * we receive an INITIAL-CONTACT.
374 const struct pfkey_satype pfkey_satypes[] = {
375 { SADB_SATYPE_AH, "AH" },
376 { SADB_SATYPE_ESP, "ESP" },
377 { SADB_X_SATYPE_IPCOMP, "IPCOMP" },
379 const int pfkey_nsatypes =
380 sizeof(pfkey_satypes) / sizeof(pfkey_satypes[0]);
383 * PF_KEY initialization
390 if ((lcconf->sock_pfkey = pfkey_open()) < 0) {
391 plog(LLV_ERROR, LOCATION, NULL,
392 "libipsec failed pfkey open (%s)\n", ipsec_strerror());
396 for (i = 0, reg_fail = 0; i < pfkey_nsatypes; i++) {
397 plog(LLV_DEBUG, LOCATION, NULL,
398 "call pfkey_send_register for %s\n",
399 pfkey_satypes[i].ps_name);
400 if (pfkey_send_register(lcconf->sock_pfkey,
401 pfkey_satypes[i].ps_satype) < 0 ||
402 pfkey_recv_register(lcconf->sock_pfkey) < 0) {
403 plog(LLV_WARNING, LOCATION, NULL,
404 "failed to register %s (%s)\n",
405 pfkey_satypes[i].ps_name,
411 if (reg_fail == pfkey_nsatypes) {
412 plog(LLV_ERROR, LOCATION, NULL,
413 "failed to regist any protocol.\n");
414 pfkey_close(lcconf->sock_pfkey);
420 if (pfkey_send_spddump(lcconf->sock_pfkey) < 0) {
421 plog(LLV_ERROR, LOCATION, NULL,
422 "libipsec sending spddump failed: %s\n",
424 pfkey_close(lcconf->sock_pfkey);
428 if (pfkey_promisc_toggle(1) < 0) {
429 pfkey_close(lcconf->sock_pfkey);
436 /* %%% for conversion */
437 /* IPSECDOI_ATTR_AUTH -> SADB_AALG */
439 ipsecdoi2pfkey_aalg(hashtype)
443 case IPSECDOI_ATTR_AUTH_HMAC_MD5:
444 return SADB_AALG_MD5HMAC;
445 case IPSECDOI_ATTR_AUTH_HMAC_SHA1:
446 return SADB_AALG_SHA1HMAC;
447 case IPSECDOI_ATTR_AUTH_KPDK: /* need special care */
448 return SADB_AALG_NONE;
451 case IPSECDOI_ATTR_AUTH_DES_MAC:
452 plog(LLV_ERROR, LOCATION, NULL,
453 "Not supported hash type: %u\n", hashtype);
456 case 0: /* reserved */
458 return SADB_AALG_NONE;
460 plog(LLV_ERROR, LOCATION, NULL,
461 "Invalid hash type: %u\n", hashtype);
467 /* IPSECDOI_ESP -> SADB_EALG */
469 ipsecdoi2pfkey_ealg(t_id)
473 case IPSECDOI_ESP_DES_IV64: /* sa_flags |= SADB_X_EXT_OLD */
474 return SADB_EALG_DESCBC;
475 case IPSECDOI_ESP_DES:
476 return SADB_EALG_DESCBC;
477 case IPSECDOI_ESP_3DES:
478 return SADB_EALG_3DESCBC;
479 #ifdef SADB_X_EALG_RC5CBC
480 case IPSECDOI_ESP_RC5:
481 return SADB_X_EALG_RC5CBC;
483 case IPSECDOI_ESP_CAST:
484 return SADB_X_EALG_CAST128CBC;
485 case IPSECDOI_ESP_BLOWFISH:
486 return SADB_X_EALG_BLOWFISHCBC;
487 case IPSECDOI_ESP_DES_IV32: /* flags |= (SADB_X_EXT_OLD|
489 return SADB_EALG_DESCBC;
490 case IPSECDOI_ESP_NULL:
491 return SADB_EALG_NULL;
492 #ifdef SADB_X_EALG_AESCBC
493 case IPSECDOI_ESP_AES:
494 return SADB_X_EALG_AESCBC;
496 #ifdef SADB_X_EALG_TWOFISHCBC
497 case IPSECDOI_ESP_TWOFISH:
498 return SADB_X_EALG_TWOFISHCBC;
502 case IPSECDOI_ESP_3IDEA:
503 case IPSECDOI_ESP_IDEA:
504 case IPSECDOI_ESP_RC4:
505 plog(LLV_ERROR, LOCATION, NULL,
506 "Not supported transform: %u\n", t_id);
509 case 0: /* reserved */
511 plog(LLV_ERROR, LOCATION, NULL,
512 "Invalid transform id: %u\n", t_id);
518 /* IPCOMP -> SADB_CALG */
520 ipsecdoi2pfkey_calg(t_id)
524 case IPSECDOI_IPCOMP_OUI:
525 return SADB_X_CALG_OUI;
526 case IPSECDOI_IPCOMP_DEFLATE:
527 return SADB_X_CALG_DEFLATE;
528 case IPSECDOI_IPCOMP_LZS:
529 return SADB_X_CALG_LZS;
531 case 0: /* reserved */
533 plog(LLV_ERROR, LOCATION, NULL,
534 "Invalid transform id: %u\n", t_id);
540 /* IPSECDOI_PROTO -> SADB_SATYPE */
542 ipsecdoi2pfkey_proto(proto)
546 case IPSECDOI_PROTO_IPSEC_AH:
547 return SADB_SATYPE_AH;
548 case IPSECDOI_PROTO_IPSEC_ESP:
549 return SADB_SATYPE_ESP;
550 case IPSECDOI_PROTO_IPCOMP:
551 return SADB_X_SATYPE_IPCOMP;
554 plog(LLV_ERROR, LOCATION, NULL,
555 "Invalid ipsec_doi proto: %u\n", proto);
562 ipsecdoi2pfkey_alg(algclass, type)
563 u_int algclass, type;
566 case IPSECDOI_ATTR_AUTH:
567 return ipsecdoi2pfkey_aalg(type);
568 case IPSECDOI_PROTO_IPSEC_ESP:
569 return ipsecdoi2pfkey_ealg(type);
570 case IPSECDOI_PROTO_IPCOMP:
571 return ipsecdoi2pfkey_calg(type);
573 plog(LLV_ERROR, LOCATION, NULL,
574 "Invalid ipsec_doi algclass: %u\n", algclass);
580 /* SADB_SATYPE -> IPSECDOI_PROTO */
582 pfkey2ipsecdoi_proto(satype)
587 return IPSECDOI_PROTO_IPSEC_AH;
588 case SADB_SATYPE_ESP:
589 return IPSECDOI_PROTO_IPSEC_ESP;
590 case SADB_X_SATYPE_IPCOMP:
591 return IPSECDOI_PROTO_IPCOMP;
594 plog(LLV_ERROR, LOCATION, NULL,
595 "Invalid pfkey proto: %u\n", satype);
601 /* IPSECDOI_ATTR_ENC_MODE -> IPSEC_MODE */
603 ipsecdoi2pfkey_mode(mode)
607 case IPSECDOI_ATTR_ENC_MODE_TUNNEL:
609 case IPSECDOI_ATTR_ENC_MODE_UDPTUNNEL_RFC:
610 case IPSECDOI_ATTR_ENC_MODE_UDPTUNNEL_DRAFT:
612 return IPSEC_MODE_TUNNEL;
613 case IPSECDOI_ATTR_ENC_MODE_TRNS:
615 case IPSECDOI_ATTR_ENC_MODE_UDPTRNS_RFC:
616 case IPSECDOI_ATTR_ENC_MODE_UDPTRNS_DRAFT:
618 return IPSEC_MODE_TRANSPORT;
620 plog(LLV_ERROR, LOCATION, NULL, "Invalid mode type: %u\n", mode);
626 /* IPSECDOI_ATTR_ENC_MODE -> IPSEC_MODE */
628 pfkey2ipsecdoi_mode(mode)
632 case IPSEC_MODE_TUNNEL:
633 return IPSECDOI_ATTR_ENC_MODE_TUNNEL;
634 case IPSEC_MODE_TRANSPORT:
635 return IPSECDOI_ATTR_ENC_MODE_TRNS;
637 return IPSECDOI_ATTR_ENC_MODE_ANY;
639 plog(LLV_ERROR, LOCATION, NULL, "Invalid mode type: %u\n", mode);
645 /* default key length for encryption algorithm */
647 keylen_aalg(hashtype)
653 return SADB_AALG_NONE;
655 res = alg_ipsec_hmacdef_hashlen(hashtype);
657 plog(LLV_ERROR, LOCATION, NULL,
658 "invalid hmac algorithm %u.\n", hashtype);
664 /* default key length for encryption algorithm */
666 keylen_ealg(enctype, encklen)
672 res = alg_ipsec_encdef_keylen(enctype, encklen);
674 plog(LLV_ERROR, LOCATION, NULL,
675 "invalid encryption algorithm %u.\n", enctype);
682 pfkey_convertfromipsecdoi(proto_id, t_id, hashtype,
683 e_type, e_keylen, a_type, a_keylen, flags)
695 case IPSECDOI_PROTO_IPSEC_ESP:
696 if ((*e_type = ipsecdoi2pfkey_ealg(t_id)) == ~0)
698 if ((*e_keylen = keylen_ealg(t_id, *e_keylen)) == ~0)
702 if ((*a_type = ipsecdoi2pfkey_aalg(hashtype)) == ~0)
704 if ((*a_keylen = keylen_aalg(hashtype)) == ~0)
708 if (*e_type == SADB_EALG_NONE) {
709 plog(LLV_ERROR, LOCATION, NULL, "no ESP algorithm.\n");
714 case IPSECDOI_PROTO_IPSEC_AH:
715 if ((*a_type = ipsecdoi2pfkey_aalg(hashtype)) == ~0)
717 if ((*a_keylen = keylen_aalg(hashtype)) == ~0)
721 if (t_id == IPSECDOI_ATTR_AUTH_HMAC_MD5
722 && hashtype == IPSECDOI_ATTR_AUTH_KPDK) {
723 /* AH_MD5 + Auth(KPDK) = RFC1826 keyed-MD5 */
724 *a_type = SADB_X_AALG_MD5;
725 *flags |= SADB_X_EXT_OLD;
727 *e_type = SADB_EALG_NONE;
729 if (*a_type == SADB_AALG_NONE) {
730 plog(LLV_ERROR, LOCATION, NULL, "no AH algorithm.\n");
735 case IPSECDOI_PROTO_IPCOMP:
736 if ((*e_type = ipsecdoi2pfkey_calg(t_id)) == ~0)
740 *flags = SADB_X_EXT_RAWCPI;
742 *a_type = SADB_AALG_NONE;
744 if (*e_type == SADB_X_CALG_NONE) {
745 plog(LLV_ERROR, LOCATION, NULL, "no IPCOMP algorithm.\n");
751 plog(LLV_ERROR, LOCATION, NULL, "unknown IPsec protocol.\n");
762 /* called from scheduler */
764 pfkey_timeover_stub(p)
768 pfkey_timeover((struct ph2handle *)p);
773 struct ph2handle *iph2;
775 plog(LLV_ERROR, LOCATION, NULL,
776 "%s give up to get IPsec-SA due to time up to wait.\n",
777 saddrwop2str(iph2->dst));
778 SCHED_KILL(iph2->sce);
780 /* If initiator side, send error to kernel by SADB_ACQUIRE. */
781 if (iph2->side == INITIATOR)
782 pk_sendeacquire(iph2);
792 /* send getspi message per ipsec protocol per remote address */
794 * the local address and remote address in ph1handle are dealed
795 * with destination address and source address respectively.
796 * Because SPI is decided by responder.
800 struct ph2handle *iph2;
802 struct sockaddr *src = NULL, *dst = NULL;
806 u_int32_t minspi, maxspi;
809 if (iph2->side == INITIATOR) {
811 proxy = iph2->ph1->rmconf->support_proxy;
814 if (iph2->sainfo && iph2->sainfo->id_i)
818 /* for mobile IPv6 */
819 if (proxy && iph2->src_id && iph2->dst_id &&
820 ipsecdoi_transportmode(pp)) {
828 for (pr = pp->head; pr != NULL; pr = pr->next) {
831 satype = ipsecdoi2pfkey_proto(pr->proto_id);
833 plog(LLV_ERROR, LOCATION, NULL,
834 "invalid proto_id %d\n", pr->proto_id);
837 /* this works around a bug in Linux kernel where it allocates 4 byte
839 else if (satype == SADB_X_SATYPE_IPCOMP) {
840 minspi = ntohl (0x100);
841 maxspi = ntohl (0xffff);
847 mode = ipsecdoi2pfkey_mode(pr->encmode);
849 plog(LLV_ERROR, LOCATION, NULL,
850 "invalid encmode %d\n", pr->encmode);
854 plog(LLV_DEBUG, LOCATION, NULL, "call pfkey_send_getspi\n");
855 if (pfkey_send_getspi(
862 pr->reqid_in, iph2->seq) < 0) {
863 plog(LLV_ERROR, LOCATION, NULL,
864 "ipseclib failed send getspi (%s)\n",
868 plog(LLV_DEBUG, LOCATION, NULL,
869 "pfkey GETSPI sent: %s\n",
870 sadbsecas2str(dst, src, satype, 0, mode));
877 * receive GETSPI from kernel.
883 struct sadb_msg *msg;
885 struct ph2handle *iph2;
886 struct sockaddr *dst;
888 int allspiok, notfound;
893 if (mhp[SADB_EXT_SA] == NULL
894 || mhp[SADB_EXT_ADDRESS_DST] == NULL) {
895 plog(LLV_ERROR, LOCATION, NULL,
896 "inappropriate sadb getspi message passed.\n");
899 msg = (struct sadb_msg *)mhp[0];
900 sa = (struct sadb_sa *)mhp[SADB_EXT_SA];
901 dst = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_SRC]); /* note SA dir */
903 /* the message has to be processed or not ? */
904 if (msg->sadb_msg_pid != getpid()) {
905 plog(LLV_DEBUG, LOCATION, NULL,
906 "%s message is not interesting "
907 "because pid %d is not mine.\n",
908 s_pfkey_type(msg->sadb_msg_type),
913 iph2 = getph2byseq(msg->sadb_msg_seq);
915 plog(LLV_DEBUG, LOCATION, NULL,
916 "seq %d of %s message not interesting.\n",
918 s_pfkey_type(msg->sadb_msg_type));
922 if (iph2->status != PHASE2ST_GETSPISENT) {
923 plog(LLV_ERROR, LOCATION, NULL,
924 "status mismatch (db:%d msg:%d)\n",
925 iph2->status, PHASE2ST_GETSPISENT);
929 /* set SPI, and check to get all spi whether or not */
932 proto_id = pfkey2ipsecdoi_proto(msg->sadb_msg_satype);
933 pp = iph2->side == INITIATOR ? iph2->proposal : iph2->approval;
935 for (pr = pp->head; pr != NULL; pr = pr->next) {
936 if (pr->proto_id == proto_id && pr->spi == 0) {
937 pr->spi = sa->sadb_sa_spi;
939 plog(LLV_DEBUG, LOCATION, NULL,
940 "pfkey GETSPI succeeded: %s\n",
941 sadbsecas2str(iph2->dst, iph2->src,
942 msg->sadb_msg_satype,
944 ipsecdoi2pfkey_mode(pr->encmode)));
947 allspiok = 0; /* not get all spi */
951 plog(LLV_ERROR, LOCATION, NULL,
952 "get spi for unknown address %s\n",
953 saddrwop2str(iph2->dst));
959 iph2->status = PHASE2ST_GETSPIDONE;
960 if (isakmp_post_getspi(iph2) < 0) {
961 plog(LLV_ERROR, LOCATION, NULL,
962 "failed to start post getspi.\n");
979 struct ph2handle *iph2;
982 struct sockaddr *src = NULL, *dst = NULL;
983 int e_type, e_keylen, a_type, a_keylen, flags;
985 u_int64_t lifebyte = 0;
986 u_int wsize = 4; /* XXX static size of window */
991 if (iph2->approval == NULL) {
992 plog(LLV_ERROR, LOCATION, NULL,
993 "no approvaled SAs found.\n");
996 if (iph2->side == INITIATOR)
997 proxy = iph2->ph1->rmconf->support_proxy;
998 else if (iph2->sainfo && iph2->sainfo->id_i)
1001 /* for mobile IPv6 */
1002 if (proxy && iph2->src_id && iph2->dst_id &&
1003 ipsecdoi_transportmode(iph2->approval)) {
1011 for (pr = iph2->approval->head; pr != NULL; pr = pr->next) {
1012 /* validity check */
1013 satype = ipsecdoi2pfkey_proto(pr->proto_id);
1015 plog(LLV_ERROR, LOCATION, NULL,
1016 "invalid proto_id %d\n", pr->proto_id);
1019 else if (satype == SADB_X_SATYPE_IPCOMP) {
1020 /* IPCOMP has no replay window */
1023 #ifdef ENABLE_SAMODE_UNSPECIFIED
1024 mode = IPSEC_MODE_ANY;
1026 mode = ipsecdoi2pfkey_mode(pr->encmode);
1028 plog(LLV_ERROR, LOCATION, NULL,
1029 "invalid encmode %d\n", pr->encmode);
1034 /* set algorithm type and key length */
1035 e_keylen = pr->head->encklen;
1036 if (pfkey_convertfromipsecdoi(
1041 &a_type, &a_keylen, &flags) < 0)
1045 lifebyte = iph2->approval->lifebyte * 1024,
1051 plog(LLV_DEBUG, LOCATION, NULL, "call pfkey_send_update_nat\n");
1052 if (pr->udp_encap) {
1053 memset (&natt, 0, sizeof (natt));
1054 natt.type = iph2->ph1->natt_options->encaps_type;
1055 natt.sport = extract_port (iph2->ph1->remote);
1056 natt.dport = extract_port (iph2->ph1->local);
1057 natt.oa = NULL; // FIXME: Here comes OA!!!
1060 memset (&natt, 0, sizeof (natt));
1062 if (pfkey_send_update_nat(
1072 e_type, e_keylen, a_type, a_keylen, flags,
1073 0, lifebyte, iph2->approval->lifetime, 0,
1075 natt.type, natt.sport, natt.dport, natt.oa) < 0) {
1076 plog(LLV_ERROR, LOCATION, NULL,
1077 "libipsec failed send update_nat (%s)\n",
1082 plog(LLV_DEBUG, LOCATION, NULL, "call pfkey_send_update\n");
1083 if (pfkey_send_update(
1093 e_type, e_keylen, a_type, a_keylen, flags,
1094 0, lifebyte, iph2->approval->lifetime, 0,
1096 plog(LLV_ERROR, LOCATION, NULL,
1097 "libipsec failed send update (%s)\n",
1101 #endif /* ENABLE_NATT */
1103 if (!lcconf->pathinfo[LC_PATHTYPE_BACKUPSA])
1107 * It maybe good idea to call backupsa_to_file() after
1108 * racoon will receive the sadb_update messages.
1109 * But it is impossible because there is not key in the
1110 * information from the kernel.
1112 if (backupsa_to_file(satype, mode, dst, src,
1113 pr->spi, pr->reqid_in, 4,
1115 e_type, e_keylen, a_type, a_keylen, flags,
1116 0, iph2->approval->lifebyte * 1024,
1117 iph2->approval->lifetime, 0,
1119 plog(LLV_ERROR, LOCATION, NULL,
1120 "backuped SA failed: %s\n",
1121 sadbsecas2str(dst, src,
1122 satype, pr->spi, mode));
1124 plog(LLV_DEBUG, LOCATION, NULL,
1125 "backuped SA: %s\n",
1126 sadbsecas2str(dst, src,
1127 satype, pr->spi, mode));
1137 struct sadb_msg *msg;
1139 struct sockaddr *src, *dst;
1140 struct ph2handle *iph2;
1141 u_int proto_id, encmode, sa_mode;
1145 /* ignore this message because of local test mode. */
1151 || mhp[SADB_EXT_SA] == NULL
1152 || mhp[SADB_EXT_ADDRESS_SRC] == NULL
1153 || mhp[SADB_EXT_ADDRESS_DST] == NULL) {
1154 plog(LLV_ERROR, LOCATION, NULL,
1155 "inappropriate sadb update message passed.\n");
1158 msg = (struct sadb_msg *)mhp[0];
1159 src = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_SRC]);
1160 dst = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_DST]);
1161 sa = (struct sadb_sa *)mhp[SADB_EXT_SA];
1163 sa_mode = mhp[SADB_X_EXT_SA2] == NULL
1165 : ((struct sadb_x_sa2 *)mhp[SADB_X_EXT_SA2])->sadb_x_sa2_mode;
1167 /* the message has to be processed or not ? */
1168 if (msg->sadb_msg_pid != getpid()) {
1169 plog(LLV_DEBUG, LOCATION, NULL,
1170 "%s message is not interesting "
1171 "because pid %d is not mine.\n",
1172 s_pfkey_type(msg->sadb_msg_type),
1177 iph2 = getph2byseq(msg->sadb_msg_seq);
1179 plog(LLV_DEBUG, LOCATION, NULL,
1180 "seq %d of %s message not interesting.\n",
1182 s_pfkey_type(msg->sadb_msg_type));
1186 if (iph2->status != PHASE2ST_ADDSA) {
1187 plog(LLV_ERROR, LOCATION, NULL,
1188 "status mismatch (db:%d msg:%d)\n",
1189 iph2->status, PHASE2ST_ADDSA);
1193 /* check to complete all keys ? */
1194 for (pr = iph2->approval->head; pr != NULL; pr = pr->next) {
1195 proto_id = pfkey2ipsecdoi_proto(msg->sadb_msg_satype);
1196 if (proto_id == ~0) {
1197 plog(LLV_ERROR, LOCATION, NULL,
1198 "invalid proto_id %d\n", msg->sadb_msg_satype);
1201 encmode = pfkey2ipsecdoi_mode(sa_mode);
1202 if (encmode == ~0) {
1203 plog(LLV_ERROR, LOCATION, NULL,
1204 "invalid encmode %d\n", sa_mode);
1208 if (pr->proto_id == proto_id
1209 && pr->spi == sa->sadb_sa_spi) {
1211 plog(LLV_DEBUG, LOCATION, NULL,
1212 "pfkey UPDATE succeeded: %s\n",
1213 sadbsecas2str(iph2->dst, iph2->src,
1214 msg->sadb_msg_satype,
1218 plog(LLV_INFO, LOCATION, NULL,
1219 "IPsec-SA established: %s\n",
1220 sadbsecas2str(iph2->dst, iph2->src,
1221 msg->sadb_msg_satype, sa->sadb_sa_spi,
1232 /* turn off the timer for calling pfkey_timeover() */
1233 SCHED_KILL(iph2->sce);
1236 iph2->status = PHASE2ST_ESTABLISHED;
1239 gettimeofday(&iph2->end, NULL);
1240 syslog(LOG_NOTICE, "%s(%s): %8.6f",
1241 "phase2", "quick", timedelta(&iph2->start, &iph2->end));
1245 iph2->ph1->ph2cnt++;
1247 /* turn off schedule */
1249 SCHED_KILL(iph2->scr);
1252 * since we are going to reuse the phase2 handler, we need to
1253 * remain it and refresh all the references between ph1 and ph2 to use.
1257 /* unbindph12(iph2);*/
1259 iph2->sce = sched_new(iph2->approval->lifetime,
1260 isakmp_ph2expire_stub, iph2);
1262 plog(LLV_DEBUG, LOCATION, NULL, "===\n");
1271 struct ph2handle *iph2;
1274 struct sockaddr *src = NULL, *dst = NULL;
1275 int e_type, e_keylen, a_type, a_keylen, flags;
1277 u_int64_t lifebyte = 0;
1278 u_int wsize = 4; /* XXX static size of window */
1280 struct ph2natt natt;
1283 if (iph2->approval == NULL) {
1284 plog(LLV_ERROR, LOCATION, NULL,
1285 "no approvaled SAs found.\n");
1288 if (iph2->side == INITIATOR)
1289 proxy = iph2->ph1->rmconf->support_proxy;
1290 else if (iph2->sainfo && iph2->sainfo->id_i)
1293 /* for mobile IPv6 */
1294 if (proxy && iph2->src_id && iph2->dst_id &&
1295 ipsecdoi_transportmode(iph2->approval)) {
1303 for (pr = iph2->approval->head; pr != NULL; pr = pr->next) {
1304 /* validity check */
1305 satype = ipsecdoi2pfkey_proto(pr->proto_id);
1307 plog(LLV_ERROR, LOCATION, NULL,
1308 "invalid proto_id %d\n", pr->proto_id);
1311 else if (satype == SADB_X_SATYPE_IPCOMP) {
1312 /* no replay window for IPCOMP */
1315 #ifdef ENABLE_SAMODE_UNSPECIFIED
1316 mode = IPSEC_MODE_ANY;
1318 mode = ipsecdoi2pfkey_mode(pr->encmode);
1320 plog(LLV_ERROR, LOCATION, NULL,
1321 "invalid encmode %d\n", pr->encmode);
1326 /* set algorithm type and key length */
1327 e_keylen = pr->head->encklen;
1328 if (pfkey_convertfromipsecdoi(
1333 &a_type, &a_keylen, &flags) < 0)
1337 lifebyte = iph2->approval->lifebyte * 1024,
1343 plog(LLV_DEBUG, LOCATION, NULL, "call pfkey_send_add_nat\n");
1345 if (pr->udp_encap) {
1346 memset (&natt, 0, sizeof (natt));
1347 natt.type = UDP_ENCAP_ESPINUDP;
1348 natt.sport = extract_port (iph2->ph1->local);
1349 natt.dport = extract_port (iph2->ph1->remote);
1350 natt.oa = NULL; // FIXME: Here comes OA!!!
1353 memset (&natt, 0, sizeof (natt));
1355 if (pfkey_send_add_nat(
1365 e_type, e_keylen, a_type, a_keylen, flags,
1366 0, lifebyte, iph2->approval->lifetime, 0,
1368 natt.type, natt.sport, natt.dport, natt.oa) < 0) {
1369 plog(LLV_ERROR, LOCATION, NULL,
1370 "libipsec failed send add_nat (%s)\n",
1375 plog(LLV_DEBUG, LOCATION, NULL, "call pfkey_send_add\n");
1387 e_type, e_keylen, a_type, a_keylen, flags,
1388 0, lifebyte, iph2->approval->lifetime, 0,
1390 plog(LLV_ERROR, LOCATION, NULL,
1391 "libipsec failed send add (%s)\n",
1395 #endif /* ENABLE_NATT */
1397 if (!lcconf->pathinfo[LC_PATHTYPE_BACKUPSA])
1401 * It maybe good idea to call backupsa_to_file() after
1402 * racoon will receive the sadb_update messages.
1403 * But it is impossible because there is not key in the
1404 * information from the kernel.
1406 if (backupsa_to_file(satype, mode, src, dst,
1407 pr->spi_p, pr->reqid_out, 4,
1409 e_type, e_keylen, a_type, a_keylen, flags,
1410 0, iph2->approval->lifebyte * 1024,
1411 iph2->approval->lifetime, 0,
1413 plog(LLV_ERROR, LOCATION, NULL,
1414 "backuped SA failed: %s\n",
1415 sadbsecas2str(src, dst,
1416 satype, pr->spi_p, mode));
1418 plog(LLV_DEBUG, LOCATION, NULL,
1419 "backuped SA: %s\n",
1420 sadbsecas2str(src, dst,
1421 satype, pr->spi_p, mode));
1431 struct sadb_msg *msg;
1433 struct sockaddr *src, *dst;
1434 struct ph2handle *iph2;
1437 /* ignore this message because of local test mode. */
1443 || mhp[SADB_EXT_SA] == NULL
1444 || mhp[SADB_EXT_ADDRESS_SRC] == NULL
1445 || mhp[SADB_EXT_ADDRESS_DST] == NULL) {
1446 plog(LLV_ERROR, LOCATION, NULL,
1447 "inappropriate sadb add message passed.\n");
1450 msg = (struct sadb_msg *)mhp[0];
1451 src = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_SRC]);
1452 dst = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_DST]);
1453 sa = (struct sadb_sa *)mhp[SADB_EXT_SA];
1455 sa_mode = mhp[SADB_X_EXT_SA2] == NULL
1457 : ((struct sadb_x_sa2 *)mhp[SADB_X_EXT_SA2])->sadb_x_sa2_mode;
1459 /* the message has to be processed or not ? */
1460 if (msg->sadb_msg_pid != getpid()) {
1461 plog(LLV_DEBUG, LOCATION, NULL,
1462 "%s message is not interesting "
1463 "because pid %d is not mine.\n",
1464 s_pfkey_type(msg->sadb_msg_type),
1469 iph2 = getph2byseq(msg->sadb_msg_seq);
1471 plog(LLV_DEBUG, LOCATION, NULL,
1472 "seq %d of %s message not interesting.\n",
1474 s_pfkey_type(msg->sadb_msg_type));
1479 * NOTE don't update any status of phase2 handle
1480 * because they must be updated by SADB_UPDATE message
1483 plog(LLV_INFO, LOCATION, NULL,
1484 "IPsec-SA established: %s\n",
1485 sadbsecas2str(iph2->src, iph2->dst,
1486 msg->sadb_msg_satype, sa->sadb_sa_spi, sa_mode));
1488 plog(LLV_DEBUG, LOCATION, NULL, "===\n");
1496 struct sadb_msg *msg;
1498 struct sockaddr *src, *dst;
1499 struct ph2handle *iph2;
1500 u_int proto_id, sa_mode;
1504 || mhp[SADB_EXT_SA] == NULL
1505 || mhp[SADB_EXT_ADDRESS_SRC] == NULL
1506 || mhp[SADB_EXT_ADDRESS_DST] == NULL
1507 || (mhp[SADB_EXT_LIFETIME_HARD] != NULL
1508 && mhp[SADB_EXT_LIFETIME_SOFT] != NULL)) {
1509 plog(LLV_ERROR, LOCATION, NULL,
1510 "inappropriate sadb expire message passed.\n");
1513 msg = (struct sadb_msg *)mhp[0];
1514 sa = (struct sadb_sa *)mhp[SADB_EXT_SA];
1515 src = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_SRC]);
1516 dst = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_DST]);
1518 sa_mode = mhp[SADB_X_EXT_SA2] == NULL
1520 : ((struct sadb_x_sa2 *)mhp[SADB_X_EXT_SA2])->sadb_x_sa2_mode;
1522 proto_id = pfkey2ipsecdoi_proto(msg->sadb_msg_satype);
1523 if (proto_id == ~0) {
1524 plog(LLV_ERROR, LOCATION, NULL,
1525 "invalid proto_id %d\n", msg->sadb_msg_satype);
1529 plog(LLV_INFO, LOCATION, NULL,
1530 "IPsec-SA expired: %s\n",
1531 sadbsecas2str(src, dst,
1532 msg->sadb_msg_satype, sa->sadb_sa_spi, sa_mode));
1534 iph2 = getph2bysaidx(src, dst, proto_id, sa->sadb_sa_spi);
1537 * Ignore it because two expire messages are come up.
1538 * phase2 handler has been deleted already when 2nd message
1541 plog(LLV_DEBUG, LOCATION, NULL,
1542 "no such a SA found: %s\n",
1543 sadbsecas2str(src, dst,
1544 msg->sadb_msg_satype, sa->sadb_sa_spi,
1548 if (iph2->status != PHASE2ST_ESTABLISHED) {
1550 * If the status is not equal to PHASE2ST_ESTABLISHED,
1551 * racoon ignores this expire message. There are two reason.
1552 * One is that the phase 2 probably starts because there is
1553 * a potential that racoon receives the acquire message
1554 * without receiving a expire message. Another is that racoon
1555 * may receive the multiple expire messages from the kernel.
1557 plog(LLV_WARNING, LOCATION, NULL,
1558 "the expire message is received "
1559 "but the handler has not been established.\n");
1563 /* turn off the timer for calling isakmp_ph2expire() */
1564 SCHED_KILL(iph2->sce);
1566 iph2->status = PHASE2ST_EXPIRED;
1568 /* INITIATOR, begin phase 2 exchange. */
1569 /* allocate buffer for status management of pfkey message */
1570 if (iph2->side == INITIATOR) {
1574 /* update status for re-use */
1575 iph2->status = PHASE2ST_STATUS2;
1577 /* start isakmp initiation by using ident exchange */
1578 if (isakmp_post_acquire(iph2) < 0) {
1579 plog(LLV_ERROR, LOCATION, iph2->dst,
1580 "failed to begin ipsec sa "
1581 "re-negotication.\n");
1592 /* If not received SADB_EXPIRE, INITIATOR delete ph2handle. */
1593 /* RESPONDER always delete ph2handle, keep silent. RESPONDER doesn't
1594 * manage IPsec SA, so delete the list */
1606 struct sadb_msg *msg;
1607 struct sadb_x_policy *xpl;
1608 struct secpolicy *sp_out = NULL, *sp_in = NULL;
1609 #define MAXNESTEDSA 5 /* XXX */
1610 struct ph2handle *iph2[MAXNESTEDSA];
1611 int n; /* # of phase 2 handler */
1613 /* ignore this message because of local test mode. */
1619 || mhp[SADB_EXT_ADDRESS_SRC] == NULL
1620 || mhp[SADB_EXT_ADDRESS_DST] == NULL
1621 || mhp[SADB_X_EXT_POLICY] == NULL) {
1622 plog(LLV_ERROR, LOCATION, NULL,
1623 "inappropriate sadb acquire message passed.\n");
1626 msg = (struct sadb_msg *)mhp[0];
1627 xpl = (struct sadb_x_policy *)mhp[SADB_X_EXT_POLICY];
1629 /* ignore if type is not IPSEC_POLICY_IPSEC */
1630 if (xpl->sadb_x_policy_type != IPSEC_POLICY_IPSEC) {
1631 plog(LLV_DEBUG, LOCATION, NULL,
1632 "ignore ACQUIRE message. type is not IPsec.\n");
1636 /* ignore it if src is multicast address */
1638 struct sockaddr *sa = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_DST]);
1640 if ((sa->sa_family == AF_INET
1641 && IN_MULTICAST(ntohl(((struct sockaddr_in *)sa)->sin_addr.s_addr)))
1643 || (sa->sa_family == AF_INET6
1644 && IN6_IS_ADDR_MULTICAST(&((struct sockaddr_in6 *)sa)->sin6_addr))
1647 plog(LLV_DEBUG, LOCATION, NULL,
1648 "ignore due to multicast address: %s.\n",
1654 /* ignore, if we do not listen on source address */
1657 * - if we'll contact peer from address we do not listen -
1658 * we will be unable to complete negotiation;
1659 * - if we'll negotiate using address we're listening -
1660 * remote peer will send packets to address different
1661 * than one in the policy, so kernel will drop them;
1662 * => therefore this acquire is not for us! --Aidas
1664 struct sockaddr *sa = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_SRC]);
1667 for (p = lcconf->myaddrs; p; p = p->next) {
1668 if (!cmpsaddrwop(p->addr, sa)) {
1675 plog(LLV_DEBUG, LOCATION, NULL,
1676 "ignore because do not listen on source address : %s.\n",
1683 * If there is a phase 2 handler against the policy identifier in
1684 * the acquire message, and if
1685 * 1. its state is less than PHASE2ST_ESTABLISHED, then racoon
1686 * should ignore such a acquire message because the phase 2
1687 * is just negotiating.
1688 * 2. its state is equal to PHASE2ST_ESTABLISHED, then racoon
1689 * has to prcesss such a acquire message because racoon may
1690 * lost the expire message.
1692 iph2[0] = getph2byspid(xpl->sadb_x_policy_id);
1693 if (iph2[0] != NULL) {
1694 if (iph2[0]->status < PHASE2ST_ESTABLISHED) {
1695 plog(LLV_DEBUG, LOCATION, NULL,
1696 "ignore the acquire because ph2 found\n");
1699 if (iph2[0]->status == PHASE2ST_EXPIRED)
1704 /* search for proper policyindex */
1705 sp_out = getspbyspid(xpl->sadb_x_policy_id);
1706 if (sp_out == NULL) {
1707 plog(LLV_ERROR, LOCATION, NULL, "no policy found: id:%d.\n",
1708 xpl->sadb_x_policy_id);
1711 plog(LLV_DEBUG, LOCATION, NULL,
1712 "suitable outbound SP found: %s.\n", spidx2str(&sp_out->spidx));
1714 /* get inbound policy */
1716 struct policyindex spidx;
1718 spidx.dir = IPSEC_DIR_INBOUND;
1719 memcpy(&spidx.src, &sp_out->spidx.dst, sizeof(spidx.src));
1720 memcpy(&spidx.dst, &sp_out->spidx.src, sizeof(spidx.dst));
1721 spidx.prefs = sp_out->spidx.prefd;
1722 spidx.prefd = sp_out->spidx.prefs;
1723 spidx.ul_proto = sp_out->spidx.ul_proto;
1725 sp_in = getsp(&spidx);
1727 plog(LLV_DEBUG, LOCATION, NULL,
1728 "suitable inbound SP found: %s.\n",
1729 spidx2str(&sp_in->spidx));
1731 plog(LLV_NOTIFY, LOCATION, NULL,
1732 "no in-bound policy found: %s\n",
1737 memset(iph2, 0, MAXNESTEDSA);
1741 /* allocate a phase 2 */
1743 if (iph2[n] == NULL) {
1744 plog(LLV_ERROR, LOCATION, NULL,
1745 "failed to allocate phase2 entry.\n");
1748 iph2[n]->side = INITIATOR;
1749 iph2[n]->spid = xpl->sadb_x_policy_id;
1750 iph2[n]->satype = msg->sadb_msg_satype;
1751 iph2[n]->seq = msg->sadb_msg_seq;
1752 iph2[n]->status = PHASE2ST_STATUS2;
1754 /* set end addresses of SA */
1755 iph2[n]->dst = dupsaddr(PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_DST]));
1756 if (iph2[n]->dst == NULL) {
1760 iph2[n]->src = dupsaddr(PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_SRC]));
1761 if (iph2[n]->src == NULL) {
1766 plog(LLV_DEBUG, LOCATION, NULL,
1767 "new acquire %s\n", spidx2str(&sp_out->spidx));
1771 vchar_t *idsrc, *iddst;
1773 idsrc = ipsecdoi_sockaddr2id((struct sockaddr *)&sp_out->spidx.src,
1774 sp_out->spidx.prefs, sp_out->spidx.ul_proto);
1775 if (idsrc == NULL) {
1776 plog(LLV_ERROR, LOCATION, NULL,
1777 "failed to get ID for %s\n",
1778 spidx2str(&sp_out->spidx));
1782 iddst = ipsecdoi_sockaddr2id((struct sockaddr *)&sp_out->spidx.dst,
1783 sp_out->spidx.prefd, sp_out->spidx.ul_proto);
1784 if (iddst == NULL) {
1785 plog(LLV_ERROR, LOCATION, NULL,
1786 "failed to get ID for %s\n",
1787 spidx2str(&sp_out->spidx));
1792 iph2[n]->sainfo = getsainfo(idsrc, iddst, NULL);
1795 if (iph2[n]->sainfo == NULL) {
1796 plog(LLV_ERROR, LOCATION, NULL,
1797 "failed to get sainfo.\n");
1800 /* XXX should use the algorithm list from register message */
1804 if (set_proposal_from_policy(iph2[n], sp_out, sp_in) < 0) {
1805 plog(LLV_ERROR, LOCATION, NULL,
1806 "failed to create saprop.\n");
1812 /* start isakmp initiation by using ident exchange */
1813 /* XXX should be looped if there are multiple phase 2 handler. */
1814 if (isakmp_post_acquire(iph2[n]) < 0) {
1815 plog(LLV_ERROR, LOCATION, NULL,
1816 "failed to begin ipsec sa negotication.\n");
1824 unbindph12(iph2[n]);
1837 struct sadb_msg *msg;
1839 struct sockaddr *src, *dst;
1840 struct ph2handle *iph2 = NULL;
1843 /* ignore this message because of local test mode. */
1849 || mhp[SADB_EXT_SA] == NULL
1850 || mhp[SADB_EXT_ADDRESS_SRC] == NULL
1851 || mhp[SADB_EXT_ADDRESS_DST] == NULL) {
1852 plog(LLV_ERROR, LOCATION, NULL,
1853 "inappropriate sadb acquire message passed.\n");
1856 msg = (struct sadb_msg *)mhp[0];
1857 sa = (struct sadb_sa *)mhp[SADB_EXT_SA];
1858 src = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_SRC]);
1859 dst = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_DST]);
1861 /* the message has to be processed or not ? */
1862 if (msg->sadb_msg_pid == getpid()) {
1863 plog(LLV_DEBUG, LOCATION, NULL,
1864 "%s message is not interesting "
1865 "because the message was originated by me.\n",
1866 s_pfkey_type(msg->sadb_msg_type));
1870 proto_id = pfkey2ipsecdoi_proto(msg->sadb_msg_satype);
1871 if (proto_id == ~0) {
1872 plog(LLV_ERROR, LOCATION, NULL,
1873 "invalid proto_id %d\n", msg->sadb_msg_satype);
1877 iph2 = getph2bysaidx(src, dst, proto_id, sa->sadb_sa_spi);
1880 plog(LLV_ERROR, LOCATION, NULL,
1881 "no iph2 found: %s\n",
1882 sadbsecas2str(src, dst, msg->sadb_msg_satype,
1883 sa->sadb_sa_spi, IPSEC_MODE_ANY));
1887 plog(LLV_ERROR, LOCATION, NULL,
1888 "pfkey DELETE received: %s\n",
1889 sadbsecas2str(iph2->src, iph2->dst,
1890 msg->sadb_msg_satype, sa->sadb_sa_spi, IPSEC_MODE_ANY));
1892 /* send delete information */
1893 if (iph2->status == PHASE2ST_ESTABLISHED)
1894 isakmp_info_send_d2(iph2);
1907 /* ignore this message because of local test mode. */
1912 if (mhp[0] == NULL) {
1913 plog(LLV_ERROR, LOCATION, NULL,
1914 "inappropriate sadb acquire message passed.\n");
1924 getsadbpolicy(policy0, policylen0, type, iph2)
1926 int *policylen0, type;
1927 struct ph2handle *iph2;
1929 struct policyindex *spidx = (struct policyindex *)iph2->spidx_gen;
1930 struct sadb_x_policy *xpl;
1931 struct sadb_x_ipsecrequest *xisr;
1938 /* get policy buffer size */
1939 policylen = sizeof(struct sadb_x_policy);
1940 if (type != SADB_X_SPDDELETE) {
1941 for (pr = iph2->approval->head; pr; pr = pr->next) {
1942 xisrlen = sizeof(*xisr);
1943 if (pr->encmode == IPSECDOI_ATTR_ENC_MODE_TUNNEL) {
1944 xisrlen += (sysdep_sa_len(iph2->src)
1945 + sysdep_sa_len(iph2->dst));
1948 policylen += PFKEY_ALIGN8(xisrlen);
1952 /* make policy structure */
1953 policy = racoon_malloc(policylen);
1955 plog(LLV_ERROR, LOCATION, NULL,
1956 "buffer allocation failed.\n");
1960 xpl = (struct sadb_x_policy *)policy;
1961 xpl->sadb_x_policy_len = PFKEY_UNIT64(policylen);
1962 xpl->sadb_x_policy_exttype = SADB_X_EXT_POLICY;
1963 xpl->sadb_x_policy_type = IPSEC_POLICY_IPSEC;
1964 xpl->sadb_x_policy_dir = spidx->dir;
1965 xpl->sadb_x_policy_id = 0;
1966 #ifdef HAVE_PFKEY_POLICY_PRIORITY
1967 xpl->sadb_x_policy_priority = PRIORITY_DEFAULT;
1970 /* no need to append policy information any more if type is SPDDELETE */
1971 if (type == SADB_X_SPDDELETE)
1974 xisr = (struct sadb_x_ipsecrequest *)(xpl + 1);
1976 for (pr = iph2->approval->head; pr; pr = pr->next) {
1978 satype = doi2ipproto(pr->proto_id);
1980 plog(LLV_ERROR, LOCATION, NULL,
1981 "invalid proto_id %d\n", pr->proto_id);
1984 mode = ipsecdoi2pfkey_mode(pr->encmode);
1986 plog(LLV_ERROR, LOCATION, NULL,
1987 "invalid encmode %d\n", pr->encmode);
1992 * the policy level cannot be unique because the policy
1993 * is defined later than SA, so req_id cannot be bound to SA.
1995 xisr->sadb_x_ipsecrequest_proto = satype;
1996 xisr->sadb_x_ipsecrequest_mode = mode;
1997 xisr->sadb_x_ipsecrequest_level = IPSEC_LEVEL_REQUIRE;
1998 xisr->sadb_x_ipsecrequest_reqid = 0;
1999 p = (caddr_t)(xisr + 1);
2001 xisrlen = sizeof(*xisr);
2003 if (pr->encmode == IPSECDOI_ATTR_ENC_MODE_TUNNEL) {
2004 int src_len, dst_len;
2006 src_len = sysdep_sa_len(iph2->src);
2007 dst_len = sysdep_sa_len(iph2->dst);
2008 xisrlen += src_len + dst_len;
2010 memcpy(p, iph2->src, src_len);
2013 memcpy(p, iph2->dst, dst_len);
2017 xisr->sadb_x_ipsecrequest_len = PFKEY_ALIGN8(xisrlen);
2022 *policylen0 = policylen;
2028 racoon_free(policy);
2034 pk_sendspdupdate2(iph2)
2035 struct ph2handle *iph2;
2037 struct policyindex *spidx = (struct policyindex *)iph2->spidx_gen;
2038 caddr_t policy = NULL;
2040 u_int64_t ltime, vtime;
2042 ltime = iph2->approval->lifetime;
2045 if (getsadbpolicy(&policy, &policylen, SADB_X_SPDUPDATE, iph2)) {
2046 plog(LLV_ERROR, LOCATION, NULL,
2047 "getting sadb policy failed.\n");
2051 if (pfkey_send_spdupdate2(
2053 (struct sockaddr *)&spidx->src,
2055 (struct sockaddr *)&spidx->dst,
2059 policy, policylen, 0) < 0) {
2060 plog(LLV_ERROR, LOCATION, NULL,
2061 "libipsec failed send spdupdate2 (%s)\n",
2065 plog(LLV_DEBUG, LOCATION, NULL, "call pfkey_send_spdupdate2\n");
2069 racoon_free(policy);
2075 pk_recvspdupdate(mhp)
2078 struct sadb_address *saddr, *daddr;
2079 struct sadb_x_policy *xpl;
2080 struct policyindex spidx;
2081 struct secpolicy *sp;
2085 || mhp[SADB_EXT_ADDRESS_SRC] == NULL
2086 || mhp[SADB_EXT_ADDRESS_DST] == NULL
2087 || mhp[SADB_X_EXT_POLICY] == NULL) {
2088 plog(LLV_ERROR, LOCATION, NULL,
2089 "inappropriate sadb spdupdate message passed.\n");
2092 saddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_SRC];
2093 daddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_DST];
2094 xpl = (struct sadb_x_policy *)mhp[SADB_X_EXT_POLICY];
2096 #ifdef HAVE_PFKEY_POLICY_PRIORITY
2097 KEY_SETSECSPIDX(xpl->sadb_x_policy_dir,
2100 saddr->sadb_address_prefixlen,
2101 daddr->sadb_address_prefixlen,
2102 saddr->sadb_address_proto,
2103 xpl->sadb_x_policy_priority,
2106 KEY_SETSECSPIDX(xpl->sadb_x_policy_dir,
2109 saddr->sadb_address_prefixlen,
2110 daddr->sadb_address_prefixlen,
2111 saddr->sadb_address_proto,
2117 plog(LLV_ERROR, LOCATION, NULL,
2118 "such policy does not already exist: %s\n",
2125 if (addnewsp(mhp) < 0)
2132 * this function has to be used by responder side.
2135 pk_sendspdadd2(iph2)
2136 struct ph2handle *iph2;
2138 struct policyindex *spidx = (struct policyindex *)iph2->spidx_gen;
2139 caddr_t policy = NULL;
2141 u_int64_t ltime, vtime;
2143 ltime = iph2->approval->lifetime;
2146 if (getsadbpolicy(&policy, &policylen, SADB_X_SPDADD, iph2)) {
2147 plog(LLV_ERROR, LOCATION, NULL,
2148 "getting sadb policy failed.\n");
2152 if (pfkey_send_spdadd2(
2154 (struct sockaddr *)&spidx->src,
2156 (struct sockaddr *)&spidx->dst,
2160 policy, policylen, 0) < 0) {
2161 plog(LLV_ERROR, LOCATION, NULL,
2162 "libipsec failed send spdadd2 (%s)\n",
2166 plog(LLV_DEBUG, LOCATION, NULL, "call pfkey_send_spdadd2\n");
2170 racoon_free(policy);
2179 struct sadb_address *saddr, *daddr;
2180 struct sadb_x_policy *xpl;
2181 struct policyindex spidx;
2182 struct secpolicy *sp;
2186 || mhp[SADB_EXT_ADDRESS_SRC] == NULL
2187 || mhp[SADB_EXT_ADDRESS_DST] == NULL
2188 || mhp[SADB_X_EXT_POLICY] == NULL) {
2189 plog(LLV_ERROR, LOCATION, NULL,
2190 "inappropriate sadb spdadd message passed.\n");
2193 saddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_SRC];
2194 daddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_DST];
2195 xpl = (struct sadb_x_policy *)mhp[SADB_X_EXT_POLICY];
2197 #ifdef HAVE_PFKEY_POLICY_PRIORITY
2198 KEY_SETSECSPIDX(xpl->sadb_x_policy_dir,
2201 saddr->sadb_address_prefixlen,
2202 daddr->sadb_address_prefixlen,
2203 saddr->sadb_address_proto,
2204 xpl->sadb_x_policy_priority,
2207 KEY_SETSECSPIDX(xpl->sadb_x_policy_dir,
2210 saddr->sadb_address_prefixlen,
2211 daddr->sadb_address_prefixlen,
2212 saddr->sadb_address_proto,
2218 plog(LLV_ERROR, LOCATION, NULL,
2219 "such policy already exists. "
2220 "anyway replace it: %s\n",
2226 if (addnewsp(mhp) < 0)
2233 * this function has to be used by responder side.
2236 pk_sendspddelete(iph2)
2237 struct ph2handle *iph2;
2239 struct policyindex *spidx = (struct policyindex *)iph2->spidx_gen;
2240 caddr_t policy = NULL;
2243 if (getsadbpolicy(&policy, &policylen, SADB_X_SPDDELETE, iph2)) {
2244 plog(LLV_ERROR, LOCATION, NULL,
2245 "getting sadb policy failed.\n");
2249 if (pfkey_send_spddelete(
2251 (struct sockaddr *)&spidx->src,
2253 (struct sockaddr *)&spidx->dst,
2256 policy, policylen, 0) < 0) {
2257 plog(LLV_ERROR, LOCATION, NULL,
2258 "libipsec failed send spddelete (%s)\n",
2262 plog(LLV_DEBUG, LOCATION, NULL, "call pfkey_send_spddelete\n");
2266 racoon_free(policy);
2272 pk_recvspddelete(mhp)
2275 struct sadb_address *saddr, *daddr;
2276 struct sadb_x_policy *xpl;
2277 struct policyindex spidx;
2278 struct secpolicy *sp;
2282 || mhp[SADB_EXT_ADDRESS_SRC] == NULL
2283 || mhp[SADB_EXT_ADDRESS_DST] == NULL
2284 || mhp[SADB_X_EXT_POLICY] == NULL) {
2285 plog(LLV_ERROR, LOCATION, NULL,
2286 "inappropriate sadb spddelete message passed.\n");
2289 saddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_SRC];
2290 daddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_DST];
2291 xpl = (struct sadb_x_policy *)mhp[SADB_X_EXT_POLICY];
2293 #ifdef HAVE_PFKEY_POLICY_PRIORITY
2294 KEY_SETSECSPIDX(xpl->sadb_x_policy_dir,
2297 saddr->sadb_address_prefixlen,
2298 daddr->sadb_address_prefixlen,
2299 saddr->sadb_address_proto,
2300 xpl->sadb_x_policy_priority,
2303 KEY_SETSECSPIDX(xpl->sadb_x_policy_dir,
2306 saddr->sadb_address_prefixlen,
2307 daddr->sadb_address_prefixlen,
2308 saddr->sadb_address_proto,
2314 plog(LLV_ERROR, LOCATION, NULL,
2315 "no policy found: %s\n",
2327 pk_recvspdexpire(mhp)
2330 struct sadb_address *saddr, *daddr;
2331 struct sadb_x_policy *xpl;
2332 struct policyindex spidx;
2333 struct secpolicy *sp;
2337 || mhp[SADB_EXT_ADDRESS_SRC] == NULL
2338 || mhp[SADB_EXT_ADDRESS_DST] == NULL
2339 || mhp[SADB_X_EXT_POLICY] == NULL) {
2340 plog(LLV_ERROR, LOCATION, NULL,
2341 "inappropriate sadb spdexpire message passed.\n");
2344 saddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_SRC];
2345 daddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_DST];
2346 xpl = (struct sadb_x_policy *)mhp[SADB_X_EXT_POLICY];
2348 #ifdef HAVE_PFKEY_POLICY_PRIORITY
2349 KEY_SETSECSPIDX(xpl->sadb_x_policy_dir,
2352 saddr->sadb_address_prefixlen,
2353 daddr->sadb_address_prefixlen,
2354 saddr->sadb_address_proto,
2355 xpl->sadb_x_policy_priority,
2358 KEY_SETSECSPIDX(xpl->sadb_x_policy_dir,
2361 saddr->sadb_address_prefixlen,
2362 daddr->sadb_address_prefixlen,
2363 saddr->sadb_address_proto,
2369 plog(LLV_ERROR, LOCATION, NULL,
2370 "no policy found: %s\n",
2386 if (mhp[0] == NULL) {
2387 plog(LLV_ERROR, LOCATION, NULL,
2388 "inappropriate sadb spdget message passed.\n");
2399 struct sadb_msg *msg;
2400 struct sadb_address *saddr, *daddr;
2401 struct sadb_x_policy *xpl;
2402 struct policyindex spidx;
2403 struct secpolicy *sp;
2406 if (mhp[0] == NULL) {
2407 plog(LLV_ERROR, LOCATION, NULL,
2408 "inappropriate sadb spddump message passed.\n");
2411 msg = (struct sadb_msg *)mhp[0];
2413 saddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_SRC];
2414 daddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_DST];
2415 xpl = (struct sadb_x_policy *)mhp[SADB_X_EXT_POLICY];
2417 if (saddr == NULL || daddr == NULL || xpl == NULL) {
2418 plog(LLV_ERROR, LOCATION, NULL,
2419 "inappropriate sadb spddump message passed.\n");
2423 #ifdef HAVE_PFKEY_POLICY_PRIORITY
2424 KEY_SETSECSPIDX(xpl->sadb_x_policy_dir,
2427 saddr->sadb_address_prefixlen,
2428 daddr->sadb_address_prefixlen,
2429 saddr->sadb_address_proto,
2430 xpl->sadb_x_policy_priority,
2433 KEY_SETSECSPIDX(xpl->sadb_x_policy_dir,
2436 saddr->sadb_address_prefixlen,
2437 daddr->sadb_address_prefixlen,
2438 saddr->sadb_address_proto,
2444 plog(LLV_ERROR, LOCATION, NULL,
2445 "such policy already exists. "
2446 "anyway replace it: %s\n",
2452 if (addnewsp(mhp) < 0)
2459 pk_recvspdflush(mhp)
2463 if (mhp[0] == NULL) {
2464 plog(LLV_ERROR, LOCATION, NULL,
2465 "inappropriate sadb spdflush message passed.\n");
2475 * send error against acquire message to kenrel.
2478 pk_sendeacquire(iph2)
2479 struct ph2handle *iph2;
2481 struct sadb_msg *newmsg;
2484 len = sizeof(struct sadb_msg);
2485 newmsg = racoon_calloc(1, len);
2486 if (newmsg == NULL) {
2487 plog(LLV_ERROR, LOCATION, NULL,
2488 "failed to get buffer to send acquire.\n");
2492 memset(newmsg, 0, len);
2493 newmsg->sadb_msg_version = PF_KEY_V2;
2494 newmsg->sadb_msg_type = SADB_ACQUIRE;
2495 newmsg->sadb_msg_errno = ENOENT; /* XXX */
2496 newmsg->sadb_msg_satype = iph2->satype;
2497 newmsg->sadb_msg_len = PFKEY_UNIT64(len);
2498 newmsg->sadb_msg_reserved = 0;
2499 newmsg->sadb_msg_seq = iph2->seq;
2500 newmsg->sadb_msg_pid = (u_int32_t)getpid();
2503 len = pfkey_send(lcconf->sock_pfkey, newmsg, len);
2505 racoon_free(newmsg);
2511 * check if the algorithm is supported or not.
2516 pk_checkalg(class, calg, keylen)
2517 int class, calg, keylen;
2521 struct sadb_alg alg0;
2523 switch (algclass2doi(class)) {
2524 case IPSECDOI_PROTO_IPSEC_ESP:
2525 sup = SADB_EXT_SUPPORTED_ENCRYPT;
2527 case IPSECDOI_ATTR_AUTH:
2528 sup = SADB_EXT_SUPPORTED_AUTH;
2530 case IPSECDOI_PROTO_IPCOMP:
2531 plog(LLV_DEBUG, LOCATION, NULL,
2532 "compression algorithm can not be checked "
2533 "because sadb message doesn't support it.\n");
2536 plog(LLV_ERROR, LOCATION, NULL,
2537 "invalid algorithm class.\n");
2540 alg = ipsecdoi2pfkey_alg(algclass2doi(class), algtype2doi(class, calg));
2545 if (ipsec_get_keylen(sup, alg, &alg0)) {
2546 plog(LLV_ERROR, LOCATION, NULL,
2547 "%s.\n", ipsec_strerror());
2550 keylen = alg0.sadb_alg_minbits;
2553 error = ipsec_check_keylen(sup, alg, keylen);
2555 plog(LLV_ERROR, LOCATION, NULL,
2556 "%s.\n", ipsec_strerror());
2562 * differences with pfkey_recv() in libipsec/pfkey.c:
2563 * - never performs busy wait loop.
2564 * - returns NULL and set *lenp to negative on fatal failures
2565 * - returns NULL and set *lenp to non-negative on non-fatal failures
2566 * - returns non-NULL on success
2568 static struct sadb_msg *
2573 struct sadb_msg buf, *newmsg;
2576 *lenp = recv(so, (caddr_t)&buf, sizeof(buf), MSG_PEEK);
2578 return NULL; /*fatal*/
2579 else if (*lenp < sizeof(buf))
2582 reallen = PFKEY_UNUNIT64(buf.sadb_msg_len);
2583 if ((newmsg = racoon_calloc(1, reallen)) == NULL)
2586 *lenp = recv(so, (caddr_t)newmsg, reallen, MSG_PEEK);
2588 racoon_free(newmsg);
2589 return NULL; /*fatal*/
2590 } else if (*lenp != reallen) {
2591 racoon_free(newmsg);
2595 *lenp = recv(so, (caddr_t)newmsg, reallen, 0);
2597 racoon_free(newmsg);
2598 return NULL; /*fatal*/
2599 } else if (*lenp != reallen) {
2600 racoon_free(newmsg);
2611 return eay_random();
2618 struct secpolicy *new;
2619 struct sadb_address *saddr, *daddr;
2620 struct sadb_x_policy *xpl;
2623 if (mhp[SADB_EXT_ADDRESS_SRC] == NULL
2624 || mhp[SADB_EXT_ADDRESS_DST] == NULL
2625 || mhp[SADB_X_EXT_POLICY] == NULL) {
2626 plog(LLV_ERROR, LOCATION, NULL,
2627 "inappropriate sadb spd management message passed.\n");
2631 saddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_SRC];
2632 daddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_DST];
2633 xpl = (struct sadb_x_policy *)mhp[SADB_X_EXT_POLICY];
2636 /* bsd skips over per-socket policies because there will be no
2637 * src and dst extensions in spddump messages. On Linux the only
2638 * way to achieve the same is check for policy id.
2640 if (xpl->sadb_x_policy_id % 8 >= 3) return 0;
2645 plog(LLV_ERROR, LOCATION, NULL,
2646 "failed to allocate buffer\n");
2650 new->spidx.dir = xpl->sadb_x_policy_dir;
2651 new->id = xpl->sadb_x_policy_id;
2652 new->policy = xpl->sadb_x_policy_type;
2656 switch (xpl->sadb_x_policy_type) {
2657 case IPSEC_POLICY_DISCARD:
2658 case IPSEC_POLICY_NONE:
2659 case IPSEC_POLICY_ENTRUST:
2660 case IPSEC_POLICY_BYPASS:
2663 case IPSEC_POLICY_IPSEC:
2666 struct sadb_x_ipsecrequest *xisr;
2667 struct ipsecrequest **p_isr = &new->req;
2669 /* validity check */
2670 if (PFKEY_EXTLEN(xpl) < sizeof(*xpl)) {
2671 plog(LLV_ERROR, LOCATION, NULL,
2672 "invalid msg length.\n");
2676 tlen = PFKEY_EXTLEN(xpl) - sizeof(*xpl);
2677 xisr = (struct sadb_x_ipsecrequest *)(xpl + 1);
2682 if (xisr->sadb_x_ipsecrequest_len < sizeof(*xisr)) {
2683 plog(LLV_ERROR, LOCATION, NULL,
2684 "invalid msg length.\n");
2688 /* allocate request buffer */
2689 *p_isr = newipsecreq();
2690 if (*p_isr == NULL) {
2691 plog(LLV_ERROR, LOCATION, NULL,
2692 "failed to get new ipsecreq.\n");
2697 (*p_isr)->next = NULL;
2699 switch (xisr->sadb_x_ipsecrequest_proto) {
2702 case IPPROTO_IPCOMP:
2705 plog(LLV_ERROR, LOCATION, NULL,
2706 "invalid proto type: %u\n",
2707 xisr->sadb_x_ipsecrequest_proto);
2710 (*p_isr)->saidx.proto = xisr->sadb_x_ipsecrequest_proto;
2712 switch (xisr->sadb_x_ipsecrequest_mode) {
2713 case IPSEC_MODE_TRANSPORT:
2714 case IPSEC_MODE_TUNNEL:
2716 case IPSEC_MODE_ANY:
2718 plog(LLV_ERROR, LOCATION, NULL,
2719 "invalid mode: %u\n",
2720 xisr->sadb_x_ipsecrequest_mode);
2723 (*p_isr)->saidx.mode = xisr->sadb_x_ipsecrequest_mode;
2725 switch (xisr->sadb_x_ipsecrequest_level) {
2726 case IPSEC_LEVEL_DEFAULT:
2727 case IPSEC_LEVEL_USE:
2728 case IPSEC_LEVEL_REQUIRE:
2730 case IPSEC_LEVEL_UNIQUE:
2731 (*p_isr)->saidx.reqid =
2732 xisr->sadb_x_ipsecrequest_reqid;
2736 plog(LLV_ERROR, LOCATION, NULL,
2737 "invalid level: %u\n",
2738 xisr->sadb_x_ipsecrequest_level);
2741 (*p_isr)->level = xisr->sadb_x_ipsecrequest_level;
2743 /* set IP addresses if there */
2744 if (xisr->sadb_x_ipsecrequest_len > sizeof(*xisr)) {
2745 struct sockaddr *paddr;
2747 paddr = (struct sockaddr *)(xisr + 1);
2748 bcopy(paddr, &(*p_isr)->saidx.src,
2749 sysdep_sa_len(paddr));
2751 paddr = (struct sockaddr *)((caddr_t)paddr
2752 + sysdep_sa_len(paddr));
2753 bcopy(paddr, &(*p_isr)->saidx.dst,
2754 sysdep_sa_len(paddr));
2759 /* initialization for the next. */
2760 p_isr = &(*p_isr)->next;
2761 tlen -= xisr->sadb_x_ipsecrequest_len;
2763 /* validity check */
2765 plog(LLV_ERROR, LOCATION, NULL,
2766 "becoming tlen < 0\n");
2769 xisr = (struct sadb_x_ipsecrequest *)((caddr_t)xisr
2770 + xisr->sadb_x_ipsecrequest_len);
2775 plog(LLV_ERROR, LOCATION, NULL,
2776 "invalid policy type.\n");
2780 #ifdef HAVE_PFKEY_POLICY_PRIORITY
2781 KEY_SETSECSPIDX(xpl->sadb_x_policy_dir,
2784 saddr->sadb_address_prefixlen,
2785 daddr->sadb_address_prefixlen,
2786 saddr->sadb_address_proto,
2787 xpl->sadb_x_policy_priority,
2790 KEY_SETSECSPIDX(xpl->sadb_x_policy_dir,
2793 saddr->sadb_address_prefixlen,
2794 daddr->sadb_address_prefixlen,
2795 saddr->sadb_address_proto,
2804 /* proto/mode/src->dst spi */
2806 sadbsecas2str(src, dst, proto, spi, mode)
2807 struct sockaddr *src, *dst;
2812 static char buf[256];
2813 u_int doi_proto, doi_mode = 0;
2817 doi_proto = pfkey2ipsecdoi_proto(proto);
2818 if (doi_proto == ~0)
2821 doi_mode = pfkey2ipsecdoi_mode(mode);
2826 blen = sizeof(buf) - 1;
2829 i = snprintf(p, blen, "%s%s%s ",
2830 s_ipsecdoi_proto(doi_proto),
2832 mode ? s_ipsecdoi_encmode(doi_mode) : "");
2833 if (i < 0 || i >= blen)
2838 i = snprintf(p, blen, "%s->", saddrwop2str(src));
2839 if (i < 0 || i >= blen)
2844 i = snprintf(p, blen, "%s ", saddrwop2str(dst));
2845 if (i < 0 || i >= blen)
2851 snprintf(p, blen, "spi=%lu(0x%lx)", (unsigned long)ntohl(spi),
2852 (unsigned long)ntohl(spi));