isakmp_cfg.c revision 981eda8baa70ed21c0db173d4a5d2d7fe12e4212
1c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh/* $NetBSD: isakmp_cfg.c,v 1.12.6.4 2008/11/27 15:25:20 vanhu Exp $ */ 20a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 30a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* Id: isakmp_cfg.c,v 1.55 2006/08/22 18:17:17 manubsd Exp */ 40a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 50a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* 60a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * Copyright (C) 2004-2006 Emmanuel Dreyfus 70a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * All rights reserved. 80a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * 90a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * Redistribution and use in source and binary forms, with or without 100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * modification, are permitted provided that the following conditions 110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * are met: 120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * 1. Redistributions of source code must retain the above copyright 130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * notice, this list of conditions and the following disclaimer. 140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * 2. Redistributions in binary form must reproduce the above copyright 150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * notice, this list of conditions and the following disclaimer in the 160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * documentation and/or other materials provided with the distribution. 170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * 3. Neither the name of the project nor the names of its contributors 180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * may be used to endorse or promote products derived from this software 190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * without specific prior written permission. 200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * 210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND 220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE 250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * SUCH DAMAGE. 320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang */ 330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "config.h" 350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <sys/types.h> 370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <sys/param.h> 380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <sys/socket.h> 390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <sys/queue.h> 400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 41514ffe2b8b4236d53f584fcd8382dd65bc4df532Chia-chi Yeh#ifndef ANDROID_PATCHED 42c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh#include <utmp.h> 43514ffe2b8b4236d53f584fcd8382dd65bc4df532Chia-chi Yeh#endif 440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#if defined(__APPLE__) && defined(__MACH__) 450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <util.h> 460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif 470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifdef __FreeBSD__ 490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang# include <libutil.h> 500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif 510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifdef __NetBSD__ 520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang# include <util.h> 530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif 540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <netinet/in.h> 560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <arpa/inet.h> 570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <stdlib.h> 590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <stdio.h> 600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <string.h> 610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <errno.h> 620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#if TIME_WITH_SYS_TIME 630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang# include <sys/time.h> 640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang# include <time.h> 650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#else 660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang# if HAVE_SYS_TIME_H 670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang# include <sys/time.h> 680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang# else 690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang# include <time.h> 700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang# endif 710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif 720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <netdb.h> 730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifdef HAVE_UNISTD_H 740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <unistd.h> 750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif 760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#if HAVE_STDINT_H 770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <stdint.h> 780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif 790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <ctype.h> 800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <resolv.h> 810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifdef HAVE_LIBRADIUS 830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <sys/utsname.h> 840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <radlib.h> 850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif 860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "var.h" 880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "misc.h" 890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "vmbuf.h" 900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "plog.h" 910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "sockmisc.h" 920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "schedule.h" 930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "debug.h" 940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "isakmp_var.h" 960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "isakmp.h" 970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "handler.h" 980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "evt.h" 990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "throttle.h" 1000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "remoteconf.h" 1010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "crypto_openssl.h" 1020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "isakmp_inf.h" 1030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "isakmp_xauth.h" 1040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "isakmp_unity.h" 1050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "isakmp_cfg.h" 1060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "strnames.h" 1070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "admin.h" 1080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "privsep.h" 1090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstruct isakmp_cfg_config isakmp_cfg_config; 1110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t *buffer_cat(vchar_t *s, vchar_t *append); 1130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t *isakmp_cfg_net(struct ph1handle *, struct isakmp_data *); 1140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#if 0 1150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t *isakmp_cfg_void(struct ph1handle *, struct isakmp_data *); 1160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif 1170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t *isakmp_cfg_addr4(struct ph1handle *, 1180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct isakmp_data *, in_addr_t *); 1190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic void isakmp_cfg_getaddr4(struct isakmp_data *, struct in_addr *); 1200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t *isakmp_cfg_addr4_list(struct ph1handle *, 1210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct isakmp_data *, in_addr_t *, int); 1220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic void isakmp_cfg_appendaddr4(struct isakmp_data *, 1230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct in_addr *, int *, int); 1240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic void isakmp_cfg_getstring(struct isakmp_data *,char *); 1250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvoid isakmp_cfg_iplist_to_str(char *, int, void *, int); 1260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#define ISAKMP_CFG_LOGIN 1 1280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#define ISAKMP_CFG_LOGOUT 2 1290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic int isakmp_cfg_accounting(struct ph1handle *, int); 1300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifdef HAVE_LIBRADIUS 1310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic int isakmp_cfg_accounting_radius(struct ph1handle *, int); 1320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif 1330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* 1350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * Handle an ISAKMP config mode packet 1360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * We expect HDR, HASH, ATTR 1370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang */ 1380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvoid 1390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangisakmp_cfg_r(iph1, msg) 1400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct ph1handle *iph1; 1410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vchar_t *msg; 1420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 1430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct isakmp *packet; 1440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct isakmp_gen *ph; 1450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int tlen; 1460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char *npp; 1470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int np; 1480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vchar_t *dmsg; 1490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct isakmp_ivm *ivm; 1500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* Check that the packet is long enough to have a header */ 1520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (msg->l < sizeof(*packet)) { 1530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, "Unexpected short packet\n"); 1540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return; 1550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 1560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang packet = (struct isakmp *)msg->v; 1580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* Is it encrypted? It should be encrypted */ 1600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if ((packet->flags & ISAKMP_FLAG_E) == 0) { 1610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, 1620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "User credentials sent in cleartext!\n"); 1630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return; 1640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 1650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* 1670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * Decrypt the packet. If this is the beginning of a new 1680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * exchange, reinitialize the IV 1690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang */ 1700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (iph1->mode_cfg->ivm == NULL || 1710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang iph1->mode_cfg->last_msgid != packet->msgid ) 1720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang iph1->mode_cfg->ivm = 1730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang isakmp_cfg_newiv(iph1, packet->msgid); 1740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang ivm = iph1->mode_cfg->ivm; 1750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang dmsg = oakley_do_decrypt(iph1, msg, ivm->iv, ivm->ive); 1770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (dmsg == NULL) { 1780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, 1790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "failed to decrypt message\n"); 1800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return; 1810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 1820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_DEBUG, LOCATION, NULL, "MODE_CFG packet\n"); 1840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plogdump(LLV_DEBUG, dmsg->v, dmsg->l); 1850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* Now work with the decrypted packet */ 1870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang packet = (struct isakmp *)dmsg->v; 1880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang tlen = dmsg->l - sizeof(*packet); 1890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang ph = (struct isakmp_gen *)(packet + 1); 1900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang np = packet->np; 1920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang while ((tlen > 0) && (np != ISAKMP_NPTYPE_NONE)) { 1930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* Check that the payload header fits in the packet */ 1940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (tlen < sizeof(*ph)) { 1950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_WARNING, LOCATION, NULL, 1960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "Short payload header\n"); 1970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang goto out; 1980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 1990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* Check that the payload fits in the packet */ 2010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (tlen < ntohs(ph->len)) { 2020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_WARNING, LOCATION, NULL, 2030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "Short payload\n"); 2040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang goto out; 2050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 2060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_DEBUG, LOCATION, NULL, "Seen payload %d\n", np); 2080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plogdump(LLV_DEBUG, ph, ntohs(ph->len)); 2090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang switch(np) { 2110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case ISAKMP_NPTYPE_HASH: { 2120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vchar_t *check; 2130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vchar_t *payload; 2140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang size_t plen; 2150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct isakmp_gen *nph; 2160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plen = ntohs(ph->len); 2180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang nph = (struct isakmp_gen *)((char *)ph + plen); 2190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plen = ntohs(nph->len); 2200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if ((payload = vmalloc(plen)) == NULL) { 2220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, 2230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "Cannot allocate memory\n"); 2240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang goto out; 2250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 2260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang memcpy(payload->v, nph, plen); 2270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if ((check = oakley_compute_hash1(iph1, 2290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang packet->msgid, payload)) == NULL) { 2300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, 2310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "Cannot compute hash\n"); 2320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vfree(payload); 2330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang goto out; 2340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 2350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (memcmp(ph + 1, check->v, check->l) != 0) { 2370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, 2380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "Hash verification failed\n"); 2390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vfree(payload); 2400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vfree(check); 2410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang goto out; 2420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 2430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vfree(payload); 2440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vfree(check); 2450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 2460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 2470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case ISAKMP_NPTYPE_ATTR: { 2480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct isakmp_pl_attr *attrpl; 2490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang attrpl = (struct isakmp_pl_attr *)ph; 2510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang isakmp_cfg_attr_r(iph1, packet->msgid, attrpl); 2520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 2540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 2550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang default: 2560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_WARNING, LOCATION, NULL, 2570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "Unexpected next payload %d\n", np); 2580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* Skip to the next payload */ 2590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 2600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 2610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* Move to the next payload */ 2630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang np = ph->np; 2640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang tlen -= ntohs(ph->len); 2650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang npp = (char *)ph; 2660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang ph = (struct isakmp_gen *)(npp + ntohs(ph->len)); 2670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 2680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangout: 2700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vfree(dmsg); 2710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 2720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangint 2740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangisakmp_cfg_attr_r(iph1, msgid, attrpl) 2750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct ph1handle *iph1; 2760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang u_int32_t msgid; 2770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct isakmp_pl_attr *attrpl; 2780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 2790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int type = attrpl->type; 2800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_DEBUG, LOCATION, NULL, 2820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "Configuration exchange type %s\n", s_isakmp_cfg_ptype(type)); 2830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang switch (type) { 2840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case ISAKMP_CFG_ACK: 2850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* ignore, but this is the time to reinit the IV */ 2860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang oakley_delivm(iph1->mode_cfg->ivm); 2870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang iph1->mode_cfg->ivm = NULL; 2880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return 0; 2890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 2900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case ISAKMP_CFG_REPLY: 2920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return isakmp_cfg_reply(iph1, attrpl); 2930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 2940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case ISAKMP_CFG_REQUEST: 2960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang iph1->msgid = msgid; 2970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return isakmp_cfg_request(iph1, attrpl); 2980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 2990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 3000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case ISAKMP_CFG_SET: 3010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang iph1->msgid = msgid; 3020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return isakmp_cfg_set(iph1, attrpl); 3030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 3040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 3050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang default: 3060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_WARNING, LOCATION, NULL, 3070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "Unepected configuration exchange type %d\n", type); 3080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return -1; 3090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 3100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 3110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 3120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return 0; 3130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 3140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 3150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangint 3160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangisakmp_cfg_reply(iph1, attrpl) 3170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct ph1handle *iph1; 3180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct isakmp_pl_attr *attrpl; 3190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 3200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct isakmp_data *attr; 3210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int tlen; 3220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang size_t alen; 3230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char *npp; 3240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int type; 3250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct sockaddr_in *sin; 3260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int error; 3270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 3280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang tlen = ntohs(attrpl->h.len); 3290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang attr = (struct isakmp_data *)(attrpl + 1); 3300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang tlen -= sizeof(*attrpl); 3310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 3320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang while (tlen > 0) { 3330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang type = ntohs(attr->type); 3340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 3350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* Handle short attributes */ 3360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if ((type & ISAKMP_GEN_MASK) == ISAKMP_GEN_TV) { 3370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang type &= ~ISAKMP_GEN_MASK; 3380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 3390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_DEBUG, LOCATION, NULL, 3400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "Short attribute %s = %d\n", 3410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang s_isakmp_cfg_type(type), ntohs(attr->lorv)); 3420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 3430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang switch (type) { 3440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case XAUTH_TYPE: 3450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if ((error = xauth_attr_reply(iph1, 3460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang attr, ntohs(attrpl->id))) != 0) 3470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return error; 3480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 3490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 3500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang default: 3510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_WARNING, LOCATION, NULL, 3520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "Ignored short attribute %s\n", 3530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang s_isakmp_cfg_type(type)); 3540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 3550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 3560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 3570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang tlen -= sizeof(*attr); 3580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang attr++; 3590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang continue; 3600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 3610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 3620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang type = ntohs(attr->type); 3630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang alen = ntohs(attr->lorv); 3640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 3650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* Check that the attribute fit in the packet */ 3660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (tlen < alen) { 3670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, 3680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "Short attribute %s\n", 3690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang s_isakmp_cfg_type(type)); 3700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return -1; 3710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 3720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 3730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_DEBUG, LOCATION, NULL, 3740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "Attribute %s, len %zu\n", 3750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang s_isakmp_cfg_type(type), alen); 3760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 3770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang switch(type) { 3780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case XAUTH_TYPE: 3790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case XAUTH_USER_NAME: 3800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case XAUTH_USER_PASSWORD: 3810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case XAUTH_PASSCODE: 3820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case XAUTH_MESSAGE: 3830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case XAUTH_CHALLENGE: 3840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case XAUTH_DOMAIN: 3850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case XAUTH_STATUS: 3860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case XAUTH_NEXT_PIN: 3870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case XAUTH_ANSWER: 3880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if ((error = xauth_attr_reply(iph1, 3890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang attr, ntohs(attrpl->id))) != 0) 3900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return error; 3910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 3920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case INTERNAL_IP4_ADDRESS: 3930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang isakmp_cfg_getaddr4(attr, &iph1->mode_cfg->addr4); 3940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang iph1->mode_cfg->flags |= ISAKMP_CFG_GOT_ADDR4; 3950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 3960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case INTERNAL_IP4_NETMASK: 3970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang isakmp_cfg_getaddr4(attr, &iph1->mode_cfg->mask4); 3980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang iph1->mode_cfg->flags |= ISAKMP_CFG_GOT_MASK4; 3990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 4000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case INTERNAL_IP4_DNS: 4010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang isakmp_cfg_appendaddr4(attr, 4020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang &iph1->mode_cfg->dns4[iph1->mode_cfg->dns4_index], 4030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang &iph1->mode_cfg->dns4_index, MAXNS); 4040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang iph1->mode_cfg->flags |= ISAKMP_CFG_GOT_DNS4; 4050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 4060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case INTERNAL_IP4_NBNS: 4070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang isakmp_cfg_appendaddr4(attr, 4080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang &iph1->mode_cfg->wins4[iph1->mode_cfg->wins4_index], 4090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang &iph1->mode_cfg->wins4_index, MAXNS); 4100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang iph1->mode_cfg->flags |= ISAKMP_CFG_GOT_WINS4; 4110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 4120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case UNITY_DEF_DOMAIN: 4130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang isakmp_cfg_getstring(attr, 4140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang iph1->mode_cfg->default_domain); 4150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang iph1->mode_cfg->flags |= ISAKMP_CFG_GOT_DEFAULT_DOMAIN; 4160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 4170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case UNITY_SPLIT_INCLUDE: 4180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case UNITY_LOCAL_LAN: 4190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case UNITY_SPLITDNS_NAME: 4200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case UNITY_BANNER: 4210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case UNITY_SAVE_PASSWD: 4220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case UNITY_NATT_PORT: 4230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case UNITY_PFS: 4240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case UNITY_FW_TYPE: 4250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case UNITY_BACKUP_SERVERS: 4260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case UNITY_DDNS_HOSTNAME: 4270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang isakmp_unity_reply(iph1, attr); 4280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 4290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case INTERNAL_IP4_SUBNET: 4300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case INTERNAL_ADDRESS_EXPIRY: 4310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang default: 4320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_WARNING, LOCATION, NULL, 4330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "Ignored attribute %s\n", 4340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang s_isakmp_cfg_type(type)); 4350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 4360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 4370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 4380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang npp = (char *)attr; 4390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang attr = (struct isakmp_data *)(npp + sizeof(*attr) + alen); 4400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang tlen -= (sizeof(*attr) + alen); 4410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 4420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 4430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* 4440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * Call the SA up script hook now that we have the configuration 4450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * It is done at the end of phase 1 if ISAKMP mode config is not 4460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * requested. 4470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang */ 4480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 4490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if ((iph1->status == PHASE1ST_ESTABLISHED) && 4500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang iph1->rmconf->mode_cfg) { 451c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh switch (AUTHMETHOD(iph1)) { 452c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh case FICTIVE_AUTH_METHOD_XAUTH_PSKEY_I: 4530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_I: 4540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* Unimplemented */ 4550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_I: 4560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_I: 4570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_I: 4580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAENC_I: 4590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAREV_I: 4600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang script_hook(iph1, SCRIPT_PHASE1_UP); 4610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 4620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang default: 4630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 4640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 4650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 4660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 4670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 4680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifdef ENABLE_ADMINPORT 4690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang { 4700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vchar_t *buf; 4710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 4720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang alen = ntohs(attrpl->h.len) - sizeof(*attrpl); 4730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if ((buf = vmalloc(alen)) == NULL) { 4740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_WARNING, LOCATION, NULL, 4750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "Cannot allocate memory: %s\n", strerror(errno)); 4760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } else { 4770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang memcpy(buf->v, attrpl + 1, buf->l); 478c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh EVT_PUSH(iph1->local, iph1->remote, 479c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh EVTT_ISAKMP_CFG_DONE, buf); 4800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vfree(buf); 4810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 4820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 4830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif 4840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 4850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return 0; 4860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 4870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 4880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangint 4890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangisakmp_cfg_request(iph1, attrpl) 4900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct ph1handle *iph1; 4910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct isakmp_pl_attr *attrpl; 4920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 4930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct isakmp_data *attr; 4940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int tlen; 4950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang size_t alen; 4960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char *npp; 4970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vchar_t *payload; 4980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct isakmp_pl_attr *reply; 4990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vchar_t *reply_attr; 5000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int type; 5010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int error = -1; 5020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 5030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if ((payload = vmalloc(sizeof(*reply))) == NULL) { 5040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, "Cannot allocate memory\n"); 5050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return -1; 5060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 5070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang memset(payload->v, 0, sizeof(*reply)); 5080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 5090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang tlen = ntohs(attrpl->h.len); 5100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang attr = (struct isakmp_data *)(attrpl + 1); 5110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang tlen -= sizeof(*attrpl); 5120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 5130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang while (tlen > 0) { 5140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang reply_attr = NULL; 5150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang type = ntohs(attr->type); 5160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 5170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* Handle short attributes */ 5180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if ((type & ISAKMP_GEN_MASK) == ISAKMP_GEN_TV) { 5190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang type &= ~ISAKMP_GEN_MASK; 5200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 5210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_DEBUG, LOCATION, NULL, 5220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "Short attribute %s = %d\n", 5230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang s_isakmp_cfg_type(type), ntohs(attr->lorv)); 5240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 5250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang switch (type) { 5260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case XAUTH_TYPE: 5270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang reply_attr = isakmp_xauth_req(iph1, attr); 5280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 5290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang default: 5300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_WARNING, LOCATION, NULL, 5310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "Ignored short attribute %s\n", 5320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang s_isakmp_cfg_type(type)); 5330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 5340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 5350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 5360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang tlen -= sizeof(*attr); 5370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang attr++; 5380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 5390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (reply_attr != NULL) { 5400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang payload = buffer_cat(payload, reply_attr); 5410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vfree(reply_attr); 5420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 5430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 5440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang continue; 5450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 5460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 5470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang type = ntohs(attr->type); 5480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang alen = ntohs(attr->lorv); 5490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 5500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* Check that the attribute fit in the packet */ 5510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (tlen < alen) { 5520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, 5530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "Short attribute %s\n", 5540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang s_isakmp_cfg_type(type)); 5550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang goto end; 5560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 5570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 5580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_DEBUG, LOCATION, NULL, 5590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "Attribute %s, len %zu\n", 5600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang s_isakmp_cfg_type(type), alen); 5610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 5620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang switch(type) { 5630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case INTERNAL_IP4_ADDRESS: 5640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case INTERNAL_IP4_NETMASK: 5650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case INTERNAL_IP4_DNS: 5660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case INTERNAL_IP4_NBNS: 5670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case INTERNAL_IP4_SUBNET: 5680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang reply_attr = isakmp_cfg_net(iph1, attr); 5690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 5700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 5710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case XAUTH_TYPE: 5720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case XAUTH_USER_NAME: 5730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case XAUTH_USER_PASSWORD: 5740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case XAUTH_PASSCODE: 5750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case XAUTH_MESSAGE: 5760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case XAUTH_CHALLENGE: 5770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case XAUTH_DOMAIN: 5780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case XAUTH_STATUS: 5790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case XAUTH_NEXT_PIN: 5800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case XAUTH_ANSWER: 5810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang reply_attr = isakmp_xauth_req(iph1, attr); 5820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 5830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 5840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case APPLICATION_VERSION: 5850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang reply_attr = isakmp_cfg_string(iph1, 5860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang attr, ISAKMP_CFG_RACOON_VERSION); 5870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 5880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 5890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case UNITY_BANNER: 5900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case UNITY_PFS: 5910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case UNITY_SAVE_PASSWD: 5920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case UNITY_DEF_DOMAIN: 5930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case UNITY_DDNS_HOSTNAME: 5940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case UNITY_FW_TYPE: 5950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case UNITY_SPLITDNS_NAME: 5960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case UNITY_SPLIT_INCLUDE: 5970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case UNITY_LOCAL_LAN: 5980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case UNITY_NATT_PORT: 5990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case UNITY_BACKUP_SERVERS: 6000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang reply_attr = isakmp_unity_req(iph1, attr); 6010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 6020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 6030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case INTERNAL_ADDRESS_EXPIRY: 6040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang default: 6050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_WARNING, LOCATION, NULL, 6060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "Ignored attribute %s\n", 6070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang s_isakmp_cfg_type(type)); 6080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 6090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 6100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 6110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang npp = (char *)attr; 6120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang attr = (struct isakmp_data *)(npp + sizeof(*attr) + alen); 6130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang tlen -= (sizeof(*attr) + alen); 6140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 6150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (reply_attr != NULL) { 6160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang payload = buffer_cat(payload, reply_attr); 6170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vfree(reply_attr); 6180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 6190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 6200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 6210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 6220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang reply = (struct isakmp_pl_attr *)payload->v; 6230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang reply->h.len = htons(payload->l); 6240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang reply->type = ISAKMP_CFG_REPLY; 6250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang reply->id = attrpl->id; 6260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 6270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_DEBUG, LOCATION, NULL, 6280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "Sending MODE_CFG REPLY\n"); 6290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 6300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang error = isakmp_cfg_send(iph1, payload, 6310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang ISAKMP_NPTYPE_ATTR, ISAKMP_FLAG_E, 0); 6320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 6330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (iph1->status == PHASE1ST_ESTABLISHED) { 634c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh switch (AUTHMETHOD(iph1)) { 6350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case OAKLEY_ATTR_AUTH_METHOD_XAUTH_PSKEY_R: 6360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_R: 6370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* Unimplemented */ 6380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_R: 6390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_R: 6400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_R: 6410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAENC_R: 6420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAREV_R: 6430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang script_hook(iph1, SCRIPT_PHASE1_UP); 6440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 6450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang default: 6460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 6470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 6480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 6490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 6500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangend: 6510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vfree(payload); 6520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 6530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return error; 6540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 6550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 6560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangint 6570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangisakmp_cfg_set(iph1, attrpl) 6580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct ph1handle *iph1; 6590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct isakmp_pl_attr *attrpl; 6600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 6610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct isakmp_data *attr; 6620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int tlen; 6630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang size_t alen; 6640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char *npp; 6650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vchar_t *payload; 6660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct isakmp_pl_attr *reply; 6670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vchar_t *reply_attr; 6680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int type; 6690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int error = -1; 6700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 6710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if ((payload = vmalloc(sizeof(*reply))) == NULL) { 6720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, "Cannot allocate memory\n"); 6730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return -1; 6740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 6750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang memset(payload->v, 0, sizeof(*reply)); 6760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 6770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang tlen = ntohs(attrpl->h.len); 6780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang attr = (struct isakmp_data *)(attrpl + 1); 6790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang tlen -= sizeof(*attrpl); 6800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 6810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* 6820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * We should send ack for the attributes we accepted 6830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang */ 6840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang while (tlen > 0) { 6850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang reply_attr = NULL; 6860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang type = ntohs(attr->type); 6870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 6880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_DEBUG, LOCATION, NULL, 6890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "Attribute %s\n", 6900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang s_isakmp_cfg_type(type & ~ISAKMP_GEN_MASK)); 6910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 6920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang switch (type & ~ISAKMP_GEN_MASK) { 6930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case XAUTH_STATUS: 6940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang reply_attr = isakmp_xauth_set(iph1, attr); 6950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 6960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang default: 6970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_DEBUG, LOCATION, NULL, 6980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "Unexpected SET attribute %s\n", 6990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang s_isakmp_cfg_type(type & ~ISAKMP_GEN_MASK)); 7000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 7010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 7020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 7030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (reply_attr != NULL) { 7040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang payload = buffer_cat(payload, reply_attr); 7050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vfree(reply_attr); 7060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 7070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 7080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* 7090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * Move to next attribute. If we run out of the packet, 7100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * tlen becomes negative and we exit. 7110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang */ 7120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if ((type & ISAKMP_GEN_MASK) == ISAKMP_GEN_TV) { 7130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang tlen -= sizeof(*attr); 7140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang attr++; 7150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } else { 7160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang alen = ntohs(attr->lorv); 7170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang tlen -= (sizeof(*attr) + alen); 7180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang npp = (char *)attr; 7190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang attr = (struct isakmp_data *) 7200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang (npp + sizeof(*attr) + alen); 7210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 7220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 7230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 7240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang reply = (struct isakmp_pl_attr *)payload->v; 7250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang reply->h.len = htons(payload->l); 7260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang reply->type = ISAKMP_CFG_ACK; 7270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang reply->id = attrpl->id; 7280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 7290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_DEBUG, LOCATION, NULL, 7300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "Sending MODE_CFG ACK\n"); 7310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 7320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang error = isakmp_cfg_send(iph1, payload, 7330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang ISAKMP_NPTYPE_ATTR, ISAKMP_FLAG_E, 0); 7340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 7350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (iph1->mode_cfg->flags & ISAKMP_CFG_DELETE_PH1) { 736c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh if (iph1->status == PHASE1ST_ESTABLISHED) 7370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang isakmp_info_send_d1(iph1); 7380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang remph1(iph1); 7390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang delph1(iph1); 7400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang iph1 = NULL; 7410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 7420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangend: 7430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vfree(payload); 7440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 7450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* 7460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * If required, request ISAKMP mode config information 7470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang */ 7480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if ((iph1 != NULL) && (iph1->rmconf->mode_cfg) && (error == 0)) 7490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang error = isakmp_cfg_getconfig(iph1); 7500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 7510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return error; 7520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 7530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 7540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 7550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t * 7560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangbuffer_cat(s, append) 7570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vchar_t *s; 7580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vchar_t *append; 7590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 7600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vchar_t *new; 7610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 7620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang new = vmalloc(s->l + append->l); 7630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (new == NULL) { 7640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, 7650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "Cannot allocate memory\n"); 7660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return s; 7670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 7680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 7690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang memcpy(new->v, s->v, s->l); 7700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang memcpy(new->v + s->l, append->v, append->l); 7710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 7720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vfree(s); 7730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return new; 7740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 7750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 7760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t * 7770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangisakmp_cfg_net(iph1, attr) 7780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct ph1handle *iph1; 7790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct isakmp_data *attr; 7800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 7810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int type; 7820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int confsource; 7830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang in_addr_t addr4; 7840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 7850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang type = ntohs(attr->type); 7860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 7870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* 7880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * Don't give an address to a peer that did not succeed Xauth 7890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang */ 7900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (xauth_check(iph1) != 0) { 7910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, 7920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "Attempt to start phase config whereas Xauth failed\n"); 7930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return NULL; 7940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 7950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 7960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang confsource = isakmp_cfg_config.confsource; 7970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* 7980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * If we have to fall back to a local 7990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * configuration source, we will jump 8000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * back to this point. 8010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang */ 8020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangretry_source: 8030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 8040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang switch(type) { 8050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case INTERNAL_IP4_ADDRESS: 8060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang switch(confsource) { 8070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifdef HAVE_LIBLDAP 8080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case ISAKMP_CFG_CONF_LDAP: 8090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (iph1->mode_cfg->flags & ISAKMP_CFG_ADDR4_EXTERN) 8100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 8110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_INFO, LOCATION, NULL, 8120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "No IP from LDAP, using local pool\n"); 8130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* FALLTHROUGH */ 8140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang confsource = ISAKMP_CFG_CONF_LOCAL; 8150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang goto retry_source; 8160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif 8170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifdef HAVE_LIBRADIUS 8180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case ISAKMP_CFG_CONF_RADIUS: 8190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if ((iph1->mode_cfg->flags & ISAKMP_CFG_ADDR4_EXTERN) 8200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang && (iph1->mode_cfg->addr4.s_addr != htonl(-2))) 8210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* 8220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * -2 is 255.255.255.254, RADIUS uses that 8230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * to instruct the NAS to use a local pool 8240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang */ 8250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 8260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_INFO, LOCATION, NULL, 8270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "No IP from RADIUS, using local pool\n"); 8280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* FALLTHROUGH */ 8290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang confsource = ISAKMP_CFG_CONF_LOCAL; 8300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang goto retry_source; 8310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif 8320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case ISAKMP_CFG_CONF_LOCAL: 8330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (isakmp_cfg_getport(iph1) == -1) { 8340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, 8350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "Port pool depleted\n"); 8360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 8370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 8380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 8390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang iph1->mode_cfg->addr4.s_addr = 8400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang htonl(ntohl(isakmp_cfg_config.network4) 8410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang + iph1->mode_cfg->port); 8420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang iph1->mode_cfg->flags |= ISAKMP_CFG_ADDR4_LOCAL; 8430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 8440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 8450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang default: 8460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, 8470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "Unexpected confsource\n"); 8480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 8490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 8500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (isakmp_cfg_accounting(iph1, ISAKMP_CFG_LOGIN) != 0) 8510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, "Accounting failed\n"); 8520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 8530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return isakmp_cfg_addr4(iph1, 8540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang attr, &iph1->mode_cfg->addr4.s_addr); 8550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 8560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 8570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case INTERNAL_IP4_NETMASK: 8580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang switch(confsource) { 8590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifdef HAVE_LIBLDAP 8600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case ISAKMP_CFG_CONF_LDAP: 8610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (iph1->mode_cfg->flags & ISAKMP_CFG_MASK4_EXTERN) 8620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 8630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_INFO, LOCATION, NULL, 8640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "No mask from LDAP, using local pool\n"); 8650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* FALLTHROUGH */ 8660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang confsource = ISAKMP_CFG_CONF_LOCAL; 8670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang goto retry_source; 8680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif 8690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifdef HAVE_LIBRADIUS 8700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case ISAKMP_CFG_CONF_RADIUS: 8710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (iph1->mode_cfg->flags & ISAKMP_CFG_MASK4_EXTERN) 8720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 8730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_INFO, LOCATION, NULL, 8740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "No mask from RADIUS, using local pool\n"); 8750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* FALLTHROUGH */ 8760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang confsource = ISAKMP_CFG_CONF_LOCAL; 8770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang goto retry_source; 8780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif 8790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case ISAKMP_CFG_CONF_LOCAL: 8800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang iph1->mode_cfg->mask4.s_addr 8810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang = isakmp_cfg_config.netmask4; 8820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang iph1->mode_cfg->flags |= ISAKMP_CFG_MASK4_LOCAL; 8830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 8840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 8850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang default: 8860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, 8870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "Unexpected confsource\n"); 8880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 8890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return isakmp_cfg_addr4(iph1, attr, 8900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang &iph1->mode_cfg->mask4.s_addr); 8910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 8920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 8930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case INTERNAL_IP4_DNS: 8940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return isakmp_cfg_addr4_list(iph1, 8950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang attr, &isakmp_cfg_config.dns4[0], 8960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang isakmp_cfg_config.dns4_index); 8970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 8980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 8990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case INTERNAL_IP4_NBNS: 9000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return isakmp_cfg_addr4_list(iph1, 9010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang attr, &isakmp_cfg_config.nbns4[0], 9020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang isakmp_cfg_config.nbns4_index); 9030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 9040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 9050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case INTERNAL_IP4_SUBNET: 906c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh return isakmp_cfg_addr4(iph1, 907c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh attr, &isakmp_cfg_config.network4); 9080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 9090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 9100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang default: 9110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, "Unexpected type %d\n", type); 9120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 9130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 9140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return NULL; 9150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 9160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 9170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#if 0 9180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t * 9190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangisakmp_cfg_void(iph1, attr) 9200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct ph1handle *iph1; 9210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct isakmp_data *attr; 9220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 9230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vchar_t *buffer; 9240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct isakmp_data *new; 9250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 9260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if ((buffer = vmalloc(sizeof(*attr))) == NULL) { 9270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, "Cannot allocate memory\n"); 9280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return NULL; 9290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 9300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 9310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang new = (struct isakmp_data *)buffer->v; 9320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 9330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang new->type = attr->type; 9340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang new->lorv = htons(0); 9350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 9360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return buffer; 9370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 9380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif 9390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 9400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvchar_t * 9410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangisakmp_cfg_copy(iph1, attr) 9420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct ph1handle *iph1; 9430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct isakmp_data *attr; 9440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 9450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vchar_t *buffer; 9460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang size_t len = 0; 9470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 9480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if ((ntohs(attr->type) & ISAKMP_GEN_MASK) == ISAKMP_GEN_TLV) 9490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang len = ntohs(attr->lorv); 9500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 9510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if ((buffer = vmalloc(sizeof(*attr) + len)) == NULL) { 9520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, "Cannot allocate memory\n"); 9530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return NULL; 9540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 9550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 9560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang memcpy(buffer->v, attr, sizeof(*attr) + ntohs(attr->lorv)); 9570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 9580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return buffer; 9590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 9600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 9610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvchar_t * 9620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangisakmp_cfg_short(iph1, attr, value) 9630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct ph1handle *iph1; 9640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct isakmp_data *attr; 9650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int value; 9660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 9670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vchar_t *buffer; 9680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct isakmp_data *new; 9690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int type; 9700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 9710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if ((buffer = vmalloc(sizeof(*attr))) == NULL) { 9720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, "Cannot allocate memory\n"); 9730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return NULL; 9740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 9750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 9760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang new = (struct isakmp_data *)buffer->v; 9770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang type = ntohs(attr->type) & ~ISAKMP_GEN_MASK; 9780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 9790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang new->type = htons(type | ISAKMP_GEN_TV); 9800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang new->lorv = htons(value); 9810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 9820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return buffer; 9830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 9840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 9850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvchar_t * 9860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangisakmp_cfg_varlen(iph1, attr, string, len) 9870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct ph1handle *iph1; 9880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct isakmp_data *attr; 9890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char *string; 9900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang size_t len; 9910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 9920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vchar_t *buffer; 9930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct isakmp_data *new; 9940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char *data; 9950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 9960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if ((buffer = vmalloc(sizeof(*attr) + len)) == NULL) { 9970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, "Cannot allocate memory\n"); 9980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return NULL; 9990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 10000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 10010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang new = (struct isakmp_data *)buffer->v; 10020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 10030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang new->type = attr->type; 10040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang new->lorv = htons(len); 10050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang data = (char *)(new + 1); 10060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 10070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang memcpy(data, string, len); 10080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 10090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return buffer; 10100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 10110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvchar_t * 10120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangisakmp_cfg_string(iph1, attr, string) 10130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct ph1handle *iph1; 10140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct isakmp_data *attr; 10150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char *string; 10160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 10170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang size_t len = strlen(string); 10180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return isakmp_cfg_varlen(iph1, attr, string, len); 10190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 10200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 10210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t * 10220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangisakmp_cfg_addr4(iph1, attr, addr) 10230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct ph1handle *iph1; 10240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct isakmp_data *attr; 10250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang in_addr_t *addr; 10260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 10270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vchar_t *buffer; 10280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct isakmp_data *new; 10290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang size_t len; 10300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 10310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang len = sizeof(*addr); 10320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if ((buffer = vmalloc(sizeof(*attr) + len)) == NULL) { 10330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, "Cannot allocate memory\n"); 10340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return NULL; 10350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 10360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 10370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang new = (struct isakmp_data *)buffer->v; 10380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 10390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang new->type = attr->type; 10400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang new->lorv = htons(len); 10410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang memcpy(new + 1, addr, len); 10420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 10430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return buffer; 10440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 10450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 10460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t * 10470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangisakmp_cfg_addr4_list(iph1, attr, addr, nbr) 10480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct ph1handle *iph1; 10490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct isakmp_data *attr; 10500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang in_addr_t *addr; 10510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int nbr; 10520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 10530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int error = -1; 10540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vchar_t *buffer = NULL; 10550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vchar_t *bufone = NULL; 10560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct isakmp_data *new; 10570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang size_t len; 10580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int i; 10590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 10600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang len = sizeof(*addr); 10610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if ((buffer = vmalloc(0)) == NULL) { 10620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, "Cannot allocate memory\n"); 10630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang goto out; 10640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 10650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang for(i = 0; i < nbr; i++) { 10660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if ((bufone = vmalloc(sizeof(*attr) + len)) == NULL) { 10670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, 10680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "Cannot allocate memory\n"); 10690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang goto out; 10700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 10710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang new = (struct isakmp_data *)bufone->v; 10720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang new->type = attr->type; 10730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang new->lorv = htons(len); 10740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang memcpy(new + 1, &addr[i], len); 10750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang new += (len + sizeof(*attr)); 10760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang buffer = buffer_cat(buffer, bufone); 10770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vfree(bufone); 10780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 10790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 10800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang error = 0; 10810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 10820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangout: 10830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if ((error != 0) && (buffer != NULL)) { 10840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vfree(buffer); 10850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang buffer = NULL; 10860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 10870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 10880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return buffer; 10890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 10900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 10910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstruct isakmp_ivm * 10920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangisakmp_cfg_newiv(iph1, msgid) 10930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct ph1handle *iph1; 10940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang u_int32_t msgid; 10950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 10960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct isakmp_cfg_state *ics = iph1->mode_cfg; 10970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 10980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (ics == NULL) { 10990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, 11000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "isakmp_cfg_newiv called without mode config state\n"); 11010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return NULL; 11020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 11030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 11040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (ics->ivm != NULL) 11050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang oakley_delivm(ics->ivm); 11060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 11070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang ics->ivm = oakley_newiv2(iph1, msgid); 11080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang ics->last_msgid = msgid; 11090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 11100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return ics->ivm; 11110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 11120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 11130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* Derived from isakmp_info_send_common */ 11140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangint 11150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangisakmp_cfg_send(iph1, payload, np, flags, new_exchange) 11160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct ph1handle *iph1; 11170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vchar_t *payload; 11180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang u_int32_t np; 11190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int flags; 11200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int new_exchange; 11210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 11220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct ph2handle *iph2 = NULL; 11230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vchar_t *hash = NULL; 11240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct isakmp *isakmp; 11250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct isakmp_gen *gen; 11260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char *p; 11270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int tlen; 11280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int error = -1; 11290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct isakmp_cfg_state *ics = iph1->mode_cfg; 11300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 11310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* Check if phase 1 is established */ 1132c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh if ((iph1->status != PHASE1ST_ESTABLISHED) || 11330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang (iph1->local == NULL) || 11340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang (iph1->remote == NULL)) { 11350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, 11360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "ISAKMP mode config exchange with immature phase 1\n"); 11370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang goto end; 11380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 11390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 11400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* add new entry to isakmp status table */ 11410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang iph2 = newph2(); 11420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (iph2 == NULL) 11430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang goto end; 11440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 11450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang iph2->dst = dupsaddr(iph1->remote); 11460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (iph2->dst == NULL) { 11470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang delph2(iph2); 11480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang goto end; 11490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 11500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang iph2->src = dupsaddr(iph1->local); 11510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (iph2->src == NULL) { 11520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang delph2(iph2); 11530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang goto end; 11540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 11550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1156c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh#if (!defined(ENABLE_NATT)) || (defined(BROKEN_NATT)) 1157c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh if (set_port(iph2->dst, 0) == NULL || 1158c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh set_port(iph2->src, 0) == NULL) { 1159c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh plog(LLV_ERROR, LOCATION, NULL, 1160c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh "invalid family: %d\n", iph1->remote->sa_family); 1161c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh delph2(iph2); 1162c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh goto end; 1163c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh } 1164c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh#endif 1165c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh iph2->ph1 = iph1; 11660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang iph2->side = INITIATOR; 11670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang iph2->status = PHASE2ST_START; 11680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 11690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (new_exchange) 11700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang iph2->msgid = isakmp_newmsgid2(iph1); 11710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang else 11720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang iph2->msgid = iph1->msgid; 11730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 11740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* get IV and HASH(1) if skeyid_a was generated. */ 11750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (iph1->skeyid_a != NULL) { 11760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (new_exchange) { 11770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (isakmp_cfg_newiv(iph1, iph2->msgid) == NULL) { 11780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang delph2(iph2); 11790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang goto end; 11800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 11810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 11820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 11830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* generate HASH(1) */ 1184c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh hash = oakley_compute_hash1(iph2->ph1, iph2->msgid, payload); 11850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (hash == NULL) { 11860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang delph2(iph2); 11870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang goto end; 11880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 11890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 11900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* initialized total buffer length */ 11910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang tlen = hash->l; 11920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang tlen += sizeof(*gen); 11930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } else { 11940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* IKE-SA is not established */ 11950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang hash = NULL; 11960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 11970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* initialized total buffer length */ 11980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang tlen = 0; 11990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 12000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if ((flags & ISAKMP_FLAG_A) == 0) 12010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang iph2->flags = (hash == NULL ? 0 : ISAKMP_FLAG_E); 12020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang else 12030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang iph2->flags = (hash == NULL ? 0 : ISAKMP_FLAG_A); 12040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 12050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang insph2(iph2); 12060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang bindph12(iph1, iph2); 12070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 12080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang tlen += sizeof(*isakmp) + payload->l; 12090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 12100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* create buffer for isakmp payload */ 12110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang iph2->sendbuf = vmalloc(tlen); 12120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (iph2->sendbuf == NULL) { 12130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, 12140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "failed to get buffer to send.\n"); 12150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang goto err; 12160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 12170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 12180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* create isakmp header */ 12190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang isakmp = (struct isakmp *)iph2->sendbuf->v; 12200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang memcpy(&isakmp->i_ck, &iph1->index.i_ck, sizeof(cookie_t)); 12210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang memcpy(&isakmp->r_ck, &iph1->index.r_ck, sizeof(cookie_t)); 12220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang isakmp->np = hash == NULL ? (np & 0xff) : ISAKMP_NPTYPE_HASH; 12230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang isakmp->v = iph1->version; 12240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang isakmp->etype = ISAKMP_ETYPE_CFG; 12250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang isakmp->flags = iph2->flags; 12260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang memcpy(&isakmp->msgid, &iph2->msgid, sizeof(isakmp->msgid)); 12270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang isakmp->len = htonl(tlen); 12280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang p = (char *)(isakmp + 1); 12290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 12300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* create HASH payload */ 12310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (hash != NULL) { 12320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang gen = (struct isakmp_gen *)p; 12330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang gen->np = np & 0xff; 12340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang gen->len = htons(sizeof(*gen) + hash->l); 12350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang p += sizeof(*gen); 12360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang memcpy(p, hash->v, hash->l); 12370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang p += hash->l; 12380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 12390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 12400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* add payload */ 12410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang memcpy(p, payload->v, payload->l); 12420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang p += payload->l; 12430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 12440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifdef HAVE_PRINT_ISAKMP_C 12450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang isakmp_printpacket(iph2->sendbuf, iph1->local, iph1->remote, 1); 12460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif 12470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 12480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_DEBUG, LOCATION, NULL, "MODE_CFG packet to send\n"); 12490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plogdump(LLV_DEBUG, iph2->sendbuf->v, iph2->sendbuf->l); 12500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 12510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* encoding */ 12520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (ISSET(isakmp->flags, ISAKMP_FLAG_E)) { 12530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vchar_t *tmp; 12540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 12550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang tmp = oakley_do_encrypt(iph2->ph1, iph2->sendbuf, 12560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang ics->ivm->ive, ics->ivm->iv); 12570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang VPTRINIT(iph2->sendbuf); 12580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (tmp == NULL) 12590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang goto err; 12600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang iph2->sendbuf = tmp; 12610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 12620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 12630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* HDR*, HASH(1), ATTR */ 12640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (isakmp_send(iph2->ph1, iph2->sendbuf) < 0) { 12650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang VPTRINIT(iph2->sendbuf); 12660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang goto err; 12670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 12680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 12690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_DEBUG, LOCATION, NULL, 12700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "sendto mode config %s.\n", s_isakmp_nptype(np)); 12710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 12720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* 12730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * XXX We might need to resend the message... 12740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang */ 12750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 12760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang error = 0; 12770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang VPTRINIT(iph2->sendbuf); 12780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 12790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangerr: 12800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (iph2->sendbuf != NULL) 12810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vfree(iph2->sendbuf); 12820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1283c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh unbindph12(iph2); 12840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang remph2(iph2); 12850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang delph2(iph2); 12860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangend: 12870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (hash) 12880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vfree(hash); 12890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return error; 12900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 12910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 12920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 12930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvoid 12940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangisakmp_cfg_rmstate(iph1) 12950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct ph1handle *iph1; 12960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 12970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct isakmp_cfg_state *state = iph1->mode_cfg; 12980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 12990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (isakmp_cfg_accounting(iph1, ISAKMP_CFG_LOGOUT) != 0) 13000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, "Accounting failed\n"); 13010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 13020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (state->flags & ISAKMP_CFG_PORT_ALLOCATED) 13030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang isakmp_cfg_putport(iph1, state->port); 13040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 13050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* Delete the IV if it's still there */ 13060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if(iph1->mode_cfg->ivm) { 13070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang oakley_delivm(iph1->mode_cfg->ivm); 13080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang iph1->mode_cfg->ivm = NULL; 13090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 13100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 13110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* Free any allocated splitnet lists */ 13120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if(iph1->mode_cfg->split_include != NULL) 13130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang splitnet_list_free(iph1->mode_cfg->split_include, 13140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang &iph1->mode_cfg->include_count); 13150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if(iph1->mode_cfg->split_local != NULL) 13160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang splitnet_list_free(iph1->mode_cfg->split_local, 13170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang &iph1->mode_cfg->local_count); 13180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 13190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang xauth_rmstate(&state->xauth); 13200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 13210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang racoon_free(state); 13220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang iph1->mode_cfg = NULL; 13230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 13240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return; 13250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 13260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 13270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstruct isakmp_cfg_state * 13280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangisakmp_cfg_mkstate(void) 13290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 13300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct isakmp_cfg_state *state; 13310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 13320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if ((state = racoon_malloc(sizeof(*state))) == NULL) { 13330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, 13340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "Cannot allocate memory for mode config state\n"); 13350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return NULL; 13360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 13370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang memset(state, 0, sizeof(*state)); 13380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 13390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return state; 13400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 13410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 13420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangint 13430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangisakmp_cfg_getport(iph1) 13440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct ph1handle *iph1; 13450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 13460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang unsigned int i; 13470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang size_t size = isakmp_cfg_config.pool_size; 13480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 13490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (iph1->mode_cfg->flags & ISAKMP_CFG_PORT_ALLOCATED) 13500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return iph1->mode_cfg->port; 13510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 13520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (isakmp_cfg_config.port_pool == NULL) { 13530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, 13540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "isakmp_cfg_config.port_pool == NULL\n"); 13550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return -1; 13560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 13570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 13580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang for (i = 0; i < size; i++) { 13590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (isakmp_cfg_config.port_pool[i].used == 0) 13600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 13610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 13620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 13630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (i == size) { 13640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, 13650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "No more addresses available\n"); 13660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return -1; 13670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 13680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 13690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang isakmp_cfg_config.port_pool[i].used = 1; 13700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 13710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_INFO, LOCATION, NULL, "Using port %d\n", i); 13720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 13730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang iph1->mode_cfg->flags |= ISAKMP_CFG_PORT_ALLOCATED; 13740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang iph1->mode_cfg->port = i; 13750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 13760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return i; 13770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 13780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 13790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangint 13800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangisakmp_cfg_putport(iph1, index) 13810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct ph1handle *iph1; 13820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang unsigned int index; 13830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 13840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (isakmp_cfg_config.port_pool == NULL) { 13850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, 13860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "isakmp_cfg_config.port_pool == NULL\n"); 13870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return -1; 13880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 13890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 13900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (isakmp_cfg_config.port_pool[index].used == 0) { 13910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, 13920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "Attempt to release an unallocated address (port %d)\n", 13930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang index); 13940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return -1; 13950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 13960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 13970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifdef HAVE_LIBPAM 13980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* Cleanup PAM status associated with the port */ 13990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (isakmp_cfg_config.authsource == ISAKMP_CFG_AUTH_PAM) 14000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang privsep_cleanup_pam(index); 14010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif 14020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang isakmp_cfg_config.port_pool[index].used = 0; 14030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang iph1->mode_cfg->flags &= ISAKMP_CFG_PORT_ALLOCATED; 14040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 14050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_INFO, LOCATION, NULL, "Released port %d\n", index); 14060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 14070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return 0; 14080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 14090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 14100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifdef HAVE_LIBPAM 14110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvoid 14120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangcleanup_pam(port) 14130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int port; 14140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 14150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (isakmp_cfg_config.port_pool[port].pam != NULL) { 14160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang pam_end(isakmp_cfg_config.port_pool[port].pam, PAM_SUCCESS); 14170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang isakmp_cfg_config.port_pool[port].pam = NULL; 14180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 14190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 14200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return; 14210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 14220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif 14230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 14240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* Accounting, only for RADIUS or PAM */ 14250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic int 14260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangisakmp_cfg_accounting(iph1, inout) 14270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct ph1handle *iph1; 14280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int inout; 14290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 14300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifdef HAVE_LIBPAM 14310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (isakmp_cfg_config.accounting == ISAKMP_CFG_ACCT_PAM) 14320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return privsep_accounting_pam(iph1->mode_cfg->port, 14330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang inout); 14340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif 14350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifdef HAVE_LIBRADIUS 14360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (isakmp_cfg_config.accounting == ISAKMP_CFG_ACCT_RADIUS) 14370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return isakmp_cfg_accounting_radius(iph1, inout); 14380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif 14390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (isakmp_cfg_config.accounting == ISAKMP_CFG_ACCT_SYSTEM) 14400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return privsep_accounting_system(iph1->mode_cfg->port, 14410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang iph1->remote, iph1->mode_cfg->login, inout); 14420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return 0; 14430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 14440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 14450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifdef HAVE_LIBPAM 14460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangint 14470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangisakmp_cfg_accounting_pam(port, inout) 14480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int port; 14490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int inout; 14500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 14510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int error = 0; 14520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang pam_handle_t *pam; 14530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 14540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (isakmp_cfg_config.port_pool == NULL) { 14550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, 14560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "isakmp_cfg_config.port_pool == NULL\n"); 14570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return -1; 14580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 14590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 14600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang pam = isakmp_cfg_config.port_pool[port].pam; 14610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (pam == NULL) { 14620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, "pam handle is NULL\n"); 14630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return -1; 14640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 14650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 14660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang switch (inout) { 14670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case ISAKMP_CFG_LOGIN: 14680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang error = pam_open_session(pam, 0); 14690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 14700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case ISAKMP_CFG_LOGOUT: 14710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang error = pam_close_session(pam, 0); 14720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang pam_end(pam, error); 14730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang isakmp_cfg_config.port_pool[port].pam = NULL; 14740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 14750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang default: 14760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, "Unepected inout\n"); 14770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 14780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 14790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 14800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (error != 0) { 14810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, 14820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "pam_open_session/pam_close_session failed: %s\n", 14830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang pam_strerror(pam, error)); 14840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return -1; 14850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 14860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 14870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return 0; 14880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 14890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif /* HAVE_LIBPAM */ 14900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 14910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifdef HAVE_LIBRADIUS 14920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic int 14930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangisakmp_cfg_accounting_radius(iph1, inout) 14940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct ph1handle *iph1; 14950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int inout; 14960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 1497c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh /* For first time use, initialize Radius */ 1498c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh if (radius_acct_state == NULL) { 1499c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh if ((radius_acct_state = rad_acct_open()) == NULL) { 1500c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh plog(LLV_ERROR, LOCATION, NULL, 1501c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh "Cannot init librradius\n"); 1502c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh return -1; 1503c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh } 1504c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh 1505c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh if (rad_config(radius_acct_state, NULL) != 0) { 1506c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh plog(LLV_ERROR, LOCATION, NULL, 1507c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh "Cannot open librarius config file: %s\n", 1508c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh rad_strerror(radius_acct_state)); 1509c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh rad_close(radius_acct_state); 1510c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh radius_acct_state = NULL; 1511c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh return -1; 1512c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh } 1513c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh } 1514c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh 15150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (rad_create_request(radius_acct_state, 15160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang RAD_ACCOUNTING_REQUEST) != 0) { 15170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, 15180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "rad_create_request failed: %s\n", 15190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang rad_strerror(radius_acct_state)); 15200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return -1; 15210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 15220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 15230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (rad_put_string(radius_acct_state, RAD_USER_NAME, 15240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang iph1->mode_cfg->login) != 0) { 15250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, 15260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "rad_put_string failed: %s\n", 15270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang rad_strerror(radius_acct_state)); 15280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return -1; 15290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 15300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 15310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang switch (inout) { 15320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case ISAKMP_CFG_LOGIN: 15330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang inout = RAD_START; 15340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 15350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case ISAKMP_CFG_LOGOUT: 15360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang inout = RAD_STOP; 15370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 15380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang default: 15390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, "Unepected inout\n"); 15400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 15410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 15420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 15430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (rad_put_addr(radius_acct_state, 15440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang RAD_FRAMED_IP_ADDRESS, iph1->mode_cfg->addr4) != 0) { 15450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, 15460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "rad_put_addr failed: %s\n", 15470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang rad_strerror(radius_acct_state)); 15480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return -1; 15490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 15500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 15510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (rad_put_addr(radius_acct_state, 15520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang RAD_LOGIN_IP_HOST, iph1->mode_cfg->addr4) != 0) { 15530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, 15540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "rad_put_addr failed: %s\n", 15550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang rad_strerror(radius_acct_state)); 15560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return -1; 15570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 15580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 15590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (rad_put_int(radius_acct_state, RAD_ACCT_STATUS_TYPE, inout) != 0) { 15600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, 15610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "rad_put_int failed: %s\n", 15620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang rad_strerror(radius_acct_state)); 15630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return -1; 15640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 15650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 15660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (isakmp_cfg_radius_common(radius_acct_state, 15670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang iph1->mode_cfg->port) != 0) 15680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return -1; 15690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 15700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (rad_send_request(radius_acct_state) != RAD_ACCOUNTING_RESPONSE) { 15710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, 15720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "rad_send_request failed: %s\n", 15730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang rad_strerror(radius_acct_state)); 15740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return -1; 15750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 15760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 15770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return 0; 15780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 15790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif /* HAVE_LIBRADIUS */ 15800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 15810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* 15820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * Attributes common to all RADIUS requests 15830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang */ 15840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifdef HAVE_LIBRADIUS 15850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangint 15860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangisakmp_cfg_radius_common(radius_state, port) 15870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct rad_handle *radius_state; 15880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int port; 15890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 15900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct utsname name; 15910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang static struct hostent *host = NULL; 15920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct in_addr nas_addr; 15930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 15940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* 15950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * Find our own IP by resolving our nodename 15960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang */ 15970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (host == NULL) { 15980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (uname(&name) != 0) { 15990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, 16000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "uname failed: %s\n", strerror(errno)); 16010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return -1; 16020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 16030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 16040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if ((host = gethostbyname(name.nodename)) == NULL) { 16050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, 16060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "gethostbyname failed: %s\n", strerror(errno)); 16070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return -1; 16080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 16090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 16100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 16110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang memcpy(&nas_addr, host->h_addr, sizeof(nas_addr)); 16120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (rad_put_addr(radius_state, RAD_NAS_IP_ADDRESS, nas_addr) != 0) { 16130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, 16140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "rad_put_addr failed: %s\n", 16150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang rad_strerror(radius_state)); 16160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return -1; 16170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 16180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 16190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (rad_put_int(radius_state, RAD_NAS_PORT, port) != 0) { 16200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, 16210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "rad_put_int failed: %s\n", 16220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang rad_strerror(radius_state)); 16230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return -1; 16240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 16250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 16260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (rad_put_int(radius_state, RAD_NAS_PORT_TYPE, RAD_VIRTUAL) != 0) { 16270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, 16280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "rad_put_int failed: %s\n", 16290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang rad_strerror(radius_state)); 16300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return -1; 16310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 16320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 16330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (rad_put_int(radius_state, RAD_SERVICE_TYPE, RAD_FRAMED) != 0) { 16340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, 16350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "rad_put_int failed: %s\n", 16360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang rad_strerror(radius_state)); 16370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return -1; 16380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 16390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 16400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return 0; 16410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 16420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif 16430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1644514ffe2b8b4236d53f584fcd8382dd65bc4df532Chia-chi Yeh#ifndef ANDROID_PATCHED 1645514ffe2b8b4236d53f584fcd8382dd65bc4df532Chia-chi Yeh 16460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* 16470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang Logs the user into the utmp system files. 16480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang*/ 16490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 16500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangint 16510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangisakmp_cfg_accounting_system(port, raddr, usr, inout) 16520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int port; 16530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct sockaddr *raddr; 16540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char *usr; 16550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int inout; 16560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 16570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int error = 0; 1658c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh struct utmp ut; 1659c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh char term[UT_LINESIZE]; 16600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char addr[NI_MAXHOST]; 16610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 16620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (usr == NULL || usr[0]=='\0') { 16630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, 16640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "system accounting : no login found\n"); 16650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return -1; 16660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 16670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1668c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh sprintf(term, TERMSPEC, port); 16690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 16700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang switch (inout) { 16710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case ISAKMP_CFG_LOGIN: 1672c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh strncpy(ut.ut_name, usr, UT_NAMESIZE); 1673c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh ut.ut_name[UT_NAMESIZE - 1] = '\0'; 1674c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh 1675c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh strncpy(ut.ut_line, term, UT_LINESIZE); 1676c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh ut.ut_line[UT_LINESIZE - 1] = '\0'; 16770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 16780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang GETNAMEINFO_NULL(raddr, addr); 1679c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh strncpy(ut.ut_host, addr, UT_HOSTSIZE); 1680c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh ut.ut_host[UT_HOSTSIZE - 1] = '\0'; 16810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1682c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh ut.ut_time = time(NULL); 1683c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh 16840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_INFO, LOCATION, NULL, 16850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "Accounting : '%s' logging on '%s' from %s.\n", 1686c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh ut.ut_name, ut.ut_line, ut.ut_host); 16870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1688c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh login(&ut); 16890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 16900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 16910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case ISAKMP_CFG_LOGOUT: 16920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 16930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_INFO, LOCATION, NULL, 16940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "Accounting : '%s' unlogging from '%s'.\n", 1695c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh usr, term); 16960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1697c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh logout(term); 16980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 16990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 17000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang default: 17010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, "Unepected inout\n"); 17020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 17030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 17040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 17050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return 0; 17060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 17070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1708514ffe2b8b4236d53f584fcd8382dd65bc4df532Chia-chi Yeh#endif 1709514ffe2b8b4236d53f584fcd8382dd65bc4df532Chia-chi Yeh 17100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangint 17110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangisakmp_cfg_getconfig(iph1) 17120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct ph1handle *iph1; 17130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 17140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vchar_t *buffer; 17150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct isakmp_pl_attr *attrpl; 17160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct isakmp_data *attr; 17170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang size_t len; 17180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int error; 17190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int attrcount; 17200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int i; 17210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int attrlist[] = { 17220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang INTERNAL_IP4_ADDRESS, 17230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang INTERNAL_IP4_NETMASK, 17240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang INTERNAL_IP4_DNS, 17250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang INTERNAL_IP4_NBNS, 17260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang UNITY_BANNER, 17270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang UNITY_DEF_DOMAIN, 17280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang UNITY_SPLITDNS_NAME, 17290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang UNITY_SPLIT_INCLUDE, 17300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang UNITY_LOCAL_LAN, 17310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang APPLICATION_VERSION, 17320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang }; 17330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 17340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang attrcount = sizeof(attrlist) / sizeof(*attrlist); 17350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang len = sizeof(*attrpl) + sizeof(*attr) * attrcount; 17360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 17370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if ((buffer = vmalloc(len)) == NULL) { 17380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, "Cannot allocate memory\n"); 17390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return -1; 17400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 17410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 17420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang attrpl = (struct isakmp_pl_attr *)buffer->v; 17430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang attrpl->h.len = htons(len); 17440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang attrpl->type = ISAKMP_CFG_REQUEST; 17450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang attrpl->id = htons((u_int16_t)(eay_random() & 0xffff)); 17460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 17470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang attr = (struct isakmp_data *)(attrpl + 1); 17480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 17490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang for (i = 0; i < attrcount; i++) { 17500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang attr->type = htons(attrlist[i]); 17510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang attr->lorv = htons(0); 17520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang attr++; 17530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 17540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 17550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_DEBUG, LOCATION, NULL, 17560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "Sending MODE_CFG REQUEST\n"); 17570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 17580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang error = isakmp_cfg_send(iph1, buffer, 17590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang ISAKMP_NPTYPE_ATTR, ISAKMP_FLAG_E, 1); 17600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 17610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vfree(buffer); 17620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 17630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return error; 17640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 17650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 17660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic void 17670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangisakmp_cfg_getaddr4(attr, ip) 17680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct isakmp_data *attr; 17690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct in_addr *ip; 17700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 17710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang size_t alen = ntohs(attr->lorv); 17720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang in_addr_t *addr; 17730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 17740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (alen != sizeof(*ip)) { 17750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, "Bad IPv4 address len\n"); 17760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return; 17770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 17780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 17790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang addr = (in_addr_t *)(attr + 1); 17800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang ip->s_addr = *addr; 17810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 17820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return; 17830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 17840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 17850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic void 17860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangisakmp_cfg_appendaddr4(attr, ip, num, max) 17870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct isakmp_data *attr; 17880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct in_addr *ip; 17890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int *num; 17900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int max; 17910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 17920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang size_t alen = ntohs(attr->lorv); 17930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang in_addr_t *addr; 17940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 17950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (alen != sizeof(*ip)) { 17960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, "Bad IPv4 address len\n"); 17970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return; 17980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 17990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (*num == max) { 18000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, "Too many addresses given\n"); 18010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return; 18020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 18030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 18040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang addr = (in_addr_t *)(attr + 1); 18050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang ip->s_addr = *addr; 18060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang (*num)++; 18070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 18080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return; 18090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 18100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 18110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic void 18120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangisakmp_cfg_getstring(attr, str) 18130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct isakmp_data *attr; 18140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char *str; 18150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 18160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang size_t alen = ntohs(attr->lorv); 18170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char *src; 18180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang src = (char *)(attr + 1); 18190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 18200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang memcpy(str, src, (alen > MAXPATHLEN ? MAXPATHLEN : alen)); 18210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 18220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return; 18230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 18240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 18250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#define IP_MAX 40 18260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 18270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvoid 18280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangisakmp_cfg_iplist_to_str(dest, count, addr, withmask) 18290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char *dest; 18300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int count; 18310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang void *addr; 18320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int withmask; 18330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 18340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int i; 18350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int p; 18360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int l; 18370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct unity_network tmp; 18380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang for(i = 0, p = 0; i < count; i++) { 18390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if(withmask == 1) 18400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang l = sizeof(struct unity_network); 18410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang else 18420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang l = sizeof(struct in_addr); 18430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang memcpy(&tmp, addr, l); 18440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang addr += l; 18450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if((uint32_t)tmp.addr4.s_addr == 0) 18460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 18470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 18480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang inet_ntop(AF_INET, &tmp.addr4, dest + p, IP_MAX); 18490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang p += strlen(dest + p); 18500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if(withmask == 1) { 18510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang dest[p] = '/'; 18520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang p++; 18530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang inet_ntop(AF_INET, &tmp.mask4, dest + p, IP_MAX); 18540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang p += strlen(dest + p); 18550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 18560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang dest[p] = ' '; 18570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang p++; 18580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 18590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if(p > 0) 18600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang dest[p-1] = '\0'; 18610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang else 18620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang dest[0] = '\0'; 18630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 18640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 18650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangint 18660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangisakmp_cfg_setenv(iph1, envp, envc) 18670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct ph1handle *iph1; 18680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char ***envp; 18690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int *envc; 18700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 18710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char addrstr[IP_MAX]; 18720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char addrlist[IP_MAX * MAXNS + MAXNS]; 18730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char *splitlist = addrlist; 1874981eda8baa70ed21c0db173d4a5d2d7fe12e4212Chia-chi Yeh char *splitlist_cidr; 18750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char defdom[MAXPATHLEN + 1]; 18760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int cidr, tmp; 18770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char cidrstr[4]; 18780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int i, p; 18790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int test; 18800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 18810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_DEBUG, LOCATION, NULL, "Starting a script.\n"); 18820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 18830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* 18840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * Internal IPv4 address, either if 18850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * we are a client or a server. 18860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang */ 18870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if ((iph1->mode_cfg->flags & ISAKMP_CFG_GOT_ADDR4) || 18880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifdef HAVE_LIBLDAP 18890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang (iph1->mode_cfg->flags & ISAKMP_CFG_ADDR4_EXTERN) || 18900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif 18910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifdef HAVE_LIBRADIUS 18920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang (iph1->mode_cfg->flags & ISAKMP_CFG_ADDR4_EXTERN) || 18930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif 18940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang (iph1->mode_cfg->flags & ISAKMP_CFG_ADDR4_LOCAL)) { 18950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang inet_ntop(AF_INET, &iph1->mode_cfg->addr4, 18960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang addrstr, IP_MAX); 18970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } else 18980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang addrstr[0] = '\0'; 18990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 19000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (script_env_append(envp, envc, "INTERNAL_ADDR4", addrstr) != 0) { 19010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, "Cannot set INTERNAL_ADDR4\n"); 19020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return -1; 19030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 19040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 19050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (iph1->mode_cfg->xauth.authdata.generic.usr != NULL) { 19060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (script_env_append(envp, envc, "XAUTH_USER", 19070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang iph1->mode_cfg->xauth.authdata.generic.usr) != 0) { 19080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, 19090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "Cannot set XAUTH_USER\n"); 19100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return -1; 19110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 19120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 19130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 19140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* Internal IPv4 mask */ 19150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (iph1->mode_cfg->flags & ISAKMP_CFG_GOT_MASK4) 19160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang inet_ntop(AF_INET, &iph1->mode_cfg->mask4, 19170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang addrstr, IP_MAX); 19180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang else 19190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang addrstr[0] = '\0'; 19200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 19210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* 19220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * During several releases, documentation adverised INTERNAL_NETMASK4 19230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * while code was using INTERNAL_MASK4. We now do both. 19240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang */ 19250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 19260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (script_env_append(envp, envc, "INTERNAL_MASK4", addrstr) != 0) { 19270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, "Cannot set INTERNAL_MASK4\n"); 19280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return -1; 19290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 19300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 19310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (script_env_append(envp, envc, "INTERNAL_NETMASK4", addrstr) != 0) { 19320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, 19330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "Cannot set INTERNAL_NETMASK4\n"); 19340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return -1; 19350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 19360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 19370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang tmp = ntohl(iph1->mode_cfg->mask4.s_addr); 19380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang for (cidr = 0; tmp != 0; cidr++) 19390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang tmp <<= 1; 19400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang snprintf(cidrstr, 3, "%d", cidr); 19410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 19420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (script_env_append(envp, envc, "INTERNAL_CIDR4", cidrstr) != 0) { 19430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, "Cannot set INTERNAL_CIDR4\n"); 19440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return -1; 19450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 19460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 19470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* Internal IPv4 DNS */ 19480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (iph1->mode_cfg->flags & ISAKMP_CFG_GOT_DNS4) { 19490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* First Internal IPv4 DNS (for compatibilty with older code */ 19500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang inet_ntop(AF_INET, &iph1->mode_cfg->dns4[0], 19510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang addrstr, IP_MAX); 19520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 19530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* Internal IPv4 DNS - all */ 19540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang isakmp_cfg_iplist_to_str(addrlist, iph1->mode_cfg->dns4_index, 19550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang (void *)iph1->mode_cfg->dns4, 0); 19560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } else { 19570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang addrstr[0] = '\0'; 19580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang addrlist[0] = '\0'; 19590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 19600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 19610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (script_env_append(envp, envc, "INTERNAL_DNS4", addrstr) != 0) { 19620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, "Cannot set INTERNAL_DNS4\n"); 19630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return -1; 19640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 19650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (script_env_append(envp, envc, "INTERNAL_DNS4_LIST", addrlist) != 0) { 19660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, 19670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "Cannot set INTERNAL_DNS4_LIST\n"); 19680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return -1; 19690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 19700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 19710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* Internal IPv4 WINS */ 19720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (iph1->mode_cfg->flags & ISAKMP_CFG_GOT_WINS4) { 19730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* 19740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * First Internal IPv4 WINS 19750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * (for compatibilty with older code 19760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang */ 19770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang inet_ntop(AF_INET, &iph1->mode_cfg->wins4[0], 19780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang addrstr, IP_MAX); 19790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 19800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* Internal IPv4 WINS - all */ 19810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang isakmp_cfg_iplist_to_str(addrlist, iph1->mode_cfg->wins4_index, 19820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang (void *)iph1->mode_cfg->wins4, 0); 19830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } else { 19840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang addrstr[0] = '\0'; 19850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang addrlist[0] = '\0'; 19860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 19870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 19880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (script_env_append(envp, envc, "INTERNAL_WINS4", addrstr) != 0) { 19890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, 19900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "Cannot set INTERNAL_WINS4\n"); 19910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return -1; 19920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 19930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (script_env_append(envp, envc, 19940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "INTERNAL_WINS4_LIST", addrlist) != 0) { 19950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, 19960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "Cannot set INTERNAL_WINS4_LIST\n"); 19970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return -1; 19980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 19990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 20000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* Deault domain */ 20010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if(iph1->mode_cfg->flags & ISAKMP_CFG_GOT_DEFAULT_DOMAIN) 20020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang strncpy(defdom, 20030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang iph1->mode_cfg->default_domain, 20040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang MAXPATHLEN + 1); 20050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang else 20060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang defdom[0] = '\0'; 20070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 20080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (script_env_append(envp, envc, "DEFAULT_DOMAIN", defdom) != 0) { 20090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, 20100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "Cannot set DEFAULT_DOMAIN\n"); 20110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return -1; 20120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 20130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 20140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* Split networks */ 2015981eda8baa70ed21c0db173d4a5d2d7fe12e4212Chia-chi Yeh if (iph1->mode_cfg->flags & ISAKMP_CFG_GOT_SPLIT_INCLUDE) { 2016981eda8baa70ed21c0db173d4a5d2d7fe12e4212Chia-chi Yeh splitlist = 2017981eda8baa70ed21c0db173d4a5d2d7fe12e4212Chia-chi Yeh splitnet_list_2str(iph1->mode_cfg->split_include, NETMASK); 2018981eda8baa70ed21c0db173d4a5d2d7fe12e4212Chia-chi Yeh splitlist_cidr = 2019981eda8baa70ed21c0db173d4a5d2d7fe12e4212Chia-chi Yeh splitnet_list_2str(iph1->mode_cfg->split_include, CIDR); 2020981eda8baa70ed21c0db173d4a5d2d7fe12e4212Chia-chi Yeh } else { 20210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang splitlist = addrlist; 2022981eda8baa70ed21c0db173d4a5d2d7fe12e4212Chia-chi Yeh splitlist_cidr = addrlist; 20230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang addrlist[0] = '\0'; 20240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 20250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 20260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (script_env_append(envp, envc, "SPLIT_INCLUDE", splitlist) != 0) { 20270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, "Cannot set SPLIT_INCLUDE\n"); 20280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return -1; 20290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 2030981eda8baa70ed21c0db173d4a5d2d7fe12e4212Chia-chi Yeh if (script_env_append(envp, envc, 2031981eda8baa70ed21c0db173d4a5d2d7fe12e4212Chia-chi Yeh "SPLIT_INCLUDE_CIDR", splitlist_cidr) != 0) { 2032981eda8baa70ed21c0db173d4a5d2d7fe12e4212Chia-chi Yeh plog(LLV_ERROR, LOCATION, NULL, 2033981eda8baa70ed21c0db173d4a5d2d7fe12e4212Chia-chi Yeh "Cannot set SPLIT_INCLUDE_CIDR\n"); 2034981eda8baa70ed21c0db173d4a5d2d7fe12e4212Chia-chi Yeh return -1; 2035981eda8baa70ed21c0db173d4a5d2d7fe12e4212Chia-chi Yeh } 20360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (splitlist != addrlist) 20370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang racoon_free(splitlist); 2038981eda8baa70ed21c0db173d4a5d2d7fe12e4212Chia-chi Yeh if (splitlist_cidr != addrlist) 2039981eda8baa70ed21c0db173d4a5d2d7fe12e4212Chia-chi Yeh racoon_free(splitlist_cidr); 2040981eda8baa70ed21c0db173d4a5d2d7fe12e4212Chia-chi Yeh 2041981eda8baa70ed21c0db173d4a5d2d7fe12e4212Chia-chi Yeh if (iph1->mode_cfg->flags & ISAKMP_CFG_GOT_SPLIT_LOCAL) { 2042981eda8baa70ed21c0db173d4a5d2d7fe12e4212Chia-chi Yeh splitlist = 2043981eda8baa70ed21c0db173d4a5d2d7fe12e4212Chia-chi Yeh splitnet_list_2str(iph1->mode_cfg->split_local, NETMASK); 2044981eda8baa70ed21c0db173d4a5d2d7fe12e4212Chia-chi Yeh splitlist_cidr = 2045981eda8baa70ed21c0db173d4a5d2d7fe12e4212Chia-chi Yeh splitnet_list_2str(iph1->mode_cfg->split_local, CIDR); 2046981eda8baa70ed21c0db173d4a5d2d7fe12e4212Chia-chi Yeh } else { 20470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang splitlist = addrlist; 2048981eda8baa70ed21c0db173d4a5d2d7fe12e4212Chia-chi Yeh splitlist_cidr = addrlist; 20490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang addrlist[0] = '\0'; 20500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 20510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 20520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (script_env_append(envp, envc, "SPLIT_LOCAL", splitlist) != 0) { 20530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, "Cannot set SPLIT_LOCAL\n"); 20540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return -1; 20550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 2056981eda8baa70ed21c0db173d4a5d2d7fe12e4212Chia-chi Yeh if (script_env_append(envp, envc, 2057981eda8baa70ed21c0db173d4a5d2d7fe12e4212Chia-chi Yeh "SPLIT_LOCAL_CIDR", splitlist_cidr) != 0) { 2058981eda8baa70ed21c0db173d4a5d2d7fe12e4212Chia-chi Yeh plog(LLV_ERROR, LOCATION, NULL, 2059981eda8baa70ed21c0db173d4a5d2d7fe12e4212Chia-chi Yeh "Cannot set SPLIT_LOCAL_CIDR\n"); 2060981eda8baa70ed21c0db173d4a5d2d7fe12e4212Chia-chi Yeh return -1; 2061981eda8baa70ed21c0db173d4a5d2d7fe12e4212Chia-chi Yeh } 20620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (splitlist != addrlist) 20630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang racoon_free(splitlist); 2064981eda8baa70ed21c0db173d4a5d2d7fe12e4212Chia-chi Yeh if (splitlist_cidr != addrlist) 2065981eda8baa70ed21c0db173d4a5d2d7fe12e4212Chia-chi Yeh racoon_free(splitlist_cidr); 2066981eda8baa70ed21c0db173d4a5d2d7fe12e4212Chia-chi Yeh 20670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return 0; 20680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 20690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 20700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangint 20710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangisakmp_cfg_resize_pool(size) 20720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int size; 20730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 20740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct isakmp_cfg_port *new_pool; 20750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang size_t len; 20760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int i; 20770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 20780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (size == isakmp_cfg_config.pool_size) 20790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return 0; 20800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 20810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_INFO, LOCATION, NULL, 20820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "Resize address pool from %zu to %d\n", 20830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang isakmp_cfg_config.pool_size, size); 20840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 20850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* If a pool already exists, check if we can shrink it */ 20860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if ((isakmp_cfg_config.port_pool != NULL) && 20870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang (size < isakmp_cfg_config.pool_size)) { 20881c71527b277e2dc256262da2ed2169c566c5bf4dChia-chi Yeh for (i = isakmp_cfg_config.pool_size-1; i >= size; --i) { 20890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (isakmp_cfg_config.port_pool[i].used) { 20900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, 20910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "resize pool from %zu to %d impossible " 20920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "port %d is in use\n", 20930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang isakmp_cfg_config.pool_size, size, i); 20940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang size = i; 20950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 20960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 20970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 20980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 20990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 21000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang len = size * sizeof(*isakmp_cfg_config.port_pool); 21010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang new_pool = racoon_realloc(isakmp_cfg_config.port_pool, len); 21020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (new_pool == NULL) { 21030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_ERROR, LOCATION, NULL, 21040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "resize pool from %zu to %d impossible: %s", 21050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang isakmp_cfg_config.pool_size, size, strerror(errno)); 21060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return -1; 21070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 21080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 21090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* If size increase, intialize correctly the new records */ 21100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (size > isakmp_cfg_config.pool_size) { 21110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang size_t unit; 21120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang size_t old_size; 21130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 21140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang unit = sizeof(*isakmp_cfg_config.port_pool); 21150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang old_size = isakmp_cfg_config.pool_size; 21160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 21170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang bzero((char *)new_pool + (old_size * unit), 21180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang (size - old_size) * unit); 21190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 21200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 21210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang isakmp_cfg_config.port_pool = new_pool; 21220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang isakmp_cfg_config.pool_size = size; 21230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 21240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return 0; 21250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 21260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 21270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangint 21280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangisakmp_cfg_init(cold) 21290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int cold; 21300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 21310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int i; 21320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int error; 21330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 21340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang isakmp_cfg_config.network4 = (in_addr_t)0x00000000; 21350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang isakmp_cfg_config.netmask4 = (in_addr_t)0x00000000; 21360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang for (i = 0; i < MAXNS; i++) 21370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang isakmp_cfg_config.dns4[i] = (in_addr_t)0x00000000; 21380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang isakmp_cfg_config.dns4_index = 0; 21390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang for (i = 0; i < MAXWINS; i++) 21400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang isakmp_cfg_config.nbns4[i] = (in_addr_t)0x00000000; 21410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang isakmp_cfg_config.nbns4_index = 0; 21420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (cold == ISAKMP_CFG_INIT_COLD) 21430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang isakmp_cfg_config.port_pool = NULL; 21440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang isakmp_cfg_config.authsource = ISAKMP_CFG_AUTH_SYSTEM; 21450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang isakmp_cfg_config.groupsource = ISAKMP_CFG_GROUP_SYSTEM; 21460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (cold == ISAKMP_CFG_INIT_COLD) { 21470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (isakmp_cfg_config.grouplist != NULL) { 21480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang for (i = 0; i < isakmp_cfg_config.groupcount; i++) 21490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang racoon_free(isakmp_cfg_config.grouplist[i]); 21500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang racoon_free(isakmp_cfg_config.grouplist); 21510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 21520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 21530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang isakmp_cfg_config.grouplist = NULL; 21540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang isakmp_cfg_config.groupcount = 0; 21550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang isakmp_cfg_config.confsource = ISAKMP_CFG_CONF_LOCAL; 21560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang isakmp_cfg_config.accounting = ISAKMP_CFG_ACCT_NONE; 21570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (cold == ISAKMP_CFG_INIT_COLD) 21580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang isakmp_cfg_config.pool_size = 0; 21590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang isakmp_cfg_config.auth_throttle = THROTTLE_PENALTY; 21600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang strlcpy(isakmp_cfg_config.default_domain, ISAKMP_CFG_DEFAULT_DOMAIN, 21610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang MAXPATHLEN); 21620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang strlcpy(isakmp_cfg_config.motd, ISAKMP_CFG_MOTD, MAXPATHLEN); 21630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 21640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (cold != ISAKMP_CFG_INIT_COLD ) 21650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (isakmp_cfg_config.splitnet_list != NULL) 21660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang splitnet_list_free(isakmp_cfg_config.splitnet_list, 21670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang &isakmp_cfg_config.splitnet_count); 21680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang isakmp_cfg_config.splitnet_list = NULL; 21690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang isakmp_cfg_config.splitnet_count = 0; 21700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang isakmp_cfg_config.splitnet_type = 0; 21710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 21720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang isakmp_cfg_config.pfs_group = 0; 21730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang isakmp_cfg_config.save_passwd = 0; 21740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 21750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (cold != ISAKMP_CFG_INIT_COLD ) 21760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (isakmp_cfg_config.splitdns_list != NULL) 21770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang racoon_free(isakmp_cfg_config.splitdns_list); 21780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang isakmp_cfg_config.splitdns_list = NULL; 21790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang isakmp_cfg_config.splitdns_len = 0; 21800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 21811c71527b277e2dc256262da2ed2169c566c5bf4dChia-chi Yeh#if 0 21820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (cold == ISAKMP_CFG_INIT_COLD) { 21830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if ((error = isakmp_cfg_resize_pool(ISAKMP_CFG_MAX_CNX)) != 0) 21840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return error; 21850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 21861c71527b277e2dc256262da2ed2169c566c5bf4dChia-chi Yeh#endif 21870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 21880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return 0; 21890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 21900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2191