1bd9f52d5SHajimu UMEMOTO /* $KAME: pfkey_dump.c,v 1.45 2003/09/08 10:14:56 itojun Exp $ */ 23c62e87aSJun-ichiro itojun Hagino 38a16b7a1SPedro F. Giffuni /*- 48a16b7a1SPedro F. Giffuni * SPDX-License-Identifier: BSD-3-Clause 58a16b7a1SPedro 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_NULL 6133841545SHajimu UMEMOTO #define SADB_X_AALG_NULL SADB_AALG_NULL 6233841545SHajimu UMEMOTO #endif 6333841545SHajimu UMEMOTO 6433841545SHajimu UMEMOTO #ifndef SADB_X_EALG_RC5CBC 6533841545SHajimu UMEMOTO #ifdef SADB_EALG_RC5CBC 6633841545SHajimu UMEMOTO #define SADB_X_EALG_RC5CBC SADB_EALG_RC5CBC 6733841545SHajimu UMEMOTO #endif 6833841545SHajimu UMEMOTO #endif 6933841545SHajimu UMEMOTO 709a4365d0SYoshinobu Inoue #define GETMSGSTR(str, num) \ 713c62e87aSJun-ichiro itojun Hagino do { \ 729a4365d0SYoshinobu Inoue if (sizeof((str)[0]) == 0 \ 739a4365d0SYoshinobu Inoue || num >= sizeof(str)/sizeof((str)[0])) \ 749713f5c1SHajimu UMEMOTO printf("%u ", (num)); \ 759a4365d0SYoshinobu Inoue else if (strlen((str)[(num)]) == 0) \ 769713f5c1SHajimu UMEMOTO printf("%u ", (num)); \ 779a4365d0SYoshinobu Inoue else \ 789a4365d0SYoshinobu Inoue printf("%s ", (str)[(num)]); \ 793c62e87aSJun-ichiro itojun Hagino } while (0) 809a4365d0SYoshinobu Inoue 8133841545SHajimu UMEMOTO #define GETMSGV2S(v2s, num) \ 8233841545SHajimu UMEMOTO do { \ 8333841545SHajimu UMEMOTO struct val2str *p; \ 8433841545SHajimu UMEMOTO for (p = (v2s); p && p->str; p++) { \ 8533841545SHajimu UMEMOTO if (p->val == (num)) \ 8633841545SHajimu UMEMOTO break; \ 8733841545SHajimu UMEMOTO } \ 8833841545SHajimu UMEMOTO if (p && p->str) \ 8933841545SHajimu UMEMOTO printf("%s ", p->str); \ 9033841545SHajimu UMEMOTO else \ 919713f5c1SHajimu UMEMOTO printf("%u ", (num)); \ 9233841545SHajimu UMEMOTO } while (0) 9333841545SHajimu UMEMOTO 9469160b1eSDavid E. O'Brien static char *str_ipaddr(struct sockaddr *); 95bd9f52d5SHajimu UMEMOTO static char *str_prefport(u_int, u_int, u_int, u_int); 96bd9f52d5SHajimu UMEMOTO static void str_upperspec(u_int, u_int, u_int); 9769160b1eSDavid E. O'Brien static char *str_time(time_t); 9869160b1eSDavid E. O'Brien static void str_lifetime_byte(struct sadb_lifetime *, char *); 999a4365d0SYoshinobu Inoue 10033841545SHajimu UMEMOTO struct val2str { 10133841545SHajimu UMEMOTO int val; 10233841545SHajimu UMEMOTO const char *str; 10333841545SHajimu UMEMOTO }; 10433841545SHajimu UMEMOTO 1059a4365d0SYoshinobu Inoue /* 1069a4365d0SYoshinobu Inoue * Must to be re-written about following strings. 1079a4365d0SYoshinobu Inoue */ 10833841545SHajimu UMEMOTO static char *str_satype[] = { 1099a4365d0SYoshinobu Inoue "unspec", 1109a4365d0SYoshinobu Inoue "unknown", 1119a4365d0SYoshinobu Inoue "ah", 1129a4365d0SYoshinobu Inoue "esp", 1139a4365d0SYoshinobu Inoue "unknown", 1149a4365d0SYoshinobu Inoue "rsvp", 1159a4365d0SYoshinobu Inoue "ospfv2", 1169a4365d0SYoshinobu Inoue "ripv2", 1179a4365d0SYoshinobu Inoue "mip", 1189a4365d0SYoshinobu Inoue "ipcomp", 1191922fd12SBruce M Simpson "policy", 1201922fd12SBruce M Simpson "tcp" 1219a4365d0SYoshinobu Inoue }; 1229a4365d0SYoshinobu Inoue 12333841545SHajimu UMEMOTO static char *str_mode[] = { 1249a4365d0SYoshinobu Inoue "any", 1259a4365d0SYoshinobu Inoue "transport", 1269a4365d0SYoshinobu Inoue "tunnel", 1279a4365d0SYoshinobu Inoue }; 1289a4365d0SYoshinobu Inoue 12933841545SHajimu UMEMOTO static char *str_state[] = { 1309a4365d0SYoshinobu Inoue "larval", 1319a4365d0SYoshinobu Inoue "mature", 1329a4365d0SYoshinobu Inoue "dying", 1339a4365d0SYoshinobu Inoue "dead", 1349a4365d0SYoshinobu Inoue }; 1359a4365d0SYoshinobu Inoue 13633841545SHajimu UMEMOTO static struct val2str str_alg_auth[] = { 13733841545SHajimu UMEMOTO { SADB_AALG_NONE, "none", }, 13833841545SHajimu UMEMOTO { SADB_AALG_SHA1HMAC, "hmac-sha1", }, 13933841545SHajimu UMEMOTO { SADB_X_AALG_NULL, "null", }, 1401922fd12SBruce M Simpson { SADB_X_AALG_TCP_MD5, "tcp-md5", }, 14133841545SHajimu UMEMOTO #ifdef SADB_X_AALG_SHA2_256 14233841545SHajimu UMEMOTO { SADB_X_AALG_SHA2_256, "hmac-sha2-256", }, 14333841545SHajimu UMEMOTO #endif 14433841545SHajimu UMEMOTO #ifdef SADB_X_AALG_SHA2_384 14533841545SHajimu UMEMOTO { SADB_X_AALG_SHA2_384, "hmac-sha2-384", }, 14633841545SHajimu UMEMOTO #endif 14733841545SHajimu UMEMOTO #ifdef SADB_X_AALG_SHA2_512 14833841545SHajimu UMEMOTO { SADB_X_AALG_SHA2_512, "hmac-sha2-512", }, 14933841545SHajimu UMEMOTO #endif 150c65ee7c7SHajimu UMEMOTO #ifdef SADB_X_AALG_AES_XCBC_MAC 151c65ee7c7SHajimu UMEMOTO { SADB_X_AALG_AES_XCBC_MAC, "aes-xcbc-mac", }, 152c65ee7c7SHajimu UMEMOTO #endif 15333841545SHajimu UMEMOTO { -1, NULL, }, 1549a4365d0SYoshinobu Inoue }; 1559a4365d0SYoshinobu Inoue 15633841545SHajimu UMEMOTO static struct val2str str_alg_enc[] = { 15733841545SHajimu UMEMOTO { SADB_EALG_NONE, "none", }, 15833841545SHajimu UMEMOTO { SADB_EALG_NULL, "null", }, 15933841545SHajimu UMEMOTO #ifdef SADB_X_EALG_RC5CBC 16033841545SHajimu UMEMOTO { SADB_X_EALG_RC5CBC, "rc5-cbc", }, 16133841545SHajimu UMEMOTO #endif 162*00a4311aSJohn Baldwin #ifdef SADB_X_EALG_AESCBC 163*00a4311aSJohn Baldwin { SADB_X_EALG_AESCBC, "aes-cbc", }, 16433841545SHajimu UMEMOTO #endif 16533841545SHajimu UMEMOTO #ifdef SADB_X_EALG_TWOFISHCBC 16633841545SHajimu UMEMOTO { SADB_X_EALG_TWOFISHCBC, "twofish-cbc", }, 16733841545SHajimu UMEMOTO #endif 168b42ac57fSHajimu UMEMOTO #ifdef SADB_X_EALG_AESCTR 169b42ac57fSHajimu UMEMOTO { SADB_X_EALG_AESCTR, "aes-ctr", }, 170b42ac57fSHajimu UMEMOTO #endif 171987de844SGeorge V. Neville-Neil #ifdef SADB_X_EALG_AESGCM16 172987de844SGeorge V. Neville-Neil { SADB_X_EALG_AESGCM16, "aes-gcm-16", }, 173987de844SGeorge V. Neville-Neil #endif 17433841545SHajimu UMEMOTO { -1, NULL, }, 1759a4365d0SYoshinobu Inoue }; 1769a4365d0SYoshinobu Inoue 17733841545SHajimu UMEMOTO static struct val2str str_alg_comp[] = { 17833841545SHajimu UMEMOTO { SADB_X_CALG_NONE, "none", }, 17933841545SHajimu UMEMOTO { SADB_X_CALG_OUI, "oui", }, 18033841545SHajimu UMEMOTO { SADB_X_CALG_DEFLATE, "deflate", }, 18133841545SHajimu UMEMOTO { SADB_X_CALG_LZS, "lzs", }, 18233841545SHajimu UMEMOTO { -1, NULL, }, 1839a4365d0SYoshinobu Inoue }; 1849a4365d0SYoshinobu Inoue 18522986c67SAndrey V. Elsukov static struct val2str str_sp_scope[] = { 18622986c67SAndrey V. Elsukov { IPSEC_POLICYSCOPE_GLOBAL, "global" }, 18722986c67SAndrey V. Elsukov { IPSEC_POLICYSCOPE_IFNET, "ifnet" }, 18822986c67SAndrey V. Elsukov { IPSEC_POLICYSCOPE_PCB, "pcb"}, 18922986c67SAndrey V. Elsukov { -1, NULL }, 19022986c67SAndrey V. Elsukov }; 19122986c67SAndrey V. Elsukov 1929a4365d0SYoshinobu Inoue /* 1939a4365d0SYoshinobu Inoue * dump SADB_MSG formated. For debugging, you should use kdebug_sadb(). 1949a4365d0SYoshinobu Inoue */ 1959a4365d0SYoshinobu Inoue void 1969a4365d0SYoshinobu Inoue pfkey_sadump(m) 1979a4365d0SYoshinobu Inoue struct sadb_msg *m; 1989a4365d0SYoshinobu Inoue { 1999a4365d0SYoshinobu Inoue caddr_t mhp[SADB_EXT_MAX + 1]; 2009a4365d0SYoshinobu Inoue struct sadb_sa *m_sa; 2013c62e87aSJun-ichiro itojun Hagino struct sadb_x_sa2 *m_sa2; 2029a4365d0SYoshinobu Inoue struct sadb_lifetime *m_lftc, *m_lfth, *m_lfts; 2039a4365d0SYoshinobu Inoue struct sadb_address *m_saddr, *m_daddr, *m_paddr; 2049a4365d0SYoshinobu Inoue struct sadb_key *m_auth, *m_enc; 2059a4365d0SYoshinobu Inoue struct sadb_ident *m_sid, *m_did; 2069a4365d0SYoshinobu Inoue struct sadb_sens *m_sens; 207bf435626SFabien Thomas struct sadb_x_sa_replay *m_sa_replay; 208fcf59617SAndrey V. Elsukov struct sadb_x_nat_t_type *natt_type; 209fcf59617SAndrey V. Elsukov struct sadb_x_nat_t_port *natt_sport, *natt_dport; 210fcf59617SAndrey V. Elsukov struct sadb_address *natt_oai, *natt_oar; 2119a4365d0SYoshinobu Inoue 2129a4365d0SYoshinobu Inoue /* check pfkey message. */ 2139a4365d0SYoshinobu Inoue if (pfkey_align(m, mhp)) { 2149a4365d0SYoshinobu Inoue printf("%s\n", ipsec_strerror()); 2159a4365d0SYoshinobu Inoue return; 2169a4365d0SYoshinobu Inoue } 2179a4365d0SYoshinobu Inoue if (pfkey_check(mhp)) { 2189a4365d0SYoshinobu Inoue printf("%s\n", ipsec_strerror()); 2199a4365d0SYoshinobu Inoue return; 2209a4365d0SYoshinobu Inoue } 2219a4365d0SYoshinobu Inoue 2229a4365d0SYoshinobu Inoue m_sa = (struct sadb_sa *)mhp[SADB_EXT_SA]; 2233c62e87aSJun-ichiro itojun Hagino m_sa2 = (struct sadb_x_sa2 *)mhp[SADB_X_EXT_SA2]; 2249a4365d0SYoshinobu Inoue m_lftc = (struct sadb_lifetime *)mhp[SADB_EXT_LIFETIME_CURRENT]; 2259a4365d0SYoshinobu Inoue m_lfth = (struct sadb_lifetime *)mhp[SADB_EXT_LIFETIME_HARD]; 2269a4365d0SYoshinobu Inoue m_lfts = (struct sadb_lifetime *)mhp[SADB_EXT_LIFETIME_SOFT]; 2279a4365d0SYoshinobu Inoue m_saddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_SRC]; 2289a4365d0SYoshinobu Inoue m_daddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_DST]; 2299a4365d0SYoshinobu Inoue m_paddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_PROXY]; 2309a4365d0SYoshinobu Inoue m_auth = (struct sadb_key *)mhp[SADB_EXT_KEY_AUTH]; 2319a4365d0SYoshinobu Inoue m_enc = (struct sadb_key *)mhp[SADB_EXT_KEY_ENCRYPT]; 2329a4365d0SYoshinobu Inoue m_sid = (struct sadb_ident *)mhp[SADB_EXT_IDENTITY_SRC]; 2333c62e87aSJun-ichiro itojun Hagino m_did = (struct sadb_ident *)mhp[SADB_EXT_IDENTITY_DST]; 2349a4365d0SYoshinobu Inoue m_sens = (struct sadb_sens *)mhp[SADB_EXT_SENSITIVITY]; 235bf435626SFabien Thomas m_sa_replay = (struct sadb_x_sa_replay *)mhp[SADB_X_EXT_SA_REPLAY]; 236fcf59617SAndrey V. Elsukov natt_type = (struct sadb_x_nat_t_type *)mhp[SADB_X_EXT_NAT_T_TYPE]; 237fcf59617SAndrey V. Elsukov natt_sport = (struct sadb_x_nat_t_port *)mhp[SADB_X_EXT_NAT_T_SPORT]; 238fcf59617SAndrey V. Elsukov natt_dport = (struct sadb_x_nat_t_port *)mhp[SADB_X_EXT_NAT_T_DPORT]; 239fcf59617SAndrey V. Elsukov natt_oai = (struct sadb_address *)mhp[SADB_X_EXT_NAT_T_OAI]; 240fcf59617SAndrey V. Elsukov natt_oar = (struct sadb_address *)mhp[SADB_X_EXT_NAT_T_OAR]; 241fcf59617SAndrey V. Elsukov 2429a4365d0SYoshinobu Inoue 2439a4365d0SYoshinobu Inoue /* source address */ 2449a4365d0SYoshinobu Inoue if (m_saddr == NULL) { 2459a4365d0SYoshinobu Inoue printf("no ADDRESS_SRC extension.\n"); 2469a4365d0SYoshinobu Inoue return; 2479a4365d0SYoshinobu Inoue } 2483c62e87aSJun-ichiro itojun Hagino printf("%s", str_ipaddr((struct sockaddr *)(m_saddr + 1))); 249fcf59617SAndrey V. Elsukov if (natt_type != NULL && natt_sport != NULL) 250fcf59617SAndrey V. Elsukov printf("[%u]", ntohs(natt_sport->sadb_x_nat_t_port_port)); 2519a4365d0SYoshinobu Inoue 2529a4365d0SYoshinobu Inoue /* destination address */ 2539a4365d0SYoshinobu Inoue if (m_daddr == NULL) { 254fcf59617SAndrey V. Elsukov printf("\nno ADDRESS_DST extension.\n"); 2559a4365d0SYoshinobu Inoue return; 2569a4365d0SYoshinobu Inoue } 2573c62e87aSJun-ichiro itojun Hagino printf(" %s", str_ipaddr((struct sockaddr *)(m_daddr + 1))); 258fcf59617SAndrey V. Elsukov if (natt_type != NULL && natt_dport != NULL) 259fcf59617SAndrey V. Elsukov printf("[%u]", ntohs(natt_dport->sadb_x_nat_t_port_port)); 2609a4365d0SYoshinobu Inoue 2619a4365d0SYoshinobu Inoue /* SA type */ 2629a4365d0SYoshinobu Inoue if (m_sa == NULL) { 263fcf59617SAndrey V. Elsukov printf("\nno SA extension.\n"); 2649a4365d0SYoshinobu Inoue return; 2659a4365d0SYoshinobu Inoue } 2663c62e87aSJun-ichiro itojun Hagino if (m_sa2 == NULL) { 267fcf59617SAndrey V. Elsukov printf("\nno SA2 extension.\n"); 2683c62e87aSJun-ichiro itojun Hagino return; 2693c62e87aSJun-ichiro itojun Hagino } 2709a4365d0SYoshinobu Inoue printf("\n\t"); 2719a4365d0SYoshinobu Inoue 272fcf59617SAndrey V. Elsukov if (m->sadb_msg_satype == SADB_SATYPE_ESP && natt_type != NULL) 273fcf59617SAndrey V. Elsukov printf("esp-udp "); 274fcf59617SAndrey V. Elsukov else 27533841545SHajimu UMEMOTO GETMSGSTR(str_satype, m->sadb_msg_satype); 2769a4365d0SYoshinobu Inoue 2779a4365d0SYoshinobu Inoue printf("mode="); 27833841545SHajimu UMEMOTO GETMSGSTR(str_mode, m_sa2->sadb_x_sa2_mode); 2799a4365d0SYoshinobu Inoue 2803c62e87aSJun-ichiro itojun Hagino printf("spi=%u(0x%08x) reqid=%u(0x%08x)\n", 2819a4365d0SYoshinobu Inoue (u_int32_t)ntohl(m_sa->sadb_sa_spi), 2829a4365d0SYoshinobu Inoue (u_int32_t)ntohl(m_sa->sadb_sa_spi), 2833c62e87aSJun-ichiro itojun Hagino (u_int32_t)m_sa2->sadb_x_sa2_reqid, 2843c62e87aSJun-ichiro itojun Hagino (u_int32_t)m_sa2->sadb_x_sa2_reqid); 2859a4365d0SYoshinobu Inoue 286fcf59617SAndrey V. Elsukov /* other NAT-T information */ 287fcf59617SAndrey V. Elsukov if (natt_type != NULL && (natt_oai != NULL || natt_oar != NULL)) { 288fcf59617SAndrey V. Elsukov printf("\tNAT:"); 289fcf59617SAndrey V. Elsukov if (natt_oai != NULL) 290fcf59617SAndrey V. Elsukov printf(" OAI=%s", 291fcf59617SAndrey V. Elsukov str_ipaddr((struct sockaddr *)(natt_oai + 1))); 292fcf59617SAndrey V. Elsukov if (natt_oar != NULL) 293fcf59617SAndrey V. Elsukov printf(" OAR=%s", 294fcf59617SAndrey V. Elsukov str_ipaddr((struct sockaddr *)(natt_oar + 1))); 295fcf59617SAndrey V. Elsukov printf("\n"); 296fcf59617SAndrey V. Elsukov } 297fcf59617SAndrey V. Elsukov 2989a4365d0SYoshinobu Inoue /* encryption key */ 2999a4365d0SYoshinobu Inoue if (m->sadb_msg_satype == SADB_X_SATYPE_IPCOMP) { 3009a4365d0SYoshinobu Inoue printf("\tC: "); 30133841545SHajimu UMEMOTO GETMSGV2S(str_alg_comp, m_sa->sadb_sa_encrypt); 3029a4365d0SYoshinobu Inoue } else if (m->sadb_msg_satype == SADB_SATYPE_ESP) { 3039a4365d0SYoshinobu Inoue if (m_enc != NULL) { 3049a4365d0SYoshinobu Inoue printf("\tE: "); 30533841545SHajimu UMEMOTO GETMSGV2S(str_alg_enc, m_sa->sadb_sa_encrypt); 3069a4365d0SYoshinobu Inoue ipsec_hexdump((caddr_t)m_enc + sizeof(*m_enc), 3079a4365d0SYoshinobu Inoue m_enc->sadb_key_bits / 8); 3089a4365d0SYoshinobu Inoue printf("\n"); 3099a4365d0SYoshinobu Inoue } 3109a4365d0SYoshinobu Inoue } 3119a4365d0SYoshinobu Inoue 3129a4365d0SYoshinobu Inoue /* authentication key */ 3139a4365d0SYoshinobu Inoue if (m_auth != NULL) { 3149a4365d0SYoshinobu Inoue printf("\tA: "); 31533841545SHajimu UMEMOTO GETMSGV2S(str_alg_auth, m_sa->sadb_sa_auth); 3169a4365d0SYoshinobu Inoue ipsec_hexdump((caddr_t)m_auth + sizeof(*m_auth), 3179a4365d0SYoshinobu Inoue m_auth->sadb_key_bits / 8); 3189a4365d0SYoshinobu Inoue printf("\n"); 3199a4365d0SYoshinobu Inoue } 3209a4365d0SYoshinobu Inoue 3213c62e87aSJun-ichiro itojun Hagino /* replay windoe size & flags */ 322232bdaf6SHajimu UMEMOTO printf("\tseq=0x%08x replay=%u flags=0x%08x ", 323232bdaf6SHajimu UMEMOTO m_sa2->sadb_x_sa2_sequence, 324bf435626SFabien Thomas m_sa_replay ? (m_sa_replay->sadb_x_sa_replay_replay >> 3) : 3253c62e87aSJun-ichiro itojun Hagino m_sa->sadb_sa_replay, 3263c62e87aSJun-ichiro itojun Hagino m_sa->sadb_sa_flags); 3273c62e87aSJun-ichiro itojun Hagino 3289a4365d0SYoshinobu Inoue /* state */ 3293c62e87aSJun-ichiro itojun Hagino printf("state="); 33033841545SHajimu UMEMOTO GETMSGSTR(str_state, m_sa->sadb_sa_state); 331232bdaf6SHajimu UMEMOTO printf("\n"); 3329a4365d0SYoshinobu Inoue 3339a4365d0SYoshinobu Inoue /* lifetime */ 3349a4365d0SYoshinobu Inoue if (m_lftc != NULL) { 3359a4365d0SYoshinobu Inoue time_t tmp_time = time(0); 3369a4365d0SYoshinobu Inoue 3379a4365d0SYoshinobu Inoue printf("\tcreated: %s", 3383c62e87aSJun-ichiro itojun Hagino str_time(m_lftc->sadb_lifetime_addtime)); 3393c62e87aSJun-ichiro itojun Hagino printf("\tcurrent: %s\n", str_time(tmp_time)); 3409a4365d0SYoshinobu Inoue printf("\tdiff: %lu(s)", 3419a4365d0SYoshinobu Inoue (u_long)(m_lftc->sadb_lifetime_addtime == 0 ? 3429a4365d0SYoshinobu Inoue 0 : (tmp_time - m_lftc->sadb_lifetime_addtime))); 3439a4365d0SYoshinobu Inoue 3449a4365d0SYoshinobu Inoue printf("\thard: %lu(s)", 3459a4365d0SYoshinobu Inoue (u_long)(m_lfth == NULL ? 3469a4365d0SYoshinobu Inoue 0 : m_lfth->sadb_lifetime_addtime)); 3479a4365d0SYoshinobu Inoue printf("\tsoft: %lu(s)\n", 3489a4365d0SYoshinobu Inoue (u_long)(m_lfts == NULL ? 3499a4365d0SYoshinobu Inoue 0 : m_lfts->sadb_lifetime_addtime)); 3509a4365d0SYoshinobu Inoue 3519a4365d0SYoshinobu Inoue printf("\tlast: %s", 3523c62e87aSJun-ichiro itojun Hagino str_time(m_lftc->sadb_lifetime_usetime)); 3539a4365d0SYoshinobu Inoue printf("\thard: %lu(s)", 3549a4365d0SYoshinobu Inoue (u_long)(m_lfth == NULL ? 3559a4365d0SYoshinobu Inoue 0 : m_lfth->sadb_lifetime_usetime)); 3569a4365d0SYoshinobu Inoue printf("\tsoft: %lu(s)\n", 3579a4365d0SYoshinobu Inoue (u_long)(m_lfts == NULL ? 3589a4365d0SYoshinobu Inoue 0 : m_lfts->sadb_lifetime_usetime)); 3599a4365d0SYoshinobu Inoue 3603c62e87aSJun-ichiro itojun Hagino str_lifetime_byte(m_lftc, "current"); 3613c62e87aSJun-ichiro itojun Hagino str_lifetime_byte(m_lfth, "hard"); 3623c62e87aSJun-ichiro itojun Hagino str_lifetime_byte(m_lfts, "soft"); 3639a4365d0SYoshinobu Inoue printf("\n"); 3649a4365d0SYoshinobu Inoue 3659a4365d0SYoshinobu Inoue printf("\tallocated: %lu", 3669a4365d0SYoshinobu Inoue (unsigned long)m_lftc->sadb_lifetime_allocations); 3679a4365d0SYoshinobu Inoue printf("\thard: %lu", 3689a4365d0SYoshinobu Inoue (u_long)(m_lfth == NULL ? 3699a4365d0SYoshinobu Inoue 0 : m_lfth->sadb_lifetime_allocations)); 3709a4365d0SYoshinobu Inoue printf("\tsoft: %lu\n", 3719a4365d0SYoshinobu Inoue (u_long)(m_lfts == NULL ? 3729a4365d0SYoshinobu Inoue 0 : m_lfts->sadb_lifetime_allocations)); 3739a4365d0SYoshinobu Inoue } 3749a4365d0SYoshinobu Inoue 375232bdaf6SHajimu UMEMOTO printf("\tsadb_seq=%lu pid=%lu ", 376232bdaf6SHajimu UMEMOTO (u_long)m->sadb_msg_seq, 377232bdaf6SHajimu UMEMOTO (u_long)m->sadb_msg_pid); 378232bdaf6SHajimu UMEMOTO 3799a4365d0SYoshinobu Inoue /* XXX DEBUG */ 380232bdaf6SHajimu UMEMOTO printf("refcnt=%u\n", m->sadb_msg_reserved); 3819a4365d0SYoshinobu Inoue 3829a4365d0SYoshinobu Inoue return; 3839a4365d0SYoshinobu Inoue } 3849a4365d0SYoshinobu Inoue 3859a4365d0SYoshinobu Inoue void 38622986c67SAndrey V. Elsukov pfkey_spdump(struct sadb_msg *m) 3879a4365d0SYoshinobu Inoue { 3883c62e87aSJun-ichiro itojun Hagino char pbuf[NI_MAXSERV]; 3899a4365d0SYoshinobu Inoue caddr_t mhp[SADB_EXT_MAX + 1]; 3909a4365d0SYoshinobu Inoue struct sadb_address *m_saddr, *m_daddr; 3919a4365d0SYoshinobu Inoue struct sadb_x_policy *m_xpl; 392bd9f52d5SHajimu UMEMOTO struct sadb_lifetime *m_lftc = NULL, *m_lfth = NULL; 3933c62e87aSJun-ichiro itojun Hagino struct sockaddr *sa; 394bd9f52d5SHajimu UMEMOTO u_int16_t sport = 0, dport = 0; 3959a4365d0SYoshinobu Inoue 3969a4365d0SYoshinobu Inoue /* check pfkey message. */ 3979a4365d0SYoshinobu Inoue if (pfkey_align(m, mhp)) { 3989a4365d0SYoshinobu Inoue printf("%s\n", ipsec_strerror()); 3999a4365d0SYoshinobu Inoue return; 4009a4365d0SYoshinobu Inoue } 4019a4365d0SYoshinobu Inoue if (pfkey_check(mhp)) { 4029a4365d0SYoshinobu Inoue printf("%s\n", ipsec_strerror()); 4039a4365d0SYoshinobu Inoue return; 4049a4365d0SYoshinobu Inoue } 4059a4365d0SYoshinobu Inoue 4069a4365d0SYoshinobu Inoue m_saddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_SRC]; 4079a4365d0SYoshinobu Inoue m_daddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_DST]; 4089a4365d0SYoshinobu Inoue m_xpl = (struct sadb_x_policy *)mhp[SADB_X_EXT_POLICY]; 409bd9f52d5SHajimu UMEMOTO m_lftc = (struct sadb_lifetime *)mhp[SADB_EXT_LIFETIME_CURRENT]; 410bd9f52d5SHajimu UMEMOTO m_lfth = (struct sadb_lifetime *)mhp[SADB_EXT_LIFETIME_HARD]; 4119a4365d0SYoshinobu Inoue 412bd9f52d5SHajimu UMEMOTO if (m_saddr && m_daddr) { 4139a4365d0SYoshinobu Inoue /* source address */ 4143c62e87aSJun-ichiro itojun Hagino sa = (struct sockaddr *)(m_saddr + 1); 4153c62e87aSJun-ichiro itojun Hagino switch (sa->sa_family) { 4163c62e87aSJun-ichiro itojun Hagino case AF_INET: 4173c62e87aSJun-ichiro itojun Hagino case AF_INET6: 418bd9f52d5SHajimu UMEMOTO if (getnameinfo(sa, sa->sa_len, NULL, 0, 419bd9f52d5SHajimu UMEMOTO pbuf, sizeof(pbuf), NI_NUMERICSERV) != 0) 420bd9f52d5SHajimu UMEMOTO sport = 0; /*XXX*/ 4213c62e87aSJun-ichiro itojun Hagino else 422bd9f52d5SHajimu UMEMOTO sport = atoi(pbuf); 4233c62e87aSJun-ichiro itojun Hagino printf("%s%s ", str_ipaddr(sa), 4243c62e87aSJun-ichiro itojun Hagino str_prefport(sa->sa_family, 425bd9f52d5SHajimu UMEMOTO m_saddr->sadb_address_prefixlen, sport, 426bd9f52d5SHajimu UMEMOTO m_saddr->sadb_address_proto)); 4273c62e87aSJun-ichiro itojun Hagino break; 4283c62e87aSJun-ichiro itojun Hagino default: 4293c62e87aSJun-ichiro itojun Hagino printf("unknown-af "); 4303c62e87aSJun-ichiro itojun Hagino break; 4313c62e87aSJun-ichiro itojun Hagino } 4329a4365d0SYoshinobu Inoue 4339a4365d0SYoshinobu Inoue /* destination address */ 4343c62e87aSJun-ichiro itojun Hagino sa = (struct sockaddr *)(m_daddr + 1); 4353c62e87aSJun-ichiro itojun Hagino switch (sa->sa_family) { 4363c62e87aSJun-ichiro itojun Hagino case AF_INET: 4373c62e87aSJun-ichiro itojun Hagino case AF_INET6: 438bd9f52d5SHajimu UMEMOTO if (getnameinfo(sa, sa->sa_len, NULL, 0, 439bd9f52d5SHajimu UMEMOTO pbuf, sizeof(pbuf), NI_NUMERICSERV) != 0) 440bd9f52d5SHajimu UMEMOTO dport = 0; /*XXX*/ 4413c62e87aSJun-ichiro itojun Hagino else 442bd9f52d5SHajimu UMEMOTO dport = atoi(pbuf); 4433c62e87aSJun-ichiro itojun Hagino printf("%s%s ", str_ipaddr(sa), 4443c62e87aSJun-ichiro itojun Hagino str_prefport(sa->sa_family, 445bd9f52d5SHajimu UMEMOTO m_daddr->sadb_address_prefixlen, dport, 446bd9f52d5SHajimu UMEMOTO m_saddr->sadb_address_proto)); 4473c62e87aSJun-ichiro itojun Hagino break; 4483c62e87aSJun-ichiro itojun Hagino default: 4493c62e87aSJun-ichiro itojun Hagino printf("unknown-af "); 4503c62e87aSJun-ichiro itojun Hagino break; 4513c62e87aSJun-ichiro itojun Hagino } 4529a4365d0SYoshinobu Inoue 4539a4365d0SYoshinobu Inoue /* upper layer protocol */ 454bd9f52d5SHajimu UMEMOTO if (m_saddr->sadb_address_proto != 455bd9f52d5SHajimu UMEMOTO m_daddr->sadb_address_proto) { 4569a4365d0SYoshinobu Inoue printf("upper layer protocol mismatched.\n"); 4579a4365d0SYoshinobu Inoue return; 4589a4365d0SYoshinobu Inoue } 459bd9f52d5SHajimu UMEMOTO str_upperspec(m_saddr->sadb_address_proto, sport, dport); 460bd9f52d5SHajimu UMEMOTO } 4619a4365d0SYoshinobu Inoue else 462bd9f52d5SHajimu UMEMOTO printf("(no selector, probably per-socket policy) "); 4639a4365d0SYoshinobu Inoue 4649a4365d0SYoshinobu Inoue /* policy */ 4659a4365d0SYoshinobu Inoue { 4669a4365d0SYoshinobu Inoue char *d_xpl; 4679a4365d0SYoshinobu Inoue 4689a4365d0SYoshinobu Inoue if (m_xpl == NULL) { 4699a4365d0SYoshinobu Inoue printf("no X_POLICY extension.\n"); 4709a4365d0SYoshinobu Inoue return; 4719a4365d0SYoshinobu Inoue } 4729a4365d0SYoshinobu Inoue d_xpl = ipsec_dump_policy((char *)m_xpl, "\n\t"); 4739a4365d0SYoshinobu Inoue 4749a4365d0SYoshinobu Inoue /* dump SPD */ 4759a4365d0SYoshinobu Inoue printf("\n\t%s\n", d_xpl); 4769a4365d0SYoshinobu Inoue free(d_xpl); 4779a4365d0SYoshinobu Inoue } 4789a4365d0SYoshinobu Inoue 47933841545SHajimu UMEMOTO /* lifetime */ 480bd9f52d5SHajimu UMEMOTO if (m_lftc) { 481bd9f52d5SHajimu UMEMOTO printf("\tcreated: %s ", 482bd9f52d5SHajimu UMEMOTO str_time(m_lftc->sadb_lifetime_addtime)); 483bd9f52d5SHajimu UMEMOTO printf("lastused: %s\n", 484bd9f52d5SHajimu UMEMOTO str_time(m_lftc->sadb_lifetime_usetime)); 48533841545SHajimu UMEMOTO } 486bd9f52d5SHajimu UMEMOTO if (m_lfth) { 487bd9f52d5SHajimu UMEMOTO printf("\tlifetime: %lu(s) ", 488bd9f52d5SHajimu UMEMOTO (u_long)m_lfth->sadb_lifetime_addtime); 489bd9f52d5SHajimu UMEMOTO printf("validtime: %lu(s)\n", 490bd9f52d5SHajimu UMEMOTO (u_long)m_lfth->sadb_lifetime_usetime); 491bd9f52d5SHajimu UMEMOTO } 492bd9f52d5SHajimu UMEMOTO 49333841545SHajimu UMEMOTO 49422986c67SAndrey V. Elsukov printf("\tspid=%ld seq=%ld pid=%ld scope=", 4953c62e87aSJun-ichiro itojun Hagino (u_long)m_xpl->sadb_x_policy_id, 4969a4365d0SYoshinobu Inoue (u_long)m->sadb_msg_seq, 4979a4365d0SYoshinobu Inoue (u_long)m->sadb_msg_pid); 49822986c67SAndrey V. Elsukov GETMSGV2S(str_sp_scope, m_xpl->sadb_x_policy_scope); 49922986c67SAndrey V. Elsukov if (m_xpl->sadb_x_policy_scope == IPSEC_POLICYSCOPE_IFNET && 50022986c67SAndrey V. Elsukov if_indextoname(m_xpl->sadb_x_policy_ifindex, pbuf) != NULL) 50122986c67SAndrey V. Elsukov printf("ifname=%s", pbuf); 50222986c67SAndrey V. Elsukov printf("\n"); 5039a4365d0SYoshinobu Inoue 5049a4365d0SYoshinobu Inoue /* XXX TEST */ 5053c62e87aSJun-ichiro itojun Hagino printf("\trefcnt=%u\n", m->sadb_msg_reserved); 5069a4365d0SYoshinobu Inoue 5079a4365d0SYoshinobu Inoue return; 5089a4365d0SYoshinobu Inoue } 5099a4365d0SYoshinobu Inoue 5109a4365d0SYoshinobu Inoue /* 5119a4365d0SYoshinobu Inoue * set "ipaddress" to buffer. 5129a4365d0SYoshinobu Inoue */ 5139a4365d0SYoshinobu Inoue static char * 5143c62e87aSJun-ichiro itojun Hagino str_ipaddr(sa) 5153c62e87aSJun-ichiro itojun Hagino struct sockaddr *sa; 5169a4365d0SYoshinobu Inoue { 5173c62e87aSJun-ichiro itojun Hagino static char buf[NI_MAXHOST]; 5183c62e87aSJun-ichiro itojun Hagino const int niflag = NI_NUMERICHOST; 5199a4365d0SYoshinobu Inoue 5203c62e87aSJun-ichiro itojun Hagino if (sa == NULL) 5219a4365d0SYoshinobu Inoue return ""; 5229a4365d0SYoshinobu Inoue 5233c62e87aSJun-ichiro itojun Hagino if (getnameinfo(sa, sa->sa_len, buf, sizeof(buf), NULL, 0, niflag) == 0) 5249a4365d0SYoshinobu Inoue return buf; 5253c62e87aSJun-ichiro itojun Hagino return NULL; 5269a4365d0SYoshinobu Inoue } 5279a4365d0SYoshinobu Inoue 5289a4365d0SYoshinobu Inoue /* 5299a4365d0SYoshinobu Inoue * set "/prefix[port number]" to buffer. 5309a4365d0SYoshinobu Inoue */ 5319a4365d0SYoshinobu Inoue static char * 532bd9f52d5SHajimu UMEMOTO str_prefport(family, pref, port, ulp) 533bd9f52d5SHajimu UMEMOTO u_int family, pref, port, ulp; 5349a4365d0SYoshinobu Inoue { 5359a4365d0SYoshinobu Inoue static char buf[128]; 536296e054fSMunechika SUMIKAWA char prefbuf[128]; 537296e054fSMunechika SUMIKAWA char portbuf[128]; 5383c62e87aSJun-ichiro itojun Hagino int plen; 5399a4365d0SYoshinobu Inoue 5403c62e87aSJun-ichiro itojun Hagino switch (family) { 5413c62e87aSJun-ichiro itojun Hagino case AF_INET: 5423c62e87aSJun-ichiro itojun Hagino plen = sizeof(struct in_addr) << 3; 5433c62e87aSJun-ichiro itojun Hagino break; 5443c62e87aSJun-ichiro itojun Hagino case AF_INET6: 5453c62e87aSJun-ichiro itojun Hagino plen = sizeof(struct in6_addr) << 3; 5463c62e87aSJun-ichiro itojun Hagino break; 5473c62e87aSJun-ichiro itojun Hagino default: 5483c62e87aSJun-ichiro itojun Hagino return "?"; 5493c62e87aSJun-ichiro itojun Hagino } 5503c62e87aSJun-ichiro itojun Hagino 5513c62e87aSJun-ichiro itojun Hagino if (pref == plen) 5529a4365d0SYoshinobu Inoue prefbuf[0] = '\0'; 5539a4365d0SYoshinobu Inoue else 5549a4365d0SYoshinobu Inoue snprintf(prefbuf, sizeof(prefbuf), "/%u", pref); 5559a4365d0SYoshinobu Inoue 556bd9f52d5SHajimu UMEMOTO if (ulp == IPPROTO_ICMPV6) 557bd9f52d5SHajimu UMEMOTO memset(portbuf, 0, sizeof(portbuf)); 558bd9f52d5SHajimu UMEMOTO else { 5599a4365d0SYoshinobu Inoue if (port == IPSEC_PORT_ANY) 5609a4365d0SYoshinobu Inoue snprintf(portbuf, sizeof(portbuf), "[%s]", "any"); 5619a4365d0SYoshinobu Inoue else 5623c62e87aSJun-ichiro itojun Hagino snprintf(portbuf, sizeof(portbuf), "[%u]", port); 563bd9f52d5SHajimu UMEMOTO } 5649a4365d0SYoshinobu Inoue 5659a4365d0SYoshinobu Inoue snprintf(buf, sizeof(buf), "%s%s", prefbuf, portbuf); 5669a4365d0SYoshinobu Inoue 5679a4365d0SYoshinobu Inoue return buf; 5689a4365d0SYoshinobu Inoue } 5699a4365d0SYoshinobu Inoue 570bd9f52d5SHajimu UMEMOTO static void 571bd9f52d5SHajimu UMEMOTO str_upperspec(ulp, p1, p2) 572bd9f52d5SHajimu UMEMOTO u_int ulp, p1, p2; 573bd9f52d5SHajimu UMEMOTO { 574bd9f52d5SHajimu UMEMOTO if (ulp == IPSEC_ULPROTO_ANY) 575bd9f52d5SHajimu UMEMOTO printf("any"); 576bd9f52d5SHajimu UMEMOTO else if (ulp == IPPROTO_ICMPV6) { 577bd9f52d5SHajimu UMEMOTO printf("icmp6"); 578bd9f52d5SHajimu UMEMOTO if (!(p1 == IPSEC_PORT_ANY && p2 == IPSEC_PORT_ANY)) 579bd9f52d5SHajimu UMEMOTO printf(" %u,%u", p1, p2); 580bd9f52d5SHajimu UMEMOTO } else { 581bd9f52d5SHajimu UMEMOTO struct protoent *ent; 582bd9f52d5SHajimu UMEMOTO 583bd9f52d5SHajimu UMEMOTO switch (ulp) { 584bd9f52d5SHajimu UMEMOTO case IPPROTO_IPV4: 585bd9f52d5SHajimu UMEMOTO printf("ip4"); 586bd9f52d5SHajimu UMEMOTO break; 587bd9f52d5SHajimu UMEMOTO default: 588bd9f52d5SHajimu UMEMOTO ent = getprotobynumber(ulp); 589bd9f52d5SHajimu UMEMOTO if (ent) 590bd9f52d5SHajimu UMEMOTO printf("%s", ent->p_name); 591bd9f52d5SHajimu UMEMOTO else 592bd9f52d5SHajimu UMEMOTO printf("%u", ulp); 593bd9f52d5SHajimu UMEMOTO 594bd9f52d5SHajimu UMEMOTO endprotoent(); 595bd9f52d5SHajimu UMEMOTO break; 596bd9f52d5SHajimu UMEMOTO } 597bd9f52d5SHajimu UMEMOTO } 598bd9f52d5SHajimu UMEMOTO } 599bd9f52d5SHajimu UMEMOTO 6009a4365d0SYoshinobu Inoue /* 6019a4365d0SYoshinobu Inoue * set "Mon Day Time Year" to buffer 6029a4365d0SYoshinobu Inoue */ 6039a4365d0SYoshinobu Inoue static char * 6043c62e87aSJun-ichiro itojun Hagino str_time(t) 6059a4365d0SYoshinobu Inoue time_t t; 6069a4365d0SYoshinobu Inoue { 6079a4365d0SYoshinobu Inoue static char buf[128]; 6089a4365d0SYoshinobu Inoue 6099a4365d0SYoshinobu Inoue if (t == 0) { 6109a4365d0SYoshinobu Inoue int i = 0; 6119a4365d0SYoshinobu Inoue for (;i < 20;) buf[i++] = ' '; 6129a4365d0SYoshinobu Inoue } else { 6139a4365d0SYoshinobu Inoue char *t0; 6149a4365d0SYoshinobu Inoue t0 = ctime(&t); 6159a4365d0SYoshinobu Inoue memcpy(buf, t0 + 4, 20); 6169a4365d0SYoshinobu Inoue } 6179a4365d0SYoshinobu Inoue 6189a4365d0SYoshinobu Inoue buf[20] = '\0'; 6199a4365d0SYoshinobu Inoue 6209a4365d0SYoshinobu Inoue return(buf); 6219a4365d0SYoshinobu Inoue } 6229a4365d0SYoshinobu Inoue 6239a4365d0SYoshinobu Inoue static void 6243c62e87aSJun-ichiro itojun Hagino str_lifetime_byte(x, str) 6259a4365d0SYoshinobu Inoue struct sadb_lifetime *x; 6269a4365d0SYoshinobu Inoue char *str; 6279a4365d0SYoshinobu Inoue { 6289a4365d0SYoshinobu Inoue double y; 6299a4365d0SYoshinobu Inoue char *unit; 6309a4365d0SYoshinobu Inoue int w; 6319a4365d0SYoshinobu Inoue 6329a4365d0SYoshinobu Inoue if (x == NULL) { 6339a4365d0SYoshinobu Inoue printf("\t%s: 0(bytes)", str); 6349a4365d0SYoshinobu Inoue return; 6359a4365d0SYoshinobu Inoue } 6369a4365d0SYoshinobu Inoue 6373c62e87aSJun-ichiro itojun Hagino #if 0 6383c62e87aSJun-ichiro itojun Hagino if ((x->sadb_lifetime_bytes) / 1024 / 1024) { 6393c62e87aSJun-ichiro itojun Hagino y = (x->sadb_lifetime_bytes) * 1.0 / 1024 / 1024; 6403c62e87aSJun-ichiro itojun Hagino unit = "M"; 6413c62e87aSJun-ichiro itojun Hagino w = 1; 6423c62e87aSJun-ichiro itojun Hagino } else if ((x->sadb_lifetime_bytes) / 1024) { 6433c62e87aSJun-ichiro itojun Hagino y = (x->sadb_lifetime_bytes) * 1.0 / 1024; 6443c62e87aSJun-ichiro itojun Hagino unit = "K"; 6453c62e87aSJun-ichiro itojun Hagino w = 1; 6463c62e87aSJun-ichiro itojun Hagino } else { 6479a4365d0SYoshinobu Inoue y = (x->sadb_lifetime_bytes) * 1.0; 6489a4365d0SYoshinobu Inoue unit = ""; 6499a4365d0SYoshinobu Inoue w = 0; 6503c62e87aSJun-ichiro itojun Hagino } 6513c62e87aSJun-ichiro itojun Hagino #else 6523c62e87aSJun-ichiro itojun Hagino y = (x->sadb_lifetime_bytes) * 1.0; 6533c62e87aSJun-ichiro itojun Hagino unit = ""; 6543c62e87aSJun-ichiro itojun Hagino w = 0; 6553c62e87aSJun-ichiro itojun Hagino #endif 6569a4365d0SYoshinobu Inoue printf("\t%s: %.*f(%sbytes)", str, w, y, unit); 6579a4365d0SYoshinobu Inoue } 658