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