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