1c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh/* $NetBSD: sainfo.c,v 1.7.6.1 2007/08/01 11:52:22 vanhu Exp $ */ 20a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 30a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* $KAME: sainfo.c,v 1.16 2003/06/27 07:32:39 sakane Exp $ */ 40a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 50a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* 60a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. 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/param.h> 370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <sys/types.h> 380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <sys/socket.h> 390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <sys/queue.h> 400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <netinet/in.h> 420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <netinet/in.h> 430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include PATH_IPSEC_H 440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <stdlib.h> 460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <stdio.h> 470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <string.h> 480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <errno.h> 490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "var.h" 510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "misc.h" 520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "vmbuf.h" 530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "plog.h" 540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "sockmisc.h" 550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "debug.h" 560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "localconf.h" 580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "isakmp_var.h" 590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "isakmp.h" 600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "ipsec_doi.h" 610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "oakley.h" 620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "handler.h" 630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "algorithm.h" 640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "sainfo.h" 650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "gcmalloc.h" 660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 67c91307af2622f6625525f3c1f9c954376df950adChia-chi Yehstatic LIST_HEAD(_sitree, sainfo) sitree, sitree_save, sitree_tmp; 680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* %%% 700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * modules for ipsec sa info 710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang */ 720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* 730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * return matching entry. 740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * no matching entry found and if there is anonymous entry, return it. 750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * else return NULL. 760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * First pass is for sainfo from a specified peer, second for others. 770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang */ 780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstruct sainfo * 79c91307af2622f6625525f3c1f9c954376df950adChia-chi Yehgetsainfo(loc, rmt, peer, remoteid) 80c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh const vchar_t *loc, *rmt, *peer; 81c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh int remoteid; 820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct sainfo *s = NULL; 84c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh struct sainfo *anonymous = NULL; 85c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh int pass = 1; 86c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh 87c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh if (peer == NULL) 88c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh pass = 2; 890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* debug level output */ 910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if(loglevel >= LLV_DEBUG) { 920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char *dloc, *drmt, *dpeer, *dclient; 93c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh 940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (loc == NULL) 950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang dloc = strdup("ANONYMOUS"); 960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang else 970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang dloc = ipsecdoi_id2str(loc); 98c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh 99c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh if (rmt == NULL) 1000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang drmt = strdup("ANONYMOUS"); 1010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang else 1020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang drmt = ipsecdoi_id2str(rmt); 103c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh 1040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (peer == NULL) 1050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang dpeer = strdup("NULL"); 1060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang else 1070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang dpeer = ipsecdoi_id2str(peer); 108c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh 1090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_DEBUG, LOCATION, NULL, 110c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh "getsainfo params: loc=\'%s\', rmt=\'%s\', peer=\'%s\', id=%i\n", 111c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh dloc, drmt, dpeer, remoteid ); 1120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang racoon_free(dloc); 1140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang racoon_free(drmt); 1150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang racoon_free(dpeer); 1160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 1170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 118c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh again: 119c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh plog(LLV_DEBUG, LOCATION, NULL, 120c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh "getsainfo pass #%i\n", pass); 121c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh 1220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang LIST_FOREACH(s, &sitree, chain) { 1230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang const char *sainfostr = sainfo2str(s); 1240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plog(LLV_DEBUG, LOCATION, NULL, 1250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "evaluating sainfo: %s\n", sainfostr); 1260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 127c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh if(s->remoteid != remoteid) 128c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh continue; 129f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh 130c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh if (s->id_i != NULL) { 131c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh if (pass == 2) 1320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang continue; 133c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh if (ipsecdoi_chkcmpids(peer, s->id_i, 0)) 134f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh continue; 135c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh } else if (pass == 1) 136c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh continue; 137c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh if (s->idsrc == NULL && s->iddst == NULL) { 138c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh anonymous = s; 1390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang continue; 1400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 1410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 142c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh /* anonymous ? */ 143c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh if (loc == NULL) { 144c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh if (anonymous != NULL) 145c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh break; 146c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh continue; 147c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh } 148f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh 149c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh /* compare the ids */ 1500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (!ipsecdoi_chkcmpids(loc, s->idsrc, 0) && 1510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang !ipsecdoi_chkcmpids(rmt, s->iddst, 0)) 1520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return s; 1530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 1540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 155c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh if ((anonymous == NULL) && (pass == 1)) { 156c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh pass++; 157c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh goto again; 158c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh } 159c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh 160c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh return anonymous; 1610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 1620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstruct sainfo * 1640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangnewsainfo() 1650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 1660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct sainfo *new; 1670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang new = racoon_calloc(1, sizeof(*new)); 1690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (new == NULL) 1700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return NULL; 1710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang new->lifetime = IPSECDOI_ATTR_SA_LD_SEC_DEFAULT; 1730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang new->lifebyte = IPSECDOI_ATTR_SA_LD_KB_MAX; 1740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return new; 1760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 1770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvoid 1790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangdelsainfo(si) 1800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct sainfo *si; 1810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 1820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int i; 1830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang for (i = 0; i < MAXALGCLASS; i++) 1850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang delsainfoalg(si->algs[i]); 1860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (si->idsrc) 1880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vfree(si->idsrc); 189c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh if (si->iddst) 1900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vfree(si->iddst); 1910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifdef ENABLE_HYBRID 1930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (si->group) 1940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vfree(si->group); 1950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif 1960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang racoon_free(si); 1980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 1990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvoid 2010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wanginssainfo(new) 2020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct sainfo *new; 2030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 204c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh LIST_INSERT_HEAD(&sitree, new, chain); 2050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 2060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvoid 2080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangremsainfo(si) 2090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct sainfo *si; 2100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 2110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang LIST_REMOVE(si, chain); 2120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 2130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvoid 2150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangflushsainfo() 2160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 2170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct sainfo *s, *next; 2180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang for (s = LIST_FIRST(&sitree); s; s = next) { 2200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang next = LIST_NEXT(s, chain); 2210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang remsainfo(s); 2220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang delsainfo(s); 2230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 2240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 2250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvoid 2270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wanginitsainfo() 2280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 2290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang LIST_INIT(&sitree); 2300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 2310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstruct sainfoalg * 2330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangnewsainfoalg() 2340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 2350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct sainfoalg *new; 2360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang new = racoon_calloc(1, sizeof(*new)); 2380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (new == NULL) 2390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return NULL; 2400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return new; 2420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 2430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvoid 2450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangdelsainfoalg(alg) 2460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct sainfoalg *alg; 2470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 2480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct sainfoalg *a, *next; 2490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang for (a = alg; a; a = next) { 2510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang next = a->next; 2520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang racoon_free(a); 2530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 2540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 2550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvoid 2570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wanginssainfoalg(head, new) 2580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct sainfoalg **head; 2590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct sainfoalg *new; 2600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 2610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct sainfoalg *a; 2620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang for (a = *head; a && a->next; a = a->next) 2640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang ; 2650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (a) 2660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang a->next = new; 2670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang else 2680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang *head = new; 2690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 2700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangconst char * 2720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangsainfo2str(si) 2730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang const struct sainfo *si; 2740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 2750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang static char buf[256]; 2760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char *idloc = NULL, *idrmt = NULL, *id_i; 2780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 279c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh if (si->idsrc == NULL) 2800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang idloc = strdup("ANONYMOUS"); 2810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang else 2820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang idloc = ipsecdoi_id2str(si->idsrc); 2830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 284c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh if (si->iddst == NULL) 2850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang idrmt = strdup("ANONYMOUS"); 2860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang else 2870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang idrmt = ipsecdoi_id2str(si->iddst); 2880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (si->id_i == NULL) 2900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang id_i = strdup("ANY"); 2910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang else 2920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang id_i = ipsecdoi_id2str(si->id_i); 2930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 294c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh snprintf(buf, 255, "loc=\'%s\', rmt=\'%s\', peer=\'%s\', id=%i", 2950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang idloc, idrmt, id_i, si->remoteid); 2960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang racoon_free(idloc); 2980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang racoon_free(idrmt); 2990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang racoon_free(id_i); 3000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 3010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return buf; 3020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 3030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 304c91307af2622f6625525f3c1f9c954376df950adChia-chi Yehvoid save_sainfotree(void){ 3050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang sitree_save=sitree; 3060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang initsainfo(); 3070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 3080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 309c91307af2622f6625525f3c1f9c954376df950adChia-chi Yehvoid save_sainfotree_flush(void){ 3100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang sitree_tmp=sitree; 3110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang sitree=sitree_save; 3120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang flushsainfo(); 3130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang sitree=sitree_tmp; 3140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 3150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 3160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvoid save_sainfotree_restore(void){ 3170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang flushsainfo(); 3180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang sitree=sitree_save; 3190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 320