xref: /freebsd/lib/libipsec/pfkey_dump.c (revision 8a16b7a18f5d0b031f09832fd7752fba717e2a97)
1bd9f52d5SHajimu UMEMOTO /*	$KAME: pfkey_dump.c,v 1.45 2003/09/08 10:14:56 itojun Exp $	*/
23c62e87aSJun-ichiro itojun Hagino 
3*8a16b7a1SPedro F. Giffuni /*-
4*8a16b7a1SPedro F. Giffuni  * SPDX-License-Identifier: BSD-3-Clause
5*8a16b7a1SPedro F. Giffuni  *
69a4365d0SYoshinobu Inoue  * Copyright (C) 1995, 1996, 1997, 1998, and 1999 WIDE Project.
79a4365d0SYoshinobu Inoue  * All rights reserved.
89a4365d0SYoshinobu Inoue  *
99a4365d0SYoshinobu Inoue  * Redistribution and use in source and binary forms, with or without
109a4365d0SYoshinobu Inoue  * modification, are permitted provided that the following conditions
119a4365d0SYoshinobu Inoue  * are met:
129a4365d0SYoshinobu Inoue  * 1. Redistributions of source code must retain the above copyright
139a4365d0SYoshinobu Inoue  *    notice, this list of conditions and the following disclaimer.
149a4365d0SYoshinobu Inoue  * 2. Redistributions in binary form must reproduce the above copyright
159a4365d0SYoshinobu Inoue  *    notice, this list of conditions and the following disclaimer in the
169a4365d0SYoshinobu Inoue  *    documentation and/or other materials provided with the distribution.
179a4365d0SYoshinobu Inoue  * 3. Neither the name of the project nor the names of its contributors
189a4365d0SYoshinobu Inoue  *    may be used to endorse or promote products derived from this software
199a4365d0SYoshinobu Inoue  *    without specific prior written permission.
209a4365d0SYoshinobu Inoue  *
219a4365d0SYoshinobu Inoue  * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
229a4365d0SYoshinobu Inoue  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
239a4365d0SYoshinobu Inoue  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
249a4365d0SYoshinobu Inoue  * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
259a4365d0SYoshinobu Inoue  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
269a4365d0SYoshinobu Inoue  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
279a4365d0SYoshinobu Inoue  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
289a4365d0SYoshinobu Inoue  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
299a4365d0SYoshinobu Inoue  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
309a4365d0SYoshinobu Inoue  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
319a4365d0SYoshinobu Inoue  * SUCH DAMAGE.
329a4365d0SYoshinobu Inoue  */
339a4365d0SYoshinobu Inoue 
3446a50f4eSMatthew Dillon #include <sys/cdefs.h>
3546a50f4eSMatthew Dillon __FBSDID("$FreeBSD$");
3646a50f4eSMatthew Dillon 
379a4365d0SYoshinobu Inoue #include <sys/types.h>
389a4365d0SYoshinobu Inoue #include <sys/param.h>
399a4365d0SYoshinobu Inoue #include <sys/socket.h>
4022986c67SAndrey V. Elsukov #include <net/if.h>
419a4365d0SYoshinobu Inoue #include <net/pfkeyv2.h>
4222986c67SAndrey V. Elsukov #include <netipsec/ipsec.h>
438409aedfSGeorge V. Neville-Neil #include <netipsec/key_var.h>
448409aedfSGeorge V. Neville-Neil #include <netipsec/key_debug.h>
459a4365d0SYoshinobu Inoue 
469a4365d0SYoshinobu Inoue #include <netinet/in.h>
479a4365d0SYoshinobu Inoue #include <arpa/inet.h>
489a4365d0SYoshinobu Inoue 
499a4365d0SYoshinobu Inoue #include <stdlib.h>
509a4365d0SYoshinobu Inoue #include <unistd.h>
519a4365d0SYoshinobu Inoue #include <stdio.h>
529a4365d0SYoshinobu Inoue #include <string.h>
539a4365d0SYoshinobu Inoue #include <time.h>
543c62e87aSJun-ichiro itojun Hagino #include <netdb.h>
559a4365d0SYoshinobu Inoue 
569a4365d0SYoshinobu Inoue #include "ipsec_strerror.h"
573c62e87aSJun-ichiro itojun Hagino #include "libpfkey.h"
589a4365d0SYoshinobu Inoue 
5933841545SHajimu UMEMOTO /* cope with old kame headers - ugly */
6033841545SHajimu UMEMOTO #ifndef SADB_X_AALG_MD5
6133841545SHajimu UMEMOTO #define SADB_X_AALG_MD5		SADB_AALG_MD5
6233841545SHajimu UMEMOTO #endif
6333841545SHajimu UMEMOTO #ifndef SADB_X_AALG_SHA
6433841545SHajimu UMEMOTO #define SADB_X_AALG_SHA		SADB_AALG_SHA
6533841545SHajimu UMEMOTO #endif
6633841545SHajimu UMEMOTO #ifndef SADB_X_AALG_NULL
6733841545SHajimu UMEMOTO #define SADB_X_AALG_NULL	SADB_AALG_NULL
6833841545SHajimu UMEMOTO #endif
6933841545SHajimu UMEMOTO 
7033841545SHajimu UMEMOTO #ifndef SADB_X_EALG_BLOWFISHCBC
7133841545SHajimu UMEMOTO #define SADB_X_EALG_BLOWFISHCBC	SADB_EALG_BLOWFISHCBC
7233841545SHajimu UMEMOTO #endif
7333841545SHajimu UMEMOTO #ifndef SADB_X_EALG_CAST128CBC
7433841545SHajimu UMEMOTO #define SADB_X_EALG_CAST128CBC	SADB_EALG_CAST128CBC
7533841545SHajimu UMEMOTO #endif
7633841545SHajimu UMEMOTO #ifndef SADB_X_EALG_RC5CBC
7733841545SHajimu UMEMOTO #ifdef SADB_EALG_RC5CBC
7833841545SHajimu UMEMOTO #define SADB_X_EALG_RC5CBC	SADB_EALG_RC5CBC
7933841545SHajimu UMEMOTO #endif
8033841545SHajimu UMEMOTO #endif
8133841545SHajimu UMEMOTO 
829a4365d0SYoshinobu Inoue #define GETMSGSTR(str, num) \
833c62e87aSJun-ichiro itojun Hagino do { \
849a4365d0SYoshinobu Inoue 	if (sizeof((str)[0]) == 0 \
859a4365d0SYoshinobu Inoue 	 || num >= sizeof(str)/sizeof((str)[0])) \
869713f5c1SHajimu UMEMOTO 		printf("%u ", (num)); \
879a4365d0SYoshinobu Inoue 	else if (strlen((str)[(num)]) == 0) \
889713f5c1SHajimu UMEMOTO 		printf("%u ", (num)); \
899a4365d0SYoshinobu Inoue 	else \
909a4365d0SYoshinobu Inoue 		printf("%s ", (str)[(num)]); \
913c62e87aSJun-ichiro itojun Hagino } while (0)
929a4365d0SYoshinobu Inoue 
9333841545SHajimu UMEMOTO #define GETMSGV2S(v2s, num) \
9433841545SHajimu UMEMOTO do { \
9533841545SHajimu UMEMOTO 	struct val2str *p;  \
9633841545SHajimu UMEMOTO 	for (p = (v2s); p && p->str; p++) { \
9733841545SHajimu UMEMOTO 		if (p->val == (num)) \
9833841545SHajimu UMEMOTO 			break; \
9933841545SHajimu UMEMOTO 	} \
10033841545SHajimu UMEMOTO 	if (p && p->str) \
10133841545SHajimu UMEMOTO 		printf("%s ", p->str); \
10233841545SHajimu UMEMOTO 	else \
1039713f5c1SHajimu UMEMOTO 		printf("%u ", (num)); \
10433841545SHajimu UMEMOTO } while (0)
10533841545SHajimu UMEMOTO 
10669160b1eSDavid E. O'Brien static char *str_ipaddr(struct sockaddr *);
107bd9f52d5SHajimu UMEMOTO static char *str_prefport(u_int, u_int, u_int, u_int);
108bd9f52d5SHajimu UMEMOTO static void str_upperspec(u_int, u_int, u_int);
10969160b1eSDavid E. O'Brien static char *str_time(time_t);
11069160b1eSDavid E. O'Brien static void str_lifetime_byte(struct sadb_lifetime *, char *);
1119a4365d0SYoshinobu Inoue 
11233841545SHajimu UMEMOTO struct val2str {
11333841545SHajimu UMEMOTO 	int val;
11433841545SHajimu UMEMOTO 	const char *str;
11533841545SHajimu UMEMOTO };
11633841545SHajimu UMEMOTO 
1179a4365d0SYoshinobu Inoue /*
1189a4365d0SYoshinobu Inoue  * Must to be re-written about following strings.
1199a4365d0SYoshinobu Inoue  */
12033841545SHajimu UMEMOTO static char *str_satype[] = {
1219a4365d0SYoshinobu Inoue 	"unspec",
1229a4365d0SYoshinobu Inoue 	"unknown",
1239a4365d0SYoshinobu Inoue 	"ah",
1249a4365d0SYoshinobu Inoue 	"esp",
1259a4365d0SYoshinobu Inoue 	"unknown",
1269a4365d0SYoshinobu Inoue 	"rsvp",
1279a4365d0SYoshinobu Inoue 	"ospfv2",
1289a4365d0SYoshinobu Inoue 	"ripv2",
1299a4365d0SYoshinobu Inoue 	"mip",
1309a4365d0SYoshinobu Inoue 	"ipcomp",
1311922fd12SBruce M Simpson 	"policy",
1321922fd12SBruce M Simpson 	"tcp"
1339a4365d0SYoshinobu Inoue };
1349a4365d0SYoshinobu Inoue 
13533841545SHajimu UMEMOTO static char *str_mode[] = {
1369a4365d0SYoshinobu Inoue 	"any",
1379a4365d0SYoshinobu Inoue 	"transport",
1389a4365d0SYoshinobu Inoue 	"tunnel",
1399a4365d0SYoshinobu Inoue };
1409a4365d0SYoshinobu Inoue 
14133841545SHajimu UMEMOTO static char *str_state[] = {
1429a4365d0SYoshinobu Inoue 	"larval",
1439a4365d0SYoshinobu Inoue 	"mature",
1449a4365d0SYoshinobu Inoue 	"dying",
1459a4365d0SYoshinobu Inoue 	"dead",
1469a4365d0SYoshinobu Inoue };
1479a4365d0SYoshinobu Inoue 
14833841545SHajimu UMEMOTO static struct val2str str_alg_auth[] = {
14933841545SHajimu UMEMOTO 	{ SADB_AALG_NONE, "none", },
15033841545SHajimu UMEMOTO 	{ SADB_AALG_MD5HMAC, "hmac-md5", },
15133841545SHajimu UMEMOTO 	{ SADB_AALG_SHA1HMAC, "hmac-sha1", },
15233841545SHajimu UMEMOTO 	{ SADB_X_AALG_MD5, "md5", },
15333841545SHajimu UMEMOTO 	{ SADB_X_AALG_SHA, "sha", },
15433841545SHajimu UMEMOTO 	{ SADB_X_AALG_NULL, "null", },
1551922fd12SBruce M Simpson 	{ SADB_X_AALG_TCP_MD5, "tcp-md5", },
15633841545SHajimu UMEMOTO #ifdef SADB_X_AALG_SHA2_256
15733841545SHajimu UMEMOTO 	{ SADB_X_AALG_SHA2_256, "hmac-sha2-256", },
15833841545SHajimu UMEMOTO #endif
15933841545SHajimu UMEMOTO #ifdef SADB_X_AALG_SHA2_384
16033841545SHajimu UMEMOTO 	{ SADB_X_AALG_SHA2_384, "hmac-sha2-384", },
16133841545SHajimu UMEMOTO #endif
16233841545SHajimu UMEMOTO #ifdef SADB_X_AALG_SHA2_512
16333841545SHajimu UMEMOTO 	{ SADB_X_AALG_SHA2_512, "hmac-sha2-512", },
16433841545SHajimu UMEMOTO #endif
165492528c0SHajimu UMEMOTO #ifdef SADB_X_AALG_RIPEMD160HMAC
166492528c0SHajimu UMEMOTO 	{ SADB_X_AALG_RIPEMD160HMAC, "hmac-ripemd160", },
167492528c0SHajimu UMEMOTO #endif
168c65ee7c7SHajimu UMEMOTO #ifdef SADB_X_AALG_AES_XCBC_MAC
169c65ee7c7SHajimu UMEMOTO 	{ SADB_X_AALG_AES_XCBC_MAC, "aes-xcbc-mac", },
170c65ee7c7SHajimu UMEMOTO #endif
17133841545SHajimu UMEMOTO 	{ -1, NULL, },
1729a4365d0SYoshinobu Inoue };
1739a4365d0SYoshinobu Inoue 
17433841545SHajimu UMEMOTO static struct val2str str_alg_enc[] = {
17533841545SHajimu UMEMOTO 	{ SADB_EALG_NONE, "none", },
17633841545SHajimu UMEMOTO 	{ SADB_EALG_DESCBC, "des-cbc", },
17733841545SHajimu UMEMOTO 	{ SADB_EALG_3DESCBC, "3des-cbc", },
17833841545SHajimu UMEMOTO 	{ SADB_EALG_NULL, "null", },
17933841545SHajimu UMEMOTO #ifdef SADB_X_EALG_RC5CBC
18033841545SHajimu UMEMOTO 	{ SADB_X_EALG_RC5CBC, "rc5-cbc", },
18133841545SHajimu UMEMOTO #endif
18233841545SHajimu UMEMOTO 	{ SADB_X_EALG_CAST128CBC, "cast128-cbc", },
18333841545SHajimu UMEMOTO 	{ SADB_X_EALG_BLOWFISHCBC, "blowfish-cbc", },
18433841545SHajimu UMEMOTO #ifdef SADB_X_EALG_RIJNDAELCBC
18533841545SHajimu UMEMOTO 	{ SADB_X_EALG_RIJNDAELCBC, "rijndael-cbc", },
18633841545SHajimu UMEMOTO #endif
18733841545SHajimu UMEMOTO #ifdef SADB_X_EALG_TWOFISHCBC
18833841545SHajimu UMEMOTO 	{ SADB_X_EALG_TWOFISHCBC, "twofish-cbc", },
18933841545SHajimu UMEMOTO #endif
190b42ac57fSHajimu UMEMOTO #ifdef SADB_X_EALG_AESCTR
191b42ac57fSHajimu UMEMOTO 	{ SADB_X_EALG_AESCTR, "aes-ctr", },
192b42ac57fSHajimu UMEMOTO #endif
193987de844SGeorge V. Neville-Neil #ifdef SADB_X_EALG_AESGCM16
194987de844SGeorge V. Neville-Neil 	{ SADB_X_EALG_AESGCM16, "aes-gcm-16", },
195987de844SGeorge V. Neville-Neil #endif
196559d3390SGeorge V. Neville-Neil #ifdef SADB_X_EALG_CAMELLIACBC
197559d3390SGeorge V. Neville-Neil 	{ SADB_X_EALG_CAMELLIACBC, "camellia-cbc", },
198559d3390SGeorge V. Neville-Neil #endif
19933841545SHajimu UMEMOTO 	{ -1, NULL, },
2009a4365d0SYoshinobu Inoue };
2019a4365d0SYoshinobu Inoue 
20233841545SHajimu UMEMOTO static struct val2str str_alg_comp[] = {
20333841545SHajimu UMEMOTO 	{ SADB_X_CALG_NONE, "none", },
20433841545SHajimu UMEMOTO 	{ SADB_X_CALG_OUI, "oui", },
20533841545SHajimu UMEMOTO 	{ SADB_X_CALG_DEFLATE, "deflate", },
20633841545SHajimu UMEMOTO 	{ SADB_X_CALG_LZS, "lzs", },
20733841545SHajimu UMEMOTO 	{ -1, NULL, },
2089a4365d0SYoshinobu Inoue };
2099a4365d0SYoshinobu Inoue 
21022986c67SAndrey V. Elsukov static struct val2str str_sp_scope[] = {
21122986c67SAndrey V. Elsukov 	{ IPSEC_POLICYSCOPE_GLOBAL, "global" },
21222986c67SAndrey V. Elsukov 	{ IPSEC_POLICYSCOPE_IFNET, "ifnet" },
21322986c67SAndrey V. Elsukov 	{ IPSEC_POLICYSCOPE_PCB, "pcb"},
21422986c67SAndrey V. Elsukov 	{ -1, NULL },
21522986c67SAndrey V. Elsukov };
21622986c67SAndrey V. Elsukov 
2179a4365d0SYoshinobu Inoue /*
2189a4365d0SYoshinobu Inoue  * dump SADB_MSG formated.  For debugging, you should use kdebug_sadb().
2199a4365d0SYoshinobu Inoue  */
2209a4365d0SYoshinobu Inoue void
2219a4365d0SYoshinobu Inoue pfkey_sadump(m)
2229a4365d0SYoshinobu Inoue 	struct sadb_msg *m;
2239a4365d0SYoshinobu Inoue {
2249a4365d0SYoshinobu Inoue 	caddr_t mhp[SADB_EXT_MAX + 1];
2259a4365d0SYoshinobu Inoue 	struct sadb_sa *m_sa;
2263c62e87aSJun-ichiro itojun Hagino 	struct sadb_x_sa2 *m_sa2;
2279a4365d0SYoshinobu Inoue 	struct sadb_lifetime *m_lftc, *m_lfth, *m_lfts;
2289a4365d0SYoshinobu Inoue 	struct sadb_address *m_saddr, *m_daddr, *m_paddr;
2299a4365d0SYoshinobu Inoue 	struct sadb_key *m_auth, *m_enc;
2309a4365d0SYoshinobu Inoue 	struct sadb_ident *m_sid, *m_did;
2319a4365d0SYoshinobu Inoue 	struct sadb_sens *m_sens;
232bf435626SFabien Thomas 	struct sadb_x_sa_replay *m_sa_replay;
233fcf59617SAndrey V. Elsukov 	struct sadb_x_nat_t_type *natt_type;
234fcf59617SAndrey V. Elsukov 	struct sadb_x_nat_t_port *natt_sport, *natt_dport;
235fcf59617SAndrey V. Elsukov 	struct sadb_address *natt_oai, *natt_oar;
2369a4365d0SYoshinobu Inoue 
2379a4365d0SYoshinobu Inoue 	/* check pfkey message. */
2389a4365d0SYoshinobu Inoue 	if (pfkey_align(m, mhp)) {
2399a4365d0SYoshinobu Inoue 		printf("%s\n", ipsec_strerror());
2409a4365d0SYoshinobu Inoue 		return;
2419a4365d0SYoshinobu Inoue 	}
2429a4365d0SYoshinobu Inoue 	if (pfkey_check(mhp)) {
2439a4365d0SYoshinobu Inoue 		printf("%s\n", ipsec_strerror());
2449a4365d0SYoshinobu Inoue 		return;
2459a4365d0SYoshinobu Inoue 	}
2469a4365d0SYoshinobu Inoue 
2479a4365d0SYoshinobu Inoue 	m_sa = (struct sadb_sa *)mhp[SADB_EXT_SA];
2483c62e87aSJun-ichiro itojun Hagino 	m_sa2 = (struct sadb_x_sa2 *)mhp[SADB_X_EXT_SA2];
2499a4365d0SYoshinobu Inoue 	m_lftc = (struct sadb_lifetime *)mhp[SADB_EXT_LIFETIME_CURRENT];
2509a4365d0SYoshinobu Inoue 	m_lfth = (struct sadb_lifetime *)mhp[SADB_EXT_LIFETIME_HARD];
2519a4365d0SYoshinobu Inoue 	m_lfts = (struct sadb_lifetime *)mhp[SADB_EXT_LIFETIME_SOFT];
2529a4365d0SYoshinobu Inoue 	m_saddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_SRC];
2539a4365d0SYoshinobu Inoue 	m_daddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_DST];
2549a4365d0SYoshinobu Inoue 	m_paddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_PROXY];
2559a4365d0SYoshinobu Inoue 	m_auth = (struct sadb_key *)mhp[SADB_EXT_KEY_AUTH];
2569a4365d0SYoshinobu Inoue 	m_enc = (struct sadb_key *)mhp[SADB_EXT_KEY_ENCRYPT];
2579a4365d0SYoshinobu Inoue 	m_sid = (struct sadb_ident *)mhp[SADB_EXT_IDENTITY_SRC];
2583c62e87aSJun-ichiro itojun Hagino 	m_did = (struct sadb_ident *)mhp[SADB_EXT_IDENTITY_DST];
2599a4365d0SYoshinobu Inoue 	m_sens = (struct sadb_sens *)mhp[SADB_EXT_SENSITIVITY];
260bf435626SFabien Thomas 	m_sa_replay = (struct sadb_x_sa_replay *)mhp[SADB_X_EXT_SA_REPLAY];
261fcf59617SAndrey V. Elsukov 	natt_type = (struct sadb_x_nat_t_type *)mhp[SADB_X_EXT_NAT_T_TYPE];
262fcf59617SAndrey V. Elsukov 	natt_sport = (struct sadb_x_nat_t_port *)mhp[SADB_X_EXT_NAT_T_SPORT];
263fcf59617SAndrey V. Elsukov 	natt_dport = (struct sadb_x_nat_t_port *)mhp[SADB_X_EXT_NAT_T_DPORT];
264fcf59617SAndrey V. Elsukov 	natt_oai = (struct sadb_address *)mhp[SADB_X_EXT_NAT_T_OAI];
265fcf59617SAndrey V. Elsukov 	natt_oar = (struct sadb_address *)mhp[SADB_X_EXT_NAT_T_OAR];
266fcf59617SAndrey V. Elsukov 
2679a4365d0SYoshinobu Inoue 
2689a4365d0SYoshinobu Inoue 	/* source address */
2699a4365d0SYoshinobu Inoue 	if (m_saddr == NULL) {
2709a4365d0SYoshinobu Inoue 		printf("no ADDRESS_SRC extension.\n");
2719a4365d0SYoshinobu Inoue 		return;
2729a4365d0SYoshinobu Inoue 	}
2733c62e87aSJun-ichiro itojun Hagino 	printf("%s", str_ipaddr((struct sockaddr *)(m_saddr + 1)));
274fcf59617SAndrey V. Elsukov 	if (natt_type != NULL && natt_sport != NULL)
275fcf59617SAndrey V. Elsukov 		printf("[%u]", ntohs(natt_sport->sadb_x_nat_t_port_port));
2769a4365d0SYoshinobu Inoue 
2779a4365d0SYoshinobu Inoue 	/* destination address */
2789a4365d0SYoshinobu Inoue 	if (m_daddr == NULL) {
279fcf59617SAndrey V. Elsukov 		printf("\nno ADDRESS_DST extension.\n");
2809a4365d0SYoshinobu Inoue 		return;
2819a4365d0SYoshinobu Inoue 	}
2823c62e87aSJun-ichiro itojun Hagino 	printf(" %s", str_ipaddr((struct sockaddr *)(m_daddr + 1)));
283fcf59617SAndrey V. Elsukov 	if (natt_type != NULL && natt_dport != NULL)
284fcf59617SAndrey V. Elsukov 		printf("[%u]", ntohs(natt_dport->sadb_x_nat_t_port_port));
2859a4365d0SYoshinobu Inoue 
2869a4365d0SYoshinobu Inoue 	/* SA type */
2879a4365d0SYoshinobu Inoue 	if (m_sa == NULL) {
288fcf59617SAndrey V. Elsukov 		printf("\nno SA extension.\n");
2899a4365d0SYoshinobu Inoue 		return;
2909a4365d0SYoshinobu Inoue 	}
2913c62e87aSJun-ichiro itojun Hagino 	if (m_sa2 == NULL) {
292fcf59617SAndrey V. Elsukov 		printf("\nno SA2 extension.\n");
2933c62e87aSJun-ichiro itojun Hagino 		return;
2943c62e87aSJun-ichiro itojun Hagino 	}
2959a4365d0SYoshinobu Inoue 	printf("\n\t");
2969a4365d0SYoshinobu Inoue 
297fcf59617SAndrey V. Elsukov 	if (m->sadb_msg_satype == SADB_SATYPE_ESP && natt_type != NULL)
298fcf59617SAndrey V. Elsukov 		printf("esp-udp ");
299fcf59617SAndrey V. Elsukov 	else
30033841545SHajimu UMEMOTO 		GETMSGSTR(str_satype, m->sadb_msg_satype);
3019a4365d0SYoshinobu Inoue 
3029a4365d0SYoshinobu Inoue 	printf("mode=");
30333841545SHajimu UMEMOTO 	GETMSGSTR(str_mode, m_sa2->sadb_x_sa2_mode);
3049a4365d0SYoshinobu Inoue 
3053c62e87aSJun-ichiro itojun Hagino 	printf("spi=%u(0x%08x) reqid=%u(0x%08x)\n",
3069a4365d0SYoshinobu Inoue 		(u_int32_t)ntohl(m_sa->sadb_sa_spi),
3079a4365d0SYoshinobu Inoue 		(u_int32_t)ntohl(m_sa->sadb_sa_spi),
3083c62e87aSJun-ichiro itojun Hagino 		(u_int32_t)m_sa2->sadb_x_sa2_reqid,
3093c62e87aSJun-ichiro itojun Hagino 		(u_int32_t)m_sa2->sadb_x_sa2_reqid);
3109a4365d0SYoshinobu Inoue 
311fcf59617SAndrey V. Elsukov 	/* other NAT-T information */
312fcf59617SAndrey V. Elsukov 	if (natt_type != NULL && (natt_oai != NULL || natt_oar != NULL)) {
313fcf59617SAndrey V. Elsukov 		printf("\tNAT:");
314fcf59617SAndrey V. Elsukov 		if (natt_oai != NULL)
315fcf59617SAndrey V. Elsukov 			printf(" OAI=%s",
316fcf59617SAndrey V. Elsukov 			    str_ipaddr((struct sockaddr *)(natt_oai + 1)));
317fcf59617SAndrey V. Elsukov 		if (natt_oar != NULL)
318fcf59617SAndrey V. Elsukov 			printf(" OAR=%s",
319fcf59617SAndrey V. Elsukov 			    str_ipaddr((struct sockaddr *)(natt_oar + 1)));
320fcf59617SAndrey V. Elsukov 		printf("\n");
321fcf59617SAndrey V. Elsukov 	}
322fcf59617SAndrey V. Elsukov 
3239a4365d0SYoshinobu Inoue 	/* encryption key */
3249a4365d0SYoshinobu Inoue 	if (m->sadb_msg_satype == SADB_X_SATYPE_IPCOMP) {
3259a4365d0SYoshinobu Inoue 		printf("\tC: ");
32633841545SHajimu UMEMOTO 		GETMSGV2S(str_alg_comp, m_sa->sadb_sa_encrypt);
3279a4365d0SYoshinobu Inoue 	} else if (m->sadb_msg_satype == SADB_SATYPE_ESP) {
3289a4365d0SYoshinobu Inoue 		if (m_enc != NULL) {
3299a4365d0SYoshinobu Inoue 			printf("\tE: ");
33033841545SHajimu UMEMOTO 			GETMSGV2S(str_alg_enc, m_sa->sadb_sa_encrypt);
3319a4365d0SYoshinobu Inoue 			ipsec_hexdump((caddr_t)m_enc + sizeof(*m_enc),
3329a4365d0SYoshinobu Inoue 				      m_enc->sadb_key_bits / 8);
3339a4365d0SYoshinobu Inoue 			printf("\n");
3349a4365d0SYoshinobu Inoue 		}
3359a4365d0SYoshinobu Inoue 	}
3369a4365d0SYoshinobu Inoue 
3379a4365d0SYoshinobu Inoue 	/* authentication key */
3389a4365d0SYoshinobu Inoue 	if (m_auth != NULL) {
3399a4365d0SYoshinobu Inoue 		printf("\tA: ");
34033841545SHajimu UMEMOTO 		GETMSGV2S(str_alg_auth, m_sa->sadb_sa_auth);
3419a4365d0SYoshinobu Inoue 		ipsec_hexdump((caddr_t)m_auth + sizeof(*m_auth),
3429a4365d0SYoshinobu Inoue 		              m_auth->sadb_key_bits / 8);
3439a4365d0SYoshinobu Inoue 		printf("\n");
3449a4365d0SYoshinobu Inoue 	}
3459a4365d0SYoshinobu Inoue 
3463c62e87aSJun-ichiro itojun Hagino 	/* replay windoe size & flags */
347232bdaf6SHajimu UMEMOTO 	printf("\tseq=0x%08x replay=%u flags=0x%08x ",
348232bdaf6SHajimu UMEMOTO 		m_sa2->sadb_x_sa2_sequence,
349bf435626SFabien Thomas 		m_sa_replay ? (m_sa_replay->sadb_x_sa_replay_replay >> 3) :
3503c62e87aSJun-ichiro itojun Hagino 			m_sa->sadb_sa_replay,
3513c62e87aSJun-ichiro itojun Hagino 		m_sa->sadb_sa_flags);
3523c62e87aSJun-ichiro itojun Hagino 
3539a4365d0SYoshinobu Inoue 	/* state */
3543c62e87aSJun-ichiro itojun Hagino 	printf("state=");
35533841545SHajimu UMEMOTO 	GETMSGSTR(str_state, m_sa->sadb_sa_state);
356232bdaf6SHajimu UMEMOTO 	printf("\n");
3579a4365d0SYoshinobu Inoue 
3589a4365d0SYoshinobu Inoue 	/* lifetime */
3599a4365d0SYoshinobu Inoue 	if (m_lftc != NULL) {
3609a4365d0SYoshinobu Inoue 		time_t tmp_time = time(0);
3619a4365d0SYoshinobu Inoue 
3629a4365d0SYoshinobu Inoue 		printf("\tcreated: %s",
3633c62e87aSJun-ichiro itojun Hagino 			str_time(m_lftc->sadb_lifetime_addtime));
3643c62e87aSJun-ichiro itojun Hagino 		printf("\tcurrent: %s\n", str_time(tmp_time));
3659a4365d0SYoshinobu Inoue 		printf("\tdiff: %lu(s)",
3669a4365d0SYoshinobu Inoue 			(u_long)(m_lftc->sadb_lifetime_addtime == 0 ?
3679a4365d0SYoshinobu Inoue 			0 : (tmp_time - m_lftc->sadb_lifetime_addtime)));
3689a4365d0SYoshinobu Inoue 
3699a4365d0SYoshinobu Inoue 		printf("\thard: %lu(s)",
3709a4365d0SYoshinobu Inoue 			(u_long)(m_lfth == NULL ?
3719a4365d0SYoshinobu Inoue 			0 : m_lfth->sadb_lifetime_addtime));
3729a4365d0SYoshinobu Inoue 		printf("\tsoft: %lu(s)\n",
3739a4365d0SYoshinobu Inoue 			(u_long)(m_lfts == NULL ?
3749a4365d0SYoshinobu Inoue 			0 : m_lfts->sadb_lifetime_addtime));
3759a4365d0SYoshinobu Inoue 
3769a4365d0SYoshinobu Inoue 		printf("\tlast: %s",
3773c62e87aSJun-ichiro itojun Hagino 			str_time(m_lftc->sadb_lifetime_usetime));
3789a4365d0SYoshinobu Inoue 		printf("\thard: %lu(s)",
3799a4365d0SYoshinobu Inoue 			(u_long)(m_lfth == NULL ?
3809a4365d0SYoshinobu Inoue 			0 : m_lfth->sadb_lifetime_usetime));
3819a4365d0SYoshinobu Inoue 		printf("\tsoft: %lu(s)\n",
3829a4365d0SYoshinobu Inoue 			(u_long)(m_lfts == NULL ?
3839a4365d0SYoshinobu Inoue 			0 : m_lfts->sadb_lifetime_usetime));
3849a4365d0SYoshinobu Inoue 
3853c62e87aSJun-ichiro itojun Hagino 		str_lifetime_byte(m_lftc, "current");
3863c62e87aSJun-ichiro itojun Hagino 		str_lifetime_byte(m_lfth, "hard");
3873c62e87aSJun-ichiro itojun Hagino 		str_lifetime_byte(m_lfts, "soft");
3889a4365d0SYoshinobu Inoue 		printf("\n");
3899a4365d0SYoshinobu Inoue 
3909a4365d0SYoshinobu Inoue 		printf("\tallocated: %lu",
3919a4365d0SYoshinobu Inoue 			(unsigned long)m_lftc->sadb_lifetime_allocations);
3929a4365d0SYoshinobu Inoue 		printf("\thard: %lu",
3939a4365d0SYoshinobu Inoue 			(u_long)(m_lfth == NULL ?
3949a4365d0SYoshinobu Inoue 			0 : m_lfth->sadb_lifetime_allocations));
3959a4365d0SYoshinobu Inoue 		printf("\tsoft: %lu\n",
3969a4365d0SYoshinobu Inoue 			(u_long)(m_lfts == NULL ?
3979a4365d0SYoshinobu Inoue 			0 : m_lfts->sadb_lifetime_allocations));
3989a4365d0SYoshinobu Inoue 	}
3999a4365d0SYoshinobu Inoue 
400232bdaf6SHajimu UMEMOTO 	printf("\tsadb_seq=%lu pid=%lu ",
401232bdaf6SHajimu UMEMOTO 		(u_long)m->sadb_msg_seq,
402232bdaf6SHajimu UMEMOTO 		(u_long)m->sadb_msg_pid);
403232bdaf6SHajimu UMEMOTO 
4049a4365d0SYoshinobu Inoue 	/* XXX DEBUG */
405232bdaf6SHajimu UMEMOTO 	printf("refcnt=%u\n", m->sadb_msg_reserved);
4069a4365d0SYoshinobu Inoue 
4079a4365d0SYoshinobu Inoue 	return;
4089a4365d0SYoshinobu Inoue }
4099a4365d0SYoshinobu Inoue 
4109a4365d0SYoshinobu Inoue void
41122986c67SAndrey V. Elsukov pfkey_spdump(struct sadb_msg *m)
4129a4365d0SYoshinobu Inoue {
4133c62e87aSJun-ichiro itojun Hagino 	char pbuf[NI_MAXSERV];
4149a4365d0SYoshinobu Inoue 	caddr_t mhp[SADB_EXT_MAX + 1];
4159a4365d0SYoshinobu Inoue 	struct sadb_address *m_saddr, *m_daddr;
4169a4365d0SYoshinobu Inoue 	struct sadb_x_policy *m_xpl;
417bd9f52d5SHajimu UMEMOTO 	struct sadb_lifetime *m_lftc = NULL, *m_lfth = NULL;
4183c62e87aSJun-ichiro itojun Hagino 	struct sockaddr *sa;
419bd9f52d5SHajimu UMEMOTO 	u_int16_t sport = 0, dport = 0;
4209a4365d0SYoshinobu Inoue 
4219a4365d0SYoshinobu Inoue 	/* check pfkey message. */
4229a4365d0SYoshinobu Inoue 	if (pfkey_align(m, mhp)) {
4239a4365d0SYoshinobu Inoue 		printf("%s\n", ipsec_strerror());
4249a4365d0SYoshinobu Inoue 		return;
4259a4365d0SYoshinobu Inoue 	}
4269a4365d0SYoshinobu Inoue 	if (pfkey_check(mhp)) {
4279a4365d0SYoshinobu Inoue 		printf("%s\n", ipsec_strerror());
4289a4365d0SYoshinobu Inoue 		return;
4299a4365d0SYoshinobu Inoue 	}
4309a4365d0SYoshinobu Inoue 
4319a4365d0SYoshinobu Inoue 	m_saddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_SRC];
4329a4365d0SYoshinobu Inoue 	m_daddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_DST];
4339a4365d0SYoshinobu Inoue 	m_xpl = (struct sadb_x_policy *)mhp[SADB_X_EXT_POLICY];
434bd9f52d5SHajimu UMEMOTO 	m_lftc = (struct sadb_lifetime *)mhp[SADB_EXT_LIFETIME_CURRENT];
435bd9f52d5SHajimu UMEMOTO 	m_lfth = (struct sadb_lifetime *)mhp[SADB_EXT_LIFETIME_HARD];
4369a4365d0SYoshinobu Inoue 
437bd9f52d5SHajimu UMEMOTO 	if (m_saddr && m_daddr) {
4389a4365d0SYoshinobu Inoue 		/* source address */
4393c62e87aSJun-ichiro itojun Hagino 		sa = (struct sockaddr *)(m_saddr + 1);
4403c62e87aSJun-ichiro itojun Hagino 		switch (sa->sa_family) {
4413c62e87aSJun-ichiro itojun Hagino 		case AF_INET:
4423c62e87aSJun-ichiro itojun Hagino 		case AF_INET6:
443bd9f52d5SHajimu UMEMOTO 			if (getnameinfo(sa, sa->sa_len, NULL, 0,
444bd9f52d5SHajimu UMEMOTO 			    pbuf, sizeof(pbuf), NI_NUMERICSERV) != 0)
445bd9f52d5SHajimu UMEMOTO 				sport = 0;	/*XXX*/
4463c62e87aSJun-ichiro itojun Hagino 			else
447bd9f52d5SHajimu UMEMOTO 				sport = atoi(pbuf);
4483c62e87aSJun-ichiro itojun Hagino 			printf("%s%s ", str_ipaddr(sa),
4493c62e87aSJun-ichiro itojun Hagino 				str_prefport(sa->sa_family,
450bd9f52d5SHajimu UMEMOTO 				    m_saddr->sadb_address_prefixlen, sport,
451bd9f52d5SHajimu UMEMOTO 				    m_saddr->sadb_address_proto));
4523c62e87aSJun-ichiro itojun Hagino 			break;
4533c62e87aSJun-ichiro itojun Hagino 		default:
4543c62e87aSJun-ichiro itojun Hagino 			printf("unknown-af ");
4553c62e87aSJun-ichiro itojun Hagino 			break;
4563c62e87aSJun-ichiro itojun Hagino 		}
4579a4365d0SYoshinobu Inoue 
4589a4365d0SYoshinobu Inoue 		/* destination address */
4593c62e87aSJun-ichiro itojun Hagino 		sa = (struct sockaddr *)(m_daddr + 1);
4603c62e87aSJun-ichiro itojun Hagino 		switch (sa->sa_family) {
4613c62e87aSJun-ichiro itojun Hagino 		case AF_INET:
4623c62e87aSJun-ichiro itojun Hagino 		case AF_INET6:
463bd9f52d5SHajimu UMEMOTO 			if (getnameinfo(sa, sa->sa_len, NULL, 0,
464bd9f52d5SHajimu UMEMOTO 			    pbuf, sizeof(pbuf), NI_NUMERICSERV) != 0)
465bd9f52d5SHajimu UMEMOTO 				dport = 0;	/*XXX*/
4663c62e87aSJun-ichiro itojun Hagino 			else
467bd9f52d5SHajimu UMEMOTO 				dport = atoi(pbuf);
4683c62e87aSJun-ichiro itojun Hagino 			printf("%s%s ", str_ipaddr(sa),
4693c62e87aSJun-ichiro itojun Hagino 				str_prefport(sa->sa_family,
470bd9f52d5SHajimu UMEMOTO 				    m_daddr->sadb_address_prefixlen, dport,
471bd9f52d5SHajimu UMEMOTO 				    m_saddr->sadb_address_proto));
4723c62e87aSJun-ichiro itojun Hagino 			break;
4733c62e87aSJun-ichiro itojun Hagino 		default:
4743c62e87aSJun-ichiro itojun Hagino 			printf("unknown-af ");
4753c62e87aSJun-ichiro itojun Hagino 			break;
4763c62e87aSJun-ichiro itojun Hagino 		}
4779a4365d0SYoshinobu Inoue 
4789a4365d0SYoshinobu Inoue 		/* upper layer protocol */
479bd9f52d5SHajimu UMEMOTO 		if (m_saddr->sadb_address_proto !=
480bd9f52d5SHajimu UMEMOTO 		    m_daddr->sadb_address_proto) {
4819a4365d0SYoshinobu Inoue 			printf("upper layer protocol mismatched.\n");
4829a4365d0SYoshinobu Inoue 			return;
4839a4365d0SYoshinobu Inoue 		}
484bd9f52d5SHajimu UMEMOTO 		str_upperspec(m_saddr->sadb_address_proto, sport, dport);
485bd9f52d5SHajimu UMEMOTO 	}
4869a4365d0SYoshinobu Inoue 	else
487bd9f52d5SHajimu UMEMOTO 		printf("(no selector, probably per-socket policy) ");
4889a4365d0SYoshinobu Inoue 
4899a4365d0SYoshinobu Inoue 	/* policy */
4909a4365d0SYoshinobu Inoue     {
4919a4365d0SYoshinobu Inoue 	char *d_xpl;
4929a4365d0SYoshinobu Inoue 
4939a4365d0SYoshinobu Inoue 	if (m_xpl == NULL) {
4949a4365d0SYoshinobu Inoue 		printf("no X_POLICY extension.\n");
4959a4365d0SYoshinobu Inoue 		return;
4969a4365d0SYoshinobu Inoue 	}
4979a4365d0SYoshinobu Inoue 	d_xpl = ipsec_dump_policy((char *)m_xpl, "\n\t");
4989a4365d0SYoshinobu Inoue 
4999a4365d0SYoshinobu Inoue 	/* dump SPD */
5009a4365d0SYoshinobu Inoue 	printf("\n\t%s\n", d_xpl);
5019a4365d0SYoshinobu Inoue 	free(d_xpl);
5029a4365d0SYoshinobu Inoue     }
5039a4365d0SYoshinobu Inoue 
50433841545SHajimu UMEMOTO 	/* lifetime */
505bd9f52d5SHajimu UMEMOTO 	if (m_lftc) {
506bd9f52d5SHajimu UMEMOTO 		printf("\tcreated: %s  ",
507bd9f52d5SHajimu UMEMOTO 			str_time(m_lftc->sadb_lifetime_addtime));
508bd9f52d5SHajimu UMEMOTO 		printf("lastused: %s\n",
509bd9f52d5SHajimu UMEMOTO 			str_time(m_lftc->sadb_lifetime_usetime));
51033841545SHajimu UMEMOTO 	}
511bd9f52d5SHajimu UMEMOTO 	if (m_lfth) {
512bd9f52d5SHajimu UMEMOTO 		printf("\tlifetime: %lu(s) ",
513bd9f52d5SHajimu UMEMOTO 			(u_long)m_lfth->sadb_lifetime_addtime);
514bd9f52d5SHajimu UMEMOTO 		printf("validtime: %lu(s)\n",
515bd9f52d5SHajimu UMEMOTO 			(u_long)m_lfth->sadb_lifetime_usetime);
516bd9f52d5SHajimu UMEMOTO 	}
517bd9f52d5SHajimu UMEMOTO 
51833841545SHajimu UMEMOTO 
51922986c67SAndrey V. Elsukov 	printf("\tspid=%ld seq=%ld pid=%ld scope=",
5203c62e87aSJun-ichiro itojun Hagino 		(u_long)m_xpl->sadb_x_policy_id,
5219a4365d0SYoshinobu Inoue 		(u_long)m->sadb_msg_seq,
5229a4365d0SYoshinobu Inoue 		(u_long)m->sadb_msg_pid);
52322986c67SAndrey V. Elsukov 	GETMSGV2S(str_sp_scope, m_xpl->sadb_x_policy_scope);
52422986c67SAndrey V. Elsukov 	if (m_xpl->sadb_x_policy_scope == IPSEC_POLICYSCOPE_IFNET &&
52522986c67SAndrey V. Elsukov 	    if_indextoname(m_xpl->sadb_x_policy_ifindex, pbuf) != NULL)
52622986c67SAndrey V. Elsukov 		printf("ifname=%s", pbuf);
52722986c67SAndrey V. Elsukov 	printf("\n");
5289a4365d0SYoshinobu Inoue 
5299a4365d0SYoshinobu Inoue 	/* XXX TEST */
5303c62e87aSJun-ichiro itojun Hagino 	printf("\trefcnt=%u\n", m->sadb_msg_reserved);
5319a4365d0SYoshinobu Inoue 
5329a4365d0SYoshinobu Inoue 	return;
5339a4365d0SYoshinobu Inoue }
5349a4365d0SYoshinobu Inoue 
5359a4365d0SYoshinobu Inoue /*
5369a4365d0SYoshinobu Inoue  * set "ipaddress" to buffer.
5379a4365d0SYoshinobu Inoue  */
5389a4365d0SYoshinobu Inoue static char *
5393c62e87aSJun-ichiro itojun Hagino str_ipaddr(sa)
5403c62e87aSJun-ichiro itojun Hagino 	struct sockaddr *sa;
5419a4365d0SYoshinobu Inoue {
5423c62e87aSJun-ichiro itojun Hagino 	static char buf[NI_MAXHOST];
5433c62e87aSJun-ichiro itojun Hagino 	const int niflag = NI_NUMERICHOST;
5449a4365d0SYoshinobu Inoue 
5453c62e87aSJun-ichiro itojun Hagino 	if (sa == NULL)
5469a4365d0SYoshinobu Inoue 		return "";
5479a4365d0SYoshinobu Inoue 
5483c62e87aSJun-ichiro itojun Hagino 	if (getnameinfo(sa, sa->sa_len, buf, sizeof(buf), NULL, 0, niflag) == 0)
5499a4365d0SYoshinobu Inoue 		return buf;
5503c62e87aSJun-ichiro itojun Hagino 	return NULL;
5519a4365d0SYoshinobu Inoue }
5529a4365d0SYoshinobu Inoue 
5539a4365d0SYoshinobu Inoue /*
5549a4365d0SYoshinobu Inoue  * set "/prefix[port number]" to buffer.
5559a4365d0SYoshinobu Inoue  */
5569a4365d0SYoshinobu Inoue static char *
557bd9f52d5SHajimu UMEMOTO str_prefport(family, pref, port, ulp)
558bd9f52d5SHajimu UMEMOTO 	u_int family, pref, port, ulp;
5599a4365d0SYoshinobu Inoue {
5609a4365d0SYoshinobu Inoue 	static char buf[128];
561296e054fSMunechika SUMIKAWA 	char prefbuf[128];
562296e054fSMunechika SUMIKAWA 	char portbuf[128];
5633c62e87aSJun-ichiro itojun Hagino 	int plen;
5649a4365d0SYoshinobu Inoue 
5653c62e87aSJun-ichiro itojun Hagino 	switch (family) {
5663c62e87aSJun-ichiro itojun Hagino 	case AF_INET:
5673c62e87aSJun-ichiro itojun Hagino 		plen = sizeof(struct in_addr) << 3;
5683c62e87aSJun-ichiro itojun Hagino 		break;
5693c62e87aSJun-ichiro itojun Hagino 	case AF_INET6:
5703c62e87aSJun-ichiro itojun Hagino 		plen = sizeof(struct in6_addr) << 3;
5713c62e87aSJun-ichiro itojun Hagino 		break;
5723c62e87aSJun-ichiro itojun Hagino 	default:
5733c62e87aSJun-ichiro itojun Hagino 		return "?";
5743c62e87aSJun-ichiro itojun Hagino 	}
5753c62e87aSJun-ichiro itojun Hagino 
5763c62e87aSJun-ichiro itojun Hagino 	if (pref == plen)
5779a4365d0SYoshinobu Inoue 		prefbuf[0] = '\0';
5789a4365d0SYoshinobu Inoue 	else
5799a4365d0SYoshinobu Inoue 		snprintf(prefbuf, sizeof(prefbuf), "/%u", pref);
5809a4365d0SYoshinobu Inoue 
581bd9f52d5SHajimu UMEMOTO 	if (ulp == IPPROTO_ICMPV6)
582bd9f52d5SHajimu UMEMOTO 		memset(portbuf, 0, sizeof(portbuf));
583bd9f52d5SHajimu UMEMOTO 	else {
5849a4365d0SYoshinobu Inoue 		if (port == IPSEC_PORT_ANY)
5859a4365d0SYoshinobu Inoue 			snprintf(portbuf, sizeof(portbuf), "[%s]", "any");
5869a4365d0SYoshinobu Inoue 		else
5873c62e87aSJun-ichiro itojun Hagino 			snprintf(portbuf, sizeof(portbuf), "[%u]", port);
588bd9f52d5SHajimu UMEMOTO 	}
5899a4365d0SYoshinobu Inoue 
5909a4365d0SYoshinobu Inoue 	snprintf(buf, sizeof(buf), "%s%s", prefbuf, portbuf);
5919a4365d0SYoshinobu Inoue 
5929a4365d0SYoshinobu Inoue 	return buf;
5939a4365d0SYoshinobu Inoue }
5949a4365d0SYoshinobu Inoue 
595bd9f52d5SHajimu UMEMOTO static void
596bd9f52d5SHajimu UMEMOTO str_upperspec(ulp, p1, p2)
597bd9f52d5SHajimu UMEMOTO 	u_int ulp, p1, p2;
598bd9f52d5SHajimu UMEMOTO {
599bd9f52d5SHajimu UMEMOTO 	if (ulp == IPSEC_ULPROTO_ANY)
600bd9f52d5SHajimu UMEMOTO 		printf("any");
601bd9f52d5SHajimu UMEMOTO 	else if (ulp == IPPROTO_ICMPV6) {
602bd9f52d5SHajimu UMEMOTO 		printf("icmp6");
603bd9f52d5SHajimu UMEMOTO 		if (!(p1 == IPSEC_PORT_ANY && p2 == IPSEC_PORT_ANY))
604bd9f52d5SHajimu UMEMOTO 			printf(" %u,%u", p1, p2);
605bd9f52d5SHajimu UMEMOTO 	} else {
606bd9f52d5SHajimu UMEMOTO 		struct protoent *ent;
607bd9f52d5SHajimu UMEMOTO 
608bd9f52d5SHajimu UMEMOTO 		switch (ulp) {
609bd9f52d5SHajimu UMEMOTO 		case IPPROTO_IPV4:
610bd9f52d5SHajimu UMEMOTO 			printf("ip4");
611bd9f52d5SHajimu UMEMOTO 			break;
612bd9f52d5SHajimu UMEMOTO 		default:
613bd9f52d5SHajimu UMEMOTO 			ent = getprotobynumber(ulp);
614bd9f52d5SHajimu UMEMOTO 			if (ent)
615bd9f52d5SHajimu UMEMOTO 				printf("%s", ent->p_name);
616bd9f52d5SHajimu UMEMOTO 			else
617bd9f52d5SHajimu UMEMOTO 				printf("%u", ulp);
618bd9f52d5SHajimu UMEMOTO 
619bd9f52d5SHajimu UMEMOTO 			endprotoent();
620bd9f52d5SHajimu UMEMOTO 			break;
621bd9f52d5SHajimu UMEMOTO 		}
622bd9f52d5SHajimu UMEMOTO 	}
623bd9f52d5SHajimu UMEMOTO }
624bd9f52d5SHajimu UMEMOTO 
6259a4365d0SYoshinobu Inoue /*
6269a4365d0SYoshinobu Inoue  * set "Mon Day Time Year" to buffer
6279a4365d0SYoshinobu Inoue  */
6289a4365d0SYoshinobu Inoue static char *
6293c62e87aSJun-ichiro itojun Hagino str_time(t)
6309a4365d0SYoshinobu Inoue 	time_t t;
6319a4365d0SYoshinobu Inoue {
6329a4365d0SYoshinobu Inoue 	static char buf[128];
6339a4365d0SYoshinobu Inoue 
6349a4365d0SYoshinobu Inoue 	if (t == 0) {
6359a4365d0SYoshinobu Inoue 		int i = 0;
6369a4365d0SYoshinobu Inoue 		for (;i < 20;) buf[i++] = ' ';
6379a4365d0SYoshinobu Inoue 	} else {
6389a4365d0SYoshinobu Inoue 		char *t0;
6399a4365d0SYoshinobu Inoue 		t0 = ctime(&t);
6409a4365d0SYoshinobu Inoue 		memcpy(buf, t0 + 4, 20);
6419a4365d0SYoshinobu Inoue 	}
6429a4365d0SYoshinobu Inoue 
6439a4365d0SYoshinobu Inoue 	buf[20] = '\0';
6449a4365d0SYoshinobu Inoue 
6459a4365d0SYoshinobu Inoue 	return(buf);
6469a4365d0SYoshinobu Inoue }
6479a4365d0SYoshinobu Inoue 
6489a4365d0SYoshinobu Inoue static void
6493c62e87aSJun-ichiro itojun Hagino str_lifetime_byte(x, str)
6509a4365d0SYoshinobu Inoue 	struct sadb_lifetime *x;
6519a4365d0SYoshinobu Inoue 	char *str;
6529a4365d0SYoshinobu Inoue {
6539a4365d0SYoshinobu Inoue 	double y;
6549a4365d0SYoshinobu Inoue 	char *unit;
6559a4365d0SYoshinobu Inoue 	int w;
6569a4365d0SYoshinobu Inoue 
6579a4365d0SYoshinobu Inoue 	if (x == NULL) {
6589a4365d0SYoshinobu Inoue 		printf("\t%s: 0(bytes)", str);
6599a4365d0SYoshinobu Inoue 		return;
6609a4365d0SYoshinobu Inoue 	}
6619a4365d0SYoshinobu Inoue 
6623c62e87aSJun-ichiro itojun Hagino #if 0
6633c62e87aSJun-ichiro itojun Hagino 	if ((x->sadb_lifetime_bytes) / 1024 / 1024) {
6643c62e87aSJun-ichiro itojun Hagino 		y = (x->sadb_lifetime_bytes) * 1.0 / 1024 / 1024;
6653c62e87aSJun-ichiro itojun Hagino 		unit = "M";
6663c62e87aSJun-ichiro itojun Hagino 		w = 1;
6673c62e87aSJun-ichiro itojun Hagino 	} else if ((x->sadb_lifetime_bytes) / 1024) {
6683c62e87aSJun-ichiro itojun Hagino 		y = (x->sadb_lifetime_bytes) * 1.0 / 1024;
6693c62e87aSJun-ichiro itojun Hagino 		unit = "K";
6703c62e87aSJun-ichiro itojun Hagino 		w = 1;
6713c62e87aSJun-ichiro itojun Hagino 	} else {
6729a4365d0SYoshinobu Inoue 		y = (x->sadb_lifetime_bytes) * 1.0;
6739a4365d0SYoshinobu Inoue 		unit = "";
6749a4365d0SYoshinobu Inoue 		w = 0;
6753c62e87aSJun-ichiro itojun Hagino 	}
6763c62e87aSJun-ichiro itojun Hagino #else
6773c62e87aSJun-ichiro itojun Hagino 	y = (x->sadb_lifetime_bytes) * 1.0;
6783c62e87aSJun-ichiro itojun Hagino 	unit = "";
6793c62e87aSJun-ichiro itojun Hagino 	w = 0;
6803c62e87aSJun-ichiro itojun Hagino #endif
6819a4365d0SYoshinobu Inoue 	printf("\t%s: %.*f(%sbytes)", str, w, y, unit);
6829a4365d0SYoshinobu Inoue }
683