xref: /freebsd/lib/libipsec/pfkey_dump.c (revision bf4356266d568717f6ae3b7f060ded6598357788)
1bd9f52d5SHajimu UMEMOTO /*	$KAME: pfkey_dump.c,v 1.45 2003/09/08 10:14:56 itojun Exp $	*/
23c62e87aSJun-ichiro itojun Hagino 
39a4365d0SYoshinobu Inoue /*
49a4365d0SYoshinobu Inoue  * Copyright (C) 1995, 1996, 1997, 1998, and 1999 WIDE Project.
59a4365d0SYoshinobu Inoue  * All rights reserved.
69a4365d0SYoshinobu Inoue  *
79a4365d0SYoshinobu Inoue  * Redistribution and use in source and binary forms, with or without
89a4365d0SYoshinobu Inoue  * modification, are permitted provided that the following conditions
99a4365d0SYoshinobu Inoue  * are met:
109a4365d0SYoshinobu Inoue  * 1. Redistributions of source code must retain the above copyright
119a4365d0SYoshinobu Inoue  *    notice, this list of conditions and the following disclaimer.
129a4365d0SYoshinobu Inoue  * 2. Redistributions in binary form must reproduce the above copyright
139a4365d0SYoshinobu Inoue  *    notice, this list of conditions and the following disclaimer in the
149a4365d0SYoshinobu Inoue  *    documentation and/or other materials provided with the distribution.
159a4365d0SYoshinobu Inoue  * 3. Neither the name of the project nor the names of its contributors
169a4365d0SYoshinobu Inoue  *    may be used to endorse or promote products derived from this software
179a4365d0SYoshinobu Inoue  *    without specific prior written permission.
189a4365d0SYoshinobu Inoue  *
199a4365d0SYoshinobu Inoue  * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
209a4365d0SYoshinobu Inoue  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
219a4365d0SYoshinobu Inoue  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
229a4365d0SYoshinobu Inoue  * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
239a4365d0SYoshinobu Inoue  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
249a4365d0SYoshinobu Inoue  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
259a4365d0SYoshinobu Inoue  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
269a4365d0SYoshinobu Inoue  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
279a4365d0SYoshinobu Inoue  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
289a4365d0SYoshinobu Inoue  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
299a4365d0SYoshinobu Inoue  * SUCH DAMAGE.
309a4365d0SYoshinobu Inoue  */
319a4365d0SYoshinobu Inoue 
3246a50f4eSMatthew Dillon #include <sys/cdefs.h>
3346a50f4eSMatthew Dillon __FBSDID("$FreeBSD$");
3446a50f4eSMatthew Dillon 
359a4365d0SYoshinobu Inoue #include <sys/types.h>
369a4365d0SYoshinobu Inoue #include <sys/param.h>
379a4365d0SYoshinobu Inoue #include <sys/socket.h>
388409aedfSGeorge V. Neville-Neil #include <netipsec/ipsec.h>
399a4365d0SYoshinobu Inoue #include <net/pfkeyv2.h>
408409aedfSGeorge V. Neville-Neil #include <netipsec/key_var.h>
418409aedfSGeorge V. Neville-Neil #include <netipsec/key_debug.h>
429a4365d0SYoshinobu Inoue 
439a4365d0SYoshinobu Inoue #include <netinet/in.h>
449a4365d0SYoshinobu Inoue #include <arpa/inet.h>
459a4365d0SYoshinobu Inoue 
469a4365d0SYoshinobu Inoue #include <stdlib.h>
479a4365d0SYoshinobu Inoue #include <unistd.h>
489a4365d0SYoshinobu Inoue #include <stdio.h>
499a4365d0SYoshinobu Inoue #include <string.h>
509a4365d0SYoshinobu Inoue #include <time.h>
513c62e87aSJun-ichiro itojun Hagino #include <netdb.h>
529a4365d0SYoshinobu Inoue 
539a4365d0SYoshinobu Inoue #include "ipsec_strerror.h"
543c62e87aSJun-ichiro itojun Hagino #include "libpfkey.h"
559a4365d0SYoshinobu Inoue 
5633841545SHajimu UMEMOTO /* cope with old kame headers - ugly */
5733841545SHajimu UMEMOTO #ifndef SADB_X_AALG_MD5
5833841545SHajimu UMEMOTO #define SADB_X_AALG_MD5		SADB_AALG_MD5
5933841545SHajimu UMEMOTO #endif
6033841545SHajimu UMEMOTO #ifndef SADB_X_AALG_SHA
6133841545SHajimu UMEMOTO #define SADB_X_AALG_SHA		SADB_AALG_SHA
6233841545SHajimu UMEMOTO #endif
6333841545SHajimu UMEMOTO #ifndef SADB_X_AALG_NULL
6433841545SHajimu UMEMOTO #define SADB_X_AALG_NULL	SADB_AALG_NULL
6533841545SHajimu UMEMOTO #endif
6633841545SHajimu UMEMOTO 
6733841545SHajimu UMEMOTO #ifndef SADB_X_EALG_BLOWFISHCBC
6833841545SHajimu UMEMOTO #define SADB_X_EALG_BLOWFISHCBC	SADB_EALG_BLOWFISHCBC
6933841545SHajimu UMEMOTO #endif
7033841545SHajimu UMEMOTO #ifndef SADB_X_EALG_CAST128CBC
7133841545SHajimu UMEMOTO #define SADB_X_EALG_CAST128CBC	SADB_EALG_CAST128CBC
7233841545SHajimu UMEMOTO #endif
7333841545SHajimu UMEMOTO #ifndef SADB_X_EALG_RC5CBC
7433841545SHajimu UMEMOTO #ifdef SADB_EALG_RC5CBC
7533841545SHajimu UMEMOTO #define SADB_X_EALG_RC5CBC	SADB_EALG_RC5CBC
7633841545SHajimu UMEMOTO #endif
7733841545SHajimu UMEMOTO #endif
7833841545SHajimu UMEMOTO 
799a4365d0SYoshinobu Inoue #define GETMSGSTR(str, num) \
803c62e87aSJun-ichiro itojun Hagino do { \
819a4365d0SYoshinobu Inoue 	if (sizeof((str)[0]) == 0 \
829a4365d0SYoshinobu Inoue 	 || num >= sizeof(str)/sizeof((str)[0])) \
839713f5c1SHajimu UMEMOTO 		printf("%u ", (num)); \
849a4365d0SYoshinobu Inoue 	else if (strlen((str)[(num)]) == 0) \
859713f5c1SHajimu UMEMOTO 		printf("%u ", (num)); \
869a4365d0SYoshinobu Inoue 	else \
879a4365d0SYoshinobu Inoue 		printf("%s ", (str)[(num)]); \
883c62e87aSJun-ichiro itojun Hagino } while (0)
899a4365d0SYoshinobu Inoue 
9033841545SHajimu UMEMOTO #define GETMSGV2S(v2s, num) \
9133841545SHajimu UMEMOTO do { \
9233841545SHajimu UMEMOTO 	struct val2str *p;  \
9333841545SHajimu UMEMOTO 	for (p = (v2s); p && p->str; p++) { \
9433841545SHajimu UMEMOTO 		if (p->val == (num)) \
9533841545SHajimu UMEMOTO 			break; \
9633841545SHajimu UMEMOTO 	} \
9733841545SHajimu UMEMOTO 	if (p && p->str) \
9833841545SHajimu UMEMOTO 		printf("%s ", p->str); \
9933841545SHajimu UMEMOTO 	else \
1009713f5c1SHajimu UMEMOTO 		printf("%u ", (num)); \
10133841545SHajimu UMEMOTO } while (0)
10233841545SHajimu UMEMOTO 
10369160b1eSDavid E. O'Brien static char *str_ipaddr(struct sockaddr *);
104bd9f52d5SHajimu UMEMOTO static char *str_prefport(u_int, u_int, u_int, u_int);
105bd9f52d5SHajimu UMEMOTO static void str_upperspec(u_int, u_int, u_int);
10669160b1eSDavid E. O'Brien static char *str_time(time_t);
10769160b1eSDavid E. O'Brien static void str_lifetime_byte(struct sadb_lifetime *, char *);
1089a4365d0SYoshinobu Inoue 
10933841545SHajimu UMEMOTO struct val2str {
11033841545SHajimu UMEMOTO 	int val;
11133841545SHajimu UMEMOTO 	const char *str;
11233841545SHajimu UMEMOTO };
11333841545SHajimu UMEMOTO 
1149a4365d0SYoshinobu Inoue /*
1159a4365d0SYoshinobu Inoue  * Must to be re-written about following strings.
1169a4365d0SYoshinobu Inoue  */
11733841545SHajimu UMEMOTO static char *str_satype[] = {
1189a4365d0SYoshinobu Inoue 	"unspec",
1199a4365d0SYoshinobu Inoue 	"unknown",
1209a4365d0SYoshinobu Inoue 	"ah",
1219a4365d0SYoshinobu Inoue 	"esp",
1229a4365d0SYoshinobu Inoue 	"unknown",
1239a4365d0SYoshinobu Inoue 	"rsvp",
1249a4365d0SYoshinobu Inoue 	"ospfv2",
1259a4365d0SYoshinobu Inoue 	"ripv2",
1269a4365d0SYoshinobu Inoue 	"mip",
1279a4365d0SYoshinobu Inoue 	"ipcomp",
1281922fd12SBruce M Simpson 	"policy",
1291922fd12SBruce M Simpson 	"tcp"
1309a4365d0SYoshinobu Inoue };
1319a4365d0SYoshinobu Inoue 
13233841545SHajimu UMEMOTO static char *str_mode[] = {
1339a4365d0SYoshinobu Inoue 	"any",
1349a4365d0SYoshinobu Inoue 	"transport",
1359a4365d0SYoshinobu Inoue 	"tunnel",
1369a4365d0SYoshinobu Inoue };
1379a4365d0SYoshinobu Inoue 
13833841545SHajimu UMEMOTO static char *str_state[] = {
1399a4365d0SYoshinobu Inoue 	"larval",
1409a4365d0SYoshinobu Inoue 	"mature",
1419a4365d0SYoshinobu Inoue 	"dying",
1429a4365d0SYoshinobu Inoue 	"dead",
1439a4365d0SYoshinobu Inoue };
1449a4365d0SYoshinobu Inoue 
14533841545SHajimu UMEMOTO static struct val2str str_alg_auth[] = {
14633841545SHajimu UMEMOTO 	{ SADB_AALG_NONE, "none", },
14733841545SHajimu UMEMOTO 	{ SADB_AALG_MD5HMAC, "hmac-md5", },
14833841545SHajimu UMEMOTO 	{ SADB_AALG_SHA1HMAC, "hmac-sha1", },
14933841545SHajimu UMEMOTO 	{ SADB_X_AALG_MD5, "md5", },
15033841545SHajimu UMEMOTO 	{ SADB_X_AALG_SHA, "sha", },
15133841545SHajimu UMEMOTO 	{ SADB_X_AALG_NULL, "null", },
1521922fd12SBruce M Simpson 	{ SADB_X_AALG_TCP_MD5, "tcp-md5", },
15333841545SHajimu UMEMOTO #ifdef SADB_X_AALG_SHA2_256
15433841545SHajimu UMEMOTO 	{ SADB_X_AALG_SHA2_256, "hmac-sha2-256", },
15533841545SHajimu UMEMOTO #endif
15633841545SHajimu UMEMOTO #ifdef SADB_X_AALG_SHA2_384
15733841545SHajimu UMEMOTO 	{ SADB_X_AALG_SHA2_384, "hmac-sha2-384", },
15833841545SHajimu UMEMOTO #endif
15933841545SHajimu UMEMOTO #ifdef SADB_X_AALG_SHA2_512
16033841545SHajimu UMEMOTO 	{ SADB_X_AALG_SHA2_512, "hmac-sha2-512", },
16133841545SHajimu UMEMOTO #endif
162492528c0SHajimu UMEMOTO #ifdef SADB_X_AALG_RIPEMD160HMAC
163492528c0SHajimu UMEMOTO 	{ SADB_X_AALG_RIPEMD160HMAC, "hmac-ripemd160", },
164492528c0SHajimu UMEMOTO #endif
165c65ee7c7SHajimu UMEMOTO #ifdef SADB_X_AALG_AES_XCBC_MAC
166c65ee7c7SHajimu UMEMOTO 	{ SADB_X_AALG_AES_XCBC_MAC, "aes-xcbc-mac", },
167c65ee7c7SHajimu UMEMOTO #endif
16833841545SHajimu UMEMOTO 	{ -1, NULL, },
1699a4365d0SYoshinobu Inoue };
1709a4365d0SYoshinobu Inoue 
17133841545SHajimu UMEMOTO static struct val2str str_alg_enc[] = {
17233841545SHajimu UMEMOTO 	{ SADB_EALG_NONE, "none", },
17333841545SHajimu UMEMOTO 	{ SADB_EALG_DESCBC, "des-cbc", },
17433841545SHajimu UMEMOTO 	{ SADB_EALG_3DESCBC, "3des-cbc", },
17533841545SHajimu UMEMOTO 	{ SADB_EALG_NULL, "null", },
17633841545SHajimu UMEMOTO #ifdef SADB_X_EALG_RC5CBC
17733841545SHajimu UMEMOTO 	{ SADB_X_EALG_RC5CBC, "rc5-cbc", },
17833841545SHajimu UMEMOTO #endif
17933841545SHajimu UMEMOTO 	{ SADB_X_EALG_CAST128CBC, "cast128-cbc", },
18033841545SHajimu UMEMOTO 	{ SADB_X_EALG_BLOWFISHCBC, "blowfish-cbc", },
18133841545SHajimu UMEMOTO #ifdef SADB_X_EALG_RIJNDAELCBC
18233841545SHajimu UMEMOTO 	{ SADB_X_EALG_RIJNDAELCBC, "rijndael-cbc", },
18333841545SHajimu UMEMOTO #endif
18433841545SHajimu UMEMOTO #ifdef SADB_X_EALG_TWOFISHCBC
18533841545SHajimu UMEMOTO 	{ SADB_X_EALG_TWOFISHCBC, "twofish-cbc", },
18633841545SHajimu UMEMOTO #endif
187b42ac57fSHajimu UMEMOTO #ifdef SADB_X_EALG_AESCTR
188b42ac57fSHajimu UMEMOTO 	{ SADB_X_EALG_AESCTR, "aes-ctr", },
189b42ac57fSHajimu UMEMOTO #endif
190987de844SGeorge V. Neville-Neil #ifdef SADB_X_EALG_AESGCM16
191987de844SGeorge V. Neville-Neil 	{ SADB_X_EALG_AESGCM16, "aes-gcm-16", },
192987de844SGeorge V. Neville-Neil #endif
193559d3390SGeorge V. Neville-Neil #ifdef SADB_X_EALG_CAMELLIACBC
194559d3390SGeorge V. Neville-Neil 	{ SADB_X_EALG_CAMELLIACBC, "camellia-cbc", },
195559d3390SGeorge V. Neville-Neil #endif
19633841545SHajimu UMEMOTO 	{ -1, NULL, },
1979a4365d0SYoshinobu Inoue };
1989a4365d0SYoshinobu Inoue 
19933841545SHajimu UMEMOTO static struct val2str str_alg_comp[] = {
20033841545SHajimu UMEMOTO 	{ SADB_X_CALG_NONE, "none", },
20133841545SHajimu UMEMOTO 	{ SADB_X_CALG_OUI, "oui", },
20233841545SHajimu UMEMOTO 	{ SADB_X_CALG_DEFLATE, "deflate", },
20333841545SHajimu UMEMOTO 	{ SADB_X_CALG_LZS, "lzs", },
20433841545SHajimu UMEMOTO 	{ -1, NULL, },
2059a4365d0SYoshinobu Inoue };
2069a4365d0SYoshinobu Inoue 
2079a4365d0SYoshinobu Inoue /*
2089a4365d0SYoshinobu Inoue  * dump SADB_MSG formated.  For debugging, you should use kdebug_sadb().
2099a4365d0SYoshinobu Inoue  */
2109a4365d0SYoshinobu Inoue void
2119a4365d0SYoshinobu Inoue pfkey_sadump(m)
2129a4365d0SYoshinobu Inoue 	struct sadb_msg *m;
2139a4365d0SYoshinobu Inoue {
2149a4365d0SYoshinobu Inoue 	caddr_t mhp[SADB_EXT_MAX + 1];
2159a4365d0SYoshinobu Inoue 	struct sadb_sa *m_sa;
2163c62e87aSJun-ichiro itojun Hagino 	struct sadb_x_sa2 *m_sa2;
2179a4365d0SYoshinobu Inoue 	struct sadb_lifetime *m_lftc, *m_lfth, *m_lfts;
2189a4365d0SYoshinobu Inoue 	struct sadb_address *m_saddr, *m_daddr, *m_paddr;
2199a4365d0SYoshinobu Inoue 	struct sadb_key *m_auth, *m_enc;
2209a4365d0SYoshinobu Inoue 	struct sadb_ident *m_sid, *m_did;
2219a4365d0SYoshinobu Inoue 	struct sadb_sens *m_sens;
222*bf435626SFabien Thomas 	struct sadb_x_sa_replay *m_sa_replay;
2239a4365d0SYoshinobu Inoue 
2249a4365d0SYoshinobu Inoue 	/* check pfkey message. */
2259a4365d0SYoshinobu Inoue 	if (pfkey_align(m, mhp)) {
2269a4365d0SYoshinobu Inoue 		printf("%s\n", ipsec_strerror());
2279a4365d0SYoshinobu Inoue 		return;
2289a4365d0SYoshinobu Inoue 	}
2299a4365d0SYoshinobu Inoue 	if (pfkey_check(mhp)) {
2309a4365d0SYoshinobu Inoue 		printf("%s\n", ipsec_strerror());
2319a4365d0SYoshinobu Inoue 		return;
2329a4365d0SYoshinobu Inoue 	}
2339a4365d0SYoshinobu Inoue 
2349a4365d0SYoshinobu Inoue 	m_sa = (struct sadb_sa *)mhp[SADB_EXT_SA];
2353c62e87aSJun-ichiro itojun Hagino 	m_sa2 = (struct sadb_x_sa2 *)mhp[SADB_X_EXT_SA2];
2369a4365d0SYoshinobu Inoue 	m_lftc = (struct sadb_lifetime *)mhp[SADB_EXT_LIFETIME_CURRENT];
2379a4365d0SYoshinobu Inoue 	m_lfth = (struct sadb_lifetime *)mhp[SADB_EXT_LIFETIME_HARD];
2389a4365d0SYoshinobu Inoue 	m_lfts = (struct sadb_lifetime *)mhp[SADB_EXT_LIFETIME_SOFT];
2399a4365d0SYoshinobu Inoue 	m_saddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_SRC];
2409a4365d0SYoshinobu Inoue 	m_daddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_DST];
2419a4365d0SYoshinobu Inoue 	m_paddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_PROXY];
2429a4365d0SYoshinobu Inoue 	m_auth = (struct sadb_key *)mhp[SADB_EXT_KEY_AUTH];
2439a4365d0SYoshinobu Inoue 	m_enc = (struct sadb_key *)mhp[SADB_EXT_KEY_ENCRYPT];
2449a4365d0SYoshinobu Inoue 	m_sid = (struct sadb_ident *)mhp[SADB_EXT_IDENTITY_SRC];
2453c62e87aSJun-ichiro itojun Hagino 	m_did = (struct sadb_ident *)mhp[SADB_EXT_IDENTITY_DST];
2469a4365d0SYoshinobu Inoue 	m_sens = (struct sadb_sens *)mhp[SADB_EXT_SENSITIVITY];
247*bf435626SFabien Thomas 	m_sa_replay = (struct sadb_x_sa_replay *)mhp[SADB_X_EXT_SA_REPLAY];
2489a4365d0SYoshinobu Inoue 
2499a4365d0SYoshinobu Inoue 	/* source address */
2509a4365d0SYoshinobu Inoue 	if (m_saddr == NULL) {
2519a4365d0SYoshinobu Inoue 		printf("no ADDRESS_SRC extension.\n");
2529a4365d0SYoshinobu Inoue 		return;
2539a4365d0SYoshinobu Inoue 	}
2543c62e87aSJun-ichiro itojun Hagino 	printf("%s ", str_ipaddr((struct sockaddr *)(m_saddr + 1)));
2559a4365d0SYoshinobu Inoue 
2569a4365d0SYoshinobu Inoue 	/* destination address */
2579a4365d0SYoshinobu Inoue 	if (m_daddr == NULL) {
2589a4365d0SYoshinobu Inoue 		printf("no ADDRESS_DST extension.\n");
2599a4365d0SYoshinobu Inoue 		return;
2609a4365d0SYoshinobu Inoue 	}
2613c62e87aSJun-ichiro itojun Hagino 	printf("%s ", str_ipaddr((struct sockaddr *)(m_daddr + 1)));
2629a4365d0SYoshinobu Inoue 
2639a4365d0SYoshinobu Inoue 	/* SA type */
2649a4365d0SYoshinobu Inoue 	if (m_sa == NULL) {
2659a4365d0SYoshinobu Inoue 		printf("no SA extension.\n");
2669a4365d0SYoshinobu Inoue 		return;
2679a4365d0SYoshinobu Inoue 	}
2683c62e87aSJun-ichiro itojun Hagino 	if (m_sa2 == NULL) {
2693c62e87aSJun-ichiro itojun Hagino 		printf("no SA2 extension.\n");
2703c62e87aSJun-ichiro itojun Hagino 		return;
2713c62e87aSJun-ichiro itojun Hagino 	}
2729a4365d0SYoshinobu Inoue 	printf("\n\t");
2739a4365d0SYoshinobu Inoue 
27433841545SHajimu UMEMOTO 	GETMSGSTR(str_satype, m->sadb_msg_satype);
2759a4365d0SYoshinobu Inoue 
2769a4365d0SYoshinobu Inoue 	printf("mode=");
27733841545SHajimu UMEMOTO 	GETMSGSTR(str_mode, m_sa2->sadb_x_sa2_mode);
2789a4365d0SYoshinobu Inoue 
2793c62e87aSJun-ichiro itojun Hagino 	printf("spi=%u(0x%08x) reqid=%u(0x%08x)\n",
2809a4365d0SYoshinobu Inoue 		(u_int32_t)ntohl(m_sa->sadb_sa_spi),
2819a4365d0SYoshinobu Inoue 		(u_int32_t)ntohl(m_sa->sadb_sa_spi),
2823c62e87aSJun-ichiro itojun Hagino 		(u_int32_t)m_sa2->sadb_x_sa2_reqid,
2833c62e87aSJun-ichiro itojun Hagino 		(u_int32_t)m_sa2->sadb_x_sa2_reqid);
2849a4365d0SYoshinobu Inoue 
2859a4365d0SYoshinobu Inoue 	/* encryption key */
2869a4365d0SYoshinobu Inoue 	if (m->sadb_msg_satype == SADB_X_SATYPE_IPCOMP) {
2879a4365d0SYoshinobu Inoue 		printf("\tC: ");
28833841545SHajimu UMEMOTO 		GETMSGV2S(str_alg_comp, m_sa->sadb_sa_encrypt);
2899a4365d0SYoshinobu Inoue 	} else if (m->sadb_msg_satype == SADB_SATYPE_ESP) {
2909a4365d0SYoshinobu Inoue 		if (m_enc != NULL) {
2919a4365d0SYoshinobu Inoue 			printf("\tE: ");
29233841545SHajimu UMEMOTO 			GETMSGV2S(str_alg_enc, m_sa->sadb_sa_encrypt);
2939a4365d0SYoshinobu Inoue 			ipsec_hexdump((caddr_t)m_enc + sizeof(*m_enc),
2949a4365d0SYoshinobu Inoue 				      m_enc->sadb_key_bits / 8);
2959a4365d0SYoshinobu Inoue 			printf("\n");
2969a4365d0SYoshinobu Inoue 		}
2979a4365d0SYoshinobu Inoue 	}
2989a4365d0SYoshinobu Inoue 
2999a4365d0SYoshinobu Inoue 	/* authentication key */
3009a4365d0SYoshinobu Inoue 	if (m_auth != NULL) {
3019a4365d0SYoshinobu Inoue 		printf("\tA: ");
30233841545SHajimu UMEMOTO 		GETMSGV2S(str_alg_auth, m_sa->sadb_sa_auth);
3039a4365d0SYoshinobu Inoue 		ipsec_hexdump((caddr_t)m_auth + sizeof(*m_auth),
3049a4365d0SYoshinobu Inoue 		              m_auth->sadb_key_bits / 8);
3059a4365d0SYoshinobu Inoue 		printf("\n");
3069a4365d0SYoshinobu Inoue 	}
3079a4365d0SYoshinobu Inoue 
3083c62e87aSJun-ichiro itojun Hagino 	/* replay windoe size & flags */
309232bdaf6SHajimu UMEMOTO 	printf("\tseq=0x%08x replay=%u flags=0x%08x ",
310232bdaf6SHajimu UMEMOTO 		m_sa2->sadb_x_sa2_sequence,
311*bf435626SFabien Thomas 		m_sa_replay ? (m_sa_replay->sadb_x_sa_replay_replay >> 3) :
3123c62e87aSJun-ichiro itojun Hagino 			m_sa->sadb_sa_replay,
3133c62e87aSJun-ichiro itojun Hagino 		m_sa->sadb_sa_flags);
3143c62e87aSJun-ichiro itojun Hagino 
3159a4365d0SYoshinobu Inoue 	/* state */
3163c62e87aSJun-ichiro itojun Hagino 	printf("state=");
31733841545SHajimu UMEMOTO 	GETMSGSTR(str_state, m_sa->sadb_sa_state);
318232bdaf6SHajimu UMEMOTO 	printf("\n");
3199a4365d0SYoshinobu Inoue 
3209a4365d0SYoshinobu Inoue 	/* lifetime */
3219a4365d0SYoshinobu Inoue 	if (m_lftc != NULL) {
3229a4365d0SYoshinobu Inoue 		time_t tmp_time = time(0);
3239a4365d0SYoshinobu Inoue 
3249a4365d0SYoshinobu Inoue 		printf("\tcreated: %s",
3253c62e87aSJun-ichiro itojun Hagino 			str_time(m_lftc->sadb_lifetime_addtime));
3263c62e87aSJun-ichiro itojun Hagino 		printf("\tcurrent: %s\n", str_time(tmp_time));
3279a4365d0SYoshinobu Inoue 		printf("\tdiff: %lu(s)",
3289a4365d0SYoshinobu Inoue 			(u_long)(m_lftc->sadb_lifetime_addtime == 0 ?
3299a4365d0SYoshinobu Inoue 			0 : (tmp_time - m_lftc->sadb_lifetime_addtime)));
3309a4365d0SYoshinobu Inoue 
3319a4365d0SYoshinobu Inoue 		printf("\thard: %lu(s)",
3329a4365d0SYoshinobu Inoue 			(u_long)(m_lfth == NULL ?
3339a4365d0SYoshinobu Inoue 			0 : m_lfth->sadb_lifetime_addtime));
3349a4365d0SYoshinobu Inoue 		printf("\tsoft: %lu(s)\n",
3359a4365d0SYoshinobu Inoue 			(u_long)(m_lfts == NULL ?
3369a4365d0SYoshinobu Inoue 			0 : m_lfts->sadb_lifetime_addtime));
3379a4365d0SYoshinobu Inoue 
3389a4365d0SYoshinobu Inoue 		printf("\tlast: %s",
3393c62e87aSJun-ichiro itojun Hagino 			str_time(m_lftc->sadb_lifetime_usetime));
3409a4365d0SYoshinobu Inoue 		printf("\thard: %lu(s)",
3419a4365d0SYoshinobu Inoue 			(u_long)(m_lfth == NULL ?
3429a4365d0SYoshinobu Inoue 			0 : m_lfth->sadb_lifetime_usetime));
3439a4365d0SYoshinobu Inoue 		printf("\tsoft: %lu(s)\n",
3449a4365d0SYoshinobu Inoue 			(u_long)(m_lfts == NULL ?
3459a4365d0SYoshinobu Inoue 			0 : m_lfts->sadb_lifetime_usetime));
3469a4365d0SYoshinobu Inoue 
3473c62e87aSJun-ichiro itojun Hagino 		str_lifetime_byte(m_lftc, "current");
3483c62e87aSJun-ichiro itojun Hagino 		str_lifetime_byte(m_lfth, "hard");
3493c62e87aSJun-ichiro itojun Hagino 		str_lifetime_byte(m_lfts, "soft");
3509a4365d0SYoshinobu Inoue 		printf("\n");
3519a4365d0SYoshinobu Inoue 
3529a4365d0SYoshinobu Inoue 		printf("\tallocated: %lu",
3539a4365d0SYoshinobu Inoue 			(unsigned long)m_lftc->sadb_lifetime_allocations);
3549a4365d0SYoshinobu Inoue 		printf("\thard: %lu",
3559a4365d0SYoshinobu Inoue 			(u_long)(m_lfth == NULL ?
3569a4365d0SYoshinobu Inoue 			0 : m_lfth->sadb_lifetime_allocations));
3579a4365d0SYoshinobu Inoue 		printf("\tsoft: %lu\n",
3589a4365d0SYoshinobu Inoue 			(u_long)(m_lfts == NULL ?
3599a4365d0SYoshinobu Inoue 			0 : m_lfts->sadb_lifetime_allocations));
3609a4365d0SYoshinobu Inoue 	}
3619a4365d0SYoshinobu Inoue 
362232bdaf6SHajimu UMEMOTO 	printf("\tsadb_seq=%lu pid=%lu ",
363232bdaf6SHajimu UMEMOTO 		(u_long)m->sadb_msg_seq,
364232bdaf6SHajimu UMEMOTO 		(u_long)m->sadb_msg_pid);
365232bdaf6SHajimu UMEMOTO 
3669a4365d0SYoshinobu Inoue 	/* XXX DEBUG */
367232bdaf6SHajimu UMEMOTO 	printf("refcnt=%u\n", m->sadb_msg_reserved);
3689a4365d0SYoshinobu Inoue 
3699a4365d0SYoshinobu Inoue 	return;
3709a4365d0SYoshinobu Inoue }
3719a4365d0SYoshinobu Inoue 
3729a4365d0SYoshinobu Inoue void
3739a4365d0SYoshinobu Inoue pfkey_spdump(m)
3749a4365d0SYoshinobu Inoue 	struct sadb_msg *m;
3759a4365d0SYoshinobu Inoue {
3763c62e87aSJun-ichiro itojun Hagino 	char pbuf[NI_MAXSERV];
3779a4365d0SYoshinobu Inoue 	caddr_t mhp[SADB_EXT_MAX + 1];
3789a4365d0SYoshinobu Inoue 	struct sadb_address *m_saddr, *m_daddr;
3799a4365d0SYoshinobu Inoue 	struct sadb_x_policy *m_xpl;
380bd9f52d5SHajimu UMEMOTO 	struct sadb_lifetime *m_lftc = NULL, *m_lfth = NULL;
3813c62e87aSJun-ichiro itojun Hagino 	struct sockaddr *sa;
382bd9f52d5SHajimu UMEMOTO 	u_int16_t sport = 0, dport = 0;
3839a4365d0SYoshinobu Inoue 
3849a4365d0SYoshinobu Inoue 	/* check pfkey message. */
3859a4365d0SYoshinobu Inoue 	if (pfkey_align(m, mhp)) {
3869a4365d0SYoshinobu Inoue 		printf("%s\n", ipsec_strerror());
3879a4365d0SYoshinobu Inoue 		return;
3889a4365d0SYoshinobu Inoue 	}
3899a4365d0SYoshinobu Inoue 	if (pfkey_check(mhp)) {
3909a4365d0SYoshinobu Inoue 		printf("%s\n", ipsec_strerror());
3919a4365d0SYoshinobu Inoue 		return;
3929a4365d0SYoshinobu Inoue 	}
3939a4365d0SYoshinobu Inoue 
3949a4365d0SYoshinobu Inoue 	m_saddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_SRC];
3959a4365d0SYoshinobu Inoue 	m_daddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_DST];
3969a4365d0SYoshinobu Inoue 	m_xpl = (struct sadb_x_policy *)mhp[SADB_X_EXT_POLICY];
397bd9f52d5SHajimu UMEMOTO 	m_lftc = (struct sadb_lifetime *)mhp[SADB_EXT_LIFETIME_CURRENT];
398bd9f52d5SHajimu UMEMOTO 	m_lfth = (struct sadb_lifetime *)mhp[SADB_EXT_LIFETIME_HARD];
3999a4365d0SYoshinobu Inoue 
400bd9f52d5SHajimu UMEMOTO 	if (m_saddr && m_daddr) {
4019a4365d0SYoshinobu Inoue 		/* source address */
4023c62e87aSJun-ichiro itojun Hagino 		sa = (struct sockaddr *)(m_saddr + 1);
4033c62e87aSJun-ichiro itojun Hagino 		switch (sa->sa_family) {
4043c62e87aSJun-ichiro itojun Hagino 		case AF_INET:
4053c62e87aSJun-ichiro itojun Hagino 		case AF_INET6:
406bd9f52d5SHajimu UMEMOTO 			if (getnameinfo(sa, sa->sa_len, NULL, 0,
407bd9f52d5SHajimu UMEMOTO 			    pbuf, sizeof(pbuf), NI_NUMERICSERV) != 0)
408bd9f52d5SHajimu UMEMOTO 				sport = 0;	/*XXX*/
4093c62e87aSJun-ichiro itojun Hagino 			else
410bd9f52d5SHajimu UMEMOTO 				sport = atoi(pbuf);
4113c62e87aSJun-ichiro itojun Hagino 			printf("%s%s ", str_ipaddr(sa),
4123c62e87aSJun-ichiro itojun Hagino 				str_prefport(sa->sa_family,
413bd9f52d5SHajimu UMEMOTO 				    m_saddr->sadb_address_prefixlen, sport,
414bd9f52d5SHajimu UMEMOTO 				    m_saddr->sadb_address_proto));
4153c62e87aSJun-ichiro itojun Hagino 			break;
4163c62e87aSJun-ichiro itojun Hagino 		default:
4173c62e87aSJun-ichiro itojun Hagino 			printf("unknown-af ");
4183c62e87aSJun-ichiro itojun Hagino 			break;
4193c62e87aSJun-ichiro itojun Hagino 		}
4209a4365d0SYoshinobu Inoue 
4219a4365d0SYoshinobu Inoue 		/* destination address */
4223c62e87aSJun-ichiro itojun Hagino 		sa = (struct sockaddr *)(m_daddr + 1);
4233c62e87aSJun-ichiro itojun Hagino 		switch (sa->sa_family) {
4243c62e87aSJun-ichiro itojun Hagino 		case AF_INET:
4253c62e87aSJun-ichiro itojun Hagino 		case AF_INET6:
426bd9f52d5SHajimu UMEMOTO 			if (getnameinfo(sa, sa->sa_len, NULL, 0,
427bd9f52d5SHajimu UMEMOTO 			    pbuf, sizeof(pbuf), NI_NUMERICSERV) != 0)
428bd9f52d5SHajimu UMEMOTO 				dport = 0;	/*XXX*/
4293c62e87aSJun-ichiro itojun Hagino 			else
430bd9f52d5SHajimu UMEMOTO 				dport = atoi(pbuf);
4313c62e87aSJun-ichiro itojun Hagino 			printf("%s%s ", str_ipaddr(sa),
4323c62e87aSJun-ichiro itojun Hagino 				str_prefport(sa->sa_family,
433bd9f52d5SHajimu UMEMOTO 				    m_daddr->sadb_address_prefixlen, dport,
434bd9f52d5SHajimu UMEMOTO 				    m_saddr->sadb_address_proto));
4353c62e87aSJun-ichiro itojun Hagino 			break;
4363c62e87aSJun-ichiro itojun Hagino 		default:
4373c62e87aSJun-ichiro itojun Hagino 			printf("unknown-af ");
4383c62e87aSJun-ichiro itojun Hagino 			break;
4393c62e87aSJun-ichiro itojun Hagino 		}
4409a4365d0SYoshinobu Inoue 
4419a4365d0SYoshinobu Inoue 		/* upper layer protocol */
442bd9f52d5SHajimu UMEMOTO 		if (m_saddr->sadb_address_proto !=
443bd9f52d5SHajimu UMEMOTO 		    m_daddr->sadb_address_proto) {
4449a4365d0SYoshinobu Inoue 			printf("upper layer protocol mismatched.\n");
4459a4365d0SYoshinobu Inoue 			return;
4469a4365d0SYoshinobu Inoue 		}
447bd9f52d5SHajimu UMEMOTO 		str_upperspec(m_saddr->sadb_address_proto, sport, dport);
448bd9f52d5SHajimu UMEMOTO 	}
4499a4365d0SYoshinobu Inoue 	else
450bd9f52d5SHajimu UMEMOTO 		printf("(no selector, probably per-socket policy) ");
4519a4365d0SYoshinobu Inoue 
4529a4365d0SYoshinobu Inoue 	/* policy */
4539a4365d0SYoshinobu Inoue     {
4549a4365d0SYoshinobu Inoue 	char *d_xpl;
4559a4365d0SYoshinobu Inoue 
4569a4365d0SYoshinobu Inoue 	if (m_xpl == NULL) {
4579a4365d0SYoshinobu Inoue 		printf("no X_POLICY extension.\n");
4589a4365d0SYoshinobu Inoue 		return;
4599a4365d0SYoshinobu Inoue 	}
4609a4365d0SYoshinobu Inoue 	d_xpl = ipsec_dump_policy((char *)m_xpl, "\n\t");
4619a4365d0SYoshinobu Inoue 
4629a4365d0SYoshinobu Inoue 	/* dump SPD */
4639a4365d0SYoshinobu Inoue 	printf("\n\t%s\n", d_xpl);
4649a4365d0SYoshinobu Inoue 	free(d_xpl);
4659a4365d0SYoshinobu Inoue     }
4669a4365d0SYoshinobu Inoue 
46733841545SHajimu UMEMOTO 	/* lifetime */
468bd9f52d5SHajimu UMEMOTO 	if (m_lftc) {
469bd9f52d5SHajimu UMEMOTO 		printf("\tcreated: %s  ",
470bd9f52d5SHajimu UMEMOTO 			str_time(m_lftc->sadb_lifetime_addtime));
471bd9f52d5SHajimu UMEMOTO 		printf("lastused: %s\n",
472bd9f52d5SHajimu UMEMOTO 			str_time(m_lftc->sadb_lifetime_usetime));
47333841545SHajimu UMEMOTO 	}
474bd9f52d5SHajimu UMEMOTO 	if (m_lfth) {
475bd9f52d5SHajimu UMEMOTO 		printf("\tlifetime: %lu(s) ",
476bd9f52d5SHajimu UMEMOTO 			(u_long)m_lfth->sadb_lifetime_addtime);
477bd9f52d5SHajimu UMEMOTO 		printf("validtime: %lu(s)\n",
478bd9f52d5SHajimu UMEMOTO 			(u_long)m_lfth->sadb_lifetime_usetime);
479bd9f52d5SHajimu UMEMOTO 	}
480bd9f52d5SHajimu UMEMOTO 
48133841545SHajimu UMEMOTO 
4823c62e87aSJun-ichiro itojun Hagino 	printf("\tspid=%ld seq=%ld pid=%ld\n",
4833c62e87aSJun-ichiro itojun Hagino 		(u_long)m_xpl->sadb_x_policy_id,
4849a4365d0SYoshinobu Inoue 		(u_long)m->sadb_msg_seq,
4859a4365d0SYoshinobu Inoue 		(u_long)m->sadb_msg_pid);
4869a4365d0SYoshinobu Inoue 
4879a4365d0SYoshinobu Inoue 	/* XXX TEST */
4883c62e87aSJun-ichiro itojun Hagino 	printf("\trefcnt=%u\n", m->sadb_msg_reserved);
4899a4365d0SYoshinobu Inoue 
4909a4365d0SYoshinobu Inoue 	return;
4919a4365d0SYoshinobu Inoue }
4929a4365d0SYoshinobu Inoue 
4939a4365d0SYoshinobu Inoue /*
4949a4365d0SYoshinobu Inoue  * set "ipaddress" to buffer.
4959a4365d0SYoshinobu Inoue  */
4969a4365d0SYoshinobu Inoue static char *
4973c62e87aSJun-ichiro itojun Hagino str_ipaddr(sa)
4983c62e87aSJun-ichiro itojun Hagino 	struct sockaddr *sa;
4999a4365d0SYoshinobu Inoue {
5003c62e87aSJun-ichiro itojun Hagino 	static char buf[NI_MAXHOST];
5013c62e87aSJun-ichiro itojun Hagino 	const int niflag = NI_NUMERICHOST;
5029a4365d0SYoshinobu Inoue 
5033c62e87aSJun-ichiro itojun Hagino 	if (sa == NULL)
5049a4365d0SYoshinobu Inoue 		return "";
5059a4365d0SYoshinobu Inoue 
5063c62e87aSJun-ichiro itojun Hagino 	if (getnameinfo(sa, sa->sa_len, buf, sizeof(buf), NULL, 0, niflag) == 0)
5079a4365d0SYoshinobu Inoue 		return buf;
5083c62e87aSJun-ichiro itojun Hagino 	return NULL;
5099a4365d0SYoshinobu Inoue }
5109a4365d0SYoshinobu Inoue 
5119a4365d0SYoshinobu Inoue /*
5129a4365d0SYoshinobu Inoue  * set "/prefix[port number]" to buffer.
5139a4365d0SYoshinobu Inoue  */
5149a4365d0SYoshinobu Inoue static char *
515bd9f52d5SHajimu UMEMOTO str_prefport(family, pref, port, ulp)
516bd9f52d5SHajimu UMEMOTO 	u_int family, pref, port, ulp;
5179a4365d0SYoshinobu Inoue {
5189a4365d0SYoshinobu Inoue 	static char buf[128];
519296e054fSMunechika SUMIKAWA 	char prefbuf[128];
520296e054fSMunechika SUMIKAWA 	char portbuf[128];
5213c62e87aSJun-ichiro itojun Hagino 	int plen;
5229a4365d0SYoshinobu Inoue 
5233c62e87aSJun-ichiro itojun Hagino 	switch (family) {
5243c62e87aSJun-ichiro itojun Hagino 	case AF_INET:
5253c62e87aSJun-ichiro itojun Hagino 		plen = sizeof(struct in_addr) << 3;
5263c62e87aSJun-ichiro itojun Hagino 		break;
5273c62e87aSJun-ichiro itojun Hagino 	case AF_INET6:
5283c62e87aSJun-ichiro itojun Hagino 		plen = sizeof(struct in6_addr) << 3;
5293c62e87aSJun-ichiro itojun Hagino 		break;
5303c62e87aSJun-ichiro itojun Hagino 	default:
5313c62e87aSJun-ichiro itojun Hagino 		return "?";
5323c62e87aSJun-ichiro itojun Hagino 	}
5333c62e87aSJun-ichiro itojun Hagino 
5343c62e87aSJun-ichiro itojun Hagino 	if (pref == plen)
5359a4365d0SYoshinobu Inoue 		prefbuf[0] = '\0';
5369a4365d0SYoshinobu Inoue 	else
5379a4365d0SYoshinobu Inoue 		snprintf(prefbuf, sizeof(prefbuf), "/%u", pref);
5389a4365d0SYoshinobu Inoue 
539bd9f52d5SHajimu UMEMOTO 	if (ulp == IPPROTO_ICMPV6)
540bd9f52d5SHajimu UMEMOTO 		memset(portbuf, 0, sizeof(portbuf));
541bd9f52d5SHajimu UMEMOTO 	else {
5429a4365d0SYoshinobu Inoue 		if (port == IPSEC_PORT_ANY)
5439a4365d0SYoshinobu Inoue 			snprintf(portbuf, sizeof(portbuf), "[%s]", "any");
5449a4365d0SYoshinobu Inoue 		else
5453c62e87aSJun-ichiro itojun Hagino 			snprintf(portbuf, sizeof(portbuf), "[%u]", port);
546bd9f52d5SHajimu UMEMOTO 	}
5479a4365d0SYoshinobu Inoue 
5489a4365d0SYoshinobu Inoue 	snprintf(buf, sizeof(buf), "%s%s", prefbuf, portbuf);
5499a4365d0SYoshinobu Inoue 
5509a4365d0SYoshinobu Inoue 	return buf;
5519a4365d0SYoshinobu Inoue }
5529a4365d0SYoshinobu Inoue 
553bd9f52d5SHajimu UMEMOTO static void
554bd9f52d5SHajimu UMEMOTO str_upperspec(ulp, p1, p2)
555bd9f52d5SHajimu UMEMOTO 	u_int ulp, p1, p2;
556bd9f52d5SHajimu UMEMOTO {
557bd9f52d5SHajimu UMEMOTO 	if (ulp == IPSEC_ULPROTO_ANY)
558bd9f52d5SHajimu UMEMOTO 		printf("any");
559bd9f52d5SHajimu UMEMOTO 	else if (ulp == IPPROTO_ICMPV6) {
560bd9f52d5SHajimu UMEMOTO 		printf("icmp6");
561bd9f52d5SHajimu UMEMOTO 		if (!(p1 == IPSEC_PORT_ANY && p2 == IPSEC_PORT_ANY))
562bd9f52d5SHajimu UMEMOTO 			printf(" %u,%u", p1, p2);
563bd9f52d5SHajimu UMEMOTO 	} else {
564bd9f52d5SHajimu UMEMOTO 		struct protoent *ent;
565bd9f52d5SHajimu UMEMOTO 
566bd9f52d5SHajimu UMEMOTO 		switch (ulp) {
567bd9f52d5SHajimu UMEMOTO 		case IPPROTO_IPV4:
568bd9f52d5SHajimu UMEMOTO 			printf("ip4");
569bd9f52d5SHajimu UMEMOTO 			break;
570bd9f52d5SHajimu UMEMOTO 		default:
571bd9f52d5SHajimu UMEMOTO 			ent = getprotobynumber(ulp);
572bd9f52d5SHajimu UMEMOTO 			if (ent)
573bd9f52d5SHajimu UMEMOTO 				printf("%s", ent->p_name);
574bd9f52d5SHajimu UMEMOTO 			else
575bd9f52d5SHajimu UMEMOTO 				printf("%u", ulp);
576bd9f52d5SHajimu UMEMOTO 
577bd9f52d5SHajimu UMEMOTO 			endprotoent();
578bd9f52d5SHajimu UMEMOTO 			break;
579bd9f52d5SHajimu UMEMOTO 		}
580bd9f52d5SHajimu UMEMOTO 	}
581bd9f52d5SHajimu UMEMOTO }
582bd9f52d5SHajimu UMEMOTO 
5839a4365d0SYoshinobu Inoue /*
5849a4365d0SYoshinobu Inoue  * set "Mon Day Time Year" to buffer
5859a4365d0SYoshinobu Inoue  */
5869a4365d0SYoshinobu Inoue static char *
5873c62e87aSJun-ichiro itojun Hagino str_time(t)
5889a4365d0SYoshinobu Inoue 	time_t t;
5899a4365d0SYoshinobu Inoue {
5909a4365d0SYoshinobu Inoue 	static char buf[128];
5919a4365d0SYoshinobu Inoue 
5929a4365d0SYoshinobu Inoue 	if (t == 0) {
5939a4365d0SYoshinobu Inoue 		int i = 0;
5949a4365d0SYoshinobu Inoue 		for (;i < 20;) buf[i++] = ' ';
5959a4365d0SYoshinobu Inoue 	} else {
5969a4365d0SYoshinobu Inoue 		char *t0;
5979a4365d0SYoshinobu Inoue 		t0 = ctime(&t);
5989a4365d0SYoshinobu Inoue 		memcpy(buf, t0 + 4, 20);
5999a4365d0SYoshinobu Inoue 	}
6009a4365d0SYoshinobu Inoue 
6019a4365d0SYoshinobu Inoue 	buf[20] = '\0';
6029a4365d0SYoshinobu Inoue 
6039a4365d0SYoshinobu Inoue 	return(buf);
6049a4365d0SYoshinobu Inoue }
6059a4365d0SYoshinobu Inoue 
6069a4365d0SYoshinobu Inoue static void
6073c62e87aSJun-ichiro itojun Hagino str_lifetime_byte(x, str)
6089a4365d0SYoshinobu Inoue 	struct sadb_lifetime *x;
6099a4365d0SYoshinobu Inoue 	char *str;
6109a4365d0SYoshinobu Inoue {
6119a4365d0SYoshinobu Inoue 	double y;
6129a4365d0SYoshinobu Inoue 	char *unit;
6139a4365d0SYoshinobu Inoue 	int w;
6149a4365d0SYoshinobu Inoue 
6159a4365d0SYoshinobu Inoue 	if (x == NULL) {
6169a4365d0SYoshinobu Inoue 		printf("\t%s: 0(bytes)", str);
6179a4365d0SYoshinobu Inoue 		return;
6189a4365d0SYoshinobu Inoue 	}
6199a4365d0SYoshinobu Inoue 
6203c62e87aSJun-ichiro itojun Hagino #if 0
6213c62e87aSJun-ichiro itojun Hagino 	if ((x->sadb_lifetime_bytes) / 1024 / 1024) {
6223c62e87aSJun-ichiro itojun Hagino 		y = (x->sadb_lifetime_bytes) * 1.0 / 1024 / 1024;
6233c62e87aSJun-ichiro itojun Hagino 		unit = "M";
6243c62e87aSJun-ichiro itojun Hagino 		w = 1;
6253c62e87aSJun-ichiro itojun Hagino 	} else if ((x->sadb_lifetime_bytes) / 1024) {
6263c62e87aSJun-ichiro itojun Hagino 		y = (x->sadb_lifetime_bytes) * 1.0 / 1024;
6273c62e87aSJun-ichiro itojun Hagino 		unit = "K";
6283c62e87aSJun-ichiro itojun Hagino 		w = 1;
6293c62e87aSJun-ichiro itojun Hagino 	} else {
6309a4365d0SYoshinobu Inoue 		y = (x->sadb_lifetime_bytes) * 1.0;
6319a4365d0SYoshinobu Inoue 		unit = "";
6329a4365d0SYoshinobu Inoue 		w = 0;
6333c62e87aSJun-ichiro itojun Hagino 	}
6343c62e87aSJun-ichiro itojun Hagino #else
6353c62e87aSJun-ichiro itojun Hagino 	y = (x->sadb_lifetime_bytes) * 1.0;
6363c62e87aSJun-ichiro itojun Hagino 	unit = "";
6373c62e87aSJun-ichiro itojun Hagino 	w = 0;
6383c62e87aSJun-ichiro itojun Hagino #endif
6399a4365d0SYoshinobu Inoue 	printf("\t%s: %.*f(%sbytes)", str, w, y, unit);
6409a4365d0SYoshinobu Inoue }
641