1 /* $KAME: pfkey.c,v 1.134 2002/06/04 05:20:27 itojun 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
34 #include <sys/types.h>
35 #include <sys/param.h>
36 #include <sys/socket.h>
37 #include <sys/queue.h>
39 #include <net/route.h>
40 #include <net/pfkeyv2.h>
42 #include <netinet/in.h>
43 #ifdef IPV6_INRIA_VERSION
44 #include <netinet/ipsec.h>
46 #include <netinet6/ipsec.h>
69 #include "localconf.h"
70 #include "remoteconf.h"
71 #include "isakmp_var.h"
73 #include "isakmp_inf.h"
74 #include "isakmp_natd.h"
75 #include "ipsec_doi.h"
80 #include "algorithm.h"
87 #ifndef HAVE_ARC4RANDOM
88 #include "arc4random.h"
92 static u_int ipsecdoi2pfkey_aalg
__P((u_int
));
93 static u_int ipsecdoi2pfkey_ealg
__P((u_int
));
94 static u_int ipsecdoi2pfkey_calg
__P((u_int
));
95 static u_int ipsecdoi2pfkey_alg
__P((u_int
, u_int
));
96 static u_int keylen_aalg
__P((u_int
));
97 static u_int keylen_ealg
__P((u_int
, int));
99 static int pk_recvgetspi
__P((caddr_t
*));
100 static int pk_recvupdate
__P((caddr_t
*));
101 static int pk_recvadd
__P((caddr_t
*));
102 static int pk_recvdelete
__P((caddr_t
*));
103 static int pk_recvacquire
__P((caddr_t
*));
104 static int pk_recvexpire
__P((caddr_t
*));
105 static int pk_recvflush
__P((caddr_t
*));
106 static int getsadbpolicy
__P((caddr_t
*, int *, int, struct ph2handle
*));
107 static int pk_recvspdupdate
__P((caddr_t
*));
108 static int pk_recvspdadd
__P((caddr_t
*));
109 static int pk_recvspddelete
__P((caddr_t
*));
110 static int pk_recvspdexpire
__P((caddr_t
*));
111 static int pk_recvspdget
__P((caddr_t
*));
112 static int pk_recvspddump
__P((caddr_t
*));
113 static int pk_recvspdflush
__P((caddr_t
*));
114 static struct sadb_msg
*pk_recv
__P((int, int *));
116 static int (*pkrecvf
[]) __P((caddr_t
*)) = {
124 NULL
, /* SABD_REGISTER */
127 NULL
, /* SADB_DUMP */
128 NULL
, /* SADB_X_PROMISC */
129 NULL
, /* SADB_X_PCHANGE */
134 NULL
, /* SADB_X_SPDACQUIRE */
137 NULL
, /* SADB_X_SPDSETIDX */
139 NULL
, /* SADB_X_SPDDELETE2 */
142 static int addnewsp
__P((caddr_t
*));
144 /* cope with old kame headers - ugly */
145 #ifndef SADB_X_AALG_MD5
146 #define SADB_X_AALG_MD5 SADB_AALG_MD5
148 #ifndef SADB_X_AALG_SHA
149 #define SADB_X_AALG_SHA SADB_AALG_SHA
151 #ifndef SADB_X_AALG_NULL
152 #define SADB_X_AALG_NULL SADB_AALG_NULL
155 #ifndef SADB_X_EALG_BLOWFISHCBC
156 #define SADB_X_EALG_BLOWFISHCBC SADB_EALG_BLOWFISHCBC
158 #ifndef SADB_X_EALG_CAST128CBC
159 #define SADB_X_EALG_CAST128CBC SADB_EALG_CAST128CBC
161 #ifndef SADB_X_EALG_RC5CBC
162 #ifdef SADB_EALG_RC5CBC
163 #define SADB_X_EALG_RC5CBC SADB_EALG_RC5CBC
168 * PF_KEY packet handler
175 struct sadb_msg
*msg
;
177 caddr_t mhp
[SADB_EXT_MAX
+ 1];
180 /* receive pfkey message. */
182 msg
= (struct sadb_msg
*)pk_recv(lcconf
->sock_pfkey
, &len
);
185 plog(LLV_ERROR
, LOCATION
, NULL
,
186 "failed to recv from pfkey (%s)\n",
190 /* short message - msg not ready */
195 plog(LLV_DEBUG
, LOCATION
, NULL
, "get pfkey %s message\n",
196 s_pfkey_type(msg
->sadb_msg_type
));
197 plogdump(LLV_DEBUG2
, msg
, msg
->sadb_msg_len
<< 3);
200 if (msg
->sadb_msg_errno
) {
203 /* when SPD is empty, treat the state as no error. */
204 if (msg
->sadb_msg_type
== SADB_X_SPDDUMP
&&
205 msg
->sadb_msg_errno
== ENOENT
)
210 plog(pri
, LOCATION
, NULL
,
211 "pfkey %s failed: %s\n",
212 s_pfkey_type(msg
->sadb_msg_type
),
213 strerror(msg
->sadb_msg_errno
));
218 /* check pfkey message. */
219 if (pfkey_align(msg
, mhp
)) {
220 plog(LLV_ERROR
, LOCATION
, NULL
,
221 "libipsec failed pfkey align (%s)\n",
225 if (pfkey_check(mhp
)) {
226 plog(LLV_ERROR
, LOCATION
, NULL
,
227 "libipsec failed pfkey check (%s)\n",
231 msg
= (struct sadb_msg
*)mhp
[0];
233 if (pkrecvf
[msg
->sadb_msg_type
] == NULL
) {
234 plog(LLV_DEBUG
, LOCATION
, NULL
,
235 "not supported command %s\n",
236 s_pfkey_type(msg
->sadb_msg_type
));
240 if ((pkrecvf
[msg
->sadb_msg_type
])(mhp
) < 0)
254 pfkey_dump_sadb(satype
)
259 pid_t pid
= getpid();
260 struct sadb_msg
*msg
= NULL
;
264 if ((s
= pfkey_open()) < 0) {
265 plog(LLV_ERROR
, LOCATION
, NULL
,
266 "libipsec failed pfkey open: %s\n",
271 plog(LLV_DEBUG
, LOCATION
, NULL
, "call pfkey_send_dump\n");
272 if (pfkey_send_dump(s
, satype
) < 0) {
273 plog(LLV_ERROR
, LOCATION
, NULL
,
274 "libipsec failed dump: %s\n", ipsec_strerror());
281 msg
= pk_recv(s
, &len
);
289 if (msg
->sadb_msg_type
!= SADB_DUMP
|| msg
->sadb_msg_pid
!= pid
)
292 ml
= msg
->sadb_msg_len
<< 3;
293 bl
= buf
? buf
->l
: 0;
294 buf
= vrealloc(buf
, bl
+ ml
);
296 plog(LLV_ERROR
, LOCATION
, NULL
,
297 "failed to reallocate buffer to dump.\n");
300 memcpy(buf
->v
+ bl
, msg
, ml
);
302 if (msg
->sadb_msg_seq
== 0)
323 pfkey_flush_sadb(proto
)
328 /* convert to SADB_SATYPE */
329 if ((satype
= admin2pfkey_proto(proto
)) < 0)
332 plog(LLV_DEBUG
, LOCATION
, NULL
, "call pfkey_send_flush\n");
333 if (pfkey_send_flush(lcconf
->sock_pfkey
, satype
) < 0) {
334 plog(LLV_ERROR
, LOCATION
, NULL
,
335 "libipsec failed send flush (%s)\n", ipsec_strerror());
343 * These are the SATYPEs that we manage. We register to get
344 * PF_KEY messages related to these SATYPEs, and we also use
345 * this list to determine which SATYPEs to delete SAs for when
346 * we receive an INITIAL-CONTACT.
348 const struct pfkey_satype pfkey_satypes
[] = {
349 { SADB_SATYPE_AH
, "AH" },
350 { SADB_SATYPE_ESP
, "ESP" },
351 { SADB_X_SATYPE_IPCOMP
, "IPCOMP" },
353 const int pfkey_nsatypes
=
354 sizeof(pfkey_satypes
) / sizeof(pfkey_satypes
[0]);
357 * PF_KEY initialization
364 if ((lcconf
->sock_pfkey
= pfkey_open()) < 0) {
365 plog(LLV_ERROR
, LOCATION
, NULL
,
366 "libipsec failed pfkey open (%s)", ipsec_strerror());
370 for (i
= 0, reg_fail
= 0; i
< pfkey_nsatypes
; i
++) {
371 plog(LLV_DEBUG
, LOCATION
, NULL
,
372 "call pfkey_send_register for %s\n",
373 pfkey_satypes
[i
].ps_name
);
374 if (pfkey_send_register(lcconf
->sock_pfkey
,
375 pfkey_satypes
[i
].ps_satype
) < 0 ||
376 pfkey_recv_register(lcconf
->sock_pfkey
) < 0) {
377 plog(LLV_WARNING
, LOCATION
, NULL
,
378 "failed to register %s (%s)",
379 pfkey_satypes
[i
].ps_name
,
385 if (reg_fail
== pfkey_nsatypes
) {
386 plog(LLV_ERROR
, LOCATION
, NULL
,
387 "failed to regist any protocol.");
388 pfkey_close(lcconf
->sock_pfkey
);
394 if (pfkey_send_spddump(lcconf
->sock_pfkey
) < 0) {
395 plog(LLV_ERROR
, LOCATION
, NULL
,
396 "libipsec sending spddump failed: %s",
398 pfkey_close(lcconf
->sock_pfkey
);
402 if (pfkey_promisc_toggle(1) < 0) {
403 pfkey_close(lcconf
->sock_pfkey
);
410 /* %%% for conversion */
411 /* IPSECDOI_ATTR_AUTH -> SADB_AALG */
413 ipsecdoi2pfkey_aalg(hashtype
)
417 case IPSECDOI_ATTR_AUTH_HMAC_MD5
:
418 return SADB_AALG_MD5HMAC
;
419 case IPSECDOI_ATTR_AUTH_HMAC_SHA1
:
420 return SADB_AALG_SHA1HMAC
;
421 case IPSECDOI_ATTR_AUTH_KPDK
: /* need special care */
422 return SADB_AALG_NONE
;
425 case IPSECDOI_ATTR_AUTH_DES_MAC
:
426 plog(LLV_ERROR
, LOCATION
, NULL
,
427 "Not supported hash type: %u\n", hashtype
);
430 case 0: /* reserved */
432 return SADB_AALG_NONE
;
434 plog(LLV_ERROR
, LOCATION
, NULL
,
435 "Invalid hash type: %u\n", hashtype
);
441 /* IPSECDOI_ESP -> SADB_EALG */
443 ipsecdoi2pfkey_ealg(t_id
)
447 case IPSECDOI_ESP_DES_IV64
: /* sa_flags |= SADB_X_EXT_OLD */
448 return SADB_EALG_DESCBC
;
449 case IPSECDOI_ESP_DES
:
450 return SADB_EALG_DESCBC
;
451 case IPSECDOI_ESP_3DES
:
452 return SADB_EALG_3DESCBC
;
453 #ifdef SADB_X_EALG_RC5CBC
454 case IPSECDOI_ESP_RC5
:
455 return SADB_X_EALG_RC5CBC
;
457 case IPSECDOI_ESP_CAST
:
458 return SADB_X_EALG_CAST128CBC
;
459 case IPSECDOI_ESP_BLOWFISH
:
460 return SADB_X_EALG_BLOWFISHCBC
;
461 case IPSECDOI_ESP_DES_IV32
: /* flags |= (SADB_X_EXT_OLD|
463 return SADB_EALG_DESCBC
;
464 case IPSECDOI_ESP_NULL
:
465 return SADB_EALG_NULL
;
466 #ifdef SADB_X_EALG_RIJNDAELCBC
467 case IPSECDOI_ESP_RIJNDAEL
:
468 return SADB_X_EALG_RIJNDAELCBC
;
470 #ifdef SADB_X_EALG_TWOFISHCBC
471 case IPSECDOI_ESP_TWOFISH
:
472 return SADB_X_EALG_TWOFISHCBC
;
476 case IPSECDOI_ESP_3IDEA
:
477 case IPSECDOI_ESP_IDEA
:
478 case IPSECDOI_ESP_RC4
:
479 plog(LLV_ERROR
, LOCATION
, NULL
,
480 "Not supported transform: %u\n", t_id
);
483 case 0: /* reserved */
485 plog(LLV_ERROR
, LOCATION
, NULL
,
486 "Invalid transform id: %u\n", t_id
);
492 /* IPCOMP -> SADB_CALG */
494 ipsecdoi2pfkey_calg(t_id
)
498 case IPSECDOI_IPCOMP_OUI
:
499 return SADB_X_CALG_OUI
;
500 case IPSECDOI_IPCOMP_DEFLATE
:
501 return SADB_X_CALG_DEFLATE
;
502 case IPSECDOI_IPCOMP_LZS
:
503 return SADB_X_CALG_LZS
;
505 case 0: /* reserved */
507 plog(LLV_ERROR
, LOCATION
, NULL
,
508 "Invalid transform id: %u\n", t_id
);
514 /* IPSECDOI_PROTO -> SADB_SATYPE */
516 ipsecdoi2pfkey_proto(proto
)
520 case IPSECDOI_PROTO_IPSEC_AH
:
521 return SADB_SATYPE_AH
;
522 case IPSECDOI_PROTO_IPSEC_ESP
:
523 return SADB_SATYPE_ESP
;
524 case IPSECDOI_PROTO_IPCOMP
:
525 return SADB_X_SATYPE_IPCOMP
;
528 plog(LLV_ERROR
, LOCATION
, NULL
,
529 "Invalid ipsec_doi proto: %u\n", proto
);
536 ipsecdoi2pfkey_alg(algclass
, type
)
537 u_int algclass
, type
;
540 case IPSECDOI_ATTR_AUTH
:
541 return ipsecdoi2pfkey_aalg(type
);
542 case IPSECDOI_PROTO_IPSEC_ESP
:
543 return ipsecdoi2pfkey_ealg(type
);
544 case IPSECDOI_PROTO_IPCOMP
:
545 return ipsecdoi2pfkey_calg(type
);
547 plog(LLV_ERROR
, LOCATION
, NULL
,
548 "Invalid ipsec_doi algclass: %u\n", algclass
);
554 /* SADB_SATYPE -> IPSECDOI_PROTO */
556 pfkey2ipsecdoi_proto(satype
)
561 return IPSECDOI_PROTO_IPSEC_AH
;
562 case SADB_SATYPE_ESP
:
563 return IPSECDOI_PROTO_IPSEC_ESP
;
564 case SADB_X_SATYPE_IPCOMP
:
565 return IPSECDOI_PROTO_IPCOMP
;
568 plog(LLV_ERROR
, LOCATION
, NULL
,
569 "Invalid pfkey proto: %u\n", satype
);
575 /* IPSECDOI_ATTR_ENC_MODE -> IPSEC_MODE */
577 ipsecdoi2pfkey_mode(mode
)
581 case IPSECDOI_ATTR_ENC_MODE_TUNNEL
:
582 case IPSECDOI_ATTR_ENC_MODE_UDPTUNNEL_RFC
:
583 case IPSECDOI_ATTR_ENC_MODE_UDPTUNNEL_DRAFT
:
584 return IPSEC_MODE_TUNNEL
;
585 case IPSECDOI_ATTR_ENC_MODE_TRNS
:
586 case IPSECDOI_ATTR_ENC_MODE_UDPTRNS_RFC
:
587 case IPSECDOI_ATTR_ENC_MODE_UDPTRNS_DRAFT
:
588 return IPSEC_MODE_TRANSPORT
;
590 plog(LLV_ERROR
, LOCATION
, NULL
, "Invalid mode type: %u\n", mode
);
596 /* IPSECDOI_ATTR_ENC_MODE -> IPSEC_MODE */
598 pfkey2ipsecdoi_mode(mode
, nattype
)
603 case IPSEC_MODE_TUNNEL
:
605 return IPSECDOI_ATTR_ENC_MODE_TUNNEL
;
606 else if (nattype
== natt_type_rfc
|| nattype
== natt_type_apple
)
607 return IPSECDOI_ATTR_ENC_MODE_UDPTUNNEL_RFC
;
609 return IPSECDOI_ATTR_ENC_MODE_UDPTUNNEL_DRAFT
;
610 case IPSEC_MODE_TRANSPORT
:
612 return IPSECDOI_ATTR_ENC_MODE_TRNS
;
613 else if (nattype
== natt_type_rfc
|| nattype
== natt_type_apple
)
614 return IPSECDOI_ATTR_ENC_MODE_UDPTRNS_RFC
;
616 return IPSECDOI_ATTR_ENC_MODE_UDPTRNS_DRAFT
;
618 return IPSECDOI_ATTR_ENC_MODE_ANY
;
620 plog(LLV_ERROR
, LOCATION
, NULL
, "Invalid mode type: %u\n", mode
);
626 /* default key length for encryption algorithm */
628 keylen_aalg(hashtype
)
634 return SADB_AALG_NONE
;
636 res
= alg_ipsec_hmacdef_hashlen(hashtype
);
638 plog(LLV_ERROR
, LOCATION
, NULL
,
639 "invalid hmac algorithm %u.\n", hashtype
);
645 /* default key length for encryption algorithm */
647 keylen_ealg(enctype
, encklen
)
653 res
= alg_ipsec_encdef_keylen(enctype
, encklen
);
655 plog(LLV_ERROR
, LOCATION
, NULL
,
656 "invalid encryption algorithm %u.\n", enctype
);
663 pfkey_convertfromipsecdoi(proto_id
, t_id
, hashtype
,
664 e_type
, e_keylen
, a_type
, a_keylen
, flags
)
676 case IPSECDOI_PROTO_IPSEC_ESP
:
677 if ((*e_type
= ipsecdoi2pfkey_ealg(t_id
)) == ~0)
679 if ((*e_keylen
= keylen_ealg(t_id
, *e_keylen
)) == ~0)
683 if ((*a_type
= ipsecdoi2pfkey_aalg(hashtype
)) == ~0)
685 if ((*a_keylen
= keylen_aalg(hashtype
)) == ~0)
689 if (*e_type
== SADB_EALG_NONE
) {
690 plog(LLV_ERROR
, LOCATION
, NULL
, "no ESP algorithm.\n");
695 case IPSECDOI_PROTO_IPSEC_AH
:
696 if ((*a_type
= ipsecdoi2pfkey_aalg(hashtype
)) == ~0)
698 if ((*a_keylen
= keylen_aalg(hashtype
)) == ~0)
702 if (t_id
== IPSECDOI_ATTR_AUTH_HMAC_MD5
703 && hashtype
== IPSECDOI_ATTR_AUTH_KPDK
) {
704 /* AH_MD5 + Auth(KPDK) = RFC1826 keyed-MD5 */
705 *a_type
= SADB_X_AALG_MD5
;
706 *flags
|= SADB_X_EXT_OLD
;
708 *e_type
= SADB_EALG_NONE
;
710 if (*a_type
== SADB_AALG_NONE
) {
711 plog(LLV_ERROR
, LOCATION
, NULL
, "no AH algorithm.\n");
716 case IPSECDOI_PROTO_IPCOMP
:
717 if ((*e_type
= ipsecdoi2pfkey_calg(t_id
)) == ~0)
721 *flags
= SADB_X_EXT_RAWCPI
;
723 *a_type
= SADB_AALG_NONE
;
725 if (*e_type
== SADB_X_CALG_NONE
) {
726 plog(LLV_ERROR
, LOCATION
, NULL
, "no IPCOMP algorithm.\n");
732 plog(LLV_ERROR
, LOCATION
, NULL
, "unknown IPsec protocol.\n");
743 /* called from scheduler */
745 pfkey_timeover_stub(p
)
749 pfkey_timeover((struct ph2handle
*)p
);
754 struct ph2handle
*iph2
;
756 plog(LLV_ERROR
, LOCATION
, NULL
,
757 "%s give up to get IPsec-SA due to time up to wait.\n",
758 saddrwop2str(iph2
->dst
));
759 SCHED_KILL(iph2
->sce
);
761 /* If initiator side, send error to kernel by SADB_ACQUIRE. */
762 if (iph2
->side
== INITIATOR
)
763 pk_sendeacquire(iph2
);
773 /* send getspi message per ipsec protocol per remote address */
775 * the local address and remote address in ph1handle are dealed
776 * with destination address and source address respectively.
777 * Because SPI is decided by responder.
781 struct ph2handle
*iph2
;
787 pp
= iph2
->side
== INITIATOR
791 for (pr
= pp
->head
; pr
!= NULL
; pr
= pr
->next
) {
794 satype
= ipsecdoi2pfkey_proto(pr
->proto_id
);
796 plog(LLV_ERROR
, LOCATION
, NULL
,
797 "invalid proto_id %d\n", pr
->proto_id
);
800 mode
= ipsecdoi2pfkey_mode(pr
->encmode
);
802 plog(LLV_ERROR
, LOCATION
, NULL
,
803 "invalid encmode %d\n", pr
->encmode
);
807 plog(LLV_DEBUG
, LOCATION
, NULL
, "call pfkey_send_getspi\n");
808 if (pfkey_send_getspi(
812 iph2
->dst
, /* src of SA */
813 iph2
->src
, /* dst of SA */
814 0, 0, pr
->reqid_in
, iph2
->seq
) < 0) {
815 plog(LLV_ERROR
, LOCATION
, NULL
,
816 "ipseclib failed send getspi (%s)\n",
820 plog(LLV_DEBUG
, LOCATION
, NULL
,
821 "pfkey GETSPI sent: %s\n",
822 sadbsecas2str(iph2
->dst
, iph2
->src
, satype
, 0, mode
));
829 * receive GETSPI from kernel.
835 struct sadb_msg
*msg
;
837 struct ph2handle
*iph2
;
838 struct sockaddr
*dst
;
840 int allspiok
, notfound
;
845 if (mhp
[SADB_EXT_SA
] == NULL
846 || mhp
[SADB_EXT_ADDRESS_DST
] == NULL
) {
847 plog(LLV_ERROR
, LOCATION
, NULL
,
848 "inappropriate sadb getspi message passed.\n");
851 msg
= (struct sadb_msg
*)mhp
[0];
852 sa
= (struct sadb_sa
*)mhp
[SADB_EXT_SA
];
853 dst
= PFKEY_ADDR_SADDR(mhp
[SADB_EXT_ADDRESS_SRC
]); /* note SA dir */
855 /* the message has to be processed or not ? */
856 if (msg
->sadb_msg_pid
!= getpid()) {
857 plog(LLV_DEBUG
, LOCATION
, NULL
,
858 "%s message is not interesting "
859 "because pid %d is not mine.\n",
860 s_pfkey_type(msg
->sadb_msg_type
),
865 iph2
= getph2byseq(msg
->sadb_msg_seq
);
867 plog(LLV_DEBUG
, LOCATION
, NULL
,
868 "seq %d of %s message not interesting.\n",
870 s_pfkey_type(msg
->sadb_msg_type
));
874 if (iph2
->status
!= PHASE2ST_GETSPISENT
) {
875 plog(LLV_ERROR
, LOCATION
, NULL
,
876 "status mismatch (db:%d msg:%d)\n",
877 iph2
->status
, PHASE2ST_GETSPISENT
);
881 /* set SPI, and check to get all spi whether or not */
884 proto_id
= pfkey2ipsecdoi_proto(msg
->sadb_msg_satype
);
885 pp
= iph2
->side
== INITIATOR
? iph2
->proposal
: iph2
->approval
;
887 for (pr
= pp
->head
; pr
!= NULL
; pr
= pr
->next
) {
888 if (pr
->proto_id
== proto_id
&& pr
->spi
== 0) {
889 pr
->spi
= sa
->sadb_sa_spi
;
891 plog(LLV_DEBUG
, LOCATION
, NULL
,
892 "pfkey GETSPI succeeded: %s\n",
893 sadbsecas2str(iph2
->dst
, iph2
->src
,
894 msg
->sadb_msg_satype
,
896 ipsecdoi2pfkey_mode(pr
->encmode
)));
899 allspiok
= 0; /* not get all spi */
903 plog(LLV_ERROR
, LOCATION
, NULL
,
904 "get spi for unknown address %s\n",
905 saddrwop2str(iph2
->dst
));
911 iph2
->status
= PHASE2ST_GETSPIDONE
;
912 if (isakmp_post_getspi(iph2
) < 0) {
913 plog(LLV_ERROR
, LOCATION
, NULL
,
914 "failed to start post getspi.\n");
931 struct ph2handle
*iph2
;
934 struct sockaddr
*src
= NULL
, *dst
= NULL
;
935 int e_type
, e_keylen
, a_type
, a_keylen
, flags
;
937 u_int64_t lifebyte
= 0;
941 if (iph2
->approval
== NULL
) {
942 plog(LLV_ERROR
, LOCATION
, NULL
,
943 "no approvaled SAs found.\n");
946 /* for mobile IPv6 */
947 if (iph2
->ph1
->rmconf
->support_mip6
&& iph2
->src_id
&& iph2
->dst_id
) {
955 for (pr
= iph2
->approval
->head
; pr
!= NULL
; pr
= pr
->next
) {
957 satype
= ipsecdoi2pfkey_proto(pr
->proto_id
);
959 plog(LLV_ERROR
, LOCATION
, NULL
,
960 "invalid proto_id %d\n", pr
->proto_id
);
963 #ifdef ENABLE_SAMODE_UNSPECIFIED
964 mode
= IPSEC_MODE_ANY
;
966 mode
= ipsecdoi2pfkey_mode(pr
->encmode
);
968 plog(LLV_ERROR
, LOCATION
, NULL
,
969 "invalid encmode %d\n", pr
->encmode
);
974 /* set algorithm type and key length */
975 e_keylen
= pr
->head
->encklen
;
976 if (pfkey_convertfromipsecdoi(
981 &a_type
, &a_keylen
, &flags
) < 0)
985 if ((pr
->encmode
== IPSECDOI_ATTR_ENC_MODE_UDPTUNNEL_RFC
||
986 pr
->encmode
== IPSECDOI_ATTR_ENC_MODE_UDPTRNS_RFC
||
987 pr
->encmode
== IPSECDOI_ATTR_ENC_MODE_UDPTUNNEL_DRAFT
||
988 pr
->encmode
== IPSECDOI_ATTR_ENC_MODE_UDPTRNS_DRAFT
) &&
989 iph2
->ph1
->remote
->sa_family
== AF_INET
)
991 flags
|= SADB_X_EXT_NATT
;
992 port
= ntohs(((struct sockaddr_in
*)iph2
->ph1
->remote
)->sin_port
);
997 lifebyte
= iph2
->approval
->lifebyte
* 1024,
1002 plog(LLV_DEBUG
, LOCATION
, NULL
, "call pfkey_send_update\n");
1004 if (pfkey_send_update(
1012 4, /* XXX static size of window */
1014 e_type
, e_keylen
, a_type
, a_keylen
, flags
,
1015 0, lifebyte
, iph2
->approval
->lifetime
, 0,
1016 iph2
->seq
, port
) < 0) {
1017 plog(LLV_ERROR
, LOCATION
, NULL
,
1018 "libipsec failed send update (%s)\n",
1023 if (!lcconf
->pathinfo
[LC_PATHTYPE_BACKUPSA
])
1027 * It maybe good idea to call backupsa_to_file() after
1028 * racoon will receive the sadb_update messages.
1029 * But it is impossible because there is not key in the
1030 * information from the kernel.
1032 if (backupsa_to_file(satype
, mode
, iph2
->dst
, iph2
->src
,
1033 pr
->spi
, pr
->reqid_in
, 4,
1035 e_type
, e_keylen
, a_type
, a_keylen
, flags
,
1036 0, iph2
->approval
->lifebyte
* 1024,
1037 iph2
->approval
->lifetime
, 0,
1039 plog(LLV_ERROR
, LOCATION
, NULL
,
1040 "backuped SA failed: %s\n",
1041 sadbsecas2str(iph2
->dst
, iph2
->src
,
1042 satype
, pr
->spi
, mode
));
1044 plog(LLV_DEBUG
, LOCATION
, NULL
,
1045 "backuped SA: %s\n",
1046 sadbsecas2str(iph2
->dst
, iph2
->src
,
1047 satype
, pr
->spi
, mode
));
1057 struct sadb_msg
*msg
;
1059 struct sockaddr
*src
, *dst
;
1060 struct ph2handle
*iph2
;
1061 u_int proto_id
, encmode
, sa_mode
;
1065 /* ignore this message because of local test mode. */
1071 || mhp
[SADB_EXT_SA
] == NULL
1072 || mhp
[SADB_EXT_ADDRESS_SRC
] == NULL
1073 || mhp
[SADB_EXT_ADDRESS_DST
] == NULL
) {
1074 plog(LLV_ERROR
, LOCATION
, NULL
,
1075 "inappropriate sadb update message passed.\n");
1078 msg
= (struct sadb_msg
*)mhp
[0];
1079 src
= PFKEY_ADDR_SADDR(mhp
[SADB_EXT_ADDRESS_SRC
]);
1080 dst
= PFKEY_ADDR_SADDR(mhp
[SADB_EXT_ADDRESS_DST
]);
1081 sa
= (struct sadb_sa
*)mhp
[SADB_EXT_SA
];
1083 sa_mode
= mhp
[SADB_X_EXT_SA2
] == NULL
1085 : ((struct sadb_x_sa2
*)mhp
[SADB_X_EXT_SA2
])->sadb_x_sa2_mode
;
1087 /* the message has to be processed or not ? */
1088 if (msg
->sadb_msg_pid
!= getpid()) {
1089 plog(LLV_DEBUG
, LOCATION
, NULL
,
1090 "%s message is not interesting "
1091 "because pid %d is not mine.\n",
1092 s_pfkey_type(msg
->sadb_msg_type
),
1097 iph2
= getph2byseq(msg
->sadb_msg_seq
);
1099 plog(LLV_DEBUG
, LOCATION
, NULL
,
1100 "seq %d of %s message not interesting.\n",
1102 s_pfkey_type(msg
->sadb_msg_type
));
1106 if (iph2
->status
!= PHASE2ST_ADDSA
) {
1107 plog(LLV_ERROR
, LOCATION
, NULL
,
1108 "status mismatch (db:%d msg:%d)\n",
1109 iph2
->status
, PHASE2ST_ADDSA
);
1113 /* check to complete all keys ? */
1114 for (pr
= iph2
->approval
->head
; pr
!= NULL
; pr
= pr
->next
) {
1115 proto_id
= pfkey2ipsecdoi_proto(msg
->sadb_msg_satype
);
1116 if (proto_id
== ~0) {
1117 plog(LLV_ERROR
, LOCATION
, NULL
,
1118 "invalid proto_id %d\n", msg
->sadb_msg_satype
);
1121 encmode
= pfkey2ipsecdoi_mode(sa_mode
, iph2
->ph1
? natd_hasnat(iph2
->ph1
) : 0);
1122 if (encmode
== ~0) {
1123 plog(LLV_ERROR
, LOCATION
, NULL
,
1124 "invalid encmode %d\n", sa_mode
);
1128 if (pr
->proto_id
== proto_id
1129 && pr
->spi
== sa
->sadb_sa_spi
) {
1131 plog(LLV_DEBUG
, LOCATION
, NULL
,
1132 "pfkey UPDATE succeeded: %s\n",
1133 sadbsecas2str(iph2
->dst
, iph2
->src
,
1134 msg
->sadb_msg_satype
,
1138 plog(LLV_INFO
, LOCATION
, NULL
,
1139 "IPsec-SA established: %s\n",
1140 sadbsecas2str(iph2
->dst
, iph2
->src
,
1141 msg
->sadb_msg_satype
, sa
->sadb_sa_spi
,
1152 /* turn off the timer for calling pfkey_timeover() */
1153 SCHED_KILL(iph2
->sce
);
1156 iph2
->status
= PHASE2ST_ESTABLISHED
;
1159 gettimeofday(&iph2
->end
, NULL
);
1160 syslog(LOG_NOTICE
, "%s(%s): %8.6f",
1161 "phase2", "quick", timedelta(&iph2
->start
, &iph2
->end
));
1165 iph2
->ph1
->ph2cnt
++;
1168 * since we are going to reuse the phase2 handler, we need to
1169 * remain it and refresh all the references between ph1 and ph2 to use.
1173 iph2
->sce
= sched_new(iph2
->approval
->lifetime
,
1174 isakmp_ph2expire_stub
, iph2
);
1176 plog(LLV_DEBUG
, LOCATION
, NULL
, "===\n");
1185 struct ph2handle
*iph2
;
1188 struct sockaddr
*src
= NULL
, *dst
= NULL
;
1189 int e_type
, e_keylen
, a_type
, a_keylen
, flags
;
1191 u_int64_t lifebyte
= 0;
1195 if (iph2
->approval
== NULL
) {
1196 plog(LLV_ERROR
, LOCATION
, NULL
,
1197 "no approvaled SAs found.\n");
1200 /* for mobile IPv6 */
1201 if (iph2
->ph1
->rmconf
->support_mip6
&& iph2
->src_id
&& iph2
->dst_id
) {
1209 for (pr
= iph2
->approval
->head
; pr
!= NULL
; pr
= pr
->next
) {
1210 /* validity check */
1211 satype
= ipsecdoi2pfkey_proto(pr
->proto_id
);
1213 plog(LLV_ERROR
, LOCATION
, NULL
,
1214 "invalid proto_id %d\n", pr
->proto_id
);
1217 #ifdef ENABLE_SAMODE_UNSPECIFIED
1218 mode
= IPSEC_MODE_ANY
;
1220 mode
= ipsecdoi2pfkey_mode(pr
->encmode
);
1222 plog(LLV_ERROR
, LOCATION
, NULL
,
1223 "invalid encmode %d\n", pr
->encmode
);
1228 /* set algorithm type and key length */
1229 e_keylen
= pr
->head
->encklen
;
1230 if (pfkey_convertfromipsecdoi(
1235 &a_type
, &a_keylen
, &flags
) < 0)
1239 if ((pr
->encmode
== IPSECDOI_ATTR_ENC_MODE_UDPTUNNEL_RFC
||
1240 pr
->encmode
== IPSECDOI_ATTR_ENC_MODE_UDPTRNS_RFC
||
1241 pr
->encmode
== IPSECDOI_ATTR_ENC_MODE_UDPTUNNEL_DRAFT
||
1242 pr
->encmode
== IPSECDOI_ATTR_ENC_MODE_UDPTRNS_DRAFT
) &&
1243 iph2
->ph1
->remote
->sa_family
== AF_INET
)
1245 flags
|= SADB_X_EXT_NATT
;
1246 port
= ntohs(((struct sockaddr_in
*)iph2
->ph1
->remote
)->sin_port
);
1248 /* If we're the side behind the NAT, send keepalives */
1249 if ((iph2
->ph1
->natt_flags
& natt_no_local_nat
) == 0)
1250 flags
|= SADB_X_EXT_NATT_KEEPALIVE
;
1255 lifebyte
= iph2
->approval
->lifebyte
* 1024,
1260 plog(LLV_DEBUG
, LOCATION
, NULL
, "call pfkey_send_add\n");
1270 4, /* XXX static size of window */
1272 e_type
, e_keylen
, a_type
, a_keylen
, flags
,
1273 0, lifebyte
, iph2
->approval
->lifetime
, 0,
1274 iph2
->seq
, port
) < 0) {
1275 plog(LLV_ERROR
, LOCATION
, NULL
,
1276 "libipsec failed send add (%s)\n",
1281 if (!lcconf
->pathinfo
[LC_PATHTYPE_BACKUPSA
])
1285 * It maybe good idea to call backupsa_to_file() after
1286 * racoon will receive the sadb_update messages.
1287 * But it is impossible because there is not key in the
1288 * information from the kernel.
1290 if (backupsa_to_file(satype
, mode
, iph2
->src
, iph2
->dst
,
1291 pr
->spi_p
, pr
->reqid_out
, 4,
1293 e_type
, e_keylen
, a_type
, a_keylen
, flags
,
1294 0, iph2
->approval
->lifebyte
* 1024,
1295 iph2
->approval
->lifetime
, 0,
1297 plog(LLV_ERROR
, LOCATION
, NULL
,
1298 "backuped SA failed: %s\n",
1299 sadbsecas2str(iph2
->src
, iph2
->dst
,
1300 satype
, pr
->spi_p
, mode
));
1302 plog(LLV_DEBUG
, LOCATION
, NULL
,
1303 "backuped SA: %s\n",
1304 sadbsecas2str(iph2
->src
, iph2
->dst
,
1305 satype
, pr
->spi_p
, mode
));
1315 struct sadb_msg
*msg
;
1317 struct sockaddr
*src
, *dst
;
1318 struct ph2handle
*iph2
;
1321 /* ignore this message because of local test mode. */
1327 || mhp
[SADB_EXT_SA
] == NULL
1328 || mhp
[SADB_EXT_ADDRESS_SRC
] == NULL
1329 || mhp
[SADB_EXT_ADDRESS_DST
] == NULL
) {
1330 plog(LLV_ERROR
, LOCATION
, NULL
,
1331 "inappropriate sadb add message passed.\n");
1334 msg
= (struct sadb_msg
*)mhp
[0];
1335 src
= PFKEY_ADDR_SADDR(mhp
[SADB_EXT_ADDRESS_SRC
]);
1336 dst
= PFKEY_ADDR_SADDR(mhp
[SADB_EXT_ADDRESS_DST
]);
1337 sa
= (struct sadb_sa
*)mhp
[SADB_EXT_SA
];
1339 sa_mode
= mhp
[SADB_X_EXT_SA2
] == NULL
1341 : ((struct sadb_x_sa2
*)mhp
[SADB_X_EXT_SA2
])->sadb_x_sa2_mode
;
1343 /* the message has to be processed or not ? */
1344 if (msg
->sadb_msg_pid
!= getpid()) {
1345 plog(LLV_DEBUG
, LOCATION
, NULL
,
1346 "%s message is not interesting "
1347 "because pid %d is not mine.\n",
1348 s_pfkey_type(msg
->sadb_msg_type
),
1353 iph2
= getph2byseq(msg
->sadb_msg_seq
);
1355 plog(LLV_DEBUG
, LOCATION
, NULL
,
1356 "seq %d of %s message not interesting.\n",
1358 s_pfkey_type(msg
->sadb_msg_type
));
1363 * NOTE don't update any status of phase2 handle
1364 * because they must be updated by SADB_UPDATE message
1367 plog(LLV_INFO
, LOCATION
, NULL
,
1368 "IPsec-SA established: %s\n",
1369 sadbsecas2str(iph2
->src
, iph2
->dst
,
1370 msg
->sadb_msg_satype
, sa
->sadb_sa_spi
, sa_mode
));
1372 plog(LLV_DEBUG
, LOCATION
, NULL
, "===\n");
1380 struct sadb_msg
*msg
;
1382 struct sockaddr
*src
, *dst
;
1383 struct ph2handle
*iph2
;
1384 u_int proto_id
, sa_mode
;
1388 || mhp
[SADB_EXT_SA
] == NULL
1389 || mhp
[SADB_EXT_ADDRESS_SRC
] == NULL
1390 || mhp
[SADB_EXT_ADDRESS_DST
] == NULL
1391 || (mhp
[SADB_EXT_LIFETIME_HARD
] != NULL
1392 && mhp
[SADB_EXT_LIFETIME_SOFT
] != NULL
)) {
1393 plog(LLV_ERROR
, LOCATION
, NULL
,
1394 "inappropriate sadb expire message passed.\n");
1397 msg
= (struct sadb_msg
*)mhp
[0];
1398 sa
= (struct sadb_sa
*)mhp
[SADB_EXT_SA
];
1399 src
= PFKEY_ADDR_SADDR(mhp
[SADB_EXT_ADDRESS_SRC
]);
1400 dst
= PFKEY_ADDR_SADDR(mhp
[SADB_EXT_ADDRESS_DST
]);
1402 sa_mode
= mhp
[SADB_X_EXT_SA2
] == NULL
1404 : ((struct sadb_x_sa2
*)mhp
[SADB_X_EXT_SA2
])->sadb_x_sa2_mode
;
1406 proto_id
= pfkey2ipsecdoi_proto(msg
->sadb_msg_satype
);
1407 if (proto_id
== ~0) {
1408 plog(LLV_ERROR
, LOCATION
, NULL
,
1409 "invalid proto_id %d\n", msg
->sadb_msg_satype
);
1413 plog(LLV_INFO
, LOCATION
, NULL
,
1414 "IPsec-SA expired: %s\n",
1415 sadbsecas2str(src
, dst
,
1416 msg
->sadb_msg_satype
, sa
->sadb_sa_spi
, sa_mode
));
1418 iph2
= getph2bysaidx(src
, dst
, proto_id
, sa
->sadb_sa_spi
);
1421 * Ignore it because two expire messages are come up.
1422 * phase2 handler has been deleted already when 2nd message
1425 plog(LLV_DEBUG
, LOCATION
, NULL
,
1426 "no such a SA found: %s\n",
1427 sadbsecas2str(src
, dst
,
1428 msg
->sadb_msg_satype
, sa
->sadb_sa_spi
,
1432 if (iph2
->status
!= PHASE2ST_ESTABLISHED
) {
1434 * If the status is not equal to PHASE2ST_ESTABLISHED,
1435 * racoon ignores this expire message. There are two reason.
1436 * One is that the phase 2 probably starts because there is
1437 * a potential that racoon receives the acquire message
1438 * without receiving a expire message. Another is that racoon
1439 * may receive the multiple expire messages from the kernel.
1441 plog(LLV_WARNING
, LOCATION
, NULL
,
1442 "the expire message is received "
1443 "but the handler has not been established.\n");
1447 /* turn off the timer for calling isakmp_ph2expire() */
1448 SCHED_KILL(iph2
->sce
);
1450 iph2
->status
= PHASE2ST_EXPIRED
;
1452 /* INITIATOR, begin phase 2 exchange. */
1453 /* allocate buffer for status management of pfkey message */
1454 if (iph2
->side
== INITIATOR
) {
1458 /* update status for re-use */
1459 iph2
->status
= PHASE2ST_STATUS2
;
1461 /* start isakmp initiation by using ident exchange */
1462 if (isakmp_post_acquire(iph2
) < 0) {
1463 plog(LLV_ERROR
, LOCATION
, iph2
->dst
,
1464 "failed to begin ipsec sa "
1465 "re-negotication.\n");
1476 /* If not received SADB_EXPIRE, INITIATOR delete ph2handle. */
1477 /* RESPONDER always delete ph2handle, keep silent. RESPONDER doesn't
1478 * manage IPsec SA, so delete the list */
1490 struct sadb_msg
*msg
;
1491 struct sadb_x_policy
*xpl
;
1492 struct secpolicy
*sp_out
= NULL
, *sp_in
= NULL
;
1493 #define MAXNESTEDSA 5 /* XXX */
1494 struct ph2handle
*iph2
[MAXNESTEDSA
];
1495 int n
; /* # of phase 2 handler */
1497 /* ignore this message because of local test mode. */
1503 || mhp
[SADB_EXT_ADDRESS_SRC
] == NULL
1504 || mhp
[SADB_EXT_ADDRESS_DST
] == NULL
1505 || mhp
[SADB_X_EXT_POLICY
] == NULL
) {
1506 plog(LLV_ERROR
, LOCATION
, NULL
,
1507 "inappropriate sadb acquire message passed.\n");
1510 msg
= (struct sadb_msg
*)mhp
[0];
1511 xpl
= (struct sadb_x_policy
*)mhp
[SADB_X_EXT_POLICY
];
1513 /* ignore if type is not IPSEC_POLICY_IPSEC */
1514 if (xpl
->sadb_x_policy_type
!= IPSEC_POLICY_IPSEC
) {
1515 plog(LLV_DEBUG
, LOCATION
, NULL
,
1516 "ignore SPDGET message. type is not IPsec.\n");
1520 /* ignore it if src is multicast address */
1522 struct sockaddr
*sa
= PFKEY_ADDR_SADDR(mhp
[SADB_EXT_ADDRESS_DST
]);
1524 if ((sa
->sa_family
== AF_INET
1525 && IN_MULTICAST(ntohl(((struct sockaddr_in
*)sa
)->sin_addr
.s_addr
)))
1527 || (sa
->sa_family
== AF_INET6
1528 && IN6_IS_ADDR_MULTICAST(&((struct sockaddr_in6
*)sa
)->sin6_addr
))
1531 plog(LLV_DEBUG
, LOCATION
, NULL
,
1532 "ignore due to multicast address: %s.\n",
1539 * If there is a phase 2 handler against the policy identifier in
1540 * the acquire message, and if
1541 * 1. its state is less than PHASE2ST_ESTABLISHED, then racoon
1542 * should ignore such a acquire message because the phase 2
1543 * is just negotiating.
1544 * 2. its state is equal to PHASE2ST_ESTABLISHED, then racoon
1545 * has to prcesss such a acquire message because racoon may
1546 * lost the expire message.
1548 iph2
[0] = getph2byspid(xpl
->sadb_x_policy_id
);
1549 if (iph2
[0] != NULL
) {
1550 if (iph2
[0]->status
< PHASE2ST_ESTABLISHED
) {
1551 plog(LLV_DEBUG
, LOCATION
, NULL
,
1552 "ignore the acquire because ph2 found\n");
1555 if (iph2
[0]->status
== PHASE2ST_EXPIRED
)
1560 /* search for proper policyindex */
1561 sp_out
= getspbyspid(xpl
->sadb_x_policy_id
);
1562 if (sp_out
== NULL
) {
1563 plog(LLV_ERROR
, LOCATION
, NULL
, "no policy found: id:%d.\n",
1564 xpl
->sadb_x_policy_id
);
1567 plog(LLV_DEBUG
, LOCATION
, NULL
,
1568 "suitable outbound SP found: %s.\n", spidx2str(&sp_out
->spidx
));
1570 /* get inbound policy */
1572 struct policyindex spidx
;
1574 spidx
.dir
= IPSEC_DIR_INBOUND
;
1575 memcpy(&spidx
.src
, &sp_out
->spidx
.dst
, sizeof(spidx
.src
));
1576 memcpy(&spidx
.dst
, &sp_out
->spidx
.src
, sizeof(spidx
.dst
));
1577 spidx
.prefs
= sp_out
->spidx
.prefd
;
1578 spidx
.prefd
= sp_out
->spidx
.prefs
;
1579 spidx
.ul_proto
= sp_out
->spidx
.ul_proto
;
1581 sp_in
= getsp(&spidx
);
1583 plog(LLV_DEBUG
, LOCATION
, NULL
,
1584 "suitable inbound SP found: %s.\n",
1585 spidx2str(&sp_in
->spidx
));
1587 plog(LLV_NOTIFY
, LOCATION
, NULL
,
1588 "no in-bound policy found: %s\n",
1593 memset(iph2
, 0, MAXNESTEDSA
);
1597 /* allocate a phase 2 */
1599 if (iph2
[n
] == NULL
) {
1600 plog(LLV_ERROR
, LOCATION
, NULL
,
1601 "failed to allocate phase2 entry.\n");
1604 iph2
[n
]->side
= INITIATOR
;
1605 iph2
[n
]->spid
= xpl
->sadb_x_policy_id
;
1606 iph2
[n
]->satype
= msg
->sadb_msg_satype
;
1607 iph2
[n
]->seq
= msg
->sadb_msg_seq
;
1608 iph2
[n
]->status
= PHASE2ST_STATUS2
;
1610 /* set end addresses of SA */
1611 iph2
[n
]->dst
= dupsaddr(PFKEY_ADDR_SADDR(mhp
[SADB_EXT_ADDRESS_DST
]));
1612 if (iph2
[n
]->dst
== NULL
) {
1616 iph2
[n
]->src
= dupsaddr(PFKEY_ADDR_SADDR(mhp
[SADB_EXT_ADDRESS_SRC
]));
1617 if (iph2
[n
]->src
== NULL
) {
1622 plog(LLV_DEBUG
, LOCATION
, NULL
,
1623 "new acquire %s\n", spidx2str(&sp_out
->spidx
));
1627 vchar_t
*idsrc
, *iddst
;
1629 idsrc
= ipsecdoi_sockaddr2id((struct sockaddr
*)&sp_out
->spidx
.src
,
1630 sp_out
->spidx
.prefs
, sp_out
->spidx
.ul_proto
);
1631 if (idsrc
== NULL
) {
1632 plog(LLV_ERROR
, LOCATION
, NULL
,
1633 "failed to get ID for %s\n",
1634 spidx2str(&sp_out
->spidx
));
1638 iddst
= ipsecdoi_sockaddr2id((struct sockaddr
*)&sp_out
->spidx
.dst
,
1639 sp_out
->spidx
.prefd
, sp_out
->spidx
.ul_proto
);
1640 if (iddst
== NULL
) {
1641 plog(LLV_ERROR
, LOCATION
, NULL
,
1642 "failed to get ID for %s\n",
1643 spidx2str(&sp_out
->spidx
));
1648 iph2
[n
]->sainfo
= getsainfo(idsrc
, iddst
);
1651 if (iph2
[n
]->sainfo
== NULL
) {
1652 plog(LLV_ERROR
, LOCATION
, NULL
,
1653 "failed to get sainfo.\n");
1656 /* XXX should use the algorithm list from register message */
1660 if (set_proposal_from_policy(iph2
[n
], sp_out
, sp_in
) < 0) {
1661 plog(LLV_ERROR
, LOCATION
, NULL
,
1662 "failed to create saprop.\n");
1668 /* start isakmp initiation by using ident exchange */
1669 /* XXX should be looped if there are multiple phase 2 handler. */
1670 if (isakmp_post_acquire(iph2
[n
]) < 0) {
1671 plog(LLV_ERROR
, LOCATION
, NULL
,
1672 "failed to begin ipsec sa negotication.\n");
1680 unbindph12(iph2
[n
]);
1693 struct sadb_msg
*msg
;
1695 struct sockaddr
*src
, *dst
;
1696 struct ph2handle
*iph2
= NULL
;
1699 /* ignore this message because of local test mode. */
1705 || mhp
[SADB_EXT_SA
] == NULL
1706 || mhp
[SADB_EXT_ADDRESS_SRC
] == NULL
1707 || mhp
[SADB_EXT_ADDRESS_DST
] == NULL
) {
1708 plog(LLV_ERROR
, LOCATION
, NULL
,
1709 "inappropriate sadb delete message passed.\n");
1712 msg
= (struct sadb_msg
*)mhp
[0];
1713 sa
= (struct sadb_sa
*)mhp
[SADB_EXT_SA
];
1714 src
= PFKEY_ADDR_SADDR(mhp
[SADB_EXT_ADDRESS_SRC
]);
1715 dst
= PFKEY_ADDR_SADDR(mhp
[SADB_EXT_ADDRESS_DST
]);
1717 /* the message has to be processed or not ? */
1718 if (msg
->sadb_msg_pid
== getpid()) {
1719 plog(LLV_DEBUG
, LOCATION
, NULL
,
1720 "%s message is not interesting "
1721 "because the message was originated by me.\n",
1722 s_pfkey_type(msg
->sadb_msg_type
),
1727 proto_id
= pfkey2ipsecdoi_proto(msg
->sadb_msg_satype
);
1728 if (proto_id
== ~0) {
1729 plog(LLV_ERROR
, LOCATION
, NULL
,
1730 "invalid proto_id %d\n", msg
->sadb_msg_satype
);
1734 iph2
= getph2bysaidx(src
, dst
, proto_id
, sa
->sadb_sa_spi
);
1737 plog(LLV_ERROR
, LOCATION
, NULL
,
1738 "no iph2 found: %s\n",
1739 sadbsecas2str(src
, dst
, msg
->sadb_msg_satype
,
1740 sa
->sadb_sa_spi
, IPSEC_MODE_ANY
));
1744 plog(LLV_ERROR
, LOCATION
, NULL
,
1745 "pfkey DELETE received: %s\n",
1746 sadbsecas2str(iph2
->src
, iph2
->dst
,
1747 msg
->sadb_msg_satype
, sa
->sadb_sa_spi
, IPSEC_MODE_ANY
));
1749 /* send delete information */
1750 if (iph2
->status
== PHASE2ST_ESTABLISHED
)
1751 isakmp_info_send_d2(iph2
);
1764 /* ignore this message because of local test mode. */
1769 if (mhp
[0] == NULL
) {
1770 plog(LLV_ERROR
, LOCATION
, NULL
,
1771 "inappropriate sadb flush message passed.\n");
1781 getsadbpolicy(policy0
, policylen0
, type
, iph2
)
1783 int *policylen0
, type
;
1784 struct ph2handle
*iph2
;
1786 struct policyindex
*spidx
= (struct policyindex
*)iph2
->spidx_gen
;
1787 struct sadb_x_policy
*xpl
;
1788 struct sadb_x_ipsecrequest
*xisr
;
1795 /* get policy buffer size */
1796 policylen
= sizeof(struct sadb_x_policy
);
1797 if (type
!= SADB_X_SPDDELETE
) {
1798 for (pr
= iph2
->approval
->head
; pr
; pr
= pr
->next
) {
1799 xisrlen
= sizeof(*xisr
);
1800 if (pr
->encmode
== IPSECDOI_ATTR_ENC_MODE_TUNNEL
||
1801 pr
->encmode
== IPSECDOI_ATTR_ENC_MODE_UDPTUNNEL_RFC
||
1802 pr
->encmode
== IPSECDOI_ATTR_ENC_MODE_UDPTUNNEL_DRAFT
) {
1803 xisrlen
+= (iph2
->src
->sa_len
1804 + iph2
->dst
->sa_len
);
1807 policylen
+= PFKEY_ALIGN8(xisrlen
);
1811 /* make policy structure */
1812 policy
= racoon_malloc(policylen
);
1814 plog(LLV_ERROR
, LOCATION
, NULL
,
1815 "buffer allocation failed.\n");
1819 xpl
= (struct sadb_x_policy
*)policy
;
1820 xpl
->sadb_x_policy_len
= PFKEY_UNIT64(policylen
);
1821 xpl
->sadb_x_policy_exttype
= SADB_X_EXT_POLICY
;
1822 xpl
->sadb_x_policy_type
= IPSEC_POLICY_IPSEC
;
1823 xpl
->sadb_x_policy_dir
= spidx
->dir
;
1824 xpl
->sadb_x_policy_id
= 0;
1826 /* no need to append policy information any more if type is SPDDELETE */
1827 if (type
== SADB_X_SPDDELETE
)
1830 xisr
= (struct sadb_x_ipsecrequest
*)(xpl
+ 1);
1832 for (pr
= iph2
->approval
->head
; pr
; pr
= pr
->next
) {
1834 satype
= doi2ipproto(pr
->proto_id
);
1836 plog(LLV_ERROR
, LOCATION
, NULL
,
1837 "invalid proto_id %d\n", pr
->proto_id
);
1840 mode
= ipsecdoi2pfkey_mode(pr
->encmode
);
1842 plog(LLV_ERROR
, LOCATION
, NULL
,
1843 "invalid encmode %d\n", pr
->encmode
);
1848 * the policy level cannot be unique because the policy
1849 * is defined later than SA, so req_id cannot be bound to SA.
1851 xisr
->sadb_x_ipsecrequest_proto
= satype
;
1852 xisr
->sadb_x_ipsecrequest_mode
= mode
;
1853 xisr
->sadb_x_ipsecrequest_level
= IPSEC_LEVEL_REQUIRE
;
1854 xisr
->sadb_x_ipsecrequest_reqid
= 0;
1855 p
= (caddr_t
)(xisr
+ 1);
1857 xisrlen
= sizeof(*xisr
);
1859 if (pr
->encmode
== IPSECDOI_ATTR_ENC_MODE_TUNNEL
||
1860 pr
->encmode
== IPSECDOI_ATTR_ENC_MODE_UDPTUNNEL_RFC
||
1861 pr
->encmode
== IPSECDOI_ATTR_ENC_MODE_UDPTUNNEL_DRAFT
) {
1862 xisrlen
+= (iph2
->src
->sa_len
+ iph2
->dst
->sa_len
);
1864 memcpy(p
, iph2
->src
, iph2
->src
->sa_len
);
1865 p
+= iph2
->src
->sa_len
;
1867 memcpy(p
, iph2
->dst
, iph2
->dst
->sa_len
);
1868 p
+= iph2
->dst
->sa_len
;
1871 xisr
->sadb_x_ipsecrequest_len
= PFKEY_ALIGN8(xisrlen
);
1876 *policylen0
= policylen
;
1882 racoon_free(policy
);
1888 pk_sendspdupdate2(iph2
)
1889 struct ph2handle
*iph2
;
1891 struct policyindex
*spidx
= (struct policyindex
*)iph2
->spidx_gen
;
1892 caddr_t policy
= NULL
;
1894 u_int64_t ltime
, vtime
;
1896 ltime
= iph2
->approval
->lifetime
;
1899 if (getsadbpolicy(&policy
, &policylen
, SADB_X_SPDUPDATE
, iph2
)) {
1900 plog(LLV_ERROR
, LOCATION
, NULL
,
1901 "getting sadb policy failed.\n");
1905 if (pfkey_send_spdupdate2(
1907 (struct sockaddr
*)&spidx
->src
,
1909 (struct sockaddr
*)&spidx
->dst
,
1913 policy
, policylen
, 0) < 0) {
1914 plog(LLV_ERROR
, LOCATION
, NULL
,
1915 "libipsec failed send spdupdate2 (%s)\n",
1919 plog(LLV_DEBUG
, LOCATION
, NULL
, "call pfkey_send_spdupdate2\n");
1923 racoon_free(policy
);
1929 pk_recvspdupdate(mhp
)
1933 if (mhp
[0] == NULL
) {
1934 plog(LLV_ERROR
, LOCATION
, NULL
,
1935 "inappropriate sadb spdupdate message passed.\n");
1943 * this function has to be used by responder side.
1946 pk_sendspdadd2(iph2
)
1947 struct ph2handle
*iph2
;
1949 struct policyindex
*spidx
= (struct policyindex
*)iph2
->spidx_gen
;
1950 caddr_t policy
= NULL
;
1952 u_int64_t ltime
, vtime
;
1954 ltime
= iph2
->approval
->lifetime
;
1957 if (getsadbpolicy(&policy
, &policylen
, SADB_X_SPDADD
, iph2
)) {
1958 plog(LLV_ERROR
, LOCATION
, NULL
,
1959 "getting sadb policy failed.\n");
1963 if (pfkey_send_spdadd2(
1965 (struct sockaddr
*)&spidx
->src
,
1967 (struct sockaddr
*)&spidx
->dst
,
1971 policy
, policylen
, 0) < 0) {
1972 plog(LLV_ERROR
, LOCATION
, NULL
,
1973 "libipsec failed send spdadd2 (%s)\n",
1977 plog(LLV_DEBUG
, LOCATION
, NULL
, "call pfkey_send_spdadd2\n");
1981 racoon_free(policy
);
1990 struct sadb_address
*saddr
, *daddr
;
1991 struct sadb_x_policy
*xpl
;
1992 struct policyindex spidx
;
1993 struct secpolicy
*sp
;
1997 || mhp
[SADB_EXT_ADDRESS_SRC
] == NULL
1998 || mhp
[SADB_EXT_ADDRESS_DST
] == NULL
1999 || mhp
[SADB_X_EXT_POLICY
] == NULL
) {
2000 plog(LLV_ERROR
, LOCATION
, NULL
,
2001 "inappropriate sadb spdadd message passed.\n");
2004 saddr
= (struct sadb_address
*)mhp
[SADB_EXT_ADDRESS_SRC
];
2005 daddr
= (struct sadb_address
*)mhp
[SADB_EXT_ADDRESS_DST
];
2006 xpl
= (struct sadb_x_policy
*)mhp
[SADB_X_EXT_POLICY
];
2008 KEY_SETSECSPIDX(xpl
->sadb_x_policy_dir
,
2011 saddr
->sadb_address_prefixlen
,
2012 daddr
->sadb_address_prefixlen
,
2013 saddr
->sadb_address_proto
,
2018 plog(LLV_ERROR
, LOCATION
, NULL
,
2019 "such policy already exists. "
2020 "anyway replace it: %s\n",
2026 if (addnewsp(mhp
) < 0)
2033 * this function has to be used by responder side.
2036 pk_sendspddelete(iph2
)
2037 struct ph2handle
*iph2
;
2039 struct policyindex
*spidx
= (struct policyindex
*)iph2
->spidx_gen
;
2040 caddr_t policy
= NULL
;
2043 if (getsadbpolicy(&policy
, &policylen
, SADB_X_SPDDELETE
, iph2
)) {
2044 plog(LLV_ERROR
, LOCATION
, NULL
,
2045 "getting sadb policy failed.\n");
2049 if (pfkey_send_spddelete(
2051 (struct sockaddr
*)&spidx
->src
,
2053 (struct sockaddr
*)&spidx
->dst
,
2056 policy
, policylen
, 0) < 0) {
2057 plog(LLV_ERROR
, LOCATION
, NULL
,
2058 "libipsec failed send spddelete (%s)\n",
2062 plog(LLV_DEBUG
, LOCATION
, NULL
, "call pfkey_send_spddelete\n");
2066 racoon_free(policy
);
2072 pk_recvspddelete(mhp
)
2075 struct sadb_address
*saddr
, *daddr
;
2076 struct sadb_x_policy
*xpl
;
2077 struct policyindex spidx
;
2078 struct secpolicy
*sp
;
2082 || mhp
[SADB_EXT_ADDRESS_SRC
] == NULL
2083 || mhp
[SADB_EXT_ADDRESS_DST
] == NULL
2084 || mhp
[SADB_X_EXT_POLICY
] == NULL
) {
2085 plog(LLV_ERROR
, LOCATION
, NULL
,
2086 "inappropriate sadb spddelete message passed.\n");
2089 saddr
= (struct sadb_address
*)mhp
[SADB_EXT_ADDRESS_SRC
];
2090 daddr
= (struct sadb_address
*)mhp
[SADB_EXT_ADDRESS_DST
];
2091 xpl
= (struct sadb_x_policy
*)mhp
[SADB_X_EXT_POLICY
];
2093 KEY_SETSECSPIDX(xpl
->sadb_x_policy_dir
,
2096 saddr
->sadb_address_prefixlen
,
2097 daddr
->sadb_address_prefixlen
,
2098 saddr
->sadb_address_proto
,
2103 plog(LLV_ERROR
, LOCATION
, NULL
,
2104 "no policy found: %s\n",
2116 pk_recvspdexpire(mhp
)
2119 struct sadb_address
*saddr
, *daddr
;
2120 struct sadb_x_policy
*xpl
;
2121 struct policyindex spidx
;
2122 struct secpolicy
*sp
;
2126 || mhp
[SADB_EXT_ADDRESS_SRC
] == NULL
2127 || mhp
[SADB_EXT_ADDRESS_DST
] == NULL
2128 || mhp
[SADB_X_EXT_POLICY
] == NULL
) {
2129 plog(LLV_ERROR
, LOCATION
, NULL
,
2130 "inappropriate sadb spdexpire message passed.\n");
2133 saddr
= (struct sadb_address
*)mhp
[SADB_EXT_ADDRESS_SRC
];
2134 daddr
= (struct sadb_address
*)mhp
[SADB_EXT_ADDRESS_DST
];
2135 xpl
= (struct sadb_x_policy
*)mhp
[SADB_X_EXT_POLICY
];
2137 KEY_SETSECSPIDX(xpl
->sadb_x_policy_dir
,
2140 saddr
->sadb_address_prefixlen
,
2141 daddr
->sadb_address_prefixlen
,
2142 saddr
->sadb_address_proto
,
2147 plog(LLV_ERROR
, LOCATION
, NULL
,
2148 "no policy found: %s\n",
2164 if (mhp
[0] == NULL
) {
2165 plog(LLV_ERROR
, LOCATION
, NULL
,
2166 "inappropriate sadb spdget message passed.\n");
2177 struct sadb_msg
*msg
;
2178 struct sadb_address
*saddr
, *daddr
;
2179 struct sadb_x_policy
*xpl
;
2180 struct policyindex spidx
;
2181 struct secpolicy
*sp
;
2184 if (mhp
[0] == NULL
) {
2185 plog(LLV_ERROR
, LOCATION
, NULL
,
2186 "inappropriate sadb spddump message passed.\n");
2189 msg
= (struct sadb_msg
*)mhp
[0];
2191 saddr
= (struct sadb_address
*)mhp
[SADB_EXT_ADDRESS_SRC
];
2192 daddr
= (struct sadb_address
*)mhp
[SADB_EXT_ADDRESS_DST
];
2193 xpl
= (struct sadb_x_policy
*)mhp
[SADB_X_EXT_POLICY
];
2195 KEY_SETSECSPIDX(xpl
->sadb_x_policy_dir
,
2198 saddr
->sadb_address_prefixlen
,
2199 daddr
->sadb_address_prefixlen
,
2200 saddr
->sadb_address_proto
,
2205 plog(LLV_ERROR
, LOCATION
, NULL
,
2206 "such policy already exists. "
2207 "anyway replace it: %s\n",
2213 if (addnewsp(mhp
) < 0)
2220 pk_recvspdflush(mhp
)
2224 if (mhp
[0] == NULL
) {
2225 plog(LLV_ERROR
, LOCATION
, NULL
,
2226 "inappropriate sadb spdflush message passed.\n");
2236 * send error against acquire message to kenrel.
2239 pk_sendeacquire(iph2
)
2240 struct ph2handle
*iph2
;
2242 struct sadb_msg
*newmsg
;
2245 len
= sizeof(struct sadb_msg
);
2246 newmsg
= racoon_calloc(1, len
);
2247 if (newmsg
== NULL
) {
2248 plog(LLV_ERROR
, LOCATION
, NULL
,
2249 "failed to get buffer to send acquire.\n");
2253 memset(newmsg
, 0, len
);
2254 newmsg
->sadb_msg_version
= PF_KEY_V2
;
2255 newmsg
->sadb_msg_type
= SADB_ACQUIRE
;
2256 newmsg
->sadb_msg_errno
= ENOENT
; /* XXX */
2257 newmsg
->sadb_msg_satype
= iph2
->satype
;
2258 newmsg
->sadb_msg_len
= PFKEY_UNIT64(len
);
2259 newmsg
->sadb_msg_reserved
= 0;
2260 newmsg
->sadb_msg_seq
= iph2
->seq
;
2261 newmsg
->sadb_msg_pid
= (u_int32_t
)getpid();
2264 len
= pfkey_send(lcconf
->sock_pfkey
, newmsg
, len
);
2266 racoon_free(newmsg
);
2272 * check if the algorithm is supported or not.
2277 pk_checkalg(class, calg
, keylen
)
2278 int class, calg
, keylen
;
2282 struct sadb_alg alg0
;
2284 switch (algclass2doi(class)) {
2285 case IPSECDOI_PROTO_IPSEC_ESP
:
2286 sup
= SADB_EXT_SUPPORTED_ENCRYPT
;
2288 case IPSECDOI_ATTR_AUTH
:
2289 sup
= SADB_EXT_SUPPORTED_AUTH
;
2291 case IPSECDOI_PROTO_IPCOMP
:
2292 plog(LLV_DEBUG
, LOCATION
, NULL
,
2293 "compression algorithm can not be checked "
2294 "because sadb message doesn't support it.\n");
2297 plog(LLV_ERROR
, LOCATION
, NULL
,
2298 "invalid algorithm class.\n");
2301 alg
= ipsecdoi2pfkey_alg(algclass2doi(class), algtype2doi(class, calg
));
2306 if (ipsec_get_keylen(sup
, alg
, &alg0
)) {
2307 plog(LLV_ERROR
, LOCATION
, NULL
,
2308 "%s.\n", ipsec_strerror());
2311 keylen
= alg0
.sadb_alg_minbits
;
2314 error
= ipsec_check_keylen(sup
, alg
, keylen
);
2316 plog(LLV_ERROR
, LOCATION
, NULL
,
2317 "%s.\n", ipsec_strerror());
2323 * differences with pfkey_recv() in libipsec/pfkey.c:
2324 * - never performs busy wait loop.
2325 * - returns NULL and set *lenp to negative on fatal failures
2326 * - returns NULL and set *lenp to non-negative on non-fatal failures
2327 * - returns non-NULL on success
2329 static struct sadb_msg
*
2334 struct sadb_msg buf
, *newmsg
;
2337 *lenp
= recv(so
, (caddr_t
)&buf
, sizeof(buf
), MSG_PEEK
);
2339 return NULL
; /*fatal*/
2340 else if (*lenp
< sizeof(buf
))
2343 reallen
= PFKEY_UNUNIT64(buf
.sadb_msg_len
);
2344 if ((newmsg
= racoon_calloc(1, reallen
)) == NULL
)
2347 *lenp
= recv(so
, (caddr_t
)newmsg
, reallen
, MSG_PEEK
);
2349 racoon_free(newmsg
);
2350 return NULL
; /*fatal*/
2351 } else if (*lenp
!= reallen
) {
2352 racoon_free(newmsg
);
2356 *lenp
= recv(so
, (caddr_t
)newmsg
, reallen
, 0);
2358 racoon_free(newmsg
);
2359 return NULL
; /*fatal*/
2360 } else if (*lenp
!= reallen
) {
2361 racoon_free(newmsg
);
2372 return arc4random();
2379 struct secpolicy
*new;
2380 struct sadb_address
*saddr
, *daddr
;
2381 struct sadb_x_policy
*xpl
;
2384 if (mhp
[SADB_EXT_ADDRESS_SRC
] == NULL
2385 || mhp
[SADB_EXT_ADDRESS_DST
] == NULL
2386 || mhp
[SADB_X_EXT_POLICY
] == NULL
) {
2387 plog(LLV_ERROR
, LOCATION
, NULL
,
2388 "inappropriate sadb spd management message passed.\n");
2392 saddr
= (struct sadb_address
*)mhp
[SADB_EXT_ADDRESS_SRC
];
2393 daddr
= (struct sadb_address
*)mhp
[SADB_EXT_ADDRESS_DST
];
2394 xpl
= (struct sadb_x_policy
*)mhp
[SADB_X_EXT_POLICY
];
2398 plog(LLV_ERROR
, LOCATION
, NULL
,
2399 "failed to allocate buffer\n");
2403 new->spidx
.dir
= xpl
->sadb_x_policy_dir
;
2404 new->id
= xpl
->sadb_x_policy_id
;
2405 new->policy
= xpl
->sadb_x_policy_type
;
2409 switch (xpl
->sadb_x_policy_type
) {
2410 case IPSEC_POLICY_DISCARD
:
2411 case IPSEC_POLICY_NONE
:
2412 case IPSEC_POLICY_ENTRUST
:
2413 case IPSEC_POLICY_BYPASS
:
2416 case IPSEC_POLICY_IPSEC
:
2419 struct sadb_x_ipsecrequest
*xisr
;
2420 struct ipsecrequest
**p_isr
= &new->req
;
2422 /* validity check */
2423 if (PFKEY_EXTLEN(xpl
) < sizeof(*xpl
)) {
2424 plog(LLV_ERROR
, LOCATION
, NULL
,
2425 "invalid msg length.\n");
2429 tlen
= PFKEY_EXTLEN(xpl
) - sizeof(*xpl
);
2430 xisr
= (struct sadb_x_ipsecrequest
*)(xpl
+ 1);
2435 if (xisr
->sadb_x_ipsecrequest_len
< sizeof(*xisr
)) {
2436 plog(LLV_ERROR
, LOCATION
, NULL
,
2437 "invalid msg length.\n");
2441 /* allocate request buffer */
2442 *p_isr
= newipsecreq();
2443 if (*p_isr
== NULL
) {
2444 plog(LLV_ERROR
, LOCATION
, NULL
,
2445 "failed to get new ipsecreq.\n");
2450 (*p_isr
)->next
= NULL
;
2452 switch (xisr
->sadb_x_ipsecrequest_proto
) {
2455 case IPPROTO_IPCOMP
:
2458 plog(LLV_ERROR
, LOCATION
, NULL
,
2459 "invalid proto type: %u\n",
2460 xisr
->sadb_x_ipsecrequest_proto
);
2463 (*p_isr
)->saidx
.proto
= xisr
->sadb_x_ipsecrequest_proto
;
2465 switch (xisr
->sadb_x_ipsecrequest_mode
) {
2466 case IPSEC_MODE_TRANSPORT
:
2467 case IPSEC_MODE_TUNNEL
:
2469 case IPSEC_MODE_ANY
:
2471 plog(LLV_ERROR
, LOCATION
, NULL
,
2472 "invalid mode: %u\n",
2473 xisr
->sadb_x_ipsecrequest_mode
);
2476 (*p_isr
)->saidx
.mode
= xisr
->sadb_x_ipsecrequest_mode
;
2478 switch (xisr
->sadb_x_ipsecrequest_level
) {
2479 case IPSEC_LEVEL_DEFAULT
:
2480 case IPSEC_LEVEL_USE
:
2481 case IPSEC_LEVEL_REQUIRE
:
2483 case IPSEC_LEVEL_UNIQUE
:
2484 (*p_isr
)->saidx
.reqid
=
2485 xisr
->sadb_x_ipsecrequest_reqid
;
2489 plog(LLV_ERROR
, LOCATION
, NULL
,
2490 "invalid level: %u\n",
2491 xisr
->sadb_x_ipsecrequest_level
);
2494 (*p_isr
)->level
= xisr
->sadb_x_ipsecrequest_level
;
2496 /* set IP addresses if there */
2497 if (xisr
->sadb_x_ipsecrequest_len
> sizeof(*xisr
)) {
2498 struct sockaddr
*paddr
;
2500 paddr
= (struct sockaddr
*)(xisr
+ 1);
2501 bcopy(paddr
, &(*p_isr
)->saidx
.src
,
2504 paddr
= (struct sockaddr
*)((caddr_t
)paddr
2506 bcopy(paddr
, &(*p_isr
)->saidx
.dst
,
2512 /* initialization for the next. */
2513 p_isr
= &(*p_isr
)->next
;
2514 tlen
-= xisr
->sadb_x_ipsecrequest_len
;
2516 /* validity check */
2518 plog(LLV_ERROR
, LOCATION
, NULL
,
2519 "becoming tlen < 0\n");
2522 xisr
= (struct sadb_x_ipsecrequest
*)((caddr_t
)xisr
2523 + xisr
->sadb_x_ipsecrequest_len
);
2528 plog(LLV_ERROR
, LOCATION
, NULL
,
2529 "invalid policy type.\n");
2533 KEY_SETSECSPIDX(xpl
->sadb_x_policy_dir
,
2536 saddr
->sadb_address_prefixlen
,
2537 daddr
->sadb_address_prefixlen
,
2538 saddr
->sadb_address_proto
,
2546 /* proto/mode/src->dst spi */
2548 sadbsecas2str(src
, dst
, proto
, spi
, mode
)
2549 struct sockaddr
*src
, *dst
;
2554 static char buf
[256];
2555 u_int doi_proto
, doi_mode
= 0;
2559 doi_proto
= pfkey2ipsecdoi_proto(proto
);
2560 if (doi_proto
== ~0)
2563 doi_mode
= pfkey2ipsecdoi_mode(mode
, 0);
2568 blen
= sizeof(buf
) - 1;
2571 i
= snprintf(p
, blen
, "%s%s%s ",
2572 s_ipsecdoi_proto(doi_proto
),
2574 mode
? s_ipsecdoi_encmode(doi_mode
) : "");
2575 if (i
< 0 || i
>= blen
)
2580 i
= snprintf(p
, blen
, "%s->", saddrwop2str(src
));
2581 if (i
< 0 || i
>= blen
)
2586 i
= snprintf(p
, blen
, "%s ", saddrwop2str(dst
));
2587 if (i
< 0 || i
>= blen
)
2593 snprintf(p
, blen
, "spi=%lu(0x%lx)", (unsigned long)ntohl(spi
),
2594 (unsigned long)ntohl(spi
));