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