racoonctl.c revision c91307af2622f6625525f3c1f9c954376df950ad
1c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh/* $NetBSD: racoonctl.c,v 1.7.6.2 2009/04/20 13:32:57 tteras Exp $ */ 20a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 30a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* Id: racoonctl.c,v 1.11 2006/04/06 17:06:25 manubsd 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/types.h> 370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <sys/param.h> 380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <sys/socket.h> 390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <sys/un.h> 400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <netinet/in.h> 420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <arpa/inet.h> 430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <net/pfkeyv2.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#if TIME_WITH_SYS_TIME 500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang# include <sys/time.h> 510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang# include <time.h> 520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#else 530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang# if HAVE_SYS_TIME_H 540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang# include <sys/time.h> 550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang# else 560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang# include <time.h> 570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang# endif 580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif 590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <netdb.h> 600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifdef HAVE_UNISTD_H 610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <unistd.h> 620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif 630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <err.h> 640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <sys/ioctl.h> 650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <resolv.h> 660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "var.h" 680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "vmbuf.h" 690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "misc.h" 700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "gcmalloc.h" 710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "racoonctl.h" 730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "admin.h" 740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "schedule.h" 750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "handler.h" 760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "sockmisc.h" 770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "vmbuf.h" 780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "plog.h" 790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "isakmp_var.h" 800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "isakmp.h" 810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "isakmp_xauth.h" 820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "isakmp_cfg.h" 830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "isakmp_unity.h" 840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "ipsec_doi.h" 850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "evt.h" 860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangchar *adminsock_path = ADMINSOCK_PATH; 880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic void usage __P((void)); 900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t *get_combuf __P((int, char **)); 910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic int handle_recv __P((vchar_t *)); 920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t *f_reload __P((int, char **)); 930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t *f_getsched __P((int, char **)); 940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t *f_getsa __P((int, char **)); 950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t *f_flushsa __P((int, char **)); 960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t *f_deletesa __P((int, char **)); 970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t *f_exchangesa __P((int, char **)); 980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t *f_vpnc __P((int, char **)); 990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t *f_vpnd __P((int, char **)); 1000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t *f_getevt __P((int, char **)); 1010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifdef ENABLE_HYBRID 1020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t *f_logoutusr __P((int, char **)); 1030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif 1040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstruct cmd_tag { 1060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vchar_t *(*func) __P((int, char **)); 107c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh int cmd; 1080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char *str; 1090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} cmdtab[] = { 110c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh { f_reload, ADMIN_RELOAD_CONF, "reload-config" }, 111c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh { f_reload, ADMIN_RELOAD_CONF, "rc" }, 112c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh { f_getsched, ADMIN_SHOW_SCHED, "show-schedule" }, 113c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh { f_getsched, ADMIN_SHOW_SCHED, "sc" }, 114c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh { f_getsa, ADMIN_SHOW_SA, "show-sa" }, 115c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh { f_getsa, ADMIN_SHOW_SA, "ss" }, 116c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh { f_flushsa, ADMIN_FLUSH_SA, "flush-sa" }, 117c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh { f_flushsa, ADMIN_FLUSH_SA, "fs" }, 118c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh { f_deletesa, ADMIN_DELETE_SA, "delete-sa" }, 119c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh { f_deletesa, ADMIN_DELETE_SA, "ds" }, 120c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh { f_exchangesa, ADMIN_ESTABLISH_SA, "establish-sa" }, 121c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh { f_exchangesa, ADMIN_ESTABLISH_SA, "es" }, 122c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh { f_vpnc, ADMIN_ESTABLISH_SA, "vpn-connect" }, 123c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh { f_vpnc, ADMIN_ESTABLISH_SA, "vc" }, 124c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh { f_vpnd, ADMIN_DELETE_ALL_SA_DST,"vpn-disconnect" }, 125c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh { f_vpnd, ADMIN_DELETE_ALL_SA_DST,"vd" }, 126c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh { f_getevt, ADMIN_SHOW_EVT, "show-event" }, 127c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh { f_getevt, ADMIN_SHOW_EVT, "se" }, 1280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifdef ENABLE_HYBRID 129c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh { f_logoutusr, ADMIN_LOGOUT_USER, "logout-user" }, 130c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh { f_logoutusr, ADMIN_LOGOUT_USER, "lu" }, 1310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif 132c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh { NULL, 0, NULL }, 1330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}; 1340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstruct evtmsg { 1360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int type; 1370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char *msg; 138c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh enum { UNSPEC, ERROR, INFO } level; 1390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} evtmsg[] = { 140c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh { EVTT_PHASE1_UP, "Phase 1 established", INFO }, 141c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh { EVTT_PHASE1_DOWN, "Phase 1 deleted", INFO }, 142c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh { EVTT_XAUTH_SUCCESS, "Xauth exchange passed", INFO }, 143c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh { EVTT_ISAKMP_CFG_DONE, "ISAKMP mode config done", INFO }, 144c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh { EVTT_PHASE2_UP, "Phase 2 established", INFO }, 145c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh { EVTT_PHASE2_DOWN, "Phase 2 deleted", INFO }, 146c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh { EVTT_DPD_TIMEOUT, "Peer not reachable anymore", ERROR }, 147c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh { EVTT_PEER_NO_RESPONSE, "Peer not responding", ERROR }, 148c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh { EVTT_PEER_DELETE, "Peer terminated security association", ERROR }, 149c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh { EVTT_RACOON_QUIT, "Raccon terminated", ERROR }, 150c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh { EVTT_OVERFLOW, "Event queue overflow", ERROR }, 151c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh { EVTT_XAUTH_FAILED, "Xauth exchange failed", ERROR }, 152c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh { EVTT_PEERPH1AUTH_FAILED, "Peer failed phase 1 authentication " 153c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh "(certificate problem?)", ERROR }, 154c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh { EVTT_PEERPH1_NOPROP, "Peer failed phase 1 initiation " 155c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh "(proposal problem?)", ERROR }, 156c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh { 0, NULL, UNSPEC }, 157c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh { EVTT_NO_ISAKMP_CFG, "No need for ISAKMP mode config ", INFO }, 1580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}; 1590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic int get_proto __P((char *)); 1610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t *get_index __P((int, char **)); 1620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic int get_family __P((char *)); 1630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t *get_comindexes __P((int, int, char **)); 1640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic int get_comindex __P((char *, char **, char **, char **)); 1650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic int get_ulproto __P((char *)); 1660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstruct proto_tag { 1680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int proto; 1690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char *str; 1700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} prototab[] = { 1710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang { ADMIN_PROTO_ISAKMP, "isakmp" }, 1720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang { ADMIN_PROTO_IPSEC, "ipsec" }, 1730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang { ADMIN_PROTO_AH, "ah" }, 1740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang { ADMIN_PROTO_ESP, "esp" }, 1750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang { ADMIN_PROTO_INTERNAL, "internal" }, 1760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang { 0, NULL }, 1770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}; 1780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstruct ulproto_tag { 1800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int ul_proto; 1810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char *str; 1820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} ulprototab[] = { 1830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang { 0, "any" }, 1840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang { IPPROTO_ICMP, "icmp" }, 1850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang { IPPROTO_TCP, "tcp" }, 1860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang { IPPROTO_UDP, "udp" }, 1870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang { 0, NULL }, 1880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}; 1890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangint so; 1910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic char _addr1_[NI_MAXHOST], _addr2_[NI_MAXHOST]; 1930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangchar *pname; 1950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangint long_format = 0; 196c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh 197c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh#define EVTF_NONE 0x0000 /* Ignore any events */ 198c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh#define EVTF_LOOP 0x0001 /* Loop awaiting for new events */ 199c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh#define EVTF_CFG_STOP 0x0002 /* Stop after ISAKMP mode config */ 200c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh#define EVTF_CFG 0x0004 /* Print ISAKMP mode config info */ 201c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh#define EVTF_ALL 0x0008 /* Print any events */ 202c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh#define EVTF_PURGE 0x0010 /* Print all available events */ 203c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh#define EVTF_PH1DOWN_STOP 0x0020 /* Stop when phase 1 SA gets down */ 204c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh#define EVTF_PH1DOWN 0x0040 /* Print that phase 1 SA got down */ 205c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh#define EVTF_ERR 0x0080 /* Print any error */ 206c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh#define EVTF_ERR_STOP 0x0100 /* Stop on any error */ 207c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh 208c91307af2622f6625525f3c1f9c954376df950adChia-chi Yehint evt_filter = EVTF_NONE; 209c91307af2622f6625525f3c1f9c954376df950adChia-chi Yehtime_t evt_start; 2100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvoid dump_isakmp_sa __P((char *, int)); 2120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvoid dump_internal __P((char *, int)); 2130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangchar *pindex_isakmp __P((isakmp_index *)); 2140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvoid print_schedule __P((caddr_t, int)); 215c91307af2622f6625525f3c1f9c954376df950adChia-chi Yehvoid print_evt __P((caddr_t, int)); 216c91307af2622f6625525f3c1f9c954376df950adChia-chi Yehvoid print_cfg __P((caddr_t, int)); 217c91307af2622f6625525f3c1f9c954376df950adChia-chi Yehvoid print_err __P((caddr_t, int)); 218c91307af2622f6625525f3c1f9c954376df950adChia-chi Yehvoid print_ph1down __P((caddr_t, int)); 219c91307af2622f6625525f3c1f9c954376df950adChia-chi Yehvoid print_ph1up __P((caddr_t, int)); 220c91307af2622f6625525f3c1f9c954376df950adChia-chi Yehint evt_poll __P((void)); 2210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangchar * fixed_addr __P((char *, char *, int)); 2220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic void 2240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangusage() 2250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 2260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf( 2270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"Usage:\n" 228c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh" %s reload-config\n" 229c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh" %s [-l [-l]] show-sa [protocol]\n" 230c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh" %s flush-sa [protocol]\n" 231c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh" %s delete-sa <saopts>\n" 232c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh" %s establish-sa [-u identity] <saopts>\n" 233c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh" %s vpn-connect [-u identity] vpn_gateway\n" 234c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh" %s vpn-disconnect vpn_gateway\n" 2350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"\n" 2360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang" <protocol>: \"isakmp\", \"esp\" or \"ah\".\n" 2370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang" In the case of \"show-sa\" or \"flush-sa\", you can use \"ipsec\".\n" 2380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"\n" 2390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang" <saopts>: \"isakmp\" <family> <src> <dst>\n" 2400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang" : {\"esp\",\"ah\"} <family> <src/prefixlen/port> <dst/prefixlen/port>\n" 2410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang" <ul_proto>\n" 2420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang" <family>: \"inet\" or \"inet6\"\n" 243c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh" <ul_proto>: \"icmp\", \"tcp\", \"udp\" or \"any\"\n", 244c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh pname, pname, pname, pname, pname, pname, pname); 2450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 2460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* 2480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * Check for proper racoonctl interface 2490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang */ 2500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#if ((RACOONCTL_INTERFACE_MAJOR != 1) || (RACOONCTL_INTERFACE < 20041230)) 2510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#error "Incompatible racoonctl interface" 2520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif 2530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangint 2550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangmain(ac, av) 2560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int ac; 2570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char **av; 2580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 2590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vchar_t *combuf; 2600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int c; 2610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang pname = *av; 2630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* 2650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * Check for proper racoonctl interface 2660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang */ 2670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if ((racoonctl_interface_major != RACOONCTL_INTERFACE_MAJOR) || 2680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang (racoonctl_interface < RACOONCTL_INTERFACE)) 2690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang errx(1, "Incompatible racoonctl interface"); 2700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifdef __linux__ 2720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* 2730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * Disable GNU extensions that will prevent racoonct vc -u login 2740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * from working (GNU getopt(3) does not like options after vc) 2750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang */ 2760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang setenv("POSIXLY_CORRECT", "1", 0); 2770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif 2780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang while ((c = getopt(ac, av, "lds:")) != -1) { 2790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang switch(c) { 2800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case 'l': 2810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang long_format++; 2820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 2830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case 'd': 2850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang loglevel++; 2860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 2870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case 's': 2890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang adminsock_path = optarg; 2900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 2910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang default: 2930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang usage(); 2940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang exit(0); 2950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 2960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 2970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang ac -= optind; 2990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang av += optind; 3000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 3010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang combuf = get_combuf(ac, av); 3020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (!combuf) 3030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang err(1, "kmpstat"); 3040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 3050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (loglevel) 3060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang racoon_hexdump(combuf, ((struct admin_com *)combuf)->ac_len); 3070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 3080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang com_init(); 3090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 3100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (com_send(combuf) != 0) 3110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang goto bad; 3120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 3130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vfree(combuf); 3140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 315c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh if (com_recv(&combuf) != 0) 316c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh goto bad; 317c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh if (handle_recv(combuf) != 0) 318c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh goto bad; 3190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 320c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh vfree(combuf); 321c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh 322c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh if (evt_filter != EVTF_NONE) 323c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh if (evt_poll() != 0) 324c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh goto bad; 325c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh 3260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang exit(0); 3270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 328c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh bad: 3290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang exit(1); 3300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 3310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 332c91307af2622f6625525f3c1f9c954376df950adChia-chi Yehint 333c91307af2622f6625525f3c1f9c954376df950adChia-chi Yehevt_poll(void) { 334c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh struct timeval tv; 335c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh vchar_t *recvbuf; 336c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh vchar_t *sendbuf; 337c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh 338c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh if ((sendbuf = f_getevt(0, NULL)) == NULL) 339c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh errx(1, "Cannot make combuf"); 340c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh 341c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh 342c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh while (evt_filter & (EVTF_LOOP|EVTF_PURGE)) { 343c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh /* handle_recv closes the socket time, so open it each time */ 344c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh com_init(); 345c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh 346c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh if (com_send(sendbuf) != 0) 347c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh errx(1, "Cannot send combuf"); 348c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh 349c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh if (com_recv(&recvbuf) == 0) { 350c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh handle_recv(recvbuf); 351c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh vfree(recvbuf); 352c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh } 353c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh 354c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh tv.tv_sec = 0; 355c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh tv.tv_usec = 10; 356c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh (void)select(0, NULL, NULL, NULL, &tv); 357c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh } 358c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh 359c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh vfree(sendbuf); 360c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh return 0; 361c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh} 362c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh 3630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* %%% */ 3640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* 3650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * return command buffer. 3660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang */ 3670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t * 3680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangget_combuf(ac, av) 3690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int ac; 3700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char **av; 3710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 3720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct cmd_tag *cp; 3730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 3740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (ac == 0) { 3750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang usage(); 3760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang exit(0); 3770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 3780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 3790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* checking the string of command. */ 3800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang for (cp = &cmdtab[0]; cp->str; cp++) { 3810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (strcmp(*av, cp->str) == 0) { 3820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 3830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 3840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 3850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (!cp->str) { 3860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("Invalid command [%s]\n", *av); 3870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang errno = EINVAL; 3880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return NULL; 3890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 3900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 3910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang ac--; 3920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang av++; 3930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return (cp->func)(ac, av); 3940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 3950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 3960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t * 397c91307af2622f6625525f3c1f9c954376df950adChia-chi Yehf_reload(ac, av) 398c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh int ac; 399c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh char **av; 4000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 4010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vchar_t *buf; 4020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct admin_com *head; 4030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 404c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh buf = vmalloc(sizeof(*head)); 4050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (buf == NULL) 4060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang errx(1, "not enough core"); 4070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 408c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh head = (struct admin_com *)buf->v; 4090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang head->ac_len = buf->l; 410c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh head->ac_cmd = ADMIN_RELOAD_CONF; 411c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh head->ac_errno = 0; 412c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh head->ac_proto = 0; 4130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 4140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return buf; 4150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 4160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 4170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t * 418f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yehf_getevt(ac, av) 419f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh int ac; 420f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh char **av; 421f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh{ 422c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh vchar_t *buf; 423c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh struct admin_com *head; 424c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh 425c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh /* 426c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh * There are 3 ways of getting here 427c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh * 1) racoonctl vc => evt_filter = (EVTF_LOOP|EVTF_CFG| ... ) 428c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh * 2) racoonctl es => evt_filter = EVTF_NONE 429c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh * 3) racoonctl es -l => evt_filter = EVTF_LOOP 430c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh * Catch the second case: show-event is here to purge all 431c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh */ 432c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh if (evt_filter == EVTF_NONE) 433c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh evt_filter = (EVTF_ALL|EVTF_PURGE); 434c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh 435c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh if ((ac >= 1) && (strcmp(av[0], "-l") == 0)) 436c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh evt_filter |= EVTF_LOOP; 437c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh 438c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh if (ac >= 2) 4390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang errx(1, "too many arguments"); 4400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 441c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh buf = vmalloc(sizeof(*head)); 442c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh if (buf == NULL) 443c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh errx(1, "not enough core"); 444c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh 445c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh head = (struct admin_com *)buf->v; 446c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh head->ac_len = buf->l; 447c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh head->ac_cmd = ADMIN_SHOW_EVT; 448c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh head->ac_errno = 0; 449c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh head->ac_proto = 0; 450c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh 451c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh return buf; 4520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 4530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 4540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t * 4550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangf_getsched(ac, av) 4560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int ac; 4570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char **av; 4580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 459c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh vchar_t *buf; 460c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh struct admin_com *head; 461c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh 462c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh buf = vmalloc(sizeof(*head)); 463c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh if (buf == NULL) 464c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh errx(1, "not enough core"); 465c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh 466c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh head = (struct admin_com *)buf->v; 467c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh head->ac_len = buf->l; 468c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh head->ac_cmd = ADMIN_SHOW_SCHED; 469c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh head->ac_errno = 0; 470c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh head->ac_proto = 0; 471c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh 472c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh return buf; 4730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 4740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 4750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t * 4760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangf_getsa(ac, av) 4770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int ac; 4780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char **av; 4790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 480c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh vchar_t *buf; 481c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh struct admin_com *head; 4820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int proto; 4830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 4840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* need protocol */ 4850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (ac != 1) 4860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang errx(1, "insufficient arguments"); 4870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang proto = get_proto(*av); 4880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (proto == -1) 4890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang errx(1, "unknown protocol %s", *av); 4900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 491c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh buf = vmalloc(sizeof(*head)); 4920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (buf == NULL) 493c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh errx(1, "not enough core"); 494f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh 495c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh head = (struct admin_com *)buf->v; 496c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh head->ac_len = buf->l; 497c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh head->ac_cmd = ADMIN_SHOW_SA; 498c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh head->ac_errno = 0; 499c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh head->ac_proto = proto; 5000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 5010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return buf; 5020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 5030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 5040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t * 5050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangf_flushsa(ac, av) 5060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int ac; 5070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char **av; 5080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 5090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vchar_t *buf; 5100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct admin_com *head; 5110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int proto; 5120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 5130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* need protocol */ 5140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (ac != 1) 5150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang errx(1, "insufficient arguments"); 5160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang proto = get_proto(*av); 5170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (proto == -1) 5180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang errx(1, "unknown protocol %s", *av); 5190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 520c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh buf = vmalloc(sizeof(*head)); 521c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh if (buf == NULL) 522c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh errx(1, "not enough core"); 523c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh 524c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh head = (struct admin_com *)buf->v; 525c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh head->ac_len = buf->l; 526c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh head->ac_cmd = ADMIN_FLUSH_SA; 527c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh head->ac_errno = 0; 528c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh head->ac_proto = proto; 529c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh 530c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh return buf; 5310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 5320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 5330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t * 5340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangf_deletesa(ac, av) 5350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int ac; 5360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char **av; 5370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 5380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vchar_t *buf, *index; 539c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh struct admin_com *head; 5400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int proto; 5410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 5420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* need protocol */ 5430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (ac < 1) 5440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang errx(1, "insufficient arguments"); 5450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang proto = get_proto(*av); 5460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (proto == -1) 5470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang errx(1, "unknown protocol %s", *av); 5480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 5490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* get index(es) */ 5500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang av++; 5510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang ac--; 5520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang switch (proto) { 5530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case ADMIN_PROTO_ISAKMP: 5540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang index = get_index(ac, av); 5550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (index == NULL) 5560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return NULL; 5570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 5580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case ADMIN_PROTO_AH: 5590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case ADMIN_PROTO_ESP: 5600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang index = get_index(ac, av); 5610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (index == NULL) 5620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return NULL; 5630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 5640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang default: 5650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang errno = EPROTONOSUPPORT; 5660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return NULL; 5670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 5680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 569c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh buf = vmalloc(sizeof(*head) + index->l); 5700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (buf == NULL) 5710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang goto out; 5720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 573c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh head = (struct admin_com *)buf->v; 574c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh head->ac_len = buf->l + index->l; 575c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh head->ac_cmd = ADMIN_DELETE_SA; 576c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh head->ac_errno = 0; 577c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh head->ac_proto = proto; 578c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh 579c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh memcpy(buf->v+sizeof(*head), index->v, index->l); 5800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 5810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangout: 5820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (index != NULL) 5830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vfree(index); 5840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 5850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return buf; 5860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 5870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 5880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t * 5890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangf_deleteallsadst(ac, av) 5900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int ac; 5910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char **av; 5920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 5930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vchar_t *buf, *index; 594c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh struct admin_com *head; 595c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh int proto; 596c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh 597c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh /* need protocol */ 598c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh if (ac < 1) 599c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh errx(1, "insufficient arguments"); 600c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh proto = get_proto(*av); 601c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh if (proto == -1) 602c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh errx(1, "unknown protocol %s", *av); 6030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 604c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh /* get index(es) */ 605c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh av++; 606c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh ac--; 607c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh switch (proto) { 608c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh case ADMIN_PROTO_ISAKMP: 609c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh index = get_index(ac, av); 610c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh if (index == NULL) 611c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh return NULL; 612c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh break; 613c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh case ADMIN_PROTO_AH: 614c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh case ADMIN_PROTO_ESP: 615c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh index = get_index(ac, av); 616c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh if (index == NULL) 617c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh return NULL; 618c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh break; 619c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh default: 620c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh errno = EPROTONOSUPPORT; 6210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return NULL; 622c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh } 6230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 624c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh buf = vmalloc(sizeof(*head) + index->l); 6250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (buf == NULL) 6260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang goto out; 6270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 628c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh head = (struct admin_com *)buf->v; 629c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh head->ac_len = buf->l + index->l; 630c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh head->ac_cmd = ADMIN_DELETE_ALL_SA_DST; 631c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh head->ac_errno = 0; 632c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh head->ac_proto = proto; 633c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh 634c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh memcpy(buf->v+sizeof(*head), index->v, index->l); 6350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 6360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangout: 6370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (index != NULL) 6380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vfree(index); 6390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 6400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return buf; 6410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 6420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 6430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t * 6440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangf_exchangesa(ac, av) 6450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int ac; 6460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char **av; 6470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 6480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vchar_t *buf, *index; 649c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh struct admin_com *head; 650c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh int proto; 6510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int cmd = ADMIN_ESTABLISH_SA; 6520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang size_t com_len = 0; 6530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char *id = NULL; 6540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char *key = NULL; 6550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct admin_com_psk *acp; 6560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 6570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (ac < 1) 6580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang errx(1, "insufficient arguments"); 6590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 6600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* Optional -u identity */ 6610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (strcmp(av[0], "-u") == 0) { 6620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (ac < 2) 6630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang errx(1, "-u require an argument"); 6640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 6650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang id = av[1]; 6660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if ((key = getpass("Password: ")) == NULL) 6670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang errx(1, "getpass() failed: %s", strerror(errno)); 6680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 6690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang com_len += sizeof(*acp) + strlen(id) + 1 + strlen(key) + 1; 6700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang cmd = ADMIN_ESTABLISH_SA_PSK; 6710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 6720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang av += 2; 6730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang ac -= 2; 6740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 6750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 676c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh /* need protocol */ 677c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh if (ac < 1) 678c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh errx(1, "insufficient arguments"); 679c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh if ((proto = get_proto(*av)) == -1) 680c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh errx(1, "unknown protocol %s", *av); 681f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh 682c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh /* get index(es) */ 683c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh av++; 684c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh ac--; 685c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh switch (proto) { 686c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh case ADMIN_PROTO_ISAKMP: 687c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh index = get_index(ac, av); 688c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh if (index == NULL) 689f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh return NULL; 690c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh break; 691c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh case ADMIN_PROTO_AH: 692c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh case ADMIN_PROTO_ESP: 693c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh index = get_index(ac, av); 694c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh if (index == NULL) 695c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh return NULL; 696c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh break; 697c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh default: 698c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh errno = EPROTONOSUPPORT; 699c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh return NULL; 7000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 7010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 702c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh com_len += sizeof(*head) + index->l; 703c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh if ((buf = vmalloc(com_len)) == NULL) 7040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang errx(1, "Cannot allocate buffer"); 7050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 706c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh head = (struct admin_com *)buf->v; 707c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh head->ac_len = buf->l; 708c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh head->ac_cmd = cmd; 709c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh head->ac_errno = 0; 710c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh head->ac_proto = proto; 711c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh 712c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh memcpy(buf->v+sizeof(*head), index->v, index->l); 7130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 714c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh if (id && key) { 7150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char *data; 7160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang acp = (struct admin_com_psk *) 717c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh (buf->v + sizeof(*head) + index->l); 7180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 7190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang acp->id_type = IDTYPE_USERFQDN; 7200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang acp->id_len = strlen(id) + 1; 7210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang acp->key_len = strlen(key) + 1; 7220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 7230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang data = (char *)(acp + 1); 7240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang strcpy(data, id); 7250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 7260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang data = (char *)(data + acp->id_len); 7270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang strcpy(data, key); 7280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 7290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 7300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vfree(index); 7310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 7320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return buf; 7330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 7340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 7350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t * 7360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangf_vpnc(ac, av) 7370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int ac; 7380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char **av; 7390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 7400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char *nav[] = {NULL, NULL, NULL, NULL, NULL, NULL}; 7410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int nac = 0; 7420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char *isakmp = "isakmp"; 7430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char *inet = "inet"; 7440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char *srcaddr; 7450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct addrinfo hints, *res; 7460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct sockaddr *src; 7470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char *idx; 7480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 7490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (ac < 1) 7500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang errx(1, "insufficient arguments"); 7510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 752c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh evt_filter = (EVTF_LOOP|EVTF_CFG|EVTF_CFG_STOP|EVTF_ERR|EVTF_ERR_STOP); 753c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh time(&evt_start); 7540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 7550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* Optional -u identity */ 7560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (strcmp(av[0], "-u") == 0) { 7570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (ac < 2) 7580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang errx(1, "-u require an argument"); 7590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 7600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang nav[nac++] = av[0]; 7610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang nav[nac++] = av[1]; 7620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 7630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang ac -= 2; 7640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang av += 2; 7650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 7660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 7670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (ac < 1) 768c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh errx(1, "VPN gateway required"); 7690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (ac > 1) 7700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang warnx("Extra arguments"); 7710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 7720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* 7730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * Find the source address 7740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang */ 7750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang memset(&hints, 0, sizeof(hints)); 7760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang hints.ai_family = PF_UNSPEC; 7770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang hints.ai_socktype = SOCK_DGRAM; 7780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (getaddrinfo(av[0], "4500", &hints, &res) != 0) 7790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang errx(1, "Cannot resolve destination address"); 7800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 7810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if ((src = getlocaladdr(res->ai_addr)) == NULL) 7820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang errx(1, "cannot find source address"); 7830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 7840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if ((srcaddr = saddr2str(src)) == NULL) 7850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang errx(1, "cannot read source address"); 7860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 7870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* We get "ip[port]" strip the port */ 7880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if ((idx = index(srcaddr, '[')) == NULL) 7890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang errx(1, "unexpected source address format"); 7900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang *idx = '\0'; 7910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 7920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang nav[nac++] = isakmp; 7930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang nav[nac++] = inet; 7940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang nav[nac++] = srcaddr; 7950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang nav[nac++] = av[0]; 7960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 7970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return f_exchangesa(nac, nav); 7980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 7990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 8000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t * 8010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangf_vpnd(ac, av) 8020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int ac; 8030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char **av; 8040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 8050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char *nav[] = {NULL, NULL, NULL, NULL}; 8060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int nac = 0; 8070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char *isakmp = "isakmp"; 8080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char *inet = "inet"; 8090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char *anyaddr = "0.0.0.0"; 8100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char *idx; 8110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 8120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (ac < 1) 813c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh errx(1, "VPN gateway required"); 8140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (ac > 1) 8150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang warnx("Extra arguments"); 8160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 817c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh evt_filter = 818c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh (EVTF_PH1DOWN|EVTF_PH1DOWN_STOP|EVTF_LOOP|EVTF_ERR|EVTF_ERR_STOP); 8190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 8200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang nav[nac++] = isakmp; 8210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang nav[nac++] = inet; 8220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang nav[nac++] = anyaddr; 8230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang nav[nac++] = av[0]; 8240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 8250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return f_deleteallsadst(nac, nav); 8260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 8270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 8280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifdef ENABLE_HYBRID 8290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t * 8300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangf_logoutusr(ac, av) 8310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int ac; 8320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char **av; 8330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 8340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vchar_t *buf; 835c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh struct admin_com *head; 8360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char *user; 8371c71527b277e2dc256262da2ed2169c566c5bf4dChia-chi Yeh size_t userlen; 8380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 8390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* need username */ 8400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (ac < 1) 8410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang errx(1, "insufficient arguments"); 8420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang user = av[0]; 8431c71527b277e2dc256262da2ed2169c566c5bf4dChia-chi Yeh userlen = strlen(user); 8441c71527b277e2dc256262da2ed2169c566c5bf4dChia-chi Yeh if ((user == NULL) || (userlen > LOGINLEN)) 8450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang errx(1, "bad login (too long?)"); 8460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 847c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh buf = vmalloc(sizeof(*head) + userlen); 8480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (buf == NULL) 8490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return NULL; 8500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 851c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh head = (struct admin_com *)buf->v; 852c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh head->ac_len = buf->l; 853c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh head->ac_cmd = ADMIN_LOGOUT_USER; 854c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh head->ac_errno = 0; 855c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh head->ac_proto = 0; 856c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh 857c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh strncpy((char *)(head + 1), user, userlen); 8580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 8590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return buf; 8600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 8610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif /* ENABLE_HYBRID */ 8620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 8630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 8640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic int 8650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangget_proto(str) 8660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char *str; 8670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 8680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct proto_tag *cp; 8690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 8700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (str == NULL) { 8710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang errno = EINVAL; 8720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return -1; 8730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 8740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 8750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* checking the string of command. */ 8760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang for (cp = &prototab[0]; cp->str; cp++) { 8770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (strcmp(str, cp->str) == 0) 8780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return cp->proto; 8790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 8800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 8810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang errno = EINVAL; 8820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return -1; 8830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 8840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 8850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t * 8860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangget_index(ac, av) 8870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int ac; 8880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char **av; 8890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 8900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int family; 8910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 8920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (ac != 3 && ac != 4) { 8930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang errno = EINVAL; 8940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return NULL; 8950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 8960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 8970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* checking the string of family */ 8980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang family = get_family(*av); 8990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (family == -1) 9000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return NULL; 9010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang av++; 9020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang ac--; 9030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 9040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return get_comindexes(family, ac, av); 9050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 9060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 9070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic int 9080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangget_family(str) 9090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char *str; 9100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 9110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (strcmp("inet", str) == 0) 9120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return AF_INET; 9130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifdef INET6 9140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang else if (strcmp("inet6", str) == 0) 9150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return AF_INET6; 9160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif 9170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang errno = EAFNOSUPPORT; 9180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return -1; 9190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 9200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 9210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t * 9220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangget_comindexes(family, ac, av) 9230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int family; 9240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int ac; 9250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char **av; 9260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 9270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vchar_t *buf; 9280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct admin_com_indexes *ci; 9290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char *p_name = NULL, *p_port = NULL; 9300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char *p_prefs = NULL, *p_prefd = NULL; 9310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct sockaddr *src = NULL, *dst = NULL; 9320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int ulproto; 9330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 9340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (ac != 2 && ac != 3) { 9350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang errno = EINVAL; 9360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return NULL; 9370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 9380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 9390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (get_comindex(*av, &p_name, &p_port, &p_prefs) == -1) 9400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang goto bad; 9410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang src = get_sockaddr(family, p_name, p_port); 9420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (p_name) { 9430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang racoon_free(p_name); 9440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang p_name = NULL; 9450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 9460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (p_port) { 9470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang racoon_free(p_port); 9480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang p_port = NULL; 9490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 9500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (src == NULL) 9510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang goto bad; 9520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang av++; 9530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang ac--; 9540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (get_comindex(*av, &p_name, &p_port, &p_prefd) == -1) 9550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang goto bad; 9560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang dst = get_sockaddr(family, p_name, p_port); 9570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (p_name) { 9580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang racoon_free(p_name); 9590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang p_name = NULL; 9600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 9610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (p_port) { 9620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang racoon_free(p_port); 9630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang p_port = NULL; 9640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 9650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (dst == NULL) 9660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang goto bad; 9670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 9680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang buf = vmalloc(sizeof(*ci)); 9690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (buf == NULL) 9700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang goto bad; 9710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 9720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang av++; 9730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang ac--; 9740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if(ac){ 9750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang ulproto = get_ulproto(*av); 9760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (ulproto == -1) 9770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang goto bad; 9780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang }else 9790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang ulproto=0; 9800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 9810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang ci = (struct admin_com_indexes *)buf->v; 9820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if(p_prefs) 9830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang ci->prefs = (u_int8_t)atoi(p_prefs); /* XXX should be handled error. */ 9840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang else 9850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang ci->prefs = 32; 9860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if(p_prefd) 9870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang ci->prefd = (u_int8_t)atoi(p_prefd); /* XXX should be handled error. */ 9880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang else 9890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang ci->prefd = 32; 9900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang ci->ul_proto = ulproto; 9910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang memcpy(&ci->src, src, sysdep_sa_len(src)); 9920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang memcpy(&ci->dst, dst, sysdep_sa_len(dst)); 9930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 9940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (p_name) 9950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang racoon_free(p_name); 9960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 9970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return buf; 9980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 9990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang bad: 10000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (p_name) 10010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang racoon_free(p_name); 10020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (p_port) 10030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang racoon_free(p_port); 10040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (p_prefs) 10050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang racoon_free(p_prefs); 10060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (p_prefd) 10070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang racoon_free(p_prefd); 10080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return NULL; 10090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 10100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 10110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic int 10120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangget_comindex(str, name, port, pref) 10130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char *str, **name, **port, **pref; 10140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 10150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char *p; 10160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 10170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang *name = *port = *pref = NULL; 10180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 10190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang *name = racoon_strdup(str); 10200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang STRDUP_FATAL(*name); 10210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang p = strpbrk(*name, "/["); 10220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (p != NULL) { 10230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (*(p + 1) == '\0') 10240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang goto bad; 10250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (*p == '/') { 10260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang *p = '\0'; 10270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang *pref = racoon_strdup(p + 1); 10280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang STRDUP_FATAL(*pref); 10290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang p = strchr(*pref, '['); 10300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (p != NULL) { 10310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (*(p + 1) == '\0') 10320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang goto bad; 10330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang *p = '\0'; 10340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang *port = racoon_strdup(p + 1); 10350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang STRDUP_FATAL(*port); 10360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang p = strchr(*pref, ']'); 10370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (p == NULL) 10380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang goto bad; 10390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang *p = '\0'; 10400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 10410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } else if (*p == '[') { 10420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (*pref == NULL) 10430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang goto bad; 10440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang *p = '\0'; 10450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang *port = racoon_strdup(p + 1); 10460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang STRDUP_FATAL(*port); 10470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang p = strchr(*pref, ']'); 10480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (p == NULL) 10490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang goto bad; 10500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang *p = '\0'; 10510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } else { 10520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* XXX */ 10530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 10540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 10550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 10560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return 0; 10570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 10580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang bad: 10590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 10600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (*name) 10610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang racoon_free(*name); 10620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (*port) 10630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang racoon_free(*port); 10640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (*pref) 10650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang racoon_free(*pref); 10660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang *name = *port = *pref = NULL; 10670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return -1; 10680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 10690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 10700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic int 10710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangget_ulproto(str) 10720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char *str; 10730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 10740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct ulproto_tag *cp; 10750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 10760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if(str == NULL){ 10770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang errno = EINVAL; 10780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return -1; 10790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 10800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 10810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* checking the string of upper layer protocol. */ 10820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang for (cp = &ulprototab[0]; cp->str; cp++) { 10830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (strcmp(str, cp->str) == 0) 10840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return cp->ul_proto; 10850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 10860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 10870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang errno = EINVAL; 10880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return -1; 10890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 10900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 10910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* %%% */ 10920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvoid 10930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangdump_isakmp_sa(buf, len) 10940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char *buf; 10950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int len; 10960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 10970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct ph1dump *pd; 10980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct tm *tm; 10990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char tbuf[56]; 11000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang caddr_t p = NULL; 11010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 11020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* isakmp status header */ 11030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* short header; 11040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1234567890123456789012 0000000000000000:0000000000000000 000000000000 11050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang*/ 11060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangchar *header1 = 11070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"Destination Cookies Created"; 11080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 11090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* semi long header; 11100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1234567890123456789012 0000000000000000:0000000000000000 00 X 00 X 0000-00-00 00:00:00 000000 11110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang*/ 11120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangchar *header2 = 11130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"Destination Cookies ST S V E Created Phase2"; 11140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 11150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* long header; 11160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 0000:0000:0000:0000:0000:0000:0000:0000.00000 0000:0000:0000:0000:0000:0000:0000:0000.00000 0000000000000000:0000000000000000 00 X 00 X 0000-00-00 00:00:00 000000 11170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang*/ 11180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangchar *header3 = 11190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"Source Destination Cookies ST S V E Created Phase2"; 11200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 11210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* phase status header */ 11220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* short format; 11230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang side stats source address destination address 11240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang xxx xxxxx 1234567890123456789012 1234567890123456789012 11250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang*/ 11260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 11270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang static char *estr[] = { "", "B", "M", "U", "A", "I", }; 11280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 11290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang switch (long_format) { 11300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case 0: 11310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("%s\n", header1); 11320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 11330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case 1: 11340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("%s\n", header2); 11350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 11360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case 2: 11370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang default: 11380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("%s\n", header3); 11390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 11400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 11410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 11420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (len % sizeof(*pd)) 11430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("invalid length %d\n", len); 11440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang len /= sizeof(*pd); 11450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 11460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang pd = (struct ph1dump *)buf; 11470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 11480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang while (len-- > 0) { 11490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* source address */ 11500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (long_format >= 2) { 11510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang GETNAMEINFO((struct sockaddr *)&pd->local, _addr1_, _addr2_); 11520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang switch (long_format) { 11530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case 0: 11540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 11550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case 1: 11560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang p = fixed_addr(_addr1_, _addr2_, 22); 11570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 11580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case 2: 11590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang default: 11600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang p = fixed_addr(_addr1_, _addr2_, 45); 11610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 11620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 11630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("%s ", p); 11640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 11650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 11660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* destination address */ 11670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang GETNAMEINFO((struct sockaddr *)&pd->remote, _addr1_, _addr2_); 11680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang switch (long_format) { 11690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case 0: 11700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case 1: 11710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang p = fixed_addr(_addr1_, _addr2_, 22); 11720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 11730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case 2: 11740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang default: 11750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang p = fixed_addr(_addr1_, _addr2_, 45); 11760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 11770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 11780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("%s ", p); 11790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 11800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("%s ", pindex_isakmp(&pd->index)); 11810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 11820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* statuc, side and version */ 11830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (long_format >= 1) { 11840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("%2d %c %2x ", 11850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang pd->status, 11860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang pd->side == INITIATOR ? 'I' : 'R', 11870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang pd->version); 11880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (ARRAYLEN(estr) > pd->etype) 11890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("%s ", estr[pd->etype]); 11900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 11910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 11920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* created date */ 11930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (pd->created) { 11940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang tm = localtime(&pd->created); 11950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang strftime(tbuf, sizeof(tbuf), "%Y-%m-%d %T", tm); 11960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } else 11970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang snprintf(tbuf, sizeof(tbuf), " "); 11980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("%s ", tbuf); 11990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 12000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* counter of phase 2 */ 12010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (long_format >= 1) 12020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("%6d ", pd->ph2cnt); 12030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 12040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("\n"); 12050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 12060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang pd++; 12070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 12080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 12090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return; 12100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 12110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 12120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* %%% */ 12130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvoid 12140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangdump_internal(buf, tlen) 12150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char *buf; 12160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int tlen; 12170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 12180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct ph2handle *iph2; 12190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct sockaddr *addr; 12200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 12210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* 12220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangshort header; 12230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang source address destination address 12240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1234567890123456789012 1234567890123456789012 12250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang*/ 12260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangchar *short_h1 = 12270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"Source Destination "; 12280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 12290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* 12300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wanglong header; 12310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang source address destination address 12320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 123456789012345678901234567890123456789012345 123456789012345678901234567890123456789012345 12330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 0000:0000:0000:0000:0000:0000:0000:0000.00000 0000:0000:0000:0000:0000:0000:0000:0000.00000 0000:0000:0000:0000:0000:0000:0000:0000.00000 12340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang*/ 12350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangchar *long_h1 = 12360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"Source Destination "; 12370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 12380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("%s\n", long_format ? long_h1 : short_h1); 12390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 12400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang while (tlen > 0) { 12410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang iph2 = (struct ph2handle *)buf; 12420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang addr = (struct sockaddr *)(++iph2); 12430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 12440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang GETNAMEINFO(addr, _addr1_, _addr2_); 12450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("%s ", long_format ? 12460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang fixed_addr(_addr1_, _addr2_, 45) 12470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang : fixed_addr(_addr1_, _addr2_, 22)); 12480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang addr++; 12490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang tlen -= sysdep_sa_len(addr); 12500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 12510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang GETNAMEINFO(addr, _addr1_, _addr2_); 12520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("%s ", long_format ? 12530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang fixed_addr(_addr1_, _addr2_, 45) 12540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang : fixed_addr(_addr1_, _addr2_, 22)); 12550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang addr++; 12560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang tlen -= sysdep_sa_len(addr); 12570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 12580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("\n"); 12590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 12600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 12610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return; 12620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 12630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 12640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* %%% */ 12650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangchar * 12660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangpindex_isakmp(index) 12670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang isakmp_index *index; 12680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 12690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang static char buf[64]; 12700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang u_char *p; 12710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int i, j; 12720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 12730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang memset(buf, 0, sizeof(buf)); 12740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 12750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* copy index */ 12760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang p = (u_char *)index; 12770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang for (j = 0, i = 0; i < sizeof(isakmp_index); i++) { 12780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang snprintf((char *)&buf[j], sizeof(buf) - j, "%02x", p[i]); 12790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang j += 2; 12800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang switch (i) { 12810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case 7: 12820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#if 0 12830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case 15: 12840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif 12850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang buf[j++] = ':'; 12860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 12870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 12880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 12890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return buf; 12900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 12910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 12920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* print schedule */ 12930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangchar *str_sched_stat[] = { 12940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"off", 12950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"on", 12960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"dead", 12970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}; 12980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 12990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangchar *str_sched_id[] = { 13000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"PH1resend", 13010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"PH1lifetime", 13020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"PH2resend", 13030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"PSTacquire", 13040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"PSTlifetime", 13050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}; 13060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 13070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvoid 13080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangprint_schedule(buf, len) 13090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang caddr_t buf; 13100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int len; 13110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 13120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct scheddump *sc = (struct scheddump *)buf; 13130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct tm *tm; 13140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char tbuf[56]; 13150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 13160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (len % sizeof(*sc)) 13170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("invalid length %d\n", len); 13180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang len /= sizeof(*sc); 13190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 13200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* 00000000 00000000 00000000 xxx........*/ 13210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("index tick xtime created\n"); 13220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 13230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang while (len-- > 0) { 13240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang tm = localtime(&sc->created); 13250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang strftime(tbuf, sizeof(tbuf), "%Y-%m-%d %T", tm); 13260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 13270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("%-8ld %-8ld %-8ld %s\n", 13280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang sc->id, 13290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang (long)sc->tick, 13300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang (long)sc->xtime, 13310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang tbuf); 13320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang sc++; 13330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 13340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 13350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return; 13360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 13370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 13380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 13390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvoid 1340c91307af2622f6625525f3c1f9c954376df950adChia-chi Yehprint_evt(buf, len) 1341c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh caddr_t buf; 1342c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh int len; 13430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 1344c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh struct evtdump *evtdump = (struct evtdump *)buf; 13450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int i; 13460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char *srcstr; 13470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char *dststr; 13480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1349c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh for (i = 0; evtmsg[i].msg; i++) 1350c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh if (evtmsg[i].type == evtdump->type) 1351c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh break; 1352c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh 1353c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh if (evtmsg[i].msg == NULL) 1354c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh printf("Event %d: ", evtdump->type); 13550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang else 13560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("%s : ", evtmsg[i].msg); 13570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1358c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh if ((srcstr = saddr2str((struct sockaddr *)&evtdump->src)) == NULL) 13590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("unknown"); 1360c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh else 13610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("%s", srcstr); 13620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf(" -> "); 1363c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh if ((dststr = saddr2str((struct sockaddr *)&evtdump->dst)) == NULL) 13640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("unknown"); 1365c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh else 13660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("%s", dststr); 13670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("\n"); 1368c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh 1369c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh return; 1370c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh} 1371c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh 1372c91307af2622f6625525f3c1f9c954376df950adChia-chi Yehvoid 1373c91307af2622f6625525f3c1f9c954376df950adChia-chi Yehprint_err(buf, len) 1374c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh caddr_t buf; 1375c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh int len; 1376c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh{ 1377c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh struct evtdump *evtdump = (struct evtdump *)buf; 1378c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh int i; 1379c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh 1380c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh 1381c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh for (i = 0; evtmsg[i].msg; i++) 1382c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh if (evtmsg[i].type == evtdump->type) 1383c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh break; 1384c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh 1385c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh if (evtmsg[i].level != ERROR) 1386c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh return; 1387c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh 1388c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh if (evtmsg[i].msg == NULL) 1389c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh printf("Error: Event %d\n", evtdump->type); 1390c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh else 1391c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh printf("Error: %s\n", evtmsg[i].msg); 1392c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh 1393c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh if (evt_filter & EVTF_ERR_STOP) 1394c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh evt_filter &= ~EVTF_LOOP; 1395c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh 1396c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh return; 1397c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh} 1398c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh 1399c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh/* 1400c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh * Print a message when phase 1 SA goes down 1401c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh */ 1402c91307af2622f6625525f3c1f9c954376df950adChia-chi Yehvoid 1403c91307af2622f6625525f3c1f9c954376df950adChia-chi Yehprint_ph1down(buf, len) 1404c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh caddr_t buf; 1405c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh int len; 1406c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh{ 1407c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh struct evtdump *evtdump = (struct evtdump *)buf; 1408c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh 1409c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh if (evtdump->type != EVTT_PHASE1_DOWN) 1410c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh return; 1411c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh 1412c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh printf("VPN connexion terminated\n"); 1413c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh 1414c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh if (evt_filter & EVTF_PH1DOWN_STOP) 1415c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh evt_filter &= ~EVTF_LOOP; 1416c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh 1417c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh return; 14180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 14190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 14200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* 14210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * Print ISAKMP mode config info (IP and banner) 14220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang */ 14230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvoid 14240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangprint_cfg(buf, len) 14250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang caddr_t buf; 14260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int len; 14270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 1428c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh struct evtdump *evtdump = (struct evtdump *)buf; 14290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct isakmp_data *attr; 14300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char *banner = NULL; 14310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct in_addr addr4; 14320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 14330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang memset(&addr4, 0, sizeof(addr4)); 14340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1435c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh if (evtdump->type != EVTT_ISAKMP_CFG_DONE && 1436c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh evtdump->type != EVTT_NO_ISAKMP_CFG) 14370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return; 14380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 14390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang len -= sizeof(*evtdump); 14400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang attr = (struct isakmp_data *)(evtdump + 1); 14410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 14420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang while (len > 0) { 14430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (len < sizeof(*attr)) { 14440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("short attribute too short\n"); 14450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 14460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 14470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 14480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if ((ntohs(attr->type) & ISAKMP_GEN_MASK) == ISAKMP_GEN_TV) { 14490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* Short attribute, skip */ 14500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang len -= sizeof(*attr); 14510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang attr++; 14520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } else { /* Long attribute */ 14530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char *n; 14540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 14550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (len < (sizeof(*attr) + ntohs(attr->lorv))) { 14560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("long attribute too long\n"); 14570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 14580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 14590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 14600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang switch (ntohs(attr->type) & ~ISAKMP_GEN_MASK) { 14610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case INTERNAL_IP4_ADDRESS: 14620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (ntohs(attr->lorv) < sizeof(addr4)) { 14630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("addr4 attribute too short\n"); 14640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 14650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 14660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang memcpy(&addr4, attr + 1, sizeof(addr4)); 14670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 14680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 14690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case UNITY_BANNER: 14700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang banner = racoon_malloc(ntohs(attr->lorv) + 1); 14710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (banner == NULL) { 14720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("malloc failed\n"); 14730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 14740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 14750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang memcpy(banner, attr + 1, ntohs(attr->lorv)); 14760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang banner[ntohs(attr->lorv)] = '\0'; 14770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 14780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 14790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang default: 14800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 14810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 14820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 14830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang len -= (sizeof(*attr) + ntohs(attr->lorv)); 14840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang n = (char *)attr; 14850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang attr = (struct isakmp_data *) 14860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang (n + sizeof(*attr) + ntohs(attr->lorv)); 14870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 14880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 1489c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh 1490c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh if (evtdump->type == EVTT_ISAKMP_CFG_DONE) 14910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("Bound to address %s\n", inet_ntoa(addr4)); 14920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang else 14930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("VPN connexion established\n"); 1494c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh 14950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (banner) { 14960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct winsize win; 14970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int col = 0; 14980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int i; 14990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 15000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (ioctl(1, TIOCGWINSZ, &win) != 1) 15010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang col = win.ws_col; 15020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 15030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang for (i = 0; i < col; i++) 15040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("%c", '='); 15050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("\n%s\n", banner); 15060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang for (i = 0; i < col; i++) 15070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("%c", '='); 15080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("\n"); 15090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang racoon_free(banner); 15100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 1511c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh 1512c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh if (evt_filter & EVTF_CFG_STOP) 1513c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh evt_filter &= ~EVTF_LOOP; 1514c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh 1515c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh return; 15160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 1517c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh 15180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 15190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangchar * 15200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangfixed_addr(addr, port, len) 15210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char *addr, *port; 15220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int len; 15230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 15240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang static char _addr_buf_[BUFSIZ]; 15250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char *p; 15260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int plen, i; 15270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 15280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* initialize */ 15290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang memset(_addr_buf_, ' ', sizeof(_addr_buf_)); 15300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 15310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang plen = strlen(port); 15320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (len < plen + 1) 15330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return NULL; 15340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 15350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang p = _addr_buf_; 15360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang for (i = 0; i < len - plen - 1 && addr[i] != '\0'; /*noting*/) 15370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang *p++ = addr[i++]; 15380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang *p++ = '.'; 15390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 15400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang for (i = 0; i < plen && port[i] != '\0'; /*noting*/) 15410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang *p++ = port[i++]; 15420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 15430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang _addr_buf_[len] = '\0'; 15440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 15450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return _addr_buf_; 15460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 15470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 15480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic int 15490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wanghandle_recv(combuf) 15500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang vchar_t *combuf; 15510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 1552c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh struct admin_com h, *com; 15530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang caddr_t buf; 15540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int len; 15550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 15560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang com = (struct admin_com *)combuf->v; 1557c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh len = com->ac_len - sizeof(*com); 15580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang buf = combuf->v + sizeof(*com); 15590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1560c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh switch (com->ac_cmd) { 15610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case ADMIN_SHOW_SCHED: 15620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang print_schedule(buf, len); 15630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 15640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 15650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case ADMIN_SHOW_EVT: { 1566c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh struct evtdump *evtdump; 15670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1568c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh /* We got no event */ 1569c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh if (len == 0) { 1570c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh /* If we were purging the queue, it is now done */ 1571c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh if (evt_filter & EVTF_PURGE) 1572c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh evt_filter &= ~EVTF_PURGE; 15730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 1574c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh } 15750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1576c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh if (len < sizeof(struct evtdump)) 1577c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh errx(1, "Short buffer\n"); 15780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1579c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh /* Toss outdated events */ 1580c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh evtdump = (struct evtdump *)buf; 1581c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh if (evtdump->timestamp < evt_start) 1582c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh break; 15830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1584c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh if (evt_filter & EVTF_ALL) 1585c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh print_evt(buf, len); 1586c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh if (evt_filter & EVTF_ERR) 1587c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh print_err(buf, len); 1588c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh if (evt_filter & EVTF_CFG) 1589c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh print_cfg(buf, len); 1590c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh if (evt_filter & EVTF_PH1DOWN) 1591c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh print_ph1down(buf, len); 1592f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh break; 1593c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh } 1594f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh 15950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case ADMIN_SHOW_SA: 15960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang { 15970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang switch (com->ac_proto) { 15980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case ADMIN_PROTO_ISAKMP: 15990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang dump_isakmp_sa(buf, len); 16000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 16010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case ADMIN_PROTO_IPSEC: 16020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case ADMIN_PROTO_AH: 16030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case ADMIN_PROTO_ESP: 16040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang { 16050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct sadb_msg *msg = (struct sadb_msg *)buf; 16060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 16070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang switch (msg->sadb_msg_errno) { 16080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case ENOENT: 16090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang switch (msg->sadb_msg_type) { 16100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case SADB_DELETE: 16110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case SADB_GET: 16120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("No entry.\n"); 16130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 16140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case SADB_DUMP: 16150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("No SAD entries.\n"); 16160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 16170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 16180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 16190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case 0: 16200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang while (1) { 16210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang pfkey_sadump(msg); 16220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (msg->sadb_msg_seq == 0) 16230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 16240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang msg = (struct sadb_msg *)((caddr_t)msg + 16250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang PFKEY_UNUNIT64(msg->sadb_msg_len)); 16260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 16270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 16280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang default: 16290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("%s.\n", strerror(msg->sadb_msg_errno)); 16300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 16310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 16320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 16330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case ADMIN_PROTO_INTERNAL: 16340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang dump_internal(buf, len); 16350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 16360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang default: 16370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("Invalid proto [%d]\n", com->ac_proto); 16380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 16390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 16400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 16410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 16420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 16430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang default: 16440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* IGNORE */ 16450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 16460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 16470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1648c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh close(so); 16490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return 0; 16500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1651c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh bad: 1652c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh close(so); 16530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return -1; 16540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 1655