1 /* $NetBSD: isakmp_cfg.c,v 1.12.6.1 2007/06/07 20:06:34 manu Exp $ */
3 /* Id: isakmp_cfg.c,v 1.55 2006/08/22 18:17:17 manubsd Exp */
6 * Copyright (C) 2004-2006 Emmanuel Dreyfus
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in the
16 * documentation and/or other materials provided with the distribution.
17 * 3. Neither the name of the project nor the names of its contributors
18 * may be used to endorse or promote products derived from this software
19 * without specific prior written permission.
21 * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36 #include <sys/types.h>
37 #include <sys/param.h>
38 #include <sys/socket.h>
39 #include <sys/queue.h>
52 #include <netinet/in.h>
53 #include <arpa/inet.h>
59 #if TIME_WITH_SYS_TIME
60 # include <sys/time.h>
64 # include <sys/time.h>
88 #include "isakmp_var.h"
92 #include "remoteconf.h"
93 #include "localconf.h"
94 #include "crypto_openssl.h"
95 #include "isakmp_inf.h"
96 #include "isakmp_xauth.h"
97 #include "isakmp_unity.h"
98 #include "isakmp_cfg.h"
100 #include "vpn_control.h"
101 #include "vpn_control_var.h"
102 #include "ike_session.h"
103 #include "ipsecSessionTracer.h"
104 #include "ipsecMessageTracer.h"
105 #include "nattraversal.h"
107 struct isakmp_cfg_config isakmp_cfg_config
;
109 static vchar_t
*buffer_cat (vchar_t
*s
, vchar_t
*append
);
110 static vchar_t
*isakmp_cfg_net (phase1_handle_t
*, struct isakmp_data
*);
112 static vchar_t
*isakmp_cfg_void (phase1_handle_t
*, struct isakmp_data
*);
114 static vchar_t
*isakmp_cfg_addr4 (phase1_handle_t
*,
115 struct isakmp_data
*, in_addr_t
*);
116 static void isakmp_cfg_getaddr4 (struct isakmp_data
*, struct in_addr
*);
117 static vchar_t
*isakmp_cfg_addr4_list (phase1_handle_t
*,
118 struct isakmp_data
*, in_addr_t
*, int);
119 static void isakmp_cfg_appendaddr4 (struct isakmp_data
*,
120 struct in_addr
*, int *, int);
121 static void isakmp_cfg_getstring (struct isakmp_data
*,char *);
122 void isakmp_cfg_iplist_to_str (char *, int, void *, int);
124 #define ISAKMP_CFG_LOGIN 1
125 #define ISAKMP_CFG_LOGOUT 2
128 * Handle an ISAKMP config mode packet
129 * We expect HDR, HASH, ATTR
132 isakmp_cfg_r(iph1
, msg
)
133 phase1_handle_t
*iph1
;
136 struct isakmp
*packet
;
137 struct isakmp_gen
*ph
;
142 struct isakmp_ivm
*ivm
;
143 phase2_handle_t
*iph2
;
146 /* Check that the packet is long enough to have a header */
147 if (msg
->l
< sizeof(*packet
)) {
148 IPSECSESSIONTRACEREVENT(iph1
->parent_session
,
149 IPSECSESSIONEVENTCODE_IKE_PACKET_RX_FAIL
,
150 CONSTSTR("MODE-Config. Unexpected short packet"),
151 CONSTSTR("Failed to process short MODE-Config packet"));
152 plog(ASL_LEVEL_ERR
, "Unexpected short packet\n");
156 packet
= (struct isakmp
*)msg
->v
;
158 /* Is it encrypted? It should be encrypted */
159 if ((packet
->flags
& ISAKMP_FLAG_E
) == 0) {
160 IPSECSESSIONTRACEREVENT(iph1
->parent_session
,
161 IPSECSESSIONEVENTCODE_IKE_PACKET_RX_FAIL
,
162 CONSTSTR("MODE-Config. User credentials sent in cleartext"),
163 CONSTSTR("Dropped cleattext User credentials"));
165 "User credentials sent in cleartext!\n");
170 * Decrypt the packet. If this is the beginning of a new
171 * exchange, reinitialize the IV
173 if (iph1
->mode_cfg
->ivm
== NULL
||
174 iph1
->mode_cfg
->last_msgid
!= packet
->msgid
)
175 iph1
->mode_cfg
->ivm
=
176 isakmp_cfg_newiv(iph1
, packet
->msgid
);
177 ivm
= iph1
->mode_cfg
->ivm
;
179 dmsg
= oakley_do_decrypt(iph1
, msg
, ivm
->iv
, ivm
->ive
);
181 IPSECSESSIONTRACEREVENT(iph1
->parent_session
,
182 IPSECSESSIONEVENTCODE_IKE_PACKET_RX_FAIL
,
183 CONSTSTR("MODE-Config. Failed to decrypt packet"),
184 CONSTSTR("Failed to decrypt MODE-Config packet"));
186 "failed to decrypt message\n");
190 plog(ASL_LEVEL_DEBUG
, "MODE_CFG packet\n");
192 /* Now work with the decrypted packet */
193 packet
= (struct isakmp
*)dmsg
->v
;
194 tlen
= dmsg
->l
- sizeof(*packet
);
195 ph
= (struct isakmp_gen
*)(packet
+ 1);
198 while ((tlen
> 0) && (np
!= ISAKMP_NPTYPE_NONE
)) {
199 /* Check that the payload header fits in the packet */
200 if (tlen
< sizeof(*ph
)) {
201 plog(ASL_LEVEL_WARNING
,
202 "Short payload header\n");
206 /* Check that the payload fits in the packet */
207 if (tlen
< ntohs(ph
->len
)) {
208 plog(ASL_LEVEL_WARNING
,
213 plog(ASL_LEVEL_DEBUG
, "Seen payload %d\n", np
);
216 case ISAKMP_NPTYPE_HASH
: {
220 struct isakmp_gen
*nph
;
222 plen
= ntohs(ph
->len
);
223 nph
= (struct isakmp_gen
*)((char *)ph
+ plen
);
224 plen
= ntohs(nph
->len
);
225 /* Check that the hash payload fits in the packet */
226 if (tlen
< (plen
+ ntohs(ph
->len
))) {
227 plog(ASL_LEVEL_WARNING
,
228 "Invalid Hash payload. len %d, overall-len %d\n",
234 if ((payload
= vmalloc(plen
)) == NULL
) {
236 "Cannot allocate memory\n");
239 memcpy(payload
->v
, nph
, plen
);
241 if ((check
= oakley_compute_hash1(iph1
,
242 packet
->msgid
, payload
)) == NULL
) {
244 "Cannot compute hash\n");
249 if (memcmp(ph
+ 1, check
->v
, check
->l
) != 0) {
251 "Hash verification failed\n");
260 case ISAKMP_NPTYPE_ATTR
: {
261 struct isakmp_pl_attr
*attrpl
;
263 attrpl
= (struct isakmp_pl_attr
*)ph
;
264 isakmp_cfg_attr_r(iph1
, packet
->msgid
, attrpl
, msg
);
269 plog(ASL_LEVEL_WARNING
,
270 "Unexpected next payload %d\n", np
);
271 /* Skip to the next payload */
275 /* Move to the next payload */
277 tlen
-= ntohs(ph
->len
);
279 ph
= (struct isakmp_gen
*)(npp
+ ntohs(ph
->len
));
283 /* find phase 2 in case pkt scheduled for resend */
284 iph2
= ike_session_getph2bymsgid(iph1
, packet
->msgid
);
286 goto out
; /* no resend scheduled */
287 SCHED_KILL(iph2
->scr
); /* turn off schedule */
288 ike_session_unlink_phase2(iph2
);
290 IPSECSESSIONTRACEREVENT(iph1
->parent_session
,
291 IPSECSESSIONEVENTCODE_IKE_PACKET_RX_SUCC
,
292 CONSTSTR("MODE-Config"),
296 IPSECSESSIONTRACEREVENT(iph1
->parent_session
,
297 IPSECSESSIONEVENTCODE_IKE_PACKET_RX_FAIL
,
298 CONSTSTR("MODE-Config"),
299 CONSTSTR("Failed to process Mode-Config packet"));
305 isakmp_cfg_attr_r(iph1
, msgid
, attrpl
, msg
)
306 phase1_handle_t
*iph1
;
308 struct isakmp_pl_attr
*attrpl
;
311 int type
= attrpl
->type
;
313 plog(ASL_LEVEL_DEBUG
,
314 "Configuration exchange type %s\n", s_isakmp_cfg_ptype(type
));
317 /* ignore, but this is the time to reinit the IV */
318 oakley_delivm(iph1
->mode_cfg
->ivm
);
319 iph1
->mode_cfg
->ivm
= NULL
;
323 case ISAKMP_CFG_REPLY
:
324 return isakmp_cfg_reply(iph1
, attrpl
);
327 case ISAKMP_CFG_REQUEST
:
329 return isakmp_cfg_request(iph1
, attrpl
, msg
);
334 return isakmp_cfg_set(iph1
, attrpl
, msg
);
338 plog(ASL_LEVEL_WARNING
,
339 "Unepected configuration exchange type %d\n", type
);
348 isakmp_cfg_reply(iph1
, attrpl
)
349 phase1_handle_t
*iph1
;
350 struct isakmp_pl_attr
*attrpl
;
352 struct isakmp_data
*attr
;
359 if (iph1
->mode_cfg
->flags
& ISAKMP_CFG_GOT_REPLY
)
360 return 0; /* already received this - duplicate packet */
362 tlen
= ntohs(attrpl
->h
.len
);
363 attr
= (struct isakmp_data
*)(attrpl
+ 1);
364 tlen
-= sizeof(*attrpl
);
367 type
= ntohs(attr
->type
);
369 /* Handle short attributes */
370 if ((type
& ISAKMP_GEN_MASK
) == ISAKMP_GEN_TV
) {
371 type
&= ~ISAKMP_GEN_MASK
;
373 plog(ASL_LEVEL_DEBUG
,
374 "Short attribute %s = %d\n",
375 s_isakmp_cfg_type(type
), ntohs(attr
->lorv
));
379 if ((error
= xauth_attr_reply(iph1
,
380 attr
, ntohs(attrpl
->id
))) != 0)
387 plog(ASL_LEVEL_WARNING
,
388 "Ignored short attribute %s\n",
389 s_isakmp_cfg_type(type
));
393 tlen
-= sizeof(*attr
);
398 type
= ntohs(attr
->type
);
399 alen
= ntohs(attr
->lorv
);
401 /* Check that the attribute fit in the packet */
404 "Short attribute %s\n",
405 s_isakmp_cfg_type(type
));
409 plog(ASL_LEVEL_DEBUG
,
410 "Attribute %s, len %zu\n",
411 s_isakmp_cfg_type(type
), alen
);
415 case XAUTH_USER_NAME
:
416 case XAUTH_USER_PASSWORD
:
419 case XAUTH_CHALLENGE
:
424 if ((error
= xauth_attr_reply(iph1
,
425 attr
, ntohs(attrpl
->id
))) != 0)
428 case INTERNAL_IP4_ADDRESS
:
429 if ((iph1
->mode_cfg
->flags
& ISAKMP_CFG_GOT_ADDR4
) == 0) {
430 isakmp_cfg_getaddr4(attr
, &iph1
->mode_cfg
->addr4
);
431 iph1
->mode_cfg
->flags
|= ISAKMP_CFG_GOT_ADDR4
;
434 case INTERNAL_IP4_NETMASK
:
435 if ((iph1
->mode_cfg
->flags
& ISAKMP_CFG_GOT_MASK4
) == 0) {
436 isakmp_cfg_getaddr4(attr
, &iph1
->mode_cfg
->mask4
);
437 iph1
->mode_cfg
->flags
|= ISAKMP_CFG_GOT_MASK4
;
440 case INTERNAL_IP4_DNS
:
441 if ((iph1
->mode_cfg
->flags
& ISAKMP_CFG_GOT_DNS4
) == 0) {
442 isakmp_cfg_appendaddr4(attr
,
443 &iph1
->mode_cfg
->dns4
[iph1
->mode_cfg
->dns4_index
],
444 &iph1
->mode_cfg
->dns4_index
, MAXNS
);
445 iph1
->mode_cfg
->flags
|= ISAKMP_CFG_GOT_DNS4
;
448 case INTERNAL_IP4_NBNS
:
449 if ((iph1
->mode_cfg
->flags
& ISAKMP_CFG_GOT_WINS4
) == 0) {
450 isakmp_cfg_appendaddr4(attr
,
451 &iph1
->mode_cfg
->wins4
[iph1
->mode_cfg
->wins4_index
],
452 &iph1
->mode_cfg
->wins4_index
, MAXNS
);
453 iph1
->mode_cfg
->flags
|= ISAKMP_CFG_GOT_WINS4
;
456 case UNITY_DEF_DOMAIN
:
457 if ((iph1
->mode_cfg
->flags
& ISAKMP_CFG_GOT_DEFAULT_DOMAIN
) == 0) {
458 isakmp_cfg_getstring(attr
,
459 iph1
->mode_cfg
->default_domain
);
460 iph1
->mode_cfg
->flags
|= ISAKMP_CFG_GOT_DEFAULT_DOMAIN
;
463 case UNITY_SPLIT_INCLUDE
:
464 case UNITY_LOCAL_LAN
:
465 case UNITY_SPLITDNS_NAME
:
467 case UNITY_SAVE_PASSWD
:
468 case UNITY_NATT_PORT
:
470 case UNITY_BACKUP_SERVERS
:
471 case UNITY_DDNS_HOSTNAME
:
472 case APPLICATION_VERSION
:
474 isakmp_unity_reply(iph1
, attr
);
476 case INTERNAL_IP4_SUBNET
:
477 case INTERNAL_ADDRESS_EXPIRY
:
478 if (iph1
->started_by_api
)
479 break; /* not actually ignored - don't fall thru */
482 plog(ASL_LEVEL_WARNING
,
483 "Ignored attribute %s\n",
484 s_isakmp_cfg_type(type
));
489 attr
= (struct isakmp_data
*)(npp
+ sizeof(*attr
) + alen
);
490 tlen
-= (sizeof(*attr
) + alen
);
492 iph1
->mode_cfg
->flags
|= ISAKMP_CFG_GOT_REPLY
;
494 if (iph1
->started_by_api
|| (iph1
->is_rekey
&& iph1
->parent_session
&& iph1
->parent_session
->is_client
)) {
495 /* connection was started by API - save attr list for passing to VPN controller */
496 if (iph1
->mode_cfg
->attr_list
!= NULL
) /* shouldn't happen */
497 vfree(iph1
->mode_cfg
->attr_list
);
498 if (ntohs(attrpl
->h
.len
) < sizeof(*attrpl
)) {
500 "invalid cfg-attr-list, attr-len %d\n",
501 ntohs(attrpl
->h
.len
));
504 alen
= ntohs(attrpl
->h
.len
) - sizeof(*attrpl
);
505 if ((iph1
->mode_cfg
->attr_list
= vmalloc(alen
)) == NULL
) {
507 "Cannot allocate memory for mode-cfg attribute list\n");
510 memcpy(iph1
->mode_cfg
->attr_list
->v
, attrpl
+ 1, alen
);
514 #ifdef ENABLE_VPNCONTROL_PORT
515 if (FSM_STATE_IS_ESTABLISHED(iph1
->status
))
516 vpncontrol_notify_phase_change(0, FROM_LOCAL
, iph1
, NULL
);
523 isakmp_cfg_request(iph1
, attrpl
, msg
)
524 phase1_handle_t
*iph1
;
525 struct isakmp_pl_attr
*attrpl
;
528 struct isakmp_data
*attr
;
532 vchar_t
*payload
= NULL
;
533 struct isakmp_pl_attr
*reply
;
538 tlen
= ntohs(attrpl
->h
.len
);
539 attr
= (struct isakmp_data
*)(attrpl
+ 1);
540 tlen
-= sizeof(*attrpl
);
543 * if started_by_api then we are a VPN client and if we receive
544 * a mode-cfg request it needs to go to the VPN controller to
545 * retrieve the appropriate data (name, pw, pin, etc.)
547 if (iph1
->started_by_api
|| ike_session_is_client_ph1_rekey(iph1
)) {
549 * if we already received this one - ignore it
550 * we are waiting for a reply from the vpn control socket
552 if (iph1
->xauth_awaiting_userinput
)
555 /* otherwise - save the msg id and call and send the status notification */
556 iph1
->pended_xauth_id
= attrpl
->id
; /* network byte order */
557 if (vpncontrol_notify_need_authinfo(iph1
, attrpl
+ 1, tlen
))
559 iph1
->xauth_awaiting_userinput
= 1;
560 iph1
->xauth_awaiting_userinput_msg
= vdup(msg
); // dup the message for later
561 ike_session_start_xauth_timer(iph1
);
563 IPSECLOGASLMSG("IPSec Extended Authentication requested.\n");
568 if ((payload
= vmalloc(sizeof(*reply
))) == NULL
) {
569 plog(ASL_LEVEL_ERR
, "Cannot allocate memory\n");
572 memset(payload
->v
, 0, sizeof(*reply
));
576 type
= ntohs(attr
->type
);
578 /* Handle short attributes */
579 if ((type
& ISAKMP_GEN_MASK
) == ISAKMP_GEN_TV
) {
580 type
&= ~ISAKMP_GEN_MASK
;
582 plog(ASL_LEVEL_DEBUG
,
583 "Short attribute %s = %d\n",
584 s_isakmp_cfg_type(type
), ntohs(attr
->lorv
));
588 reply_attr
= isakmp_xauth_req(iph1
, attr
);
591 plog(ASL_LEVEL_WARNING
,
592 "Ignored short attribute %s\n",
593 s_isakmp_cfg_type(type
));
597 tlen
-= sizeof(*attr
);
600 if (reply_attr
!= NULL
) {
601 payload
= buffer_cat(payload
, reply_attr
);
608 type
= ntohs(attr
->type
);
609 alen
= ntohs(attr
->lorv
);
611 /* Check that the attribute fit in the packet */
614 "Short attribute %s\n",
615 s_isakmp_cfg_type(type
));
619 plog(ASL_LEVEL_DEBUG
,
620 "Attribute %s, len %zu\n",
621 s_isakmp_cfg_type(type
), alen
);
624 case INTERNAL_IP4_ADDRESS
:
625 case INTERNAL_IP4_NETMASK
:
626 case INTERNAL_IP4_DNS
:
627 case INTERNAL_IP4_NBNS
:
628 case INTERNAL_IP4_SUBNET
:
629 reply_attr
= isakmp_cfg_net(iph1
, attr
);
633 case XAUTH_USER_NAME
:
634 case XAUTH_USER_PASSWORD
:
637 case XAUTH_CHALLENGE
:
642 reply_attr
= isakmp_xauth_req(iph1
, attr
);
645 case APPLICATION_VERSION
:
646 reply_attr
= isakmp_cfg_string(iph1
,
647 attr
, ISAKMP_CFG_RACOON_VERSION
);
652 case UNITY_SAVE_PASSWD
:
653 case UNITY_DEF_DOMAIN
:
654 case UNITY_DDNS_HOSTNAME
:
656 case UNITY_SPLITDNS_NAME
:
657 case UNITY_SPLIT_INCLUDE
:
658 case UNITY_LOCAL_LAN
:
659 case UNITY_NATT_PORT
:
660 case UNITY_BACKUP_SERVERS
:
661 reply_attr
= isakmp_unity_req(iph1
, attr
);
664 case INTERNAL_ADDRESS_EXPIRY
:
666 plog(ASL_LEVEL_WARNING
,
667 "Ignored attribute %s\n",
668 s_isakmp_cfg_type(type
));
673 attr
= (struct isakmp_data
*)(npp
+ sizeof(*attr
) + alen
);
674 tlen
-= (sizeof(*attr
) + alen
);
676 if (reply_attr
!= NULL
) {
677 payload
= buffer_cat(payload
, reply_attr
);
682 reply
= (struct isakmp_pl_attr
*)payload
->v
;
683 reply
->h
.len
= htons(payload
->l
);
684 reply
->type
= ISAKMP_CFG_REPLY
;
685 reply
->id
= attrpl
->id
;
687 plog(ASL_LEVEL_DEBUG
,
688 "Sending MODE_CFG REPLY\n");
690 error
= isakmp_cfg_send(iph1
, payload
,
691 ISAKMP_NPTYPE_ATTR
, ISAKMP_FLAG_E
, 0, 0, msg
);
701 isakmp_cfg_set(iph1
, attrpl
, msg
)
702 phase1_handle_t
*iph1
;
703 struct isakmp_pl_attr
*attrpl
;
706 struct isakmp_data
*attr
;
711 struct isakmp_pl_attr
*reply
;
716 if ((payload
= vmalloc(sizeof(*reply
))) == NULL
) {
717 plog(ASL_LEVEL_ERR
, "Cannot allocate memory\n");
720 memset(payload
->v
, 0, sizeof(*reply
));
722 tlen
= ntohs(attrpl
->h
.len
);
723 attr
= (struct isakmp_data
*)(attrpl
+ 1);
724 tlen
-= sizeof(*attrpl
);
727 * We should send ack for the attributes we accepted
731 type
= ntohs(attr
->type
);
733 plog(ASL_LEVEL_DEBUG
,
735 s_isakmp_cfg_type(type
& ~ISAKMP_GEN_MASK
));
737 switch (type
& ~ISAKMP_GEN_MASK
) {
739 reply_attr
= isakmp_xauth_set(iph1
, attr
);
742 plog(ASL_LEVEL_DEBUG
,
743 "Unexpected SET attribute %s\n",
744 s_isakmp_cfg_type(type
& ~ISAKMP_GEN_MASK
));
748 if (reply_attr
!= NULL
) {
749 payload
= buffer_cat(payload
, reply_attr
);
754 * Move to next attribute. If we run out of the packet,
755 * tlen becomes negative and we exit.
757 if ((type
& ISAKMP_GEN_MASK
) == ISAKMP_GEN_TV
) {
758 tlen
-= sizeof(*attr
);
761 alen
= ntohs(attr
->lorv
);
762 tlen
-= (sizeof(*attr
) + alen
);
764 attr
= (struct isakmp_data
*)
765 (npp
+ sizeof(*attr
) + alen
);
769 reply
= (struct isakmp_pl_attr
*)payload
->v
;
770 reply
->h
.len
= htons(payload
->l
);
771 reply
->type
= ISAKMP_CFG_ACK
;
772 reply
->id
= attrpl
->id
;
774 plog(ASL_LEVEL_DEBUG
,
775 "Sending MODE_CFG ACK\n");
777 error
= isakmp_cfg_send(iph1
, payload
,
778 ISAKMP_NPTYPE_ATTR
, ISAKMP_FLAG_E
, 0, 0, msg
);
780 if (iph1
->mode_cfg
->flags
& ISAKMP_CFG_DELETE_PH1
) {
781 if (FSM_STATE_IS_ESTABLISHED(iph1
->status
))
782 isakmp_info_send_d1(iph1
);
783 isakmp_ph1expire(iph1
);
789 * If required, request ISAKMP mode config information: ignore rekeys
791 if ((iph1
!= NULL
) && (!iph1
->is_rekey
) && (iph1
->rmconf
->mode_cfg
) && (error
== 0))
792 error
= isakmp_cfg_getconfig(iph1
);
799 buffer_cat(s
, append
)
805 new = vmalloc(s
->l
+ append
->l
);
808 "Cannot allocate memory\n");
812 memcpy(new->v
, s
->v
, s
->l
);
813 memcpy(new->v
+ s
->l
, append
->v
, append
->l
);
820 isakmp_cfg_net(iph1
, attr
)
821 phase1_handle_t
*iph1
;
822 struct isakmp_data
*attr
;
827 type
= ntohs(attr
->type
);
830 * Don't give an address to a peer that did not succeed Xauth
832 if (xauth_check(iph1
) != 0) {
834 "Attempt to start phase config whereas Xauth failed\n");
838 confsource
= isakmp_cfg_config
.confsource
;
840 * If we have to fall back to a local
841 * configuration source, we will jump
842 * back to this point.
846 case INTERNAL_IP4_ADDRESS
:
848 case ISAKMP_CFG_CONF_LOCAL
:
849 if (isakmp_cfg_getport(iph1
) == -1) {
851 "Port pool depleted\n");
855 iph1
->mode_cfg
->addr4
.s_addr
=
856 htonl(ntohl(isakmp_cfg_config
.network4
)
857 + iph1
->mode_cfg
->port
);
858 iph1
->mode_cfg
->flags
|= ISAKMP_CFG_ADDR4_LOCAL
;
863 "Unexpected confsource\n");
866 return isakmp_cfg_addr4(iph1
,
867 attr
, &iph1
->mode_cfg
->addr4
.s_addr
);
870 case INTERNAL_IP4_NETMASK
:
872 case ISAKMP_CFG_CONF_LOCAL
:
873 iph1
->mode_cfg
->mask4
.s_addr
874 = isakmp_cfg_config
.netmask4
;
875 iph1
->mode_cfg
->flags
|= ISAKMP_CFG_MASK4_LOCAL
;
880 "Unexpected confsource\n");
882 return isakmp_cfg_addr4(iph1
, attr
,
883 &iph1
->mode_cfg
->mask4
.s_addr
);
886 case INTERNAL_IP4_DNS
:
887 return isakmp_cfg_addr4_list(iph1
,
888 attr
, &isakmp_cfg_config
.dns4
[0],
889 isakmp_cfg_config
.dns4_index
);
892 case INTERNAL_IP4_NBNS
:
893 return isakmp_cfg_addr4_list(iph1
,
894 attr
, &isakmp_cfg_config
.nbns4
[0],
895 isakmp_cfg_config
.nbns4_index
);
898 case INTERNAL_IP4_SUBNET
:
899 return isakmp_cfg_addr4(iph1
,
900 attr
, &isakmp_cfg_config
.network4
);
904 plog(ASL_LEVEL_ERR
, "Unexpected type %d\n", type
);
912 isakmp_cfg_void(iph1
, attr
)
913 phase1_handle_t
*iph1
;
914 struct isakmp_data
*attr
;
917 struct isakmp_data
*new;
919 if ((buffer
= vmalloc(sizeof(*attr
))) == NULL
) {
920 plog(ASL_LEVEL_ERR
, "Cannot allocate memory\n");
924 new = (struct isakmp_data
*)buffer
->v
;
926 new->type
= attr
->type
;
927 new->lorv
= htons(0);
934 isakmp_cfg_copy(iph1
, attr
)
935 phase1_handle_t
*iph1
;
936 struct isakmp_data
*attr
;
941 if ((ntohs(attr
->type
) & ISAKMP_GEN_MASK
) == ISAKMP_GEN_TLV
)
942 len
= ntohs(attr
->lorv
);
944 if ((buffer
= vmalloc(sizeof(*attr
) + len
)) == NULL
) {
945 plog(ASL_LEVEL_ERR
, "Cannot allocate memory\n");
949 memcpy(buffer
->v
, attr
, sizeof(*attr
) + ntohs(attr
->lorv
));
955 isakmp_cfg_short(iph1
, attr
, value
)
956 phase1_handle_t
*iph1
;
957 struct isakmp_data
*attr
;
961 struct isakmp_data
*new;
964 if ((buffer
= vmalloc(sizeof(*attr
))) == NULL
) {
965 plog(ASL_LEVEL_ERR
, "Cannot allocate memory\n");
969 new = (struct isakmp_data
*)buffer
->v
;
970 type
= ntohs(attr
->type
) & ~ISAKMP_GEN_MASK
;
972 new->type
= htons(type
| ISAKMP_GEN_TV
);
973 new->lorv
= htons(value
);
979 isakmp_cfg_varlen(iph1
, attr
, string
, len
)
980 phase1_handle_t
*iph1
;
981 struct isakmp_data
*attr
;
986 struct isakmp_data
*new;
989 if ((buffer
= vmalloc(sizeof(*attr
) + len
)) == NULL
) {
990 plog(ASL_LEVEL_ERR
, "Cannot allocate memory\n");
994 new = (struct isakmp_data
*)buffer
->v
;
996 new->type
= attr
->type
;
997 new->lorv
= htons(len
);
998 data
= (char *)(new + 1);
1000 memcpy(data
, string
, len
);
1005 isakmp_cfg_string(iph1
, attr
, string
)
1006 phase1_handle_t
*iph1
;
1007 struct isakmp_data
*attr
;
1010 size_t len
= strlen(string
);
1011 return isakmp_cfg_varlen(iph1
, attr
, string
, len
);
1015 isakmp_cfg_addr4(iph1
, attr
, addr
)
1016 phase1_handle_t
*iph1
;
1017 struct isakmp_data
*attr
;
1021 struct isakmp_data
*new;
1024 len
= sizeof(*addr
);
1025 if ((buffer
= vmalloc(sizeof(*attr
) + len
)) == NULL
) {
1026 plog(ASL_LEVEL_ERR
, "Cannot allocate memory\n");
1030 new = (struct isakmp_data
*)buffer
->v
;
1032 new->type
= attr
->type
;
1033 new->lorv
= htons(len
);
1034 memcpy(new + 1, addr
, len
);
1040 isakmp_cfg_addr4_list(iph1
, attr
, addr
, nbr
)
1041 phase1_handle_t
*iph1
;
1042 struct isakmp_data
*attr
;
1047 vchar_t
*buffer
= NULL
;
1048 vchar_t
*bufone
= NULL
;
1049 struct isakmp_data
*new;
1053 len
= sizeof(*addr
);
1054 if ((buffer
= vmalloc(0)) == NULL
) {
1055 plog(ASL_LEVEL_ERR
, "Cannot allocate memory\n");
1058 for(i
= 0; i
< nbr
; i
++) {
1059 if ((bufone
= vmalloc(sizeof(*attr
) + len
)) == NULL
) {
1061 "Cannot allocate memory\n");
1064 new = (struct isakmp_data
*)bufone
->v
;
1065 new->type
= attr
->type
;
1066 new->lorv
= htons(len
);
1067 memcpy(new + 1, &addr
[i
], len
);
1068 new += (len
+ sizeof(*attr
));
1069 buffer
= buffer_cat(buffer
, bufone
);
1076 if ((error
!= 0) && (buffer
!= NULL
)) {
1085 isakmp_cfg_newiv(iph1
, msgid
)
1086 phase1_handle_t
*iph1
;
1089 struct isakmp_cfg_state
*ics
= iph1
->mode_cfg
;
1093 "isakmp_cfg_newiv called without mode config state\n");
1097 if (ics
->ivm
!= NULL
)
1098 oakley_delivm(ics
->ivm
);
1100 ics
->ivm
= oakley_newiv2(iph1
, msgid
);
1101 ics
->last_msgid
= msgid
;
1106 /* Derived from isakmp_info_send_common */
1108 isakmp_cfg_send(iph1
, payload
, np
, flags
, new_exchange
, retry_count
, msg
)
1109 phase1_handle_t
*iph1
;
1117 phase2_handle_t
*iph2
= NULL
;
1118 vchar_t
*hash
= NULL
;
1119 struct isakmp
*isakmp
;
1120 struct isakmp_gen
*gen
;
1124 struct isakmp_cfg_state
*ics
= iph1
->mode_cfg
;
1126 /* Check if phase 1 is established */
1127 if ((!FSM_STATE_IS_ESTABLISHED(iph1
->status
)) ||
1128 (iph1
->local
== NULL
) ||
1129 (iph1
->remote
== NULL
)) {
1131 "ISAKMP mode config exchange with immature phase 1\n");
1135 /* add new entry to isakmp status table */
1136 iph2
= ike_session_newph2(ISAKMP_VERSION_NUMBER_IKEV1
, PHASE2_TYPE_CFG
);
1139 "failed to allocate ph2");
1143 iph2
->dst
= dupsaddr(iph1
->remote
);
1144 if (iph2
->dst
== NULL
) {
1146 "failed to duplicate remote address");
1147 ike_session_delph2(iph2
);
1150 iph2
->src
= dupsaddr(iph1
->local
);
1151 if (iph2
->src
== NULL
) {
1153 "failed to duplicate local address");
1154 ike_session_delph2(iph2
);
1158 switch (iph1
->remote
->ss_family
) {
1160 #if (!defined(ENABLE_NATT)) || (defined(BROKEN_NATT))
1161 ((struct sockaddr_in
*)iph2
->dst
)->sin_port
= 0;
1162 ((struct sockaddr_in
*)iph2
->src
)->sin_port
= 0;
1167 #if (!defined(ENABLE_NATT)) || (defined(BROKEN_NATT))
1168 ((struct sockaddr_in6
*)iph2
->dst
)->sin6_port
= 0;
1169 ((struct sockaddr_in6
*)iph2
->src
)->sin6_port
= 0;
1175 "invalid family: %d\n", iph1
->remote
->ss_family
);
1176 ike_session_delph2(iph2
);
1179 iph2
->side
= INITIATOR
;
1180 fsm_set_state(&iph2
->status
, IKEV1_STATE_INFO
);
1183 iph2
->msgid
= isakmp_newmsgid2(iph1
);
1185 iph2
->msgid
= iph1
->msgid
;
1187 /* get IV and HASH(1) if skeyid_a was generated. */
1188 if (iph1
->skeyid_a
!= NULL
) {
1190 if (isakmp_cfg_newiv(iph1
, iph2
->msgid
) == NULL
) {
1192 "failed to generate IV");
1193 ike_session_delph2(iph2
);
1198 /* generate HASH(1) */
1199 hash
= oakley_compute_hash1(iph1
, iph2
->msgid
, payload
);
1202 "failed to generate HASH");
1203 ike_session_delph2(iph2
);
1207 /* initialized total buffer length */
1209 tlen
+= sizeof(*gen
);
1211 /* IKE-SA is not established */
1214 /* initialized total buffer length */
1217 if ((flags
& ISAKMP_FLAG_A
) == 0)
1218 iph2
->flags
= (hash
== NULL
? 0 : ISAKMP_FLAG_E
);
1220 iph2
->flags
= (hash
== NULL
? 0 : ISAKMP_FLAG_A
);
1222 ike_session_link_ph2_to_ph1(iph1
, iph2
);
1224 tlen
+= sizeof(*isakmp
) + payload
->l
;
1226 /* create buffer for isakmp payload */
1227 iph2
->sendbuf
= vmalloc(tlen
);
1228 if (iph2
->sendbuf
== NULL
) {
1230 "failed to get buffer to send.\n");
1234 /* create isakmp header */
1235 isakmp
= (struct isakmp
*)iph2
->sendbuf
->v
;
1236 memcpy(&isakmp
->i_ck
, &iph1
->index
.i_ck
, sizeof(cookie_t
));
1237 memcpy(&isakmp
->r_ck
, &iph1
->index
.r_ck
, sizeof(cookie_t
));
1238 isakmp
->np
= hash
== NULL
? (np
& 0xff) : ISAKMP_NPTYPE_HASH
;
1239 isakmp
->v
= iph1
->version
;
1240 isakmp
->etype
= ISAKMP_ETYPE_CFG
;
1241 isakmp
->flags
= iph2
->flags
;
1242 memcpy(&isakmp
->msgid
, &iph2
->msgid
, sizeof(isakmp
->msgid
));
1243 isakmp
->len
= htonl(tlen
);
1244 p
= (char *)(isakmp
+ 1);
1246 /* create HASH payload */
1248 gen
= (struct isakmp_gen
*)p
;
1249 gen
->np
= np
& 0xff;
1250 gen
->len
= htons(sizeof(*gen
) + hash
->l
);
1252 memcpy(p
, hash
->v
, hash
->l
);
1257 memcpy(p
, payload
->v
, payload
->l
);
1260 #ifdef HAVE_PRINT_ISAKMP_C
1261 isakmp_printpacket(iph2
->sendbuf
, iph1
->local
, iph1
->remote
, 1);
1264 plog(ASL_LEVEL_DEBUG
, "MODE_CFG packet to send\n");
1267 if (ISSET(isakmp
->flags
, ISAKMP_FLAG_E
)) {
1270 tmp
= oakley_do_encrypt(iph1
, iph2
->sendbuf
,
1271 ics
->ivm
->ive
, ics
->ivm
->iv
);
1272 VPTRINIT(iph2
->sendbuf
);
1275 "failed to encrypt packet");
1278 iph2
->sendbuf
= tmp
;
1281 /* HDR*, HASH(1), ATTR */
1283 if (retry_count
> 0) {
1284 iph2
->retry_counter
= retry_count
;
1285 if (isakmp_ph2resend(iph2
) < 0) {
1287 "failed to resend packet");
1288 VPTRINIT(iph2
->sendbuf
);
1291 IPSECSESSIONTRACEREVENT(iph1
->parent_session
,
1292 IPSECSESSIONEVENTCODE_IKEV1_CFG_RETRANSMIT
,
1293 CONSTSTR("Mode-Config retransmit"),
1299 if (isakmp_send(iph2
->ph1
, iph2
->sendbuf
) < 0) {
1301 "failed to send packet");
1302 VPTRINIT(iph2
->sendbuf
);
1306 /* the sending message is added to the received-list. */
1307 if (ike_session_add_recvdpkt(iph1
->remote
, iph1
->local
, iph2
->sendbuf
, msg
,
1308 PH2_NON_ESP_EXTRA_LEN(iph2
, iph2
->sendbuf
), PH1_FRAG_FLAGS(iph1
)) == -1) {
1309 plog(ASL_LEVEL_ERR
,
1310 "failed to add a response packet to the tree.\n");
1314 plog(ASL_LEVEL_DEBUG
,
1315 "sendto mode config %s.\n", s_isakmp_nptype(np
));
1318 * XXX We might need to resend the message...
1322 VPTRINIT(iph2
->sendbuf
);
1324 IPSECSESSIONTRACEREVENT(iph1
->parent_session
,
1325 IPSECSESSIONEVENTCODE_IKE_PACKET_TX_SUCC
,
1326 CONSTSTR("Mode-Config message"),
1331 IPSECSESSIONTRACEREVENT(iph1
->parent_session
,
1332 IPSECSESSIONEVENTCODE_IKE_PACKET_TX_FAIL
,
1333 CONSTSTR("Mode-Config message"),
1334 CONSTSTR("Failed to transmit Mode-Config message"));
1336 ike_session_unlink_phase2(iph2
);
1345 isakmp_cfg_rmstate(phase1_handle_t
*iph1
)
1347 struct isakmp_cfg_state
**state
= &iph1
->mode_cfg
;
1353 if ((*state
)->flags
& ISAKMP_CFG_PORT_ALLOCATED
)
1354 isakmp_cfg_putport(iph1
, (*state
)->port
);
1356 /* Delete the IV if it's still there */
1358 oakley_delivm((*state
)->ivm
);
1359 (*state
)->ivm
= NULL
;
1362 /* Free any allocated splitnet lists */
1363 if((*state
)->split_include
!= NULL
)
1364 splitnet_list_free((*state
)->split_include
,
1365 &(*state
)->include_count
);
1366 if((*state
)->split_local
!= NULL
)
1367 splitnet_list_free((*state
)->split_local
,
1368 &(*state
)->local_count
);
1370 xauth_rmstate(&(*state
)->xauth
);
1372 if ((*state
)->attr_list
)
1373 vfree((*state
)->attr_list
);
1375 racoon_free((*state
));
1381 struct isakmp_cfg_state
*
1382 isakmp_cfg_mkstate(void)
1384 struct isakmp_cfg_state
*state
;
1386 if ((state
= racoon_malloc(sizeof(*state
))) == NULL
) {
1388 "Cannot allocate memory for mode config state\n");
1391 memset(state
, 0, sizeof(*state
));
1397 isakmp_cfg_getport(iph1
)
1398 phase1_handle_t
*iph1
;
1401 size_t size
= isakmp_cfg_config
.pool_size
;
1403 if (iph1
->mode_cfg
->flags
& ISAKMP_CFG_PORT_ALLOCATED
)
1404 return iph1
->mode_cfg
->port
;
1406 if (isakmp_cfg_config
.port_pool
== NULL
) {
1408 "isakmp_cfg_config.port_pool == NULL\n");
1412 for (i
= 0; i
< size
; i
++) {
1413 if (isakmp_cfg_config
.port_pool
[i
].used
== 0)
1419 "No more addresses available\n");
1423 isakmp_cfg_config
.port_pool
[i
].used
= 1;
1425 plog(ASL_LEVEL_INFO
, "Using port %d\n", i
);
1427 iph1
->mode_cfg
->flags
|= ISAKMP_CFG_PORT_ALLOCATED
;
1428 iph1
->mode_cfg
->port
= i
;
1434 isakmp_cfg_putport(iph1
, index
)
1435 phase1_handle_t
*iph1
;
1438 if (isakmp_cfg_config
.port_pool
== NULL
) {
1440 "isakmp_cfg_config.port_pool == NULL\n");
1444 if (isakmp_cfg_config
.port_pool
[index
].used
== 0) {
1446 "Attempt to release an unallocated address (port %d)\n",
1451 isakmp_cfg_config
.port_pool
[index
].used
= 0;
1452 iph1
->mode_cfg
->flags
&= ISAKMP_CFG_PORT_ALLOCATED
;
1454 plog(ASL_LEVEL_INFO
, "Released port %d\n", index
);
1461 isakmp_cfg_getconfig(iph1
)
1462 phase1_handle_t
*iph1
;
1465 struct isakmp_pl_attr
*attrpl
;
1466 struct isakmp_data
*attr
;
1468 vchar_t
*version
= NULL
;
1473 INTERNAL_IP4_ADDRESS
,
1474 INTERNAL_IP4_NETMASK
,
1477 INTERNAL_ADDRESS_EXPIRY
,
1478 APPLICATION_VERSION
,
1481 UNITY_SPLITDNS_NAME
,
1482 UNITY_SPLIT_INCLUDE
,
1486 attrcount
= sizeof(attrlist
) / sizeof(*attrlist
);
1487 len
= sizeof(*attrpl
) + sizeof(*attr
) * attrcount
;
1489 if (iph1
->started_by_api
) {
1490 if (iph1
->remote
->ss_family
== AF_INET
) {
1491 struct vpnctl_socket_elem
*sock_elem
;
1492 struct bound_addr
*bound_addr
;
1495 address
= ((struct sockaddr_in
*)iph1
->remote
)->sin_addr
.s_addr
;
1496 LIST_FOREACH(sock_elem
, &lcconf
->vpnctl_comm_socks
, chain
) {
1497 LIST_FOREACH(bound_addr
, &sock_elem
->bound_addresses
, chain
) {
1498 if (bound_addr
->address
== address
) {
1499 if ((version
= bound_addr
->version
))
1500 len
+= bound_addr
->version
->l
;
1508 if ((buffer
= vmalloc(len
)) == NULL
) {
1509 plog(ASL_LEVEL_ERR
, "Cannot allocate memory\n");
1513 attrpl
= (struct isakmp_pl_attr
*)buffer
->v
;
1514 attrpl
->h
.len
= htons(len
);
1515 attrpl
->type
= ISAKMP_CFG_REQUEST
;
1516 attrpl
->id
= htons((u_int16_t
)(eay_random() & 0xffff));
1518 attr
= (struct isakmp_data
*)(attrpl
+ 1);
1520 for (i
= 0; i
< attrcount
; i
++) {
1521 switch (attrlist
[i
]) {
1522 case APPLICATION_VERSION
:
1524 attr
->type
= htons(attrlist
[i
]);
1525 attr
->lorv
= htons(version
->l
);
1526 memcpy(attr
+ 1, version
->v
, version
->l
);
1527 attr
= (struct isakmp_data
*)(((char *)(attr
+ 1)) + version
->l
);
1529 } else /* fall thru */;
1531 attr
->type
= htons(attrlist
[i
]);
1532 attr
->lorv
= htons(0);
1538 plog(ASL_LEVEL_DEBUG
,
1539 "Sending MODE_CFG REQUEST\n");
1541 error
= isakmp_cfg_send(iph1
, buffer
,
1542 ISAKMP_NPTYPE_ATTR
, ISAKMP_FLAG_E
, 1, iph1
->rmconf
->retry_counter
, NULL
);
1546 IPSECLOGASLMSG("IPSec Network Configuration requested.\n");
1552 isakmp_cfg_getaddr4(attr
, ip
)
1553 struct isakmp_data
*attr
;
1556 size_t alen
= ntohs(attr
->lorv
);
1559 if (alen
!= sizeof(*ip
)) {
1560 plog(ASL_LEVEL_ERR
, "Bad IPv4 address len\n");
1564 addr
= ALIGNED_CAST(in_addr_t
*)(attr
+ 1); // Wcast-align fix (void*) - attr comes from packet data in a vchar_t
1571 isakmp_cfg_appendaddr4(attr
, ip
, num
, max
)
1572 struct isakmp_data
*attr
;
1577 size_t alen
= ntohs(attr
->lorv
);
1580 if (alen
!= sizeof(*ip
)) {
1581 plog(ASL_LEVEL_ERR
, "Bad IPv4 address len\n");
1585 plog(ASL_LEVEL_ERR
, "Too many addresses given\n");
1589 addr
= ALIGNED_CAST(in_addr_t
*)(attr
+ 1); // Wcast-align fix (void*) - attr comes from packet data in a vchar_t
1597 isakmp_cfg_getstring(attr
, str
)
1598 struct isakmp_data
*attr
;
1601 size_t alen
= ntohs(attr
->lorv
);
1603 src
= (char *)(attr
+ 1);
1605 memcpy(str
, src
, (alen
> MAXPATHLEN
? MAXPATHLEN
: alen
));
1613 isakmp_cfg_iplist_to_str(dest
, count
, addr
, withmask
)
1622 struct unity_network tmp
;
1623 for(i
= 0, p
= 0; i
< count
; i
++) {
1625 l
= sizeof(struct unity_network
);
1627 l
= sizeof(struct in_addr
);
1628 memcpy(&tmp
, addr
, l
);
1630 if((uint32_t)tmp
.addr4
.s_addr
== 0)
1633 inet_ntop(AF_INET
, &tmp
.addr4
, dest
+ p
, IP_MAX
);
1634 p
+= strlen(dest
+ p
);
1638 inet_ntop(AF_INET
, &tmp
.mask4
, dest
+ p
, IP_MAX
);
1639 p
+= strlen(dest
+ p
);
1651 isakmp_cfg_resize_pool(size
)
1654 struct isakmp_cfg_port
*new_pool
;
1658 if (size
== isakmp_cfg_config
.pool_size
)
1661 plog(ASL_LEVEL_INFO
,
1662 "Resize address pool from %zu to %d\n",
1663 isakmp_cfg_config
.pool_size
, size
);
1665 /* If a pool already exists, check if we can shrink it */
1666 if ((isakmp_cfg_config
.port_pool
!= NULL
) &&
1667 (size
< isakmp_cfg_config
.pool_size
)) {
1668 for (i
= isakmp_cfg_config
.pool_size
-1; i
>= size
; --i
) {
1669 if (isakmp_cfg_config
.port_pool
[i
].used
) {
1671 "resize pool from %zu to %d impossible "
1672 "port %d is in use\n",
1673 isakmp_cfg_config
.pool_size
, size
, i
);
1680 len
= size
* sizeof(*isakmp_cfg_config
.port_pool
);
1681 new_pool
= racoon_realloc(isakmp_cfg_config
.port_pool
, len
);
1682 if (new_pool
== NULL
) {
1684 "resize pool from %zu to %d impossible: %s",
1685 isakmp_cfg_config
.pool_size
, size
, strerror(errno
));
1689 /* If size increase, intialize correctly the new records */
1690 if (size
> isakmp_cfg_config
.pool_size
) {
1694 unit
= sizeof(*isakmp_cfg_config
.port_pool
);
1695 old_size
= isakmp_cfg_config
.pool_size
;
1697 bzero((char *)new_pool
+ (old_size
* unit
),
1698 (size
- old_size
) * unit
);
1701 isakmp_cfg_config
.port_pool
= new_pool
;
1702 isakmp_cfg_config
.pool_size
= size
;
1708 isakmp_cfg_init(cold
)
1716 isakmp_cfg_config
.network4
= (in_addr_t
)0x00000000;
1717 isakmp_cfg_config
.netmask4
= (in_addr_t
)0x00000000;
1718 for (i
= 0; i
< MAXNS
; i
++)
1719 isakmp_cfg_config
.dns4
[i
] = (in_addr_t
)0x00000000;
1720 isakmp_cfg_config
.dns4_index
= 0;
1721 for (i
= 0; i
< MAXWINS
; i
++)
1722 isakmp_cfg_config
.nbns4
[i
] = (in_addr_t
)0x00000000;
1723 isakmp_cfg_config
.nbns4_index
= 0;
1724 if (cold
!= ISAKMP_CFG_INIT_COLD
) {
1725 if (isakmp_cfg_config
.port_pool
) {
1726 racoon_free(isakmp_cfg_config
.port_pool
);
1729 isakmp_cfg_config
.port_pool
= NULL
;
1730 isakmp_cfg_config
.pool_size
= 0;
1731 isakmp_cfg_config
.authsource
= ISAKMP_CFG_AUTH_SYSTEM
;
1732 isakmp_cfg_config
.groupsource
= ISAKMP_CFG_GROUP_SYSTEM
;
1733 if (cold
!= ISAKMP_CFG_INIT_COLD
) {
1734 if (isakmp_cfg_config
.grouplist
!= NULL
) {
1735 for (i
= 0; i
< isakmp_cfg_config
.groupcount
; i
++)
1736 racoon_free(isakmp_cfg_config
.grouplist
[i
]);
1737 racoon_free(isakmp_cfg_config
.grouplist
);
1740 isakmp_cfg_config
.grouplist
= NULL
;
1741 isakmp_cfg_config
.groupcount
= 0;
1742 isakmp_cfg_config
.confsource
= ISAKMP_CFG_CONF_LOCAL
;
1743 isakmp_cfg_config
.accounting
= ISAKMP_CFG_ACCT_NONE
;
1744 isakmp_cfg_config
.auth_throttle
= THROTTLE_PENALTY
;
1745 strlcpy(isakmp_cfg_config
.default_domain
, ISAKMP_CFG_DEFAULT_DOMAIN
,
1746 sizeof(isakmp_cfg_config
.default_domain
));
1747 strlcpy(isakmp_cfg_config
.motd
, ISAKMP_CFG_MOTD
, sizeof(isakmp_cfg_config
.motd
));
1749 if (cold
!= ISAKMP_CFG_INIT_COLD
)
1750 if (isakmp_cfg_config
.splitnet_list
!= NULL
)
1751 splitnet_list_free(isakmp_cfg_config
.splitnet_list
,
1752 &isakmp_cfg_config
.splitnet_count
);
1753 isakmp_cfg_config
.splitnet_list
= NULL
;
1754 isakmp_cfg_config
.splitnet_count
= 0;
1755 isakmp_cfg_config
.splitnet_type
= 0;
1757 isakmp_cfg_config
.pfs_group
= 0;
1758 isakmp_cfg_config
.save_passwd
= 0;
1760 if (cold
!= ISAKMP_CFG_INIT_COLD
)
1761 if (isakmp_cfg_config
.splitdns_list
!= NULL
)
1762 racoon_free(isakmp_cfg_config
.splitdns_list
);
1763 isakmp_cfg_config
.splitdns_list
= NULL
;
1764 isakmp_cfg_config
.splitdns_len
= 0;
1767 if (cold
== ISAKMP_CFG_INIT_COLD
) {
1768 if ((error
= isakmp_cfg_resize_pool(ISAKMP_CFG_MAX_CNX
)) != 0)