1c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh/* $NetBSD: key_debug.c,v 1.7.6.1 2007/08/01 11:52:18 vanhu Exp $ */ 20a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 30a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* $KAME: key_debug.c,v 1.29 2001/08/16 14:25:41 itojun 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#ifdef HAVE_CONFIG_H 350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "config.h" 360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif 370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifdef _KERNEL 390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#if defined(__FreeBSD__) && __FreeBSD__ >= 3 400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "opt_inet.h" 410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "opt_inet6.h" 420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "opt_ipsec.h" 430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif 440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifdef __NetBSD__ 450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "opt_inet.h" 460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif 470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif 480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#if HAVE_STDINT_H 500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <stdint.h> 510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif 520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <sys/types.h> 540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <sys/param.h> 550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifdef _KERNEL 560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <sys/systm.h> 570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <sys/mbuf.h> 580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <sys/queue.h> 590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif 600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <sys/socket.h> 610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <netinet/in.h> 630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include PATH_IPSEC_H 640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifndef _KERNEL 660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <ctype.h> 670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <stdio.h> 680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <stdlib.h> 690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif /* !_KERNEL */ 700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "config.h" 720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "libpfkey.h" 730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic void kdebug_sadb_prop __P((struct sadb_ext *)); 750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic void kdebug_sadb_identity __P((struct sadb_ext *)); 760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic void kdebug_sadb_supported __P((struct sadb_ext *)); 770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic void kdebug_sadb_lifetime __P((struct sadb_ext *)); 780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic void kdebug_sadb_sa __P((struct sadb_ext *)); 790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic void kdebug_sadb_address __P((struct sadb_ext *)); 800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic void kdebug_sadb_key __P((struct sadb_ext *)); 810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic void kdebug_sadb_x_sa2 __P((struct sadb_ext *)); 820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic void kdebug_sadb_x_policy __P((struct sadb_ext *ext)); 830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic void kdebug_sockaddr __P((struct sockaddr *addr)); 840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifdef SADB_X_EXT_NAT_T_TYPE 860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic void kdebug_sadb_x_nat_t_type __P((struct sadb_ext *ext)); 870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic void kdebug_sadb_x_nat_t_port __P((struct sadb_ext *ext)); 880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif 890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifdef SADB_X_EXT_PACKET 910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic void kdebug_sadb_x_packet __P((struct sadb_ext *)); 920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif 930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifdef _KERNEL 950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic void kdebug_secreplay __P((struct secreplay *)); 960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif 970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifndef _KERNEL 990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#define panic(param) { printf(param); exit(1); } 1000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif 1010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "libpfkey.h" 1030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* NOTE: host byte order */ 1040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* %%%: about struct sadb_msg */ 1060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvoid 1070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangkdebug_sadb(base) 1080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct sadb_msg *base; 1090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 1100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct sadb_ext *ext; 1110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int tlen, extlen; 1120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* sanity check */ 1140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (base == NULL) 1150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang panic("kdebug_sadb: NULL pointer was passed.\n"); 1160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("sadb_msg{ version=%u type=%u errno=%u satype=%u\n", 1180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang base->sadb_msg_version, base->sadb_msg_type, 1190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang base->sadb_msg_errno, base->sadb_msg_satype); 1200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf(" len=%u reserved=%u seq=%u pid=%u\n", 1210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang base->sadb_msg_len, base->sadb_msg_reserved, 1220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang base->sadb_msg_seq, base->sadb_msg_pid); 1230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang tlen = PFKEY_UNUNIT64(base->sadb_msg_len) - sizeof(struct sadb_msg); 1250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang ext = (void *)((caddr_t)(void *)base + sizeof(struct sadb_msg)); 1260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang while (tlen > 0) { 1280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("sadb_ext{ len=%u type=%u }\n", 1290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang ext->sadb_ext_len, ext->sadb_ext_type); 1300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (ext->sadb_ext_len == 0) { 1320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("kdebug_sadb: invalid ext_len=0 was passed.\n"); 1330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return; 1340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 1350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (ext->sadb_ext_len > tlen) { 1360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("kdebug_sadb: ext_len exceeds end of buffer.\n"); 1370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return; 1380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 1390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 1400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang switch (ext->sadb_ext_type) { 1410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case SADB_EXT_SA: 1420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang kdebug_sadb_sa(ext); 1430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 1440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case SADB_EXT_LIFETIME_CURRENT: 1450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case SADB_EXT_LIFETIME_HARD: 1460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case SADB_EXT_LIFETIME_SOFT: 1470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang kdebug_sadb_lifetime(ext); 1480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 1490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case SADB_EXT_ADDRESS_SRC: 1500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case SADB_EXT_ADDRESS_DST: 1510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case SADB_EXT_ADDRESS_PROXY: 1520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang kdebug_sadb_address(ext); 1530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 1540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case SADB_EXT_KEY_AUTH: 1550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case SADB_EXT_KEY_ENCRYPT: 1560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang kdebug_sadb_key(ext); 1570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 1580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case SADB_EXT_IDENTITY_SRC: 1590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case SADB_EXT_IDENTITY_DST: 1600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang kdebug_sadb_identity(ext); 1610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 1620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case SADB_EXT_SENSITIVITY: 1630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 1640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case SADB_EXT_PROPOSAL: 1650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang kdebug_sadb_prop(ext); 1660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 1670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case SADB_EXT_SUPPORTED_AUTH: 1680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case SADB_EXT_SUPPORTED_ENCRYPT: 1690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang kdebug_sadb_supported(ext); 1700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 1710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case SADB_EXT_SPIRANGE: 1720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case SADB_X_EXT_KMPRIVATE: 1730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 1740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case SADB_X_EXT_POLICY: 1750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang kdebug_sadb_x_policy(ext); 1760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 1770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case SADB_X_EXT_SA2: 1780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang kdebug_sadb_x_sa2(ext); 1790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 1800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifdef SADB_X_EXT_NAT_T_TYPE 1810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case SADB_X_EXT_NAT_T_TYPE: 1820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang kdebug_sadb_x_nat_t_type(ext); 1830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 1840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case SADB_X_EXT_NAT_T_SPORT: 1850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case SADB_X_EXT_NAT_T_DPORT: 1860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang kdebug_sadb_x_nat_t_port(ext); 1870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 1880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case SADB_X_EXT_NAT_T_OA: 1890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang kdebug_sadb_address(ext); 1900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 1910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif 1920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifdef SADB_X_EXT_PACKET 1930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case SADB_X_EXT_PACKET: 1940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang kdebug_sadb_x_packet(ext); 1950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 1960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif 1970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang default: 1980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("kdebug_sadb: invalid ext_type %u was passed.\n", 1990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang ext->sadb_ext_type); 2000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return; 2010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 2020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang extlen = PFKEY_UNUNIT64(ext->sadb_ext_len); 2040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang tlen -= extlen; 2050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang ext = (void *)((caddr_t)(void *)ext + extlen); 2060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 2070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return; 2090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 2100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic void 2120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangkdebug_sadb_prop(ext) 2130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct sadb_ext *ext; 2140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 2150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct sadb_prop *prop = (void *)ext; 2160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct sadb_comb *comb; 2170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int len; 2180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* sanity check */ 2200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (ext == NULL) 2210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang panic("kdebug_sadb_prop: NULL pointer was passed.\n"); 2220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang len = (PFKEY_UNUNIT64(prop->sadb_prop_len) - sizeof(*prop)) 2240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang / sizeof(*comb); 2250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang comb = (void *)(prop + 1); 2260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("sadb_prop{ replay=%u\n", prop->sadb_prop_replay); 2270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang while (len--) { 2290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("sadb_comb{ auth=%u encrypt=%u " 2300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "flags=0x%04x reserved=0x%08x\n", 2310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang comb->sadb_comb_auth, comb->sadb_comb_encrypt, 2320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang comb->sadb_comb_flags, comb->sadb_comb_reserved); 2330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf(" auth_minbits=%u auth_maxbits=%u " 2350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "encrypt_minbits=%u encrypt_maxbits=%u\n", 2360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang comb->sadb_comb_auth_minbits, 2370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang comb->sadb_comb_auth_maxbits, 2380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang comb->sadb_comb_encrypt_minbits, 2390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang comb->sadb_comb_encrypt_maxbits); 2400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf(" soft_alloc=%u hard_alloc=%u " 2420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "soft_bytes=%lu hard_bytes=%lu\n", 2430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang comb->sadb_comb_soft_allocations, 2440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang comb->sadb_comb_hard_allocations, 2450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang (unsigned long)comb->sadb_comb_soft_bytes, 2460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang (unsigned long)comb->sadb_comb_hard_bytes); 2470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf(" soft_alloc=%lu hard_alloc=%lu " 2490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "soft_bytes=%lu hard_bytes=%lu }\n", 2500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang (unsigned long)comb->sadb_comb_soft_addtime, 2510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang (unsigned long)comb->sadb_comb_hard_addtime, 2520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang (unsigned long)comb->sadb_comb_soft_usetime, 2530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang (unsigned long)comb->sadb_comb_hard_usetime); 2540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang comb++; 2550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 2560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("}\n"); 2570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return; 2590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 2600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic void 2620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangkdebug_sadb_identity(ext) 2630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct sadb_ext *ext; 2640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 2650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct sadb_ident *id = (void *)ext; 2660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int len; 2670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* sanity check */ 2690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (ext == NULL) 2700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang panic("kdebug_sadb_identity: NULL pointer was passed.\n"); 2710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang len = PFKEY_UNUNIT64(id->sadb_ident_len) - sizeof(*id); 2730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("sadb_ident_%s{", 2740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang id->sadb_ident_exttype == SADB_EXT_IDENTITY_SRC ? "src" : "dst"); 2750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang switch (id->sadb_ident_type) { 2760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang default: 2770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf(" type=%d id=%lu", 2780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang id->sadb_ident_type, (u_long)id->sadb_ident_id); 2790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (len) { 2800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifdef _KERNEL 2810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang ipsec_hexdump((caddr_t)(id + 1), len); /*XXX cast ?*/ 2820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#else 2830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang char *p, *ep; 2840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("\n str=\""); 2850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang p = (void *)(id + 1); 2860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang ep = p + len; 2870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang for (/*nothing*/; *p && p < ep; p++) { 2880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (isprint((int)*p)) 2890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("%c", *p & 0xff); 2900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang else 2910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("\\%03o", *p & 0xff); 2920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 2930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif 2940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("\""); 2950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 2960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 2970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 2980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 2990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf(" }\n"); 3000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 3010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return; 3020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 3030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 3040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic void 3050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangkdebug_sadb_supported(ext) 3060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct sadb_ext *ext; 3070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 3080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct sadb_supported *sup = (void *)ext; 3090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct sadb_alg *alg; 3100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int len; 3110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 3120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* sanity check */ 3130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (ext == NULL) 3140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang panic("kdebug_sadb_supported: NULL pointer was passed.\n"); 3150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 3160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang len = (PFKEY_UNUNIT64(sup->sadb_supported_len) - sizeof(*sup)) 3170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang / sizeof(*alg); 3180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang alg = (void *)(sup + 1); 3190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("sadb_sup{\n"); 3200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang while (len--) { 3210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf(" { id=%d ivlen=%d min=%d max=%d }\n", 3220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang alg->sadb_alg_id, alg->sadb_alg_ivlen, 3230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang alg->sadb_alg_minbits, alg->sadb_alg_maxbits); 3240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang alg++; 3250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 3260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("}\n"); 3270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 3280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return; 3290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 3300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 3310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic void 3320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangkdebug_sadb_lifetime(ext) 3330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct sadb_ext *ext; 3340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 3350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct sadb_lifetime *lft = (void *)ext; 3360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 3370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* sanity check */ 3380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (ext == NULL) 3390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("kdebug_sadb_lifetime: NULL pointer was passed.\n"); 3400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 3410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("sadb_lifetime{ alloc=%u, bytes=%u\n", 3420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang lft->sadb_lifetime_allocations, 3430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang (u_int32_t)lft->sadb_lifetime_bytes); 3440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf(" addtime=%u, usetime=%u }\n", 3450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang (u_int32_t)lft->sadb_lifetime_addtime, 3460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang (u_int32_t)lft->sadb_lifetime_usetime); 3470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 3480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return; 3490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 3500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 3510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic void 3520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangkdebug_sadb_sa(ext) 3530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct sadb_ext *ext; 3540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 3550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct sadb_sa *sa = (void *)ext; 3560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 3570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* sanity check */ 3580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (ext == NULL) 3590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang panic("kdebug_sadb_sa: NULL pointer was passed.\n"); 3600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 3610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("sadb_sa{ spi=%u replay=%u state=%u\n", 3620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang (u_int32_t)ntohl(sa->sadb_sa_spi), sa->sadb_sa_replay, 3630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang sa->sadb_sa_state); 3640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf(" auth=%u encrypt=%u flags=0x%08x }\n", 3650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang sa->sadb_sa_auth, sa->sadb_sa_encrypt, sa->sadb_sa_flags); 3660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 3670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return; 3680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 3690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 3700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic void 3710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangkdebug_sadb_address(ext) 3720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct sadb_ext *ext; 3730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 3740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct sadb_address *addr = (void *)ext; 3750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 3760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* sanity check */ 3770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (ext == NULL) 3780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang panic("kdebug_sadb_address: NULL pointer was passed.\n"); 3790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 3800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("sadb_address{ proto=%u prefixlen=%u reserved=0x%02x%02x }\n", 3810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang addr->sadb_address_proto, addr->sadb_address_prefixlen, 3820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang ((u_char *)(void *)&addr->sadb_address_reserved)[0], 3830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang ((u_char *)(void *)&addr->sadb_address_reserved)[1]); 3840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 3850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang kdebug_sockaddr((void *)((caddr_t)(void *)ext + sizeof(*addr))); 3860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 3870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return; 3880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 3890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 3900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic void 3910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangkdebug_sadb_key(ext) 3920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct sadb_ext *ext; 3930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 3940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct sadb_key *key = (void *)ext; 3950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 3960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* sanity check */ 3970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (ext == NULL) 3980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang panic("kdebug_sadb_key: NULL pointer was passed.\n"); 3990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 4000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("sadb_key{ bits=%u reserved=%u\n", 4010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang key->sadb_key_bits, key->sadb_key_reserved); 4020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf(" key="); 4030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 4040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* sanity check 2 */ 4050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (((uint32_t)key->sadb_key_bits >> 3) > 4060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang (PFKEY_UNUNIT64(key->sadb_key_len) - sizeof(struct sadb_key))) { 4070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("kdebug_sadb_key: key length mismatch, bit:%d len:%ld.\n", 4080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang (uint32_t)key->sadb_key_bits >> 3, 4090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang (long)PFKEY_UNUNIT64(key->sadb_key_len) - sizeof(struct sadb_key)); 4100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 4110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 4120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang ipsec_hexdump(key + sizeof(struct sadb_key), 4130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang (int)((uint32_t)key->sadb_key_bits >> 3)); 4140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf(" }\n"); 4150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return; 4160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 4170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 4180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic void 4190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangkdebug_sadb_x_sa2(ext) 4200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct sadb_ext *ext; 4210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 4220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct sadb_x_sa2 *sa2 = (void *)ext; 4230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 4240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* sanity check */ 4250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (ext == NULL) 4260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang panic("kdebug_sadb_x_sa2: NULL pointer was passed.\n"); 4270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 4280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("sadb_x_sa2{ mode=%u reqid=%u\n", 4290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang sa2->sadb_x_sa2_mode, sa2->sadb_x_sa2_reqid); 4300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf(" reserved1=%u reserved2=%u sequence=%u }\n", 4310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang sa2->sadb_x_sa2_reserved1, sa2->sadb_x_sa2_reserved2, 4320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang sa2->sadb_x_sa2_sequence); 4330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 4340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return; 4350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 4360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 4370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvoid 4380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangkdebug_sadb_x_policy(ext) 4390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct sadb_ext *ext; 4400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 4410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct sadb_x_policy *xpl = (void *)ext; 4420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct sockaddr *addr; 4430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 4440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* sanity check */ 4450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (ext == NULL) 4460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang panic("kdebug_sadb_x_policy: NULL pointer was passed.\n"); 4470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 4480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifdef HAVE_PFKEY_POLICY_PRIORITY 4490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("sadb_x_policy{ type=%u dir=%u id=%x priority=%u }\n", 4500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#else 4510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("sadb_x_policy{ type=%u dir=%u id=%x }\n", 4520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif 4530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang xpl->sadb_x_policy_type, xpl->sadb_x_policy_dir, 4540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifdef HAVE_PFKEY_POLICY_PRIORITY 4550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang xpl->sadb_x_policy_id, xpl->sadb_x_policy_priority); 4560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#else 4570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang xpl->sadb_x_policy_id); 4580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif 4590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 4600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (xpl->sadb_x_policy_type == IPSEC_POLICY_IPSEC) { 4610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int tlen; 4620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct sadb_x_ipsecrequest *xisr; 4630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 4640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang tlen = PFKEY_UNUNIT64(xpl->sadb_x_policy_len) - sizeof(*xpl); 4650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang xisr = (void *)(xpl + 1); 4660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 4670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang while (tlen > 0) { 4680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf(" { len=%u proto=%u mode=%u level=%u reqid=%u\n", 4690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang xisr->sadb_x_ipsecrequest_len, 4700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang xisr->sadb_x_ipsecrequest_proto, 4710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang xisr->sadb_x_ipsecrequest_mode, 4720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang xisr->sadb_x_ipsecrequest_level, 4730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang xisr->sadb_x_ipsecrequest_reqid); 4740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 4750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (xisr->sadb_x_ipsecrequest_len > sizeof(*xisr)) { 4760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang addr = (void *)(xisr + 1); 4770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang kdebug_sockaddr(addr); 4780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang addr = (void *)((caddr_t)(void *)addr 4790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang + sysdep_sa_len(addr)); 4800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang kdebug_sockaddr(addr); 4810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 4820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 4830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf(" }\n"); 4840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 4850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* prevent infinite loop */ 4860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (xisr->sadb_x_ipsecrequest_len == 0) { 4870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("kdebug_sadb_x_policy: wrong policy struct.\n"); 4880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return; 4890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 4900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* prevent overflow */ 4910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (xisr->sadb_x_ipsecrequest_len > tlen) { 4920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("invalid ipsec policy length\n"); 4930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return; 4940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 4950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 4960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang tlen -= xisr->sadb_x_ipsecrequest_len; 4970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 4980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang xisr = (void *)((caddr_t)(void *)xisr 4990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang + xisr->sadb_x_ipsecrequest_len); 5000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 5010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 5020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (tlen != 0) 5030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang panic("kdebug_sadb_x_policy: wrong policy struct.\n"); 5040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 5050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 5060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return; 5070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 5080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 5090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifdef SADB_X_EXT_NAT_T_TYPE 5100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic void 5110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangkdebug_sadb_x_nat_t_type(struct sadb_ext *ext) 5120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 5130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct sadb_x_nat_t_type *ntt = (void *)ext; 5140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 5150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* sanity check */ 5160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (ext == NULL) 5170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang panic("kdebug_sadb_x_nat_t_type: NULL pointer was passed.\n"); 5180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 5190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("sadb_x_nat_t_type{ type=%u }\n", ntt->sadb_x_nat_t_type_type); 5200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 5210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return; 5220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 5230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 5240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic void 5250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangkdebug_sadb_x_nat_t_port(struct sadb_ext *ext) 5260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 5270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct sadb_x_nat_t_port *ntp = (void *)ext; 5280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 5290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* sanity check */ 5300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (ext == NULL) 5310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang panic("kdebug_sadb_x_nat_t_port: NULL pointer was passed.\n"); 5320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 5330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("sadb_x_nat_t_port{ port=%u }\n", ntohs(ntp->sadb_x_nat_t_port_port)); 5340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 5350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return; 5360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 5370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif 5380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 5390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifdef SADB_X_EXT_PACKET 5400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic void 5410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangkdebug_sadb_x_packet(ext) 5420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct sadb_ext *ext; 5430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 5440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct sadb_x_packet *pkt = (struct sadb_x_packet *)ext; 5450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 5460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* sanity check */ 5470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (ext == NULL) 5480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang panic("kdebug_sadb_x_packet: NULL pointer was passed.\n"); 5490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 5500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("sadb_x_packet{ copylen=%u\n", pkt->sadb_x_packet_copylen); 5510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf(" packet="); 5520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang ipsec_hexdump((caddr_t)pkt + sizeof(struct sadb_x_packet), 5530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang pkt->sadb_x_packet_copylen); 5540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf(" }\n"); 5550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return; 5560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 5570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif 5580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 5590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 5600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifdef _KERNEL 5610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* %%%: about SPD and SAD */ 5620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvoid 5630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangkdebug_secpolicy(sp) 5640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct secpolicy *sp; 5650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 5660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* sanity check */ 5670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (sp == NULL) 5680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang panic("kdebug_secpolicy: NULL pointer was passed.\n"); 5690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 5700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("secpolicy{ refcnt=%u state=%u policy=%u\n", 5710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang sp->refcnt, sp->state, sp->policy); 5720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 5730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang kdebug_secpolicyindex(&sp->spidx); 5740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 5750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang switch (sp->policy) { 5760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case IPSEC_POLICY_DISCARD: 5770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf(" type=discard }\n"); 5780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 5790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case IPSEC_POLICY_NONE: 5800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf(" type=none }\n"); 5810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 5820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case IPSEC_POLICY_IPSEC: 5830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang { 5840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct ipsecrequest *isr; 5850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang for (isr = sp->req; isr != NULL; isr = isr->next) { 5860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 5870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf(" level=%u\n", isr->level); 5880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang kdebug_secasindex(&isr->saidx); 5890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 5900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (isr->sav != NULL) 5910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang kdebug_secasv(isr->sav); 5920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 5930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf(" }\n"); 5940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 5950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 5960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case IPSEC_POLICY_BYPASS: 5970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf(" type=bypass }\n"); 5980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 5990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case IPSEC_POLICY_ENTRUST: 6000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf(" type=entrust }\n"); 6010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 6020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang default: 6030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("kdebug_secpolicy: Invalid policy found. %d\n", 6040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang sp->policy); 6050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 6060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 6070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 6080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return; 6090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 6100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 6110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvoid 6120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangkdebug_secpolicyindex(spidx) 6130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct secpolicyindex *spidx; 6140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 6150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* sanity check */ 6160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (spidx == NULL) 6170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang panic("kdebug_secpolicyindex: NULL pointer was passed.\n"); 6180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 6190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("secpolicyindex{ dir=%u prefs=%u prefd=%u ul_proto=%u\n", 6200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang spidx->dir, spidx->prefs, spidx->prefd, spidx->ul_proto); 6210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 6220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang ipsec_hexdump((caddr_t)&spidx->src, 6230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang sysdep_sa_len((struct sockaddr *)&spidx->src)); 6240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("\n"); 6250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang ipsec_hexdump((caddr_t)&spidx->dst, 6260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang sysdep_sa_len((struct sockaddr *)&spidx->dst)); 6270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("}\n"); 6280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 6290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return; 6300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 6310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 6320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvoid 6330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangkdebug_secasindex(saidx) 6340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct secasindex *saidx; 6350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 6360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* sanity check */ 6370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (saidx == NULL) 6380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang panic("kdebug_secpolicyindex: NULL pointer was passed.\n"); 6390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 6400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("secasindex{ mode=%u proto=%u\n", 6410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang saidx->mode, saidx->proto); 6420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 6430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang ipsec_hexdump((caddr_t)&saidx->src, 6440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang sysdep_sa_len((struct sockaddr *)&saidx->src)); 6450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("\n"); 6460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang ipsec_hexdump((caddr_t)&saidx->dst, 6470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang sysdep_sa_len((struct sockaddr *)&saidx->dst)); 6480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("\n"); 6490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 6500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return; 6510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 6520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 6530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvoid 6540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangkdebug_secasv(sav) 6550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct secasvar *sav; 6560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 6570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* sanity check */ 6580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (sav == NULL) 6590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang panic("kdebug_secasv: NULL pointer was passed.\n"); 6600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 6610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("secas{"); 6620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang kdebug_secasindex(&sav->sah->saidx); 6630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 6640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf(" refcnt=%u state=%u auth=%u enc=%u\n", 6650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang sav->refcnt, sav->state, sav->alg_auth, sav->alg_enc); 6660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf(" spi=%u flags=%u\n", 6670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang (u_int32_t)ntohl(sav->spi), sav->flags); 6680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 6690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (sav->key_auth != NULL) 6700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang kdebug_sadb_key((struct sadb_ext *)sav->key_auth); 6710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (sav->key_enc != NULL) 6720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang kdebug_sadb_key((struct sadb_ext *)sav->key_enc); 6730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (sav->iv != NULL) { 6740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf(" iv="); 6750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang ipsec_hexdump(sav->iv, sav->ivlen ? sav->ivlen : 8); 6760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("\n"); 6770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 6780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 6790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (sav->replay != NULL) 6800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang kdebug_secreplay(sav->replay); 6810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (sav->lft_c != NULL) 6820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang kdebug_sadb_lifetime((struct sadb_ext *)sav->lft_c); 6830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (sav->lft_h != NULL) 6840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang kdebug_sadb_lifetime((struct sadb_ext *)sav->lft_h); 6850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (sav->lft_s != NULL) 6860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang kdebug_sadb_lifetime((struct sadb_ext *)sav->lft_s); 6870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 6880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#if notyet 6890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* XXX: misc[123] ? */ 6900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif 6910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 6920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return; 6930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 6940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 6950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic void 6960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangkdebug_secreplay(rpl) 6970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct secreplay *rpl; 6980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 6990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int len, l; 7000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 7010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* sanity check */ 7020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (rpl == NULL) 7030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang panic("kdebug_secreplay: NULL pointer was passed.\n"); 7040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 7050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf(" secreplay{ count=%u wsize=%u seq=%u lastseq=%u", 7060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang rpl->count, rpl->wsize, rpl->seq, rpl->lastseq); 7070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 7080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (rpl->bitmap == NULL) { 7090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf(" }\n"); 7100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return; 7110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 7120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 7130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("\n bitmap { "); 7140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 7150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang for (len = 0; len < rpl->wsize; len++) { 7160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang for (l = 7; l >= 0; l--) 7170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("%u", (((rpl->bitmap)[len] >> l) & 1) ? 1 : 0); 7180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 7190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf(" }\n"); 7200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 7210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return; 7220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 7230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 7240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvoid 7250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangkdebug_mbufhdr(m) 7260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct mbuf *m; 7270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 7280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* sanity check */ 7290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (m == NULL) 7300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return; 7310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 7320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("mbuf(%p){ m_next:%p m_nextpkt:%p m_data:%p " 7330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "m_len:%d m_type:0x%02x m_flags:0x%02x }\n", 7340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang m, m->m_next, m->m_nextpkt, m->m_data, 7350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang m->m_len, m->m_type, m->m_flags); 7360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 7370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (m->m_flags & M_PKTHDR) { 7380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf(" m_pkthdr{ len:%d rcvif:%p }\n", 7390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang m->m_pkthdr.len, m->m_pkthdr.rcvif); 7400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 7410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 7420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifdef __FreeBSD__ 7430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (m->m_flags & M_EXT) { 7440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf(" m_ext{ ext_buf:%p ext_free:%p " 7450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang "ext_size:%u ext_ref:%p }\n", 7460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang m->m_ext.ext_buf, m->m_ext.ext_free, 7470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang m->m_ext.ext_size, m->m_ext.ext_ref); 7480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 7490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif 7500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 7510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return; 7520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 7530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 7540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvoid 7550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangkdebug_mbuf(m0) 7560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct mbuf *m0; 7570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 7580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct mbuf *m = m0; 7590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int i, j; 7600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 7610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang for (j = 0; m; m = m->m_next) { 7620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang kdebug_mbufhdr(m); 7630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf(" m_data:\n"); 7640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang for (i = 0; i < m->m_len; i++) { 7650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (i && i % 32 == 0) 7660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("\n"); 7670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (i % 4 == 0) 7680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf(" "); 7690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("%02x", mtod(m, u_char *)[i]); 7700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang j++; 7710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 7720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("\n"); 7730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 7740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 7750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return; 7760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 7770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif /* _KERNEL */ 7780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 7790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic void 7800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangkdebug_sockaddr(addr) 7810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct sockaddr *addr; 7820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 7830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct sockaddr_in *sin4; 7840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifdef INET6 7850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang struct sockaddr_in6 *sin6; 7860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif 7870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 7880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* sanity check */ 7890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (addr == NULL) 7900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang panic("kdebug_sockaddr: NULL pointer was passed.\n"); 7910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 7920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang /* NOTE: We deal with port number as host byte order. */ 7930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("sockaddr{ len=%u family=%u", sysdep_sa_len(addr), addr->sa_family); 7940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 7950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang switch (addr->sa_family) { 7960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case AF_INET: 7970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang sin4 = (void *)addr; 7980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf(" port=%u\n", ntohs(sin4->sin_port)); 7990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang ipsec_hexdump(&sin4->sin_addr, sizeof(sin4->sin_addr)); 8000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 8010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifdef INET6 8020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang case AF_INET6: 8030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang sin6 = (void *)addr; 8040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf(" port=%u\n", ntohs(sin6->sin6_port)); 8050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf(" flowinfo=0x%08x, scope_id=0x%08x\n", 8060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang sin6->sin6_flowinfo, sin6->sin6_scope_id); 8070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang ipsec_hexdump(&sin6->sin6_addr, sizeof(sin6->sin6_addr)); 8080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang break; 8090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif 8100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 8110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 8120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf(" }\n"); 8130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 8140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return; 8150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 8160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 8170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvoid 8180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangipsec_bindump(buf, len) 8190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang caddr_t buf; 8200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int len; 8210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 8220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int i; 8230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 8240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang for (i = 0; i < len; i++) 8250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("%c", (unsigned char)buf[i]); 8260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 8270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return; 8280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 8290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 8300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 8310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvoid 8320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangipsec_hexdump(buf, len) 8330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang const void *buf; 8340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int len; 8350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{ 8360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang int i; 8370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 8380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang for (i = 0; i < len; i++) { 8390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (i != 0 && i % 32 == 0) printf("\n"); 8400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (i % 4 == 0) printf(" "); 8410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang printf("%02x", ((const unsigned char *)buf)[i]); 8420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang } 8430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#if 0 8440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang if (i % 32 != 0) printf("\n"); 8450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif 8460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang 8470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang return; 8480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} 849