17c478bd9Sstevel@tonic-gate /* 27c478bd9Sstevel@tonic-gate * CDDL HEADER START 37c478bd9Sstevel@tonic-gate * 47c478bd9Sstevel@tonic-gate * The contents of this file are subject to the terms of the 577c67f2fSkcpoon * Common Development and Distribution License (the "License"). 677c67f2fSkcpoon * You may not use this file except in compliance with the License. 77c478bd9Sstevel@tonic-gate * 87c478bd9Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 97c478bd9Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing. 107c478bd9Sstevel@tonic-gate * See the License for the specific language governing permissions 117c478bd9Sstevel@tonic-gate * and limitations under the License. 127c478bd9Sstevel@tonic-gate * 137c478bd9Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each 147c478bd9Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 157c478bd9Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the 167c478bd9Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying 177c478bd9Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner] 187c478bd9Sstevel@tonic-gate * 197c478bd9Sstevel@tonic-gate * CDDL HEADER END 207c478bd9Sstevel@tonic-gate */ 2177c67f2fSkcpoon 227c478bd9Sstevel@tonic-gate /* 23fd7b5aedSGeorge Shepherd * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved. 247c478bd9Sstevel@tonic-gate */ 257c478bd9Sstevel@tonic-gate 267c478bd9Sstevel@tonic-gate #include <sys/types.h> 277c478bd9Sstevel@tonic-gate #include <sys/stream.h> 287c478bd9Sstevel@tonic-gate #include <sys/mdb_modapi.h> 297c478bd9Sstevel@tonic-gate #include <sys/socket.h> 307c478bd9Sstevel@tonic-gate #include <sys/list.h> 317c478bd9Sstevel@tonic-gate #include <sys/strsun.h> 327c478bd9Sstevel@tonic-gate 337c478bd9Sstevel@tonic-gate #include <mdb/mdb_stdlib.h> 347c478bd9Sstevel@tonic-gate 357c478bd9Sstevel@tonic-gate #include <netinet/in.h> 367c478bd9Sstevel@tonic-gate #include <netinet/ip6.h> 377c478bd9Sstevel@tonic-gate #include <netinet/sctp.h> 387c478bd9Sstevel@tonic-gate 397c478bd9Sstevel@tonic-gate #include <inet/common.h> 407c478bd9Sstevel@tonic-gate #include <inet/ip.h> 417c478bd9Sstevel@tonic-gate #include <inet/ip6.h> 427c478bd9Sstevel@tonic-gate #include <inet/ipclassifier.h> 437c478bd9Sstevel@tonic-gate 447c478bd9Sstevel@tonic-gate #include <sctp/sctp_impl.h> 457c478bd9Sstevel@tonic-gate #include <sctp/sctp_addr.h> 467c478bd9Sstevel@tonic-gate 477c478bd9Sstevel@tonic-gate #define MDB_SCTP_SHOW_FLAGS 0x1 487c478bd9Sstevel@tonic-gate #define MDB_SCTP_DUMP_ADDRS 0x2 497c478bd9Sstevel@tonic-gate #define MDB_SCTP_SHOW_HASH 0x4 507c478bd9Sstevel@tonic-gate #define MDB_SCTP_SHOW_OUT 0x8 517c478bd9Sstevel@tonic-gate #define MDB_SCTP_SHOW_IN 0x10 527c478bd9Sstevel@tonic-gate #define MDB_SCTP_SHOW_MISC 0x20 537c478bd9Sstevel@tonic-gate #define MDB_SCTP_SHOW_RTT 0x40 547c478bd9Sstevel@tonic-gate #define MDB_SCTP_SHOW_STATS 0x80 557c478bd9Sstevel@tonic-gate #define MDB_SCTP_SHOW_FLOW 0x100 567c478bd9Sstevel@tonic-gate #define MDB_SCTP_SHOW_HDR 0x200 577c478bd9Sstevel@tonic-gate #define MDB_SCTP_SHOW_PMTUD 0x400 587c478bd9Sstevel@tonic-gate #define MDB_SCTP_SHOW_RXT 0x800 597c478bd9Sstevel@tonic-gate #define MDB_SCTP_SHOW_CONN 0x1000 607c478bd9Sstevel@tonic-gate #define MDB_SCTP_SHOW_CLOSE 0x2000 617c478bd9Sstevel@tonic-gate #define MDB_SCTP_SHOW_EXT 0x4000 627c478bd9Sstevel@tonic-gate 637c478bd9Sstevel@tonic-gate #define MDB_SCTP_SHOW_ALL 0xffffffff 647c478bd9Sstevel@tonic-gate 657c478bd9Sstevel@tonic-gate /* 667c478bd9Sstevel@tonic-gate * Copy from usr/src/uts/common/os/list.c. Should we have a generic 677c478bd9Sstevel@tonic-gate * mdb list walker? 687c478bd9Sstevel@tonic-gate */ 697c478bd9Sstevel@tonic-gate #define list_object(a, node) ((void *)(((char *)node) - (a)->list_offset)) 707c478bd9Sstevel@tonic-gate 71f4b3ec61Sdh155122 static int 72f4b3ec61Sdh155122 ns_to_stackid(uintptr_t kaddr) 73f4b3ec61Sdh155122 { 74f4b3ec61Sdh155122 netstack_t nss; 75f4b3ec61Sdh155122 76f4b3ec61Sdh155122 if (mdb_vread(&nss, sizeof (nss), kaddr) == -1) { 77f4b3ec61Sdh155122 mdb_warn("failed to read netdstack info %p", kaddr); 78f4b3ec61Sdh155122 return (0); 79f4b3ec61Sdh155122 } 80f4b3ec61Sdh155122 return (nss.netstack_stackid); 81f4b3ec61Sdh155122 } 82f4b3ec61Sdh155122 83f4b3ec61Sdh155122 int 84f4b3ec61Sdh155122 sctp_stacks_walk_init(mdb_walk_state_t *wsp) 85f4b3ec61Sdh155122 { 86f4b3ec61Sdh155122 if (mdb_layered_walk("netstack", wsp) == -1) { 87f4b3ec61Sdh155122 mdb_warn("can't walk 'netstack'"); 88f4b3ec61Sdh155122 return (WALK_ERR); 89f4b3ec61Sdh155122 } 90f4b3ec61Sdh155122 return (WALK_NEXT); 91f4b3ec61Sdh155122 } 92f4b3ec61Sdh155122 93f4b3ec61Sdh155122 int 94f4b3ec61Sdh155122 sctp_stacks_walk_step(mdb_walk_state_t *wsp) 95f4b3ec61Sdh155122 { 96f4b3ec61Sdh155122 uintptr_t kaddr; 97f4b3ec61Sdh155122 netstack_t nss; 98f4b3ec61Sdh155122 99f4b3ec61Sdh155122 if (mdb_vread(&nss, sizeof (nss), wsp->walk_addr) == -1) { 100f4b3ec61Sdh155122 mdb_warn("can't read netstack at %p", wsp->walk_addr); 101f4b3ec61Sdh155122 return (WALK_ERR); 102f4b3ec61Sdh155122 } 103f4b3ec61Sdh155122 kaddr = (uintptr_t)nss.netstack_modules[NS_SCTP]; 104f4b3ec61Sdh155122 return (wsp->walk_callback(kaddr, wsp->walk_layer, wsp->walk_cbdata)); 105f4b3ec61Sdh155122 } 106f4b3ec61Sdh155122 107f551bb10Svi117747 static char * 108f551bb10Svi117747 sctp_faddr_state(int state) 109f551bb10Svi117747 { 110f551bb10Svi117747 char *statestr; 111f551bb10Svi117747 112f551bb10Svi117747 switch (state) { 113f551bb10Svi117747 case SCTP_FADDRS_UNREACH: 114f551bb10Svi117747 statestr = "Unreachable"; 115f551bb10Svi117747 break; 116f551bb10Svi117747 case SCTP_FADDRS_DOWN: 117f551bb10Svi117747 statestr = "Down"; 118f551bb10Svi117747 break; 119f551bb10Svi117747 case SCTP_FADDRS_ALIVE: 120f551bb10Svi117747 statestr = "Alive"; 121f551bb10Svi117747 break; 122f551bb10Svi117747 case SCTP_FADDRS_UNCONFIRMED: 123f551bb10Svi117747 statestr = "Unconfirmed"; 124f551bb10Svi117747 break; 125f551bb10Svi117747 default: 126f551bb10Svi117747 statestr = "Unknown"; 127f551bb10Svi117747 break; 128f551bb10Svi117747 } 129f551bb10Svi117747 return (statestr); 130f551bb10Svi117747 } 131f551bb10Svi117747 1327c478bd9Sstevel@tonic-gate /* ARGSUSED */ 1337c478bd9Sstevel@tonic-gate static int 1347c478bd9Sstevel@tonic-gate sctp_faddr(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) 1357c478bd9Sstevel@tonic-gate { 1367c478bd9Sstevel@tonic-gate sctp_faddr_t fa[1]; 1377c478bd9Sstevel@tonic-gate char *statestr; 1387c478bd9Sstevel@tonic-gate 1397c478bd9Sstevel@tonic-gate if (!(flags & DCMD_ADDRSPEC)) 1407c478bd9Sstevel@tonic-gate return (DCMD_USAGE); 1417c478bd9Sstevel@tonic-gate 1427c478bd9Sstevel@tonic-gate if (mdb_vread(fa, sizeof (*fa), addr) == -1) { 1437c478bd9Sstevel@tonic-gate mdb_warn("cannot read fadder at %p", addr); 1447c478bd9Sstevel@tonic-gate return (DCMD_ERR); 1457c478bd9Sstevel@tonic-gate } 1467c478bd9Sstevel@tonic-gate 1476be61d4eSchandrasekar marimuthu - Sun Microsystems - Bangalore India statestr = sctp_faddr_state(fa->sf_state); 1486be61d4eSchandrasekar marimuthu - Sun Microsystems - Bangalore India mdb_printf("%<u>%p\t%<b>%N%</b>\t%s%</u>\n", addr, &fa->sf_faddr, 1497c478bd9Sstevel@tonic-gate statestr); 1506be61d4eSchandrasekar marimuthu - Sun Microsystems - Bangalore India mdb_printf("next\t\t%?p\tsaddr\t%N\n", fa->sf_next, &fa->sf_saddr); 1516be61d4eSchandrasekar marimuthu - Sun Microsystems - Bangalore India mdb_printf("rto\t\t%?d\tsrtt\t\t%?d\n", fa->sf_rto, fa->sf_srtt); 1526be61d4eSchandrasekar marimuthu - Sun Microsystems - Bangalore India mdb_printf("rttvar\t\t%?d\trtt_updates\t%?u\n", fa->sf_rttvar, 1536be61d4eSchandrasekar marimuthu - Sun Microsystems - Bangalore India fa->sf_rtt_updates); 1546be61d4eSchandrasekar marimuthu - Sun Microsystems - Bangalore India mdb_printf("strikes\t\t%?d\tmax_retr\t%?d\n", fa->sf_strikes, 1556be61d4eSchandrasekar marimuthu - Sun Microsystems - Bangalore India fa->sf_max_retr); 1566be61d4eSchandrasekar marimuthu - Sun Microsystems - Bangalore India mdb_printf("hb_expiry\t%?ld\thb_interval\t%?u\n", fa->sf_hb_expiry, 1576be61d4eSchandrasekar marimuthu - Sun Microsystems - Bangalore India fa->sf_hb_interval); 1586be61d4eSchandrasekar marimuthu - Sun Microsystems - Bangalore India mdb_printf("pmss\t\t%?u\tcwnd\t\t%?u\n", fa->sf_pmss, fa->sf_cwnd); 1596be61d4eSchandrasekar marimuthu - Sun Microsystems - Bangalore India mdb_printf("ssthresh\t%?u\tsuna\t\t%?u\n", fa->sf_ssthresh, 1606be61d4eSchandrasekar marimuthu - Sun Microsystems - Bangalore India fa->sf_suna); 1616be61d4eSchandrasekar marimuthu - Sun Microsystems - Bangalore India mdb_printf("pba\t\t%?u\tacked\t\t%?u\n", fa->sf_pba, fa->sf_acked); 1626be61d4eSchandrasekar marimuthu - Sun Microsystems - Bangalore India mdb_printf("lastactive\t%?ld\thb_secret\t%?#lx\n", fa->sf_lastactive, 1636be61d4eSchandrasekar marimuthu - Sun Microsystems - Bangalore India fa->sf_hb_secret); 1646be61d4eSchandrasekar marimuthu - Sun Microsystems - Bangalore India mdb_printf("rxt_unacked\t%?u\n", fa->sf_rxt_unacked); 1656be61d4eSchandrasekar marimuthu - Sun Microsystems - Bangalore India mdb_printf("timer_mp\t%?p\tixa\t\t%?p\n", fa->sf_timer_mp, fa->sf_ixa); 166c31292eeSkcpoon mdb_printf("hb_enabled\t%?d\thb_pending\t%?d\n" 167c31292eeSkcpoon "timer_running\t%?d\tdf\t\t%?d\n" 168c31292eeSkcpoon "pmtu_discovered\t%?d\tisv4\t\t%?d\n" 169c31292eeSkcpoon "retransmissions\t%?u\n", 1706be61d4eSchandrasekar marimuthu - Sun Microsystems - Bangalore India fa->sf_hb_enabled, fa->sf_hb_pending, fa->sf_timer_running, 1716be61d4eSchandrasekar marimuthu - Sun Microsystems - Bangalore India fa->sf_df, fa->sf_pmtu_discovered, fa->sf_isv4, fa->sf_T3expire); 1727c478bd9Sstevel@tonic-gate 1737c478bd9Sstevel@tonic-gate return (DCMD_OK); 1747c478bd9Sstevel@tonic-gate } 1757c478bd9Sstevel@tonic-gate 1767c478bd9Sstevel@tonic-gate static void 1777c478bd9Sstevel@tonic-gate print_set(sctp_set_t *sp) 1787c478bd9Sstevel@tonic-gate { 1797c478bd9Sstevel@tonic-gate mdb_printf("\tbegin\t%<b>%?x%</b>\t\tend\t%<b>%?x%</b>\n", 1807c478bd9Sstevel@tonic-gate sp->begin, sp->end); 1817c478bd9Sstevel@tonic-gate mdb_printf("\tnext\t%?p\tprev\t%?p\n", sp->next, sp->prev); 1827c478bd9Sstevel@tonic-gate } 1837c478bd9Sstevel@tonic-gate 1847c478bd9Sstevel@tonic-gate /* ARGSUSED */ 1857c478bd9Sstevel@tonic-gate static int 1867c478bd9Sstevel@tonic-gate sctp_set(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) 1877c478bd9Sstevel@tonic-gate { 1887c478bd9Sstevel@tonic-gate sctp_set_t sp[1]; 1897c478bd9Sstevel@tonic-gate 1907c478bd9Sstevel@tonic-gate if (!(flags & DCMD_ADDRSPEC)) 1917c478bd9Sstevel@tonic-gate return (DCMD_USAGE); 1927c478bd9Sstevel@tonic-gate 1937c478bd9Sstevel@tonic-gate if (mdb_vread(sp, sizeof (*sp), addr) == -1) 1947c478bd9Sstevel@tonic-gate return (DCMD_ERR); 1957c478bd9Sstevel@tonic-gate 1967c478bd9Sstevel@tonic-gate print_set(sp); 1977c478bd9Sstevel@tonic-gate 1987c478bd9Sstevel@tonic-gate return (DCMD_OK); 1997c478bd9Sstevel@tonic-gate } 2007c478bd9Sstevel@tonic-gate 2017c478bd9Sstevel@tonic-gate static void 2027c478bd9Sstevel@tonic-gate dump_sack_info(uintptr_t addr) 2037c478bd9Sstevel@tonic-gate { 2047c478bd9Sstevel@tonic-gate sctp_set_t sp[1]; 2057c478bd9Sstevel@tonic-gate 2067c478bd9Sstevel@tonic-gate while (addr != 0) { 2077c478bd9Sstevel@tonic-gate if (mdb_vread(sp, sizeof (*sp), addr) == -1) { 2087c478bd9Sstevel@tonic-gate mdb_warn("failed to read sctp_set at %p", addr); 2097c478bd9Sstevel@tonic-gate return; 2107c478bd9Sstevel@tonic-gate } 2117c478bd9Sstevel@tonic-gate 2127c478bd9Sstevel@tonic-gate addr = (uintptr_t)sp->next; 2137c478bd9Sstevel@tonic-gate print_set(sp); 2147c478bd9Sstevel@tonic-gate } 2157c478bd9Sstevel@tonic-gate } 2167c478bd9Sstevel@tonic-gate 2177c478bd9Sstevel@tonic-gate static int 2187c478bd9Sstevel@tonic-gate dump_msghdr(mblk_t *meta) 2197c478bd9Sstevel@tonic-gate { 2207c478bd9Sstevel@tonic-gate sctp_msg_hdr_t smh; 2217c478bd9Sstevel@tonic-gate 2227c478bd9Sstevel@tonic-gate if (mdb_vread(&smh, sizeof (smh), (uintptr_t)meta->b_rptr) == -1) 2237c478bd9Sstevel@tonic-gate return (-1); 2247c478bd9Sstevel@tonic-gate 2257c478bd9Sstevel@tonic-gate mdb_printf("%<u>msg_hdr_t at \t%?p\tsentto\t%?p%</u>\n", 2267c478bd9Sstevel@tonic-gate meta->b_rptr, SCTP_CHUNK_DEST(meta)); 2277c478bd9Sstevel@tonic-gate mdb_printf("\tttl\t%?ld\ttob\t%?ld\n", smh.smh_ttl, smh.smh_tob); 2287c478bd9Sstevel@tonic-gate mdb_printf("\tsid\t%?u\tssn\t%?u\n", smh.smh_sid, smh.smh_ssn); 2297c478bd9Sstevel@tonic-gate mdb_printf("\tppid\t%?u\tflags\t%?s\n", smh.smh_ppid, 2307c478bd9Sstevel@tonic-gate smh.smh_flags & MSG_UNORDERED ? "unordered" : " "); 2317c478bd9Sstevel@tonic-gate mdb_printf("\tcontext\t%?u\tmsglen\t%?d\n", smh.smh_context, 2327c478bd9Sstevel@tonic-gate smh.smh_msglen); 2337c478bd9Sstevel@tonic-gate 2347c478bd9Sstevel@tonic-gate return (0); 2357c478bd9Sstevel@tonic-gate } 2367c478bd9Sstevel@tonic-gate 2377c478bd9Sstevel@tonic-gate static int 2387c478bd9Sstevel@tonic-gate dump_datahdr(mblk_t *mp) 2397c478bd9Sstevel@tonic-gate { 2407c478bd9Sstevel@tonic-gate sctp_data_hdr_t sdc; 2417c478bd9Sstevel@tonic-gate uint16_t sdh_int16; 2427c478bd9Sstevel@tonic-gate uint32_t sdh_int32; 2437c478bd9Sstevel@tonic-gate 2447c478bd9Sstevel@tonic-gate if (mdb_vread(&sdc, sizeof (sdc), (uintptr_t)mp->b_rptr) == -1) 2457c478bd9Sstevel@tonic-gate return (-1); 2467c478bd9Sstevel@tonic-gate 2477c478bd9Sstevel@tonic-gate mdb_printf("%<u>data_chunk_t \t%?p\tsentto\t%?p%</u>\n", 2487c478bd9Sstevel@tonic-gate mp->b_rptr, SCTP_CHUNK_DEST(mp)); 2497c478bd9Sstevel@tonic-gate mdb_printf("\tsent\t%?d\t", SCTP_CHUNK_ISSENT(mp)?1:0); 2507c478bd9Sstevel@tonic-gate mdb_printf("retrans\t%?d\n", SCTP_CHUNK_WANT_REXMIT(mp)?1:0); 2517c478bd9Sstevel@tonic-gate mdb_printf("\tacked\t%?d\t", SCTP_CHUNK_ISACKED(mp)?1:0); 2527c478bd9Sstevel@tonic-gate mdb_printf("sackcnt\t%?u\n", SCTP_CHUNK_SACKCNT(mp)); 2537c478bd9Sstevel@tonic-gate 2547c478bd9Sstevel@tonic-gate mdb_nhconvert(&sdh_int16, &sdc.sdh_len, sizeof (sdc.sdh_len)); 2557c478bd9Sstevel@tonic-gate mdb_printf("\tlen\t%?d\t", sdh_int16); 2567c478bd9Sstevel@tonic-gate mdb_printf("BBIT=%d", SCTP_DATA_GET_BBIT(&sdc) == 0 ? 0 : 1); 2577c478bd9Sstevel@tonic-gate mdb_printf("EBIT=%d", SCTP_DATA_GET_EBIT(&sdc) == 0 ? 0 : 1); 2587c478bd9Sstevel@tonic-gate 2597c478bd9Sstevel@tonic-gate mdb_nhconvert(&sdh_int32, &sdc.sdh_tsn, sizeof (sdc.sdh_tsn)); 2607c478bd9Sstevel@tonic-gate mdb_nhconvert(&sdh_int16, &sdc.sdh_sid, sizeof (sdc.sdh_sid)); 2617c478bd9Sstevel@tonic-gate mdb_printf("\ttsn\t%?x\tsid\t%?hu\n", sdh_int32, sdh_int16); 2627c478bd9Sstevel@tonic-gate 2637c478bd9Sstevel@tonic-gate mdb_nhconvert(&sdh_int16, &sdc.sdh_ssn, sizeof (sdc.sdh_ssn)); 2647c478bd9Sstevel@tonic-gate mdb_nhconvert(&sdh_int32, &sdc.sdh_payload_id, 2657c478bd9Sstevel@tonic-gate sizeof (sdc.sdh_payload_id)); 2667c478bd9Sstevel@tonic-gate mdb_printf("\tssn\t%?hu\tppid\t%?d\n", sdh_int16, sdh_int32); 2677c478bd9Sstevel@tonic-gate 2687c478bd9Sstevel@tonic-gate return (0); 2697c478bd9Sstevel@tonic-gate } 2707c478bd9Sstevel@tonic-gate 2717c478bd9Sstevel@tonic-gate static int 2727c478bd9Sstevel@tonic-gate sctp_sent_list(mblk_t *addr) 2737c478bd9Sstevel@tonic-gate { 2747c478bd9Sstevel@tonic-gate mblk_t meta, mp; 2757c478bd9Sstevel@tonic-gate 2767c478bd9Sstevel@tonic-gate if (!addr) 2777c478bd9Sstevel@tonic-gate return (0); 2787c478bd9Sstevel@tonic-gate 2797c478bd9Sstevel@tonic-gate if (mdb_vread(&meta, sizeof (meta), (uintptr_t)addr) == -1) 2807c478bd9Sstevel@tonic-gate return (-1); 2817c478bd9Sstevel@tonic-gate 2827c478bd9Sstevel@tonic-gate for (;;) { 2837c478bd9Sstevel@tonic-gate dump_msghdr(&meta); 2847c478bd9Sstevel@tonic-gate 2857c478bd9Sstevel@tonic-gate if (meta.b_cont == NULL) { 2867c478bd9Sstevel@tonic-gate mdb_printf("No data chunks with message header!\n"); 2877c478bd9Sstevel@tonic-gate return (-1); 2887c478bd9Sstevel@tonic-gate } 2897c478bd9Sstevel@tonic-gate if (mdb_vread(&mp, sizeof (mp), 2907c478bd9Sstevel@tonic-gate (uintptr_t)meta.b_cont) == -1) { 2917c478bd9Sstevel@tonic-gate return (-1); 2927c478bd9Sstevel@tonic-gate } 2937c478bd9Sstevel@tonic-gate for (;;) { 2947c478bd9Sstevel@tonic-gate dump_datahdr(&mp); 2957c478bd9Sstevel@tonic-gate if (!mp.b_next) 2967c478bd9Sstevel@tonic-gate break; 2977c478bd9Sstevel@tonic-gate 2987c478bd9Sstevel@tonic-gate if (mdb_vread(&mp, sizeof (mp), 2997c478bd9Sstevel@tonic-gate (uintptr_t)(mp.b_next)) == -1) 3007c478bd9Sstevel@tonic-gate return (-1); 3017c478bd9Sstevel@tonic-gate } 3027c478bd9Sstevel@tonic-gate if (meta.b_next == NULL) 3037c478bd9Sstevel@tonic-gate break; 3047c478bd9Sstevel@tonic-gate if (mdb_vread(&meta, sizeof (meta), 3057c478bd9Sstevel@tonic-gate (uintptr_t)meta.b_next) == -1) 3067c478bd9Sstevel@tonic-gate return (-1); 3077c478bd9Sstevel@tonic-gate } 3087c478bd9Sstevel@tonic-gate 3097c478bd9Sstevel@tonic-gate return (0); 3107c478bd9Sstevel@tonic-gate } 3117c478bd9Sstevel@tonic-gate 3127c478bd9Sstevel@tonic-gate static int 3137c478bd9Sstevel@tonic-gate sctp_unsent_list(mblk_t *addr) 3147c478bd9Sstevel@tonic-gate { 3157c478bd9Sstevel@tonic-gate mblk_t meta; 3167c478bd9Sstevel@tonic-gate 3177c478bd9Sstevel@tonic-gate if (!addr) 3187c478bd9Sstevel@tonic-gate return (0); 3197c478bd9Sstevel@tonic-gate 3207c478bd9Sstevel@tonic-gate if (mdb_vread(&meta, sizeof (meta), (uintptr_t)addr) == -1) 3217c478bd9Sstevel@tonic-gate return (-1); 3227c478bd9Sstevel@tonic-gate 3237c478bd9Sstevel@tonic-gate for (;;) { 3247c478bd9Sstevel@tonic-gate dump_msghdr(&meta); 3257c478bd9Sstevel@tonic-gate 3267c478bd9Sstevel@tonic-gate if (meta.b_next == NULL) 3277c478bd9Sstevel@tonic-gate break; 3287c478bd9Sstevel@tonic-gate 3297c478bd9Sstevel@tonic-gate if (mdb_vread(&meta, sizeof (meta), 3307c478bd9Sstevel@tonic-gate (uintptr_t)meta.b_next) == -1) 3317c478bd9Sstevel@tonic-gate return (-1); 3327c478bd9Sstevel@tonic-gate } 3337c478bd9Sstevel@tonic-gate 3347c478bd9Sstevel@tonic-gate return (0); 3357c478bd9Sstevel@tonic-gate } 3367c478bd9Sstevel@tonic-gate 3377c478bd9Sstevel@tonic-gate /* ARGSUSED */ 3387c478bd9Sstevel@tonic-gate static int 3397c478bd9Sstevel@tonic-gate sctp_xmit_list(uintptr_t addr, uint_t flags, int ac, const mdb_arg_t *av) 3407c478bd9Sstevel@tonic-gate { 3417c478bd9Sstevel@tonic-gate sctp_t sctp; 3427c478bd9Sstevel@tonic-gate 3437c478bd9Sstevel@tonic-gate if (!(flags & DCMD_ADDRSPEC)) 3447c478bd9Sstevel@tonic-gate return (DCMD_USAGE); 3457c478bd9Sstevel@tonic-gate 3467c478bd9Sstevel@tonic-gate if (mdb_vread(&sctp, sizeof (sctp), addr) == -1) 3477c478bd9Sstevel@tonic-gate return (DCMD_ERR); 3487c478bd9Sstevel@tonic-gate 3497c478bd9Sstevel@tonic-gate mdb_printf("%<b>Chunkified TX list%</b>\n"); 3507c478bd9Sstevel@tonic-gate if (sctp_sent_list(sctp.sctp_xmit_head) < 0) 3517c478bd9Sstevel@tonic-gate return (DCMD_ERR); 3527c478bd9Sstevel@tonic-gate 3537c478bd9Sstevel@tonic-gate mdb_printf("%<b>Unchunkified TX list%</b>\n"); 3547c478bd9Sstevel@tonic-gate if (sctp_unsent_list(sctp.sctp_xmit_unsent) < 0) 3557c478bd9Sstevel@tonic-gate return (DCMD_ERR); 3567c478bd9Sstevel@tonic-gate 3577c478bd9Sstevel@tonic-gate return (DCMD_OK); 3587c478bd9Sstevel@tonic-gate } 3597c478bd9Sstevel@tonic-gate 3607c478bd9Sstevel@tonic-gate /* ARGSUSED */ 3617c478bd9Sstevel@tonic-gate static int 3627c478bd9Sstevel@tonic-gate sctp_mdata_chunk(uintptr_t addr, uint_t flags, int ac, const mdb_arg_t *av) 3637c478bd9Sstevel@tonic-gate { 3647c478bd9Sstevel@tonic-gate sctp_data_hdr_t dc; 3657c478bd9Sstevel@tonic-gate mblk_t mp; 3667c478bd9Sstevel@tonic-gate 3677c478bd9Sstevel@tonic-gate if (!(flags & DCMD_ADDRSPEC)) 3687c478bd9Sstevel@tonic-gate return (DCMD_USAGE); 3697c478bd9Sstevel@tonic-gate 3707c478bd9Sstevel@tonic-gate if (mdb_vread(&mp, sizeof (mp), addr) == -1) 3717c478bd9Sstevel@tonic-gate return (DCMD_ERR); 3727c478bd9Sstevel@tonic-gate 3737c478bd9Sstevel@tonic-gate if (mdb_vread(&dc, sizeof (dc), (uintptr_t)mp.b_rptr) == -1) 3747c478bd9Sstevel@tonic-gate return (DCMD_ERR); 3757c478bd9Sstevel@tonic-gate 3767c478bd9Sstevel@tonic-gate mdb_printf("%<b>%-?p%</b>tsn\t%?x\tsid\t%?hu\n", addr, 3777c478bd9Sstevel@tonic-gate dc.sdh_tsn, dc.sdh_sid); 3787c478bd9Sstevel@tonic-gate mdb_printf("%-?sssn\t%?hu\tppid\t%?x\n", "", dc.sdh_ssn, 3797c478bd9Sstevel@tonic-gate dc.sdh_payload_id); 3807c478bd9Sstevel@tonic-gate 3817c478bd9Sstevel@tonic-gate return (DCMD_OK); 3827c478bd9Sstevel@tonic-gate } 3837c478bd9Sstevel@tonic-gate 3847c478bd9Sstevel@tonic-gate /* ARGSUSED */ 3857c478bd9Sstevel@tonic-gate static int 3867c478bd9Sstevel@tonic-gate sctp_istr_msgs(uintptr_t addr, uint_t flags, int ac, const mdb_arg_t *av) 3877c478bd9Sstevel@tonic-gate { 3887c478bd9Sstevel@tonic-gate mblk_t istrmp; 3897c478bd9Sstevel@tonic-gate mblk_t dmp; 3907c478bd9Sstevel@tonic-gate sctp_data_hdr_t dp; 3917c478bd9Sstevel@tonic-gate uintptr_t daddr; 3927c478bd9Sstevel@tonic-gate uintptr_t chaddr; 3937c478bd9Sstevel@tonic-gate boolean_t bbit; 3947c478bd9Sstevel@tonic-gate boolean_t ebit; 3957c478bd9Sstevel@tonic-gate 3967c478bd9Sstevel@tonic-gate if (!(flags & DCMD_ADDRSPEC)) 3977c478bd9Sstevel@tonic-gate return (DCMD_USAGE); 3987c478bd9Sstevel@tonic-gate 3997c478bd9Sstevel@tonic-gate do { 4007c478bd9Sstevel@tonic-gate if (mdb_vread(&istrmp, sizeof (istrmp), addr) == -1) 4017c478bd9Sstevel@tonic-gate return (DCMD_ERR); 4027c478bd9Sstevel@tonic-gate 4037c478bd9Sstevel@tonic-gate mdb_printf("\tistr mblk at %p: next: %?p\n" 4047c478bd9Sstevel@tonic-gate "\t\tprev: %?p\tcont: %?p\n", addr, istrmp.b_next, 4057c478bd9Sstevel@tonic-gate istrmp.b_prev, istrmp.b_cont); 4067c478bd9Sstevel@tonic-gate daddr = (uintptr_t)&istrmp; 4077c478bd9Sstevel@tonic-gate do { 4087c478bd9Sstevel@tonic-gate if (mdb_vread(&dmp, sizeof (dmp), daddr) == -1) 4097c478bd9Sstevel@tonic-gate break; 4107c478bd9Sstevel@tonic-gate chaddr = (uintptr_t)dmp.b_rptr; 4117c478bd9Sstevel@tonic-gate if (mdb_vread(&dp, sizeof (dp), chaddr) == -1) 4127c478bd9Sstevel@tonic-gate break; 4137c478bd9Sstevel@tonic-gate 4147c478bd9Sstevel@tonic-gate bbit = (SCTP_DATA_GET_BBIT(&dp) != 0); 4157c478bd9Sstevel@tonic-gate ebit = (SCTP_DATA_GET_EBIT(&dp) != 0); 4167c478bd9Sstevel@tonic-gate 4177c478bd9Sstevel@tonic-gate mdb_printf("\t\t\ttsn: %x bbit: %d ebit: %d\n", 4187c478bd9Sstevel@tonic-gate dp.sdh_tsn, bbit, ebit); 4197c478bd9Sstevel@tonic-gate 4207c478bd9Sstevel@tonic-gate 4217c478bd9Sstevel@tonic-gate daddr = (uintptr_t)dmp.b_cont; 4227c478bd9Sstevel@tonic-gate } while (daddr != NULL); 4237c478bd9Sstevel@tonic-gate 4247c478bd9Sstevel@tonic-gate addr = (uintptr_t)istrmp.b_next; 4257c478bd9Sstevel@tonic-gate } while (addr != NULL); 4267c478bd9Sstevel@tonic-gate 4277c478bd9Sstevel@tonic-gate return (DCMD_OK); 4287c478bd9Sstevel@tonic-gate } 4297c478bd9Sstevel@tonic-gate 4307c478bd9Sstevel@tonic-gate /* ARGSUSED */ 4317c478bd9Sstevel@tonic-gate static int 4327c478bd9Sstevel@tonic-gate sctp_reass_list(uintptr_t addr, uint_t flags, int ac, const mdb_arg_t *av) 4337c478bd9Sstevel@tonic-gate { 4347c478bd9Sstevel@tonic-gate sctp_reass_t srp; 4357c478bd9Sstevel@tonic-gate mblk_t srpmp; 4367c478bd9Sstevel@tonic-gate sctp_data_hdr_t dp; 4377c478bd9Sstevel@tonic-gate mblk_t dmp; 4387c478bd9Sstevel@tonic-gate uintptr_t daddr; 4397c478bd9Sstevel@tonic-gate uintptr_t chaddr; 4407c478bd9Sstevel@tonic-gate boolean_t bbit, ebit; 4417c478bd9Sstevel@tonic-gate 4427c478bd9Sstevel@tonic-gate if (!(flags & DCMD_ADDRSPEC)) 4437c478bd9Sstevel@tonic-gate return (DCMD_USAGE); 4447c478bd9Sstevel@tonic-gate 4457c478bd9Sstevel@tonic-gate do { 4467c478bd9Sstevel@tonic-gate if (mdb_vread(&srpmp, sizeof (srpmp), addr) == -1) 4477c478bd9Sstevel@tonic-gate return (DCMD_ERR); 4487c478bd9Sstevel@tonic-gate 4497c478bd9Sstevel@tonic-gate if (mdb_vread(&srp, sizeof (srp), 4507c478bd9Sstevel@tonic-gate (uintptr_t)srpmp.b_datap->db_base) == -1) 4517c478bd9Sstevel@tonic-gate return (DCMD_ERR); 4527c478bd9Sstevel@tonic-gate 4537c478bd9Sstevel@tonic-gate mdb_printf("\treassembly mblk at %p: next: %?p\n" 4547c478bd9Sstevel@tonic-gate "\t\tprev: %?p\tcont: %?p\n", addr, srpmp.b_next, 4557c478bd9Sstevel@tonic-gate srpmp.b_prev, srpmp.b_cont); 4567c478bd9Sstevel@tonic-gate mdb_printf("\t\tssn: %hu\tneeded: %hu\tgot: %hu\ttail: %?p\n" 4576be61d4eSchandrasekar marimuthu - Sun Microsystems - Bangalore India "\t\tpartial_delivered: %s\n", srp.sr_ssn, srp.sr_needed, 4586be61d4eSchandrasekar marimuthu - Sun Microsystems - Bangalore India srp.sr_got, srp.sr_tail, srp.sr_partial_delivered ? "TRUE" : 4597c478bd9Sstevel@tonic-gate "FALSE"); 4607c478bd9Sstevel@tonic-gate 4617c478bd9Sstevel@tonic-gate /* display the contents of this ssn's reassemby list */ 4627c478bd9Sstevel@tonic-gate daddr = DB_TYPE(&srpmp) == M_CTL ? (uintptr_t)srpmp.b_cont : 4637c478bd9Sstevel@tonic-gate (uintptr_t)&srpmp; 4647c478bd9Sstevel@tonic-gate do { 4657c478bd9Sstevel@tonic-gate if (mdb_vread(&dmp, sizeof (dmp), daddr) == -1) 4667c478bd9Sstevel@tonic-gate break; 4677c478bd9Sstevel@tonic-gate chaddr = (uintptr_t)dmp.b_rptr; 4687c478bd9Sstevel@tonic-gate if (mdb_vread(&dp, sizeof (dp), chaddr) == -1) 4697c478bd9Sstevel@tonic-gate break; 4707c478bd9Sstevel@tonic-gate 4717c478bd9Sstevel@tonic-gate bbit = (SCTP_DATA_GET_BBIT(&dp) != 0); 4727c478bd9Sstevel@tonic-gate ebit = (SCTP_DATA_GET_EBIT(&dp) != 0); 4737c478bd9Sstevel@tonic-gate 4747c478bd9Sstevel@tonic-gate mdb_printf("\t\t\ttsn: %x bbit: %d ebit: %d\n", 4757c478bd9Sstevel@tonic-gate dp.sdh_tsn, bbit, ebit); 4767c478bd9Sstevel@tonic-gate 4777c478bd9Sstevel@tonic-gate daddr = (uintptr_t)dmp.b_cont; 4787c478bd9Sstevel@tonic-gate } while (daddr != NULL); 4797c478bd9Sstevel@tonic-gate 4807c478bd9Sstevel@tonic-gate addr = (uintptr_t)srpmp.b_next; 4817c478bd9Sstevel@tonic-gate } while (addr != NULL); 4827c478bd9Sstevel@tonic-gate 4837c478bd9Sstevel@tonic-gate return (DCMD_OK); 4847c478bd9Sstevel@tonic-gate } 4857c478bd9Sstevel@tonic-gate 4867c478bd9Sstevel@tonic-gate /* ARGSUSED */ 4877c478bd9Sstevel@tonic-gate static int 4887c478bd9Sstevel@tonic-gate sctp_uo_reass_list(uintptr_t addr, uint_t flags, int ac, const mdb_arg_t *av) 4897c478bd9Sstevel@tonic-gate { 4907c478bd9Sstevel@tonic-gate sctp_data_hdr_t dp; 4917c478bd9Sstevel@tonic-gate mblk_t dmp; 4927c478bd9Sstevel@tonic-gate uintptr_t chaddr; 4937c478bd9Sstevel@tonic-gate boolean_t bbit; 4947c478bd9Sstevel@tonic-gate boolean_t ebit; 4957c478bd9Sstevel@tonic-gate boolean_t ubit; 4967c478bd9Sstevel@tonic-gate 4977c478bd9Sstevel@tonic-gate if (!(flags & DCMD_ADDRSPEC)) 4987c478bd9Sstevel@tonic-gate return (DCMD_USAGE); 4997c478bd9Sstevel@tonic-gate 5007c478bd9Sstevel@tonic-gate do { 5017c478bd9Sstevel@tonic-gate if (mdb_vread(&dmp, sizeof (dmp), addr) == -1) 5027c478bd9Sstevel@tonic-gate return (DCMD_ERR); 5037c478bd9Sstevel@tonic-gate 5047c478bd9Sstevel@tonic-gate mdb_printf("\treassembly mblk at %p: next: %?p\n" 5057c478bd9Sstevel@tonic-gate "\t\tprev: %?p\n", addr, dmp.b_next, dmp.b_prev); 5067c478bd9Sstevel@tonic-gate 5077c478bd9Sstevel@tonic-gate chaddr = (uintptr_t)dmp.b_rptr; 5087c478bd9Sstevel@tonic-gate if (mdb_vread(&dp, sizeof (dp), chaddr) == -1) 5097c478bd9Sstevel@tonic-gate break; 5107c478bd9Sstevel@tonic-gate 5117c478bd9Sstevel@tonic-gate bbit = (SCTP_DATA_GET_BBIT(&dp) != 0); 5127c478bd9Sstevel@tonic-gate ebit = (SCTP_DATA_GET_EBIT(&dp) != 0); 5137c478bd9Sstevel@tonic-gate ubit = (SCTP_DATA_GET_UBIT(&dp) != 0); 5147c478bd9Sstevel@tonic-gate 5157c478bd9Sstevel@tonic-gate mdb_printf("\t\t\tsid: %hu ssn: %hu tsn: %x " 5167c478bd9Sstevel@tonic-gate "flags: %x (U=%d B=%d E=%d)\n", dp.sdh_sid, dp.sdh_ssn, 5177c478bd9Sstevel@tonic-gate dp.sdh_tsn, dp.sdh_flags, ubit, bbit, ebit); 5187c478bd9Sstevel@tonic-gate 5197c478bd9Sstevel@tonic-gate addr = (uintptr_t)dmp.b_next; 5207c478bd9Sstevel@tonic-gate } while (addr != NULL); 5217c478bd9Sstevel@tonic-gate 5227c478bd9Sstevel@tonic-gate return (DCMD_OK); 5237c478bd9Sstevel@tonic-gate } 5247c478bd9Sstevel@tonic-gate 5257c478bd9Sstevel@tonic-gate static int 5267c478bd9Sstevel@tonic-gate sctp_instr(uintptr_t addr, uint_t flags, int ac, const mdb_arg_t *av) 5277c478bd9Sstevel@tonic-gate { 5287c478bd9Sstevel@tonic-gate sctp_instr_t sip; 5297c478bd9Sstevel@tonic-gate 5307c478bd9Sstevel@tonic-gate if (!(flags & DCMD_ADDRSPEC)) 5317c478bd9Sstevel@tonic-gate return (DCMD_USAGE); 5327c478bd9Sstevel@tonic-gate 5337c478bd9Sstevel@tonic-gate if (mdb_vread(&sip, sizeof (sip), addr) == -1) 5347c478bd9Sstevel@tonic-gate return (DCMD_ERR); 5357c478bd9Sstevel@tonic-gate 5367c478bd9Sstevel@tonic-gate mdb_printf("%<b>%-?p%</b>\n\tmsglist\t%?p\tnmsgs\t%?d\n" 5377c478bd9Sstevel@tonic-gate "\tnextseq\t%?d\treass\t%?p\n", addr, sip.istr_msgs, 5387c478bd9Sstevel@tonic-gate sip.istr_nmsgs, sip.nextseq, sip.istr_reass); 5397c478bd9Sstevel@tonic-gate mdb_set_dot(addr + sizeof (sip)); 5407c478bd9Sstevel@tonic-gate 5417c478bd9Sstevel@tonic-gate return (sctp_reass_list((uintptr_t)sip.istr_reass, flags, ac, av)); 5427c478bd9Sstevel@tonic-gate } 5437c478bd9Sstevel@tonic-gate 5447c478bd9Sstevel@tonic-gate static const char * 5457c478bd9Sstevel@tonic-gate state2str(sctp_t *sctp) 5467c478bd9Sstevel@tonic-gate { 5477c478bd9Sstevel@tonic-gate switch (sctp->sctp_state) { 5487c478bd9Sstevel@tonic-gate case SCTPS_IDLE: return ("SCTPS_IDLE"); 5497c478bd9Sstevel@tonic-gate case SCTPS_BOUND: return ("SCTPS_BOUND"); 5507c478bd9Sstevel@tonic-gate case SCTPS_LISTEN: return ("SCTPS_LISTEN"); 5517c478bd9Sstevel@tonic-gate case SCTPS_COOKIE_WAIT: return ("SCTPS_COOKIE_WAIT"); 5527c478bd9Sstevel@tonic-gate case SCTPS_COOKIE_ECHOED: return ("SCTPS_COOKIE_ECHOED"); 5537c478bd9Sstevel@tonic-gate case SCTPS_ESTABLISHED: return ("SCTPS_ESTABLISHED"); 5547c478bd9Sstevel@tonic-gate case SCTPS_SHUTDOWN_PENDING: return ("SCTPS_SHUTDOWN_PENDING"); 5557c478bd9Sstevel@tonic-gate case SCTPS_SHUTDOWN_SENT: return ("SCTPS_SHUTDOWN_SENT"); 5567c478bd9Sstevel@tonic-gate case SCTPS_SHUTDOWN_RECEIVED: return ("SCTPS_SHUTDOWN_RECEIVED"); 5577c478bd9Sstevel@tonic-gate case SCTPS_SHUTDOWN_ACK_SENT: return ("SCTPS_SHUTDOWN_ACK_SENT"); 5587c478bd9Sstevel@tonic-gate default: return ("UNKNOWN STATE"); 5597c478bd9Sstevel@tonic-gate } 5607c478bd9Sstevel@tonic-gate } 5617c478bd9Sstevel@tonic-gate 5627c478bd9Sstevel@tonic-gate static void 5637c478bd9Sstevel@tonic-gate show_sctp_flags(sctp_t *sctp) 5647c478bd9Sstevel@tonic-gate { 5657c478bd9Sstevel@tonic-gate mdb_printf("\tunderstands_asconf\t%d\n", 5667c478bd9Sstevel@tonic-gate sctp->sctp_understands_asconf); 567bd670b35SErik Nordmark mdb_printf("\tdebug\t\t\t%d\n", sctp->sctp_connp->conn_debug); 5687c478bd9Sstevel@tonic-gate mdb_printf("\tcchunk_pend\t\t%d\n", sctp->sctp_cchunk_pend); 569bd670b35SErik Nordmark mdb_printf("\tdgram_errind\t\t%d\n", 570bd670b35SErik Nordmark sctp->sctp_connp->conn_dgram_errind); 5717c478bd9Sstevel@tonic-gate 572bd670b35SErik Nordmark mdb_printf("\tlinger\t\t\t%d\n", sctp->sctp_connp->conn_linger); 5737c478bd9Sstevel@tonic-gate if (sctp->sctp_lingering) 5747c478bd9Sstevel@tonic-gate return; 5757c478bd9Sstevel@tonic-gate mdb_printf("\tlingering\t\t%d\n", sctp->sctp_lingering); 5767c478bd9Sstevel@tonic-gate mdb_printf("\tloopback\t\t%d\n", sctp->sctp_loopback); 5777c478bd9Sstevel@tonic-gate mdb_printf("\tforce_sack\t\t%d\n", sctp->sctp_force_sack); 5787c478bd9Sstevel@tonic-gate 5797c478bd9Sstevel@tonic-gate mdb_printf("\tack_timer_runing\t%d\n", sctp->sctp_ack_timer_running); 580bd670b35SErik Nordmark mdb_printf("\trecvdstaddr\t\t%d\n", 581bd670b35SErik Nordmark sctp->sctp_connp->conn_recv_ancillary.crb_recvdstaddr); 5827c478bd9Sstevel@tonic-gate mdb_printf("\thwcksum\t\t\t%d\n", sctp->sctp_hwcksum); 5837c478bd9Sstevel@tonic-gate mdb_printf("\tunderstands_addip\t%d\n", sctp->sctp_understands_addip); 5847c478bd9Sstevel@tonic-gate 5857c478bd9Sstevel@tonic-gate mdb_printf("\tbound_to_all\t\t%d\n", sctp->sctp_bound_to_all); 5867c478bd9Sstevel@tonic-gate mdb_printf("\tcansleep\t\t%d\n", sctp->sctp_cansleep); 5877c478bd9Sstevel@tonic-gate mdb_printf("\tdetached\t\t%d\n", sctp->sctp_detached); 588558fbd03Skcpoon mdb_printf("\tsend_adaptation\t\t%d\n", sctp->sctp_send_adaptation); 5897c478bd9Sstevel@tonic-gate 590558fbd03Skcpoon mdb_printf("\trecv_adaptation\t\t%d\n", sctp->sctp_recv_adaptation); 5917c478bd9Sstevel@tonic-gate mdb_printf("\tndelay\t\t\t%d\n", sctp->sctp_ndelay); 5927c478bd9Sstevel@tonic-gate mdb_printf("\tcondemned\t\t%d\n", sctp->sctp_condemned); 5937c478bd9Sstevel@tonic-gate mdb_printf("\tchk_fast_rexmit\t\t%d\n", sctp->sctp_chk_fast_rexmit); 59477c67f2fSkcpoon 5957c478bd9Sstevel@tonic-gate mdb_printf("\tprsctp_aware\t\t%d\n", sctp->sctp_prsctp_aware); 596f551bb10Svi117747 mdb_printf("\tlinklocal\t\t%d\n", sctp->sctp_linklocal); 59777c67f2fSkcpoon mdb_printf("\trexmitting\t\t%d\n", sctp->sctp_rexmitting); 5985d0bc3edSsommerfe mdb_printf("\tzero_win_probe\t\t%d\n", sctp->sctp_zero_win_probe); 5997c478bd9Sstevel@tonic-gate 6007c478bd9Sstevel@tonic-gate mdb_printf("\trecvsndrcvinfo\t\t%d\n", sctp->sctp_recvsndrcvinfo); 6017c478bd9Sstevel@tonic-gate mdb_printf("\trecvassocevnt\t\t%d\n", sctp->sctp_recvassocevnt); 6027c478bd9Sstevel@tonic-gate mdb_printf("\trecvpathevnt\t\t%d\n", sctp->sctp_recvpathevnt); 6037c478bd9Sstevel@tonic-gate mdb_printf("\trecvsendfailevnt\t%d\n", sctp->sctp_recvsendfailevnt); 6047c478bd9Sstevel@tonic-gate 6057c478bd9Sstevel@tonic-gate mdb_printf("\trecvpeerevnt\t\t%d\n", sctp->sctp_recvpeererr); 6067c478bd9Sstevel@tonic-gate mdb_printf("\trecvchutdownevnt\t%d\n", sctp->sctp_recvshutdownevnt); 6077c478bd9Sstevel@tonic-gate mdb_printf("\trecvcpdnevnt\t\t%d\n", sctp->sctp_recvpdevnt); 6087c478bd9Sstevel@tonic-gate mdb_printf("\trecvcalevnt\t\t%d\n\n", sctp->sctp_recvalevnt); 6097c478bd9Sstevel@tonic-gate } 6107c478bd9Sstevel@tonic-gate 6117c478bd9Sstevel@tonic-gate /* 6127c478bd9Sstevel@tonic-gate * Given a sctp_saddr_ipif_t, print out its address. This assumes 6137c478bd9Sstevel@tonic-gate * that addr contains the sctp_addr_ipif_t structure already and this 6147c478bd9Sstevel@tonic-gate * function does not need to read it in. 6157c478bd9Sstevel@tonic-gate */ 6167c478bd9Sstevel@tonic-gate /* ARGSUSED */ 6177c478bd9Sstevel@tonic-gate static int 6187c478bd9Sstevel@tonic-gate print_saddr(uintptr_t ptr, const void *addr, void *cbdata) 6197c478bd9Sstevel@tonic-gate { 6207c478bd9Sstevel@tonic-gate sctp_saddr_ipif_t *saddr = (sctp_saddr_ipif_t *)addr; 6217c478bd9Sstevel@tonic-gate sctp_ipif_t ipif; 6227c478bd9Sstevel@tonic-gate char *statestr; 6237c478bd9Sstevel@tonic-gate 6247c478bd9Sstevel@tonic-gate /* Read in the sctp_ipif object */ 6257c478bd9Sstevel@tonic-gate if (mdb_vread(&ipif, sizeof (ipif), (uintptr_t)saddr->saddr_ipifp) == 6267c478bd9Sstevel@tonic-gate -1) { 6277c478bd9Sstevel@tonic-gate mdb_warn("cannot read ipif at %p", saddr->saddr_ipifp); 6287c478bd9Sstevel@tonic-gate return (WALK_ERR); 6297c478bd9Sstevel@tonic-gate } 6307c478bd9Sstevel@tonic-gate 6317c478bd9Sstevel@tonic-gate switch (ipif.sctp_ipif_state) { 6327c478bd9Sstevel@tonic-gate case SCTP_IPIFS_CONDEMNED: 633f551bb10Svi117747 statestr = "Condemned"; 6347c478bd9Sstevel@tonic-gate break; 6357c478bd9Sstevel@tonic-gate case SCTP_IPIFS_INVALID: 636f551bb10Svi117747 statestr = "Invalid"; 6377c478bd9Sstevel@tonic-gate break; 6387c478bd9Sstevel@tonic-gate case SCTP_IPIFS_DOWN: 639f551bb10Svi117747 statestr = "Down"; 6407c478bd9Sstevel@tonic-gate break; 6417c478bd9Sstevel@tonic-gate case SCTP_IPIFS_UP: 642f551bb10Svi117747 statestr = "Up"; 6437c478bd9Sstevel@tonic-gate break; 6447c478bd9Sstevel@tonic-gate default: 645f551bb10Svi117747 statestr = "Unknown"; 6467c478bd9Sstevel@tonic-gate break; 6477c478bd9Sstevel@tonic-gate } 648f551bb10Svi117747 mdb_printf("\t%p\t%N% (%s", saddr->saddr_ipifp, &ipif.sctp_ipif_saddr, 649f551bb10Svi117747 statestr); 650f551bb10Svi117747 if (saddr->saddr_ipif_dontsrc == 1) 651f551bb10Svi117747 mdb_printf("/Dontsrc"); 652f551bb10Svi117747 if (saddr->saddr_ipif_unconfirmed == 1) 653f551bb10Svi117747 mdb_printf("/Unconfirmed"); 654f551bb10Svi117747 if (saddr->saddr_ipif_delete_pending == 1) 655f551bb10Svi117747 mdb_printf("/DeletePending"); 656f551bb10Svi117747 mdb_printf(")\n"); 657bd670b35SErik Nordmark mdb_printf("\t\t\tid %d zoneid %d IPIF flags %x\n", 658bd670b35SErik Nordmark ipif.sctp_ipif_id, 659f551bb10Svi117747 ipif.sctp_ipif_zoneid, ipif.sctp_ipif_flags); 6607c478bd9Sstevel@tonic-gate return (WALK_NEXT); 6617c478bd9Sstevel@tonic-gate } 6627c478bd9Sstevel@tonic-gate 6637c478bd9Sstevel@tonic-gate /* 6647c478bd9Sstevel@tonic-gate * Given a sctp_faddr_t, print out its address. This assumes that 6657c478bd9Sstevel@tonic-gate * addr contains the sctp_faddr_t structure already and this function 6667c478bd9Sstevel@tonic-gate * does not need to read it in. 6677c478bd9Sstevel@tonic-gate */ 6687c478bd9Sstevel@tonic-gate static int 6697c478bd9Sstevel@tonic-gate print_faddr(uintptr_t ptr, const void *addr, void *cbdata) 6707c478bd9Sstevel@tonic-gate { 671f551bb10Svi117747 char *statestr; 6727c478bd9Sstevel@tonic-gate sctp_faddr_t *faddr = (sctp_faddr_t *)addr; 6737c478bd9Sstevel@tonic-gate int *i = cbdata; 6747c478bd9Sstevel@tonic-gate 6756be61d4eSchandrasekar marimuthu - Sun Microsystems - Bangalore India statestr = sctp_faddr_state(faddr->sf_state); 676f551bb10Svi117747 6776be61d4eSchandrasekar marimuthu - Sun Microsystems - Bangalore India mdb_printf("\t%d:\t%N\t%?p (%s)\n", (*i)++, &faddr->sf_faddr, ptr, 678f551bb10Svi117747 statestr); 6797c478bd9Sstevel@tonic-gate return (WALK_NEXT); 6807c478bd9Sstevel@tonic-gate } 6817c478bd9Sstevel@tonic-gate 6827c478bd9Sstevel@tonic-gate int 6837c478bd9Sstevel@tonic-gate sctp(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) 6847c478bd9Sstevel@tonic-gate { 685bd670b35SErik Nordmark sctp_t sctps, *sctp; 686bd670b35SErik Nordmark conn_t conns, *connp; 6877c478bd9Sstevel@tonic-gate int i; 6887c478bd9Sstevel@tonic-gate uint_t opts = 0; 6897c478bd9Sstevel@tonic-gate uint_t paddr = 0; 6907c478bd9Sstevel@tonic-gate in_port_t lport, fport; 6917c478bd9Sstevel@tonic-gate 6927c478bd9Sstevel@tonic-gate if (!(flags & DCMD_ADDRSPEC)) 6937c478bd9Sstevel@tonic-gate return (DCMD_USAGE); 6947c478bd9Sstevel@tonic-gate 695bd670b35SErik Nordmark if (mdb_vread(&sctps, sizeof (sctps), addr) == -1) { 6967c478bd9Sstevel@tonic-gate mdb_warn("failed to read sctp_t at: %p\n", addr); 6977c478bd9Sstevel@tonic-gate return (DCMD_ERR); 6987c478bd9Sstevel@tonic-gate } 699bd670b35SErik Nordmark sctp = &sctps; 700bd670b35SErik Nordmark 701bd670b35SErik Nordmark if (mdb_vread(&conns, sizeof (conns), 702bd670b35SErik Nordmark (uintptr_t)sctp->sctp_connp) == -1) { 703bd670b35SErik Nordmark mdb_warn("failed to read conn_t at: %p\n", sctp->sctp_connp); 7047c478bd9Sstevel@tonic-gate return (DCMD_ERR); 7057c478bd9Sstevel@tonic-gate } 7067c478bd9Sstevel@tonic-gate 707bd670b35SErik Nordmark connp = &conns; 708bd670b35SErik Nordmark 709bd670b35SErik Nordmark connp->conn_sctp = sctp; 710bd670b35SErik Nordmark sctp->sctp_connp = connp; 711bd670b35SErik Nordmark 7127c478bd9Sstevel@tonic-gate if (mdb_getopts(argc, argv, 7137c478bd9Sstevel@tonic-gate 'a', MDB_OPT_SETBITS, MDB_SCTP_SHOW_ALL, &opts, 7147c478bd9Sstevel@tonic-gate 'f', MDB_OPT_SETBITS, MDB_SCTP_SHOW_FLAGS, &opts, 7157c478bd9Sstevel@tonic-gate 'h', MDB_OPT_SETBITS, MDB_SCTP_SHOW_HASH, &opts, 7167c478bd9Sstevel@tonic-gate 'o', MDB_OPT_SETBITS, MDB_SCTP_SHOW_OUT, &opts, 7177c478bd9Sstevel@tonic-gate 'i', MDB_OPT_SETBITS, MDB_SCTP_SHOW_IN, &opts, 7187c478bd9Sstevel@tonic-gate 'm', MDB_OPT_SETBITS, MDB_SCTP_SHOW_MISC, &opts, 7197c478bd9Sstevel@tonic-gate 'r', MDB_OPT_SETBITS, MDB_SCTP_SHOW_RTT, &opts, 7207c478bd9Sstevel@tonic-gate 'S', MDB_OPT_SETBITS, MDB_SCTP_SHOW_STATS, &opts, 7217c478bd9Sstevel@tonic-gate 'F', MDB_OPT_SETBITS, MDB_SCTP_SHOW_FLOW, &opts, 7227c478bd9Sstevel@tonic-gate 'H', MDB_OPT_SETBITS, MDB_SCTP_SHOW_HDR, &opts, 7237c478bd9Sstevel@tonic-gate 'p', MDB_OPT_SETBITS, MDB_SCTP_SHOW_PMTUD, &opts, 7247c478bd9Sstevel@tonic-gate 'R', MDB_OPT_SETBITS, MDB_SCTP_SHOW_RXT, &opts, 7257c478bd9Sstevel@tonic-gate 'C', MDB_OPT_SETBITS, MDB_SCTP_SHOW_CONN, &opts, 7267c478bd9Sstevel@tonic-gate 'c', MDB_OPT_SETBITS, MDB_SCTP_SHOW_CLOSE, &opts, 7277c478bd9Sstevel@tonic-gate 'e', MDB_OPT_SETBITS, MDB_SCTP_SHOW_EXT, &opts, 7287c478bd9Sstevel@tonic-gate 'P', MDB_OPT_SETBITS, 1, &paddr, 7297c478bd9Sstevel@tonic-gate 'd', MDB_OPT_SETBITS, MDB_SCTP_DUMP_ADDRS, &opts) != argc) { 7307c478bd9Sstevel@tonic-gate return (DCMD_USAGE); 7317c478bd9Sstevel@tonic-gate } 7327c478bd9Sstevel@tonic-gate 7337c478bd9Sstevel@tonic-gate /* non-verbose faddrs, suitable for pipelines to sctp_faddr */ 7347c478bd9Sstevel@tonic-gate if (paddr != 0) { 7357c478bd9Sstevel@tonic-gate sctp_faddr_t faddr, *fp; 7366be61d4eSchandrasekar marimuthu - Sun Microsystems - Bangalore India for (fp = sctp->sctp_faddrs; fp != NULL; fp = faddr.sf_next) { 7377c478bd9Sstevel@tonic-gate if (mdb_vread(&faddr, sizeof (faddr), (uintptr_t)fp) 7387c478bd9Sstevel@tonic-gate == -1) { 7397c478bd9Sstevel@tonic-gate mdb_warn("failed to read faddr at %p", 7407c478bd9Sstevel@tonic-gate fp); 7417c478bd9Sstevel@tonic-gate return (DCMD_ERR); 7427c478bd9Sstevel@tonic-gate } 7437c478bd9Sstevel@tonic-gate mdb_printf("%p\n", fp); 7447c478bd9Sstevel@tonic-gate } 7457c478bd9Sstevel@tonic-gate return (DCMD_OK); 7467c478bd9Sstevel@tonic-gate } 7477c478bd9Sstevel@tonic-gate 748bd670b35SErik Nordmark mdb_nhconvert(&lport, &connp->conn_lport, sizeof (lport)); 749bd670b35SErik Nordmark mdb_nhconvert(&fport, &connp->conn_fport, sizeof (fport)); 750f4b3ec61Sdh155122 mdb_printf("%<u>%p% %22s S=%-6hu D=%-6hu% STACK=%d ZONE=%d%</u>", addr, 751bd670b35SErik Nordmark state2str(sctp), lport, fport, 752bd670b35SErik Nordmark ns_to_stackid((uintptr_t)connp->conn_netstack), connp->conn_zoneid); 7537c478bd9Sstevel@tonic-gate 754bd670b35SErik Nordmark if (sctp->sctp_faddrs) { 7557c478bd9Sstevel@tonic-gate sctp_faddr_t faddr; 7567c478bd9Sstevel@tonic-gate if (mdb_vread(&faddr, sizeof (faddr), 757bd670b35SErik Nordmark (uintptr_t)sctp->sctp_faddrs) != -1) 7586be61d4eSchandrasekar marimuthu - Sun Microsystems - Bangalore India mdb_printf("%<u> %N%</u>", &faddr.sf_faddr); 7597c478bd9Sstevel@tonic-gate } 7607c478bd9Sstevel@tonic-gate mdb_printf("\n"); 7617c478bd9Sstevel@tonic-gate 7627c478bd9Sstevel@tonic-gate if (opts & MDB_SCTP_DUMP_ADDRS) { 7637c478bd9Sstevel@tonic-gate mdb_printf("%<b>Local and Peer Addresses%</b>\n"); 7647c478bd9Sstevel@tonic-gate 7657c478bd9Sstevel@tonic-gate /* Display source addresses */ 766bd670b35SErik Nordmark mdb_printf("nsaddrs\t\t%?d\n", sctp->sctp_nsaddrs); 7677c478bd9Sstevel@tonic-gate (void) mdb_pwalk("sctp_walk_saddr", print_saddr, NULL, addr); 7687c478bd9Sstevel@tonic-gate 7697c478bd9Sstevel@tonic-gate /* Display peer addresses */ 770bd670b35SErik Nordmark mdb_printf("nfaddrs\t\t%?d\n", sctp->sctp_nfaddrs); 7717c478bd9Sstevel@tonic-gate i = 1; 7727c478bd9Sstevel@tonic-gate (void) mdb_pwalk("sctp_walk_faddr", print_faddr, &i, addr); 7737c478bd9Sstevel@tonic-gate 7747c478bd9Sstevel@tonic-gate mdb_printf("lastfaddr\t%?p\tprimary\t\t%?p\n", 775bd670b35SErik Nordmark sctp->sctp_lastfaddr, sctp->sctp_primary); 7767c478bd9Sstevel@tonic-gate mdb_printf("current\t\t%?p\tlastdata\t%?p\n", 777bd670b35SErik Nordmark sctp->sctp_current, sctp->sctp_lastdata); 7787c478bd9Sstevel@tonic-gate } 7797c478bd9Sstevel@tonic-gate 7807c478bd9Sstevel@tonic-gate if (opts & MDB_SCTP_SHOW_OUT) { 7817c478bd9Sstevel@tonic-gate mdb_printf("%<b>Outbound Data%</b>\n"); 7827c478bd9Sstevel@tonic-gate mdb_printf("xmit_head\t%?p\txmit_tail\t%?p\n", 783bd670b35SErik Nordmark sctp->sctp_xmit_head, sctp->sctp_xmit_tail); 7847c478bd9Sstevel@tonic-gate mdb_printf("xmit_unsent\t%?p\txmit_unsent_tail%?p\n", 785bd670b35SErik Nordmark sctp->sctp_xmit_unsent, sctp->sctp_xmit_unsent_tail); 786bd670b35SErik Nordmark mdb_printf("xmit_unacked\t%?p\n", sctp->sctp_xmit_unacked); 7877c478bd9Sstevel@tonic-gate mdb_printf("unacked\t\t%?u\tunsent\t\t%?ld\n", 788bd670b35SErik Nordmark sctp->sctp_unacked, sctp->sctp_unsent); 7897c478bd9Sstevel@tonic-gate mdb_printf("ltsn\t\t%?x\tlastack_rxd\t%?x\n", 790bd670b35SErik Nordmark sctp->sctp_ltsn, sctp->sctp_lastack_rxd); 7917c478bd9Sstevel@tonic-gate mdb_printf("recovery_tsn\t%?x\tadv_pap\t\t%?x\n", 792bd670b35SErik Nordmark sctp->sctp_recovery_tsn, sctp->sctp_adv_pap); 7937c478bd9Sstevel@tonic-gate mdb_printf("num_ostr\t%?hu\tostrcntrs\t%?p\n", 794bd670b35SErik Nordmark sctp->sctp_num_ostr, sctp->sctp_ostrcntrs); 7957f093707Skcpoon mdb_printf("pad_mp\t\t%?p\terr_chunks\t%?p\n", 796bd670b35SErik Nordmark sctp->sctp_pad_mp, sctp->sctp_err_chunks); 797bd670b35SErik Nordmark mdb_printf("err_len\t\t%?u\n", sctp->sctp_err_len); 7987c478bd9Sstevel@tonic-gate 7997c478bd9Sstevel@tonic-gate mdb_printf("%<b>Default Send Parameters%</b>\n"); 8007c478bd9Sstevel@tonic-gate mdb_printf("def_stream\t%?u\tdef_flags\t%?x\n", 801bd670b35SErik Nordmark sctp->sctp_def_stream, sctp->sctp_def_flags); 8027c478bd9Sstevel@tonic-gate mdb_printf("def_ppid\t%?x\tdef_context\t%?x\n", 803bd670b35SErik Nordmark sctp->sctp_def_ppid, sctp->sctp_def_context); 8047c478bd9Sstevel@tonic-gate mdb_printf("def_timetolive\t%?u\n", 805bd670b35SErik Nordmark sctp->sctp_def_timetolive); 8067c478bd9Sstevel@tonic-gate } 8077c478bd9Sstevel@tonic-gate 8087c478bd9Sstevel@tonic-gate if (opts & MDB_SCTP_SHOW_IN) { 8097c478bd9Sstevel@tonic-gate mdb_printf("%<b>Inbound Data%</b>\n"); 8107c478bd9Sstevel@tonic-gate mdb_printf("sack_info\t%?p\tsack_gaps\t%?d\n", 811bd670b35SErik Nordmark sctp->sctp_sack_info, sctp->sctp_sack_gaps); 812bd670b35SErik Nordmark dump_sack_info((uintptr_t)sctp->sctp_sack_info); 8137c478bd9Sstevel@tonic-gate mdb_printf("ftsn\t\t%?x\tlastacked\t%?x\n", 814bd670b35SErik Nordmark sctp->sctp_ftsn, sctp->sctp_lastacked); 8157c478bd9Sstevel@tonic-gate mdb_printf("istr_nmsgs\t%?d\tsack_toggle\t%?d\n", 816bd670b35SErik Nordmark sctp->sctp_istr_nmsgs, sctp->sctp_sack_toggle); 817bd670b35SErik Nordmark mdb_printf("ack_mp\t\t%?p\n", sctp->sctp_ack_mp); 8187c478bd9Sstevel@tonic-gate mdb_printf("num_istr\t%?hu\tinstr\t\t%?p\n", 819bd670b35SErik Nordmark sctp->sctp_num_istr, sctp->sctp_instr); 820bd670b35SErik Nordmark mdb_printf("unord_reass\t%?p\n", sctp->sctp_uo_frags); 8217c478bd9Sstevel@tonic-gate } 8227c478bd9Sstevel@tonic-gate 8237c478bd9Sstevel@tonic-gate if (opts & MDB_SCTP_SHOW_RTT) { 8247c478bd9Sstevel@tonic-gate mdb_printf("%<b>RTT Tracking%</b>\n"); 8257c478bd9Sstevel@tonic-gate mdb_printf("rtt_tsn\t\t%?x\tout_time\t%?ld\n", 826bd670b35SErik Nordmark sctp->sctp_rtt_tsn, sctp->sctp_out_time); 8277c478bd9Sstevel@tonic-gate } 8287c478bd9Sstevel@tonic-gate 8297c478bd9Sstevel@tonic-gate if (opts & MDB_SCTP_SHOW_FLOW) { 8307c478bd9Sstevel@tonic-gate mdb_printf("%<b>Flow Control%</b>\n"); 831bd670b35SErik Nordmark mdb_printf("tconn_sndbuf\t%?d\n" 832bd670b35SErik Nordmark "conn_sndlowat\t%?d\tfrwnd\t\t%?u\n" 833*a215d4ebSKacheong Poon "rwnd\t\t%?u\tlast advertised rwnd\t%?u\n" 834bd670b35SErik Nordmark "rxqueued\t%?u\tcwnd_max\t%?u\n", connp->conn_sndbuf, 835bd670b35SErik Nordmark connp->conn_sndlowat, sctp->sctp_frwnd, 836*a215d4ebSKacheong Poon sctp->sctp_rwnd, sctp->sctp_arwnd, sctp->sctp_rxqueued, 837bd670b35SErik Nordmark sctp->sctp_cwnd_max); 8387c478bd9Sstevel@tonic-gate } 8397c478bd9Sstevel@tonic-gate 8407c478bd9Sstevel@tonic-gate if (opts & MDB_SCTP_SHOW_HDR) { 8417c478bd9Sstevel@tonic-gate mdb_printf("%<b>Composite Headers%</b>\n"); 8427c478bd9Sstevel@tonic-gate mdb_printf("iphc\t\t%?p\tiphc6\t\t%?p\n" 8437c478bd9Sstevel@tonic-gate "iphc_len\t%?d\tiphc6_len\t%?d\n" 8447c478bd9Sstevel@tonic-gate "hdr_len\t\t%?d\thdr6_len\t%?d\n" 8457c478bd9Sstevel@tonic-gate "ipha\t\t%?p\tip6h\t\t%?p\n" 8467c478bd9Sstevel@tonic-gate "ip_hdr_len\t%?d\tip_hdr6_len\t%?d\n" 8477c478bd9Sstevel@tonic-gate "sctph\t\t%?p\tsctph6\t\t%?p\n" 848bd670b35SErik Nordmark "lvtag\t\t%?x\tfvtag\t\t%?x\n", sctp->sctp_iphc, 849bd670b35SErik Nordmark sctp->sctp_iphc6, sctp->sctp_iphc_len, 850bd670b35SErik Nordmark sctp->sctp_iphc6_len, sctp->sctp_hdr_len, 851bd670b35SErik Nordmark sctp->sctp_hdr6_len, sctp->sctp_ipha, sctp->sctp_ip6h, 852bd670b35SErik Nordmark sctp->sctp_ip_hdr_len, sctp->sctp_ip_hdr6_len, 853bd670b35SErik Nordmark sctp->sctp_sctph, sctp->sctp_sctph6, sctp->sctp_lvtag, 854bd670b35SErik Nordmark sctp->sctp_fvtag); 8557c478bd9Sstevel@tonic-gate } 8567c478bd9Sstevel@tonic-gate 8577c478bd9Sstevel@tonic-gate if (opts & MDB_SCTP_SHOW_PMTUD) { 8587c478bd9Sstevel@tonic-gate mdb_printf("%<b>PMTUd%</b>\n"); 8597c478bd9Sstevel@tonic-gate mdb_printf("last_mtu_probe\t%?ld\tmtu_probe_intvl\t%?ld\n" 8607c478bd9Sstevel@tonic-gate "mss\t\t%?u\n", 861bd670b35SErik Nordmark sctp->sctp_last_mtu_probe, sctp->sctp_mtu_probe_intvl, 862bd670b35SErik Nordmark sctp->sctp_mss); 8637c478bd9Sstevel@tonic-gate } 8647c478bd9Sstevel@tonic-gate 8657c478bd9Sstevel@tonic-gate if (opts & MDB_SCTP_SHOW_RXT) { 8667c478bd9Sstevel@tonic-gate mdb_printf("%<b>Retransmit Info%</b>\n"); 8677c478bd9Sstevel@tonic-gate mdb_printf("cookie_mp\t%?p\tstrikes\t\t%?d\n" 8687c478bd9Sstevel@tonic-gate "max_init_rxt\t%?d\tpa_max_rxt\t%?d\n" 8697c478bd9Sstevel@tonic-gate "pp_max_rxt\t%?d\trto_max\t\t%?u\n" 8707c478bd9Sstevel@tonic-gate "rto_min\t\t%?u\trto_initial\t%?u\n" 87177c67f2fSkcpoon "init_rto_max\t%?u\n" 872bd670b35SErik Nordmark "rxt_nxttsn\t%?u\trxt_maxtsn\t%?u\n", sctp->sctp_cookie_mp, 873bd670b35SErik Nordmark sctp->sctp_strikes, sctp->sctp_max_init_rxt, 874bd670b35SErik Nordmark sctp->sctp_pa_max_rxt, sctp->sctp_pp_max_rxt, 875bd670b35SErik Nordmark sctp->sctp_rto_max, sctp->sctp_rto_min, 876fd7b5aedSGeorge Shepherd sctp->sctp_rto_initial, sctp->sctp_rto_max_init, 877bd670b35SErik Nordmark sctp->sctp_rxt_nxttsn, sctp->sctp_rxt_maxtsn); 8787c478bd9Sstevel@tonic-gate } 8797c478bd9Sstevel@tonic-gate 8807c478bd9Sstevel@tonic-gate if (opts & MDB_SCTP_SHOW_CONN) { 8817c478bd9Sstevel@tonic-gate mdb_printf("%<b>Connection State%</b>\n"); 8827c478bd9Sstevel@tonic-gate mdb_printf("last_secret_update%?ld\n", 883bd670b35SErik Nordmark sctp->sctp_last_secret_update); 8847c478bd9Sstevel@tonic-gate 8857c478bd9Sstevel@tonic-gate mdb_printf("secret\t\t"); 8867c478bd9Sstevel@tonic-gate for (i = 0; i < SCTP_SECRET_LEN; i++) { 8877c478bd9Sstevel@tonic-gate if (i % 2 == 0) 888bd670b35SErik Nordmark mdb_printf("0x%02x", sctp->sctp_secret[i]); 8897c478bd9Sstevel@tonic-gate else 890bd670b35SErik Nordmark mdb_printf("%02x ", sctp->sctp_secret[i]); 8917c478bd9Sstevel@tonic-gate } 8927c478bd9Sstevel@tonic-gate mdb_printf("\n"); 8937c478bd9Sstevel@tonic-gate mdb_printf("old_secret\t"); 8947c478bd9Sstevel@tonic-gate for (i = 0; i < SCTP_SECRET_LEN; i++) { 8957c478bd9Sstevel@tonic-gate if (i % 2 == 0) 896bd670b35SErik Nordmark mdb_printf("0x%02x", sctp->sctp_old_secret[i]); 8977c478bd9Sstevel@tonic-gate else 898bd670b35SErik Nordmark mdb_printf("%02x ", sctp->sctp_old_secret[i]); 8997c478bd9Sstevel@tonic-gate } 9007c478bd9Sstevel@tonic-gate mdb_printf("\n"); 9017c478bd9Sstevel@tonic-gate } 9027c478bd9Sstevel@tonic-gate 9037c478bd9Sstevel@tonic-gate if (opts & MDB_SCTP_SHOW_STATS) { 9047c478bd9Sstevel@tonic-gate mdb_printf("%<b>Stats Counters%</b>\n"); 9057c478bd9Sstevel@tonic-gate mdb_printf("opkts\t\t%?llu\tobchunks\t%?llu\n" 9067c478bd9Sstevel@tonic-gate "odchunks\t%?llu\toudchunks\t%?llu\n" 9077c478bd9Sstevel@tonic-gate "rxtchunks\t%?llu\tT1expire\t%?lu\n" 9087c478bd9Sstevel@tonic-gate "T2expire\t%?lu\tT3expire\t%?lu\n" 9097c478bd9Sstevel@tonic-gate "msgcount\t%?llu\tprsctpdrop\t%?llu\n" 9107c478bd9Sstevel@tonic-gate "AssocStartTime\t%?lu\n", 911bd670b35SErik Nordmark sctp->sctp_opkts, sctp->sctp_obchunks, 912bd670b35SErik Nordmark sctp->sctp_odchunks, sctp->sctp_oudchunks, 913bd670b35SErik Nordmark sctp->sctp_rxtchunks, sctp->sctp_T1expire, 914bd670b35SErik Nordmark sctp->sctp_T2expire, sctp->sctp_T3expire, 915bd670b35SErik Nordmark sctp->sctp_msgcount, sctp->sctp_prsctpdrop, 916bd670b35SErik Nordmark sctp->sctp_assoc_start_time); 9177c478bd9Sstevel@tonic-gate mdb_printf("ipkts\t\t%?llu\tibchunks\t%?llu\n" 9187c478bd9Sstevel@tonic-gate "idchunks\t%?llu\tiudchunks\t%?llu\n" 9197c478bd9Sstevel@tonic-gate "fragdmsgs\t%?llu\treassmsgs\t%?llu\n", 920bd670b35SErik Nordmark sctp->sctp_ipkts, sctp->sctp_ibchunks, 921bd670b35SErik Nordmark sctp->sctp_idchunks, sctp->sctp_iudchunks, 922bd670b35SErik Nordmark sctp->sctp_fragdmsgs, sctp->sctp_reassmsgs); 9237c478bd9Sstevel@tonic-gate } 9247c478bd9Sstevel@tonic-gate 9257c478bd9Sstevel@tonic-gate if (opts & MDB_SCTP_SHOW_HASH) { 9267c478bd9Sstevel@tonic-gate mdb_printf("%<b>Hash Tables%</b>\n"); 927bd670b35SErik Nordmark mdb_printf("conn_hash_next\t%?p\t", sctp->sctp_conn_hash_next); 928bd670b35SErik Nordmark mdb_printf("conn_hash_prev\t%?p\n", sctp->sctp_conn_hash_prev); 9297c478bd9Sstevel@tonic-gate 9307c478bd9Sstevel@tonic-gate mdb_printf("listen_hash_next%?p\t", 931bd670b35SErik Nordmark sctp->sctp_listen_hash_next); 9327c478bd9Sstevel@tonic-gate mdb_printf("listen_hash_prev%?p\n", 933bd670b35SErik Nordmark sctp->sctp_listen_hash_prev); 934bd670b35SErik Nordmark mdb_nhconvert(&lport, &connp->conn_lport, sizeof (lport)); 9357c478bd9Sstevel@tonic-gate mdb_printf("[ listen_hash bucket\t%?d ]\n", 9367c478bd9Sstevel@tonic-gate SCTP_LISTEN_HASH(lport)); 9377c478bd9Sstevel@tonic-gate 938bd670b35SErik Nordmark mdb_printf("conn_tfp\t%?p\t", sctp->sctp_conn_tfp); 939bd670b35SErik Nordmark mdb_printf("listen_tfp\t%?p\n", sctp->sctp_listen_tfp); 9407c478bd9Sstevel@tonic-gate 9417c478bd9Sstevel@tonic-gate mdb_printf("bind_hash\t%?p\tptpbhn\t\t%?p\n", 942bd670b35SErik Nordmark sctp->sctp_bind_hash, sctp->sctp_ptpbhn); 9437c478bd9Sstevel@tonic-gate mdb_printf("bind_lockp\t%?p\n", 944bd670b35SErik Nordmark sctp->sctp_bind_lockp); 9457c478bd9Sstevel@tonic-gate mdb_printf("[ bind_hash bucket\t%?d ]\n", 9467c478bd9Sstevel@tonic-gate SCTP_BIND_HASH(lport)); 9477c478bd9Sstevel@tonic-gate } 9487c478bd9Sstevel@tonic-gate 9497c478bd9Sstevel@tonic-gate if (opts & MDB_SCTP_SHOW_CLOSE) { 9507c478bd9Sstevel@tonic-gate mdb_printf("%<b>Cleanup / Close%</b>\n"); 9517c478bd9Sstevel@tonic-gate mdb_printf("shutdown_faddr\t%?p\tclient_errno\t%?d\n" 9527c478bd9Sstevel@tonic-gate "lingertime\t%?d\trefcnt\t\t%?hu\n", 953bd670b35SErik Nordmark sctp->sctp_shutdown_faddr, sctp->sctp_client_errno, 954bd670b35SErik Nordmark connp->conn_lingertime, sctp->sctp_refcnt); 9557c478bd9Sstevel@tonic-gate } 9567c478bd9Sstevel@tonic-gate 9577c478bd9Sstevel@tonic-gate if (opts & MDB_SCTP_SHOW_MISC) { 9587c478bd9Sstevel@tonic-gate mdb_printf("%<b>Miscellaneous%</b>\n"); 9597c478bd9Sstevel@tonic-gate mdb_printf("bound_if\t%?u\theartbeat_mp\t%?p\n" 9607c478bd9Sstevel@tonic-gate "family\t\t%?u\tipversion\t%?hu\n" 9617c478bd9Sstevel@tonic-gate "hb_interval\t%?u\tautoclose\t%?d\n" 962558fbd03Skcpoon "active\t\t%?ld\ttx_adaptation_code%?x\n" 963558fbd03Skcpoon "rx_adaptation_code%?x\ttimer_mp\t%?p\n" 9647d546a59Svi117747 "partial_delivery_point\t%?d\n", 965bd670b35SErik Nordmark connp->conn_bound_if, sctp->sctp_heartbeat_mp, 966bd670b35SErik Nordmark connp->conn_family, 967bd670b35SErik Nordmark connp->conn_ipversion, 968bd670b35SErik Nordmark sctp->sctp_hb_interval, sctp->sctp_autoclose, 969bd670b35SErik Nordmark sctp->sctp_active, sctp->sctp_tx_adaptation_code, 970bd670b35SErik Nordmark sctp->sctp_rx_adaptation_code, sctp->sctp_timer_mp, 971bd670b35SErik Nordmark sctp->sctp_pd_point); 9727c478bd9Sstevel@tonic-gate } 9737c478bd9Sstevel@tonic-gate 9747c478bd9Sstevel@tonic-gate if (opts & MDB_SCTP_SHOW_EXT) { 9757c478bd9Sstevel@tonic-gate mdb_printf("%<b>Extensions and Reliable Ctl Chunks%</b>\n"); 9767c478bd9Sstevel@tonic-gate mdb_printf("cxmit_list\t%?p\tlcsn\t\t%?x\n" 977bd670b35SErik Nordmark "fcsn\t\t%?x\n", sctp->sctp_cxmit_list, sctp->sctp_lcsn, 978bd670b35SErik Nordmark sctp->sctp_fcsn); 9797c478bd9Sstevel@tonic-gate } 9807c478bd9Sstevel@tonic-gate 9817c478bd9Sstevel@tonic-gate if (opts & MDB_SCTP_SHOW_FLAGS) { 9827c478bd9Sstevel@tonic-gate mdb_printf("%<b>Flags%</b>\n"); 983bd670b35SErik Nordmark show_sctp_flags(sctp); 9847c478bd9Sstevel@tonic-gate } 9857c478bd9Sstevel@tonic-gate 9867c478bd9Sstevel@tonic-gate return (DCMD_OK); 9877c478bd9Sstevel@tonic-gate } 9887c478bd9Sstevel@tonic-gate 9897c478bd9Sstevel@tonic-gate typedef struct fanout_walk_data { 9907c478bd9Sstevel@tonic-gate int index; 9917c478bd9Sstevel@tonic-gate int size; 9927c478bd9Sstevel@tonic-gate uintptr_t sctp; 9937c478bd9Sstevel@tonic-gate sctp_tf_t *fanout; 9947c478bd9Sstevel@tonic-gate uintptr_t (*getnext)(sctp_t *); 9957c478bd9Sstevel@tonic-gate } fanout_walk_data_t; 9967c478bd9Sstevel@tonic-gate 9977c478bd9Sstevel@tonic-gate typedef struct fanout_init { 998f4b3ec61Sdh155122 const char *nested_walker_name; 999f4b3ec61Sdh155122 size_t offset; /* for what used to be a symbol */ 1000f4b3ec61Sdh155122 int (*getsize)(sctp_stack_t *); 10017c478bd9Sstevel@tonic-gate uintptr_t (*getnext)(sctp_t *); 10027c478bd9Sstevel@tonic-gate } fanout_init_t; 10037c478bd9Sstevel@tonic-gate 10047c478bd9Sstevel@tonic-gate static uintptr_t 10057c478bd9Sstevel@tonic-gate listen_next(sctp_t *sctp) 10067c478bd9Sstevel@tonic-gate { 10077c478bd9Sstevel@tonic-gate return ((uintptr_t)sctp->sctp_listen_hash_next); 10087c478bd9Sstevel@tonic-gate } 10097c478bd9Sstevel@tonic-gate 1010f4b3ec61Sdh155122 /* ARGSUSED */ 10117c478bd9Sstevel@tonic-gate static int 1012f4b3ec61Sdh155122 listen_size(sctp_stack_t *sctps) 10137c478bd9Sstevel@tonic-gate { 10147c478bd9Sstevel@tonic-gate return (SCTP_LISTEN_FANOUT_SIZE); 10157c478bd9Sstevel@tonic-gate } 10167c478bd9Sstevel@tonic-gate 10177c478bd9Sstevel@tonic-gate static uintptr_t 10187c478bd9Sstevel@tonic-gate conn_next(sctp_t *sctp) 10197c478bd9Sstevel@tonic-gate { 10207c478bd9Sstevel@tonic-gate return ((uintptr_t)sctp->sctp_conn_hash_next); 10217c478bd9Sstevel@tonic-gate } 10227c478bd9Sstevel@tonic-gate 10237c478bd9Sstevel@tonic-gate static int 1024f4b3ec61Sdh155122 conn_size(sctp_stack_t *sctps) 10257c478bd9Sstevel@tonic-gate { 10267c478bd9Sstevel@tonic-gate int size; 1027f4b3ec61Sdh155122 uintptr_t kaddr; 10287c478bd9Sstevel@tonic-gate 1029f4b3ec61Sdh155122 kaddr = (uintptr_t)&sctps->sctps_conn_hash_size; 1030f4b3ec61Sdh155122 1031f4b3ec61Sdh155122 if (mdb_vread(&size, sizeof (size), kaddr) == -1) { 1032f4b3ec61Sdh155122 mdb_warn("can't read 'sctps_conn_hash_size' at %p", kaddr); 10337c478bd9Sstevel@tonic-gate return (1); 10347c478bd9Sstevel@tonic-gate } 10357c478bd9Sstevel@tonic-gate return (size); 10367c478bd9Sstevel@tonic-gate } 10377c478bd9Sstevel@tonic-gate 10387c478bd9Sstevel@tonic-gate static uintptr_t 10397c478bd9Sstevel@tonic-gate bind_next(sctp_t *sctp) 10407c478bd9Sstevel@tonic-gate { 10417c478bd9Sstevel@tonic-gate return ((uintptr_t)sctp->sctp_bind_hash); 10427c478bd9Sstevel@tonic-gate } 10437c478bd9Sstevel@tonic-gate 1044f4b3ec61Sdh155122 /* ARGSUSED */ 10457c478bd9Sstevel@tonic-gate static int 1046f4b3ec61Sdh155122 bind_size(sctp_stack_t *sctps) 10477c478bd9Sstevel@tonic-gate { 10487c478bd9Sstevel@tonic-gate return (SCTP_BIND_FANOUT_SIZE); 10497c478bd9Sstevel@tonic-gate } 10507c478bd9Sstevel@tonic-gate 10517c478bd9Sstevel@tonic-gate static intptr_t 10527c478bd9Sstevel@tonic-gate find_next_hash_item(fanout_walk_data_t *fw) 10537c478bd9Sstevel@tonic-gate { 10547c478bd9Sstevel@tonic-gate sctp_tf_t tf; 10557c478bd9Sstevel@tonic-gate sctp_t sctp; 10567c478bd9Sstevel@tonic-gate 10577c478bd9Sstevel@tonic-gate /* first try to continue down the hash chain */ 10587c478bd9Sstevel@tonic-gate if (fw->sctp != NULL) { 10597c478bd9Sstevel@tonic-gate /* try to get next in hash chain */ 10607c478bd9Sstevel@tonic-gate if (mdb_vread(&sctp, sizeof (sctp), fw->sctp) == -1) { 10617c478bd9Sstevel@tonic-gate mdb_warn("failed to read sctp at %p", fw->sctp); 10627c478bd9Sstevel@tonic-gate return (NULL); 10637c478bd9Sstevel@tonic-gate } 10647c478bd9Sstevel@tonic-gate fw->sctp = fw->getnext(&sctp); 10657c478bd9Sstevel@tonic-gate if (fw->sctp != NULL) 10667c478bd9Sstevel@tonic-gate return (fw->sctp); 10677c478bd9Sstevel@tonic-gate else 10687c478bd9Sstevel@tonic-gate /* end of chain; go to next bucket */ 10697c478bd9Sstevel@tonic-gate fw->index++; 10707c478bd9Sstevel@tonic-gate } 10717c478bd9Sstevel@tonic-gate 10727c478bd9Sstevel@tonic-gate /* find a new hash chain, traversing the buckets */ 10737c478bd9Sstevel@tonic-gate for (; fw->index < fw->size; fw->index++) { 10747c478bd9Sstevel@tonic-gate /* read the current hash line for an sctp */ 10757c478bd9Sstevel@tonic-gate if (mdb_vread(&tf, sizeof (tf), 10767c478bd9Sstevel@tonic-gate (uintptr_t)(fw->fanout + fw->index)) == -1) { 10777c478bd9Sstevel@tonic-gate mdb_warn("failed to read tf at %p", 10787c478bd9Sstevel@tonic-gate fw->fanout + fw->index); 10797c478bd9Sstevel@tonic-gate return (NULL); 10807c478bd9Sstevel@tonic-gate } 10817c478bd9Sstevel@tonic-gate if (tf.tf_sctp != NULL) { 10827c478bd9Sstevel@tonic-gate /* start of a new chain */ 10837c478bd9Sstevel@tonic-gate fw->sctp = (uintptr_t)tf.tf_sctp; 10847c478bd9Sstevel@tonic-gate return (fw->sctp); 10857c478bd9Sstevel@tonic-gate } 10867c478bd9Sstevel@tonic-gate } 10877c478bd9Sstevel@tonic-gate return (NULL); 10887c478bd9Sstevel@tonic-gate } 10897c478bd9Sstevel@tonic-gate 10907c478bd9Sstevel@tonic-gate static int 1091f4b3ec61Sdh155122 fanout_stack_walk_init(mdb_walk_state_t *wsp) 10927c478bd9Sstevel@tonic-gate { 10937c478bd9Sstevel@tonic-gate fanout_walk_data_t *lw; 10947c478bd9Sstevel@tonic-gate fanout_init_t *fi = wsp->walk_arg; 1095f4b3ec61Sdh155122 sctp_stack_t *sctps = (sctp_stack_t *)wsp->walk_addr; 1096f4b3ec61Sdh155122 uintptr_t kaddr; 10977c478bd9Sstevel@tonic-gate 1098f4b3ec61Sdh155122 if (mdb_vread(&kaddr, sizeof (kaddr), 1099f4b3ec61Sdh155122 wsp->walk_addr + fi->offset) == -1) { 1100f4b3ec61Sdh155122 mdb_warn("can't read sctp fanout at %p", 1101f4b3ec61Sdh155122 wsp->walk_addr + fi->offset); 11027c478bd9Sstevel@tonic-gate return (WALK_ERR); 11037c478bd9Sstevel@tonic-gate } 11047c478bd9Sstevel@tonic-gate 11057c478bd9Sstevel@tonic-gate lw = mdb_alloc(sizeof (*lw), UM_SLEEP); 11067c478bd9Sstevel@tonic-gate lw->index = 0; 1107f4b3ec61Sdh155122 lw->size = fi->getsize(sctps); 11087c478bd9Sstevel@tonic-gate lw->sctp = NULL; 1109f4b3ec61Sdh155122 lw->fanout = (sctp_tf_t *)kaddr; 11107c478bd9Sstevel@tonic-gate lw->getnext = fi->getnext; 11117c478bd9Sstevel@tonic-gate 11127c478bd9Sstevel@tonic-gate if ((wsp->walk_addr = find_next_hash_item(lw)) == NULL) { 11137c478bd9Sstevel@tonic-gate return (WALK_DONE); 11147c478bd9Sstevel@tonic-gate } 11157c478bd9Sstevel@tonic-gate wsp->walk_data = lw; 11167c478bd9Sstevel@tonic-gate return (WALK_NEXT); 11177c478bd9Sstevel@tonic-gate } 11187c478bd9Sstevel@tonic-gate 11197c478bd9Sstevel@tonic-gate static int 1120f4b3ec61Sdh155122 fanout_stack_walk_step(mdb_walk_state_t *wsp) 11217c478bd9Sstevel@tonic-gate { 11227c478bd9Sstevel@tonic-gate fanout_walk_data_t *fw = wsp->walk_data; 11237c478bd9Sstevel@tonic-gate uintptr_t addr = wsp->walk_addr; 11247c478bd9Sstevel@tonic-gate sctp_t sctp; 11257c478bd9Sstevel@tonic-gate int status; 11267c478bd9Sstevel@tonic-gate 11277c478bd9Sstevel@tonic-gate if (mdb_vread(&sctp, sizeof (sctp), addr) == -1) { 11287c478bd9Sstevel@tonic-gate mdb_warn("failed to read sctp at %p", addr); 11297c478bd9Sstevel@tonic-gate return (WALK_DONE); 11307c478bd9Sstevel@tonic-gate } 11317c478bd9Sstevel@tonic-gate 11327c478bd9Sstevel@tonic-gate status = wsp->walk_callback(addr, &sctp, wsp->walk_cbdata); 11337c478bd9Sstevel@tonic-gate if (status != WALK_NEXT) 11347c478bd9Sstevel@tonic-gate return (status); 11357c478bd9Sstevel@tonic-gate 11367c478bd9Sstevel@tonic-gate if ((wsp->walk_addr = find_next_hash_item(fw)) == NULL) 11377c478bd9Sstevel@tonic-gate return (WALK_DONE); 11387c478bd9Sstevel@tonic-gate 11397c478bd9Sstevel@tonic-gate return (WALK_NEXT); 11407c478bd9Sstevel@tonic-gate } 11417c478bd9Sstevel@tonic-gate 11427c478bd9Sstevel@tonic-gate static void 1143f4b3ec61Sdh155122 fanout_stack_walk_fini(mdb_walk_state_t *wsp) 11447c478bd9Sstevel@tonic-gate { 11457c478bd9Sstevel@tonic-gate fanout_walk_data_t *fw = wsp->walk_data; 11467c478bd9Sstevel@tonic-gate 11477c478bd9Sstevel@tonic-gate mdb_free(fw, sizeof (*fw)); 11487c478bd9Sstevel@tonic-gate } 11497c478bd9Sstevel@tonic-gate 1150f4b3ec61Sdh155122 int 1151f4b3ec61Sdh155122 fanout_walk_init(mdb_walk_state_t *wsp) 11527c478bd9Sstevel@tonic-gate { 1153f4b3ec61Sdh155122 if (mdb_layered_walk("sctp_stacks", wsp) == -1) { 1154f4b3ec61Sdh155122 mdb_warn("can't walk 'sctp_stacks'"); 11557c478bd9Sstevel@tonic-gate return (WALK_ERR); 11567c478bd9Sstevel@tonic-gate } 11577c478bd9Sstevel@tonic-gate 11587c478bd9Sstevel@tonic-gate return (WALK_NEXT); 11597c478bd9Sstevel@tonic-gate } 1160f4b3ec61Sdh155122 1161f4b3ec61Sdh155122 int 1162f4b3ec61Sdh155122 fanout_walk_step(mdb_walk_state_t *wsp) 1163f4b3ec61Sdh155122 { 1164f4b3ec61Sdh155122 fanout_init_t *fi = wsp->walk_arg; 1165f4b3ec61Sdh155122 1166f4b3ec61Sdh155122 if (mdb_pwalk(fi->nested_walker_name, wsp->walk_callback, 1167f4b3ec61Sdh155122 wsp->walk_cbdata, wsp->walk_addr) == -1) { 1168f4b3ec61Sdh155122 mdb_warn("couldn't walk '%s'for address %p", 1169f4b3ec61Sdh155122 fi->nested_walker_name, wsp->walk_addr); 1170f4b3ec61Sdh155122 return (WALK_ERR); 1171f4b3ec61Sdh155122 } 1172f4b3ec61Sdh155122 return (WALK_NEXT); 1173f4b3ec61Sdh155122 } 1174f4b3ec61Sdh155122 1175f4b3ec61Sdh155122 int 1176f4b3ec61Sdh155122 sctps_walk_init(mdb_walk_state_t *wsp) 1177f4b3ec61Sdh155122 { 1178f4b3ec61Sdh155122 1179f4b3ec61Sdh155122 if (mdb_layered_walk("sctp_stacks", wsp) == -1) { 1180f4b3ec61Sdh155122 mdb_warn("can't walk 'sctp_stacks'"); 1181f4b3ec61Sdh155122 return (WALK_ERR); 1182f4b3ec61Sdh155122 } 1183f4b3ec61Sdh155122 1184f4b3ec61Sdh155122 return (WALK_NEXT); 1185f4b3ec61Sdh155122 } 1186f4b3ec61Sdh155122 1187f4b3ec61Sdh155122 int 1188f4b3ec61Sdh155122 sctps_walk_step(mdb_walk_state_t *wsp) 1189f4b3ec61Sdh155122 { 1190f4b3ec61Sdh155122 uintptr_t kaddr; 1191f4b3ec61Sdh155122 1192f4b3ec61Sdh155122 kaddr = wsp->walk_addr + OFFSETOF(sctp_stack_t, sctps_g_list); 1193f4b3ec61Sdh155122 if (mdb_pwalk("list", wsp->walk_callback, 1194f4b3ec61Sdh155122 wsp->walk_cbdata, kaddr) == -1) { 1195f4b3ec61Sdh155122 mdb_warn("couldn't walk 'list' for address %p", kaddr); 1196f4b3ec61Sdh155122 return (WALK_ERR); 1197f4b3ec61Sdh155122 } 1198f4b3ec61Sdh155122 return (WALK_NEXT); 11997c478bd9Sstevel@tonic-gate } 12007c478bd9Sstevel@tonic-gate 12017c478bd9Sstevel@tonic-gate static int 12027c478bd9Sstevel@tonic-gate sctp_walk_faddr_init(mdb_walk_state_t *wsp) 12037c478bd9Sstevel@tonic-gate { 12047c478bd9Sstevel@tonic-gate sctp_t sctp; 12057c478bd9Sstevel@tonic-gate 12067c478bd9Sstevel@tonic-gate if (wsp->walk_addr == NULL) 12077c478bd9Sstevel@tonic-gate return (WALK_ERR); 12087c478bd9Sstevel@tonic-gate 12097c478bd9Sstevel@tonic-gate if (mdb_vread(&sctp, sizeof (sctp), wsp->walk_addr) == -1) { 12107c478bd9Sstevel@tonic-gate mdb_warn("failed to read sctp at %p", wsp->walk_addr); 12117c478bd9Sstevel@tonic-gate return (WALK_ERR); 12127c478bd9Sstevel@tonic-gate } 12137c478bd9Sstevel@tonic-gate if ((wsp->walk_addr = (uintptr_t)sctp.sctp_faddrs) != NULL) 12147c478bd9Sstevel@tonic-gate return (WALK_NEXT); 12157c478bd9Sstevel@tonic-gate else 12167c478bd9Sstevel@tonic-gate return (WALK_DONE); 12177c478bd9Sstevel@tonic-gate } 12187c478bd9Sstevel@tonic-gate 12197c478bd9Sstevel@tonic-gate static int 12207c478bd9Sstevel@tonic-gate sctp_walk_faddr_step(mdb_walk_state_t *wsp) 12217c478bd9Sstevel@tonic-gate { 12227c478bd9Sstevel@tonic-gate uintptr_t faddr_ptr = wsp->walk_addr; 12237c478bd9Sstevel@tonic-gate sctp_faddr_t sctp_faddr; 12247c478bd9Sstevel@tonic-gate int status; 12257c478bd9Sstevel@tonic-gate 12267c478bd9Sstevel@tonic-gate if (mdb_vread(&sctp_faddr, sizeof (sctp_faddr_t), faddr_ptr) == -1) { 12277c478bd9Sstevel@tonic-gate mdb_warn("failed to read sctp_faddr_t at %p", faddr_ptr); 12287c478bd9Sstevel@tonic-gate return (WALK_ERR); 12297c478bd9Sstevel@tonic-gate } 12307c478bd9Sstevel@tonic-gate status = wsp->walk_callback(faddr_ptr, &sctp_faddr, wsp->walk_cbdata); 12317c478bd9Sstevel@tonic-gate if (status != WALK_NEXT) 12327c478bd9Sstevel@tonic-gate return (status); 12336be61d4eSchandrasekar marimuthu - Sun Microsystems - Bangalore India if ((faddr_ptr = (uintptr_t)sctp_faddr.sf_next) == NULL) { 12347c478bd9Sstevel@tonic-gate return (WALK_DONE); 12357c478bd9Sstevel@tonic-gate } else { 12367c478bd9Sstevel@tonic-gate wsp->walk_addr = faddr_ptr; 12377c478bd9Sstevel@tonic-gate return (WALK_NEXT); 12387c478bd9Sstevel@tonic-gate } 12397c478bd9Sstevel@tonic-gate } 12407c478bd9Sstevel@tonic-gate 12417c478bd9Sstevel@tonic-gate /* 12427c478bd9Sstevel@tonic-gate * Helper structure for sctp_walk_saddr. It stores the sctp_t being walked, 12437c478bd9Sstevel@tonic-gate * the current index to the sctp_saddrs[], and the current count of the 12447c478bd9Sstevel@tonic-gate * sctp_saddr_ipif_t list. 12457c478bd9Sstevel@tonic-gate */ 12467c478bd9Sstevel@tonic-gate typedef struct { 12477c478bd9Sstevel@tonic-gate sctp_t sctp; 12487c478bd9Sstevel@tonic-gate int hash_index; 12497c478bd9Sstevel@tonic-gate int cur_cnt; 12507c478bd9Sstevel@tonic-gate } saddr_walk_t; 12517c478bd9Sstevel@tonic-gate 12527c478bd9Sstevel@tonic-gate static int 12537c478bd9Sstevel@tonic-gate sctp_walk_saddr_init(mdb_walk_state_t *wsp) 12547c478bd9Sstevel@tonic-gate { 12557c478bd9Sstevel@tonic-gate sctp_t *sctp; 12567c478bd9Sstevel@tonic-gate int i; 12577c478bd9Sstevel@tonic-gate saddr_walk_t *swalker; 12587c478bd9Sstevel@tonic-gate 12597c478bd9Sstevel@tonic-gate if (wsp->walk_addr == NULL) 12607c478bd9Sstevel@tonic-gate return (WALK_ERR); 12617c478bd9Sstevel@tonic-gate 12627c478bd9Sstevel@tonic-gate swalker = mdb_alloc(sizeof (saddr_walk_t), UM_SLEEP); 12637c478bd9Sstevel@tonic-gate sctp = &swalker->sctp; 12647c478bd9Sstevel@tonic-gate if (mdb_vread(sctp, sizeof (sctp_t), wsp->walk_addr) == -1) { 12657c478bd9Sstevel@tonic-gate mdb_warn("failed to read sctp at %p", wsp->walk_addr); 12667c478bd9Sstevel@tonic-gate mdb_free(swalker, sizeof (saddr_walk_t)); 12677c478bd9Sstevel@tonic-gate return (WALK_ERR); 12687c478bd9Sstevel@tonic-gate } 12697c478bd9Sstevel@tonic-gate 12707c478bd9Sstevel@tonic-gate /* Find the first source address. */ 12717c478bd9Sstevel@tonic-gate for (i = 0; i < SCTP_IPIF_HASH; i++) { 12727c478bd9Sstevel@tonic-gate if (sctp->sctp_saddrs[i].ipif_count > 0) { 12737c478bd9Sstevel@tonic-gate list_t *addr_list; 12747c478bd9Sstevel@tonic-gate 12757c478bd9Sstevel@tonic-gate addr_list = &sctp->sctp_saddrs[i].sctp_ipif_list; 12767c478bd9Sstevel@tonic-gate wsp->walk_addr = (uintptr_t)list_object(addr_list, 12777c478bd9Sstevel@tonic-gate addr_list->list_head.list_next); 12787c478bd9Sstevel@tonic-gate 12797c478bd9Sstevel@tonic-gate /* Recode the current info */ 12807c478bd9Sstevel@tonic-gate swalker->hash_index = i; 12817c478bd9Sstevel@tonic-gate swalker->cur_cnt = 1; 12827c478bd9Sstevel@tonic-gate wsp->walk_data = swalker; 12837c478bd9Sstevel@tonic-gate 12847c478bd9Sstevel@tonic-gate return (WALK_NEXT); 12857c478bd9Sstevel@tonic-gate } 12867c478bd9Sstevel@tonic-gate } 12877c478bd9Sstevel@tonic-gate return (WALK_DONE); 12887c478bd9Sstevel@tonic-gate } 12897c478bd9Sstevel@tonic-gate 12907c478bd9Sstevel@tonic-gate static int 12917c478bd9Sstevel@tonic-gate sctp_walk_saddr_step(mdb_walk_state_t *wsp) 12927c478bd9Sstevel@tonic-gate { 12937c478bd9Sstevel@tonic-gate uintptr_t saddr_ptr = wsp->walk_addr; 12947c478bd9Sstevel@tonic-gate sctp_saddr_ipif_t saddr; 12957c478bd9Sstevel@tonic-gate saddr_walk_t *swalker; 12967c478bd9Sstevel@tonic-gate sctp_t *sctp; 12977c478bd9Sstevel@tonic-gate int status; 12987c478bd9Sstevel@tonic-gate int i, j; 12997c478bd9Sstevel@tonic-gate 13007c478bd9Sstevel@tonic-gate if (mdb_vread(&saddr, sizeof (sctp_saddr_ipif_t), saddr_ptr) == -1) { 13017c478bd9Sstevel@tonic-gate mdb_warn("failed to read sctp_saddr_ipif_t at %p", saddr_ptr); 13027c478bd9Sstevel@tonic-gate return (WALK_ERR); 13037c478bd9Sstevel@tonic-gate } 13047c478bd9Sstevel@tonic-gate status = wsp->walk_callback(saddr_ptr, &saddr, wsp->walk_cbdata); 13057c478bd9Sstevel@tonic-gate if (status != WALK_NEXT) 13067c478bd9Sstevel@tonic-gate return (status); 13077c478bd9Sstevel@tonic-gate 13087c478bd9Sstevel@tonic-gate swalker = (saddr_walk_t *)wsp->walk_data; 13097c478bd9Sstevel@tonic-gate sctp = &swalker->sctp; 13107c478bd9Sstevel@tonic-gate i = swalker->hash_index; 13117c478bd9Sstevel@tonic-gate j = swalker->cur_cnt; 13127c478bd9Sstevel@tonic-gate 13137c478bd9Sstevel@tonic-gate /* 13147c478bd9Sstevel@tonic-gate * If there is still a source address in the current list, return it. 13157c478bd9Sstevel@tonic-gate * Otherwise, go to the next list in the sctp_saddrs[]. 13167c478bd9Sstevel@tonic-gate */ 13177c478bd9Sstevel@tonic-gate if (j++ < sctp->sctp_saddrs[i].ipif_count) { 13187c478bd9Sstevel@tonic-gate wsp->walk_addr = (uintptr_t)saddr.saddr_ipif.list_next; 13197c478bd9Sstevel@tonic-gate swalker->cur_cnt = j; 13207c478bd9Sstevel@tonic-gate return (WALK_NEXT); 13217c478bd9Sstevel@tonic-gate } else { 13227c478bd9Sstevel@tonic-gate list_t *lst; 13237c478bd9Sstevel@tonic-gate 13247c478bd9Sstevel@tonic-gate for (i = i + 1; i < SCTP_IPIF_HASH; i++) { 13257c478bd9Sstevel@tonic-gate if (sctp->sctp_saddrs[i].ipif_count > 0) { 13267c478bd9Sstevel@tonic-gate lst = &sctp->sctp_saddrs[i].sctp_ipif_list; 13277c478bd9Sstevel@tonic-gate wsp->walk_addr = (uintptr_t)list_object( 13287c478bd9Sstevel@tonic-gate lst, lst->list_head.list_next); 13297c478bd9Sstevel@tonic-gate swalker->hash_index = i; 13307c478bd9Sstevel@tonic-gate swalker->cur_cnt = 1; 13317c478bd9Sstevel@tonic-gate return (WALK_NEXT); 13327c478bd9Sstevel@tonic-gate } 13337c478bd9Sstevel@tonic-gate } 13347c478bd9Sstevel@tonic-gate } 13357c478bd9Sstevel@tonic-gate return (WALK_DONE); 13367c478bd9Sstevel@tonic-gate } 13377c478bd9Sstevel@tonic-gate 13387c478bd9Sstevel@tonic-gate static void 13397c478bd9Sstevel@tonic-gate sctp_walk_saddr_fini(mdb_walk_state_t *wsp) 13407c478bd9Sstevel@tonic-gate { 13417c478bd9Sstevel@tonic-gate saddr_walk_t *swalker = (saddr_walk_t *)wsp->walk_data; 13427c478bd9Sstevel@tonic-gate 13437c478bd9Sstevel@tonic-gate mdb_free(swalker, sizeof (saddr_walk_t)); 13447c478bd9Sstevel@tonic-gate } 13457c478bd9Sstevel@tonic-gate 1346f4b3ec61Sdh155122 1347f4b3ec61Sdh155122 typedef struct ill_walk_data { 1348f4b3ec61Sdh155122 sctp_ill_hash_t ills[SCTP_ILL_HASH]; 1349f4b3ec61Sdh155122 uint32_t count; 1350f4b3ec61Sdh155122 } ill_walk_data_t; 1351f4b3ec61Sdh155122 1352f4b3ec61Sdh155122 typedef struct ipuf_walk_data { 1353f4b3ec61Sdh155122 sctp_ipif_hash_t ipifs[SCTP_IPIF_HASH]; 1354f4b3ec61Sdh155122 uint32_t count; 1355f4b3ec61Sdh155122 } ipif_walk_data_t; 1356f4b3ec61Sdh155122 1357f4b3ec61Sdh155122 1358f4b3ec61Sdh155122 int 1359f4b3ec61Sdh155122 sctp_ill_walk_init(mdb_walk_state_t *wsp) 13607c478bd9Sstevel@tonic-gate { 1361f4b3ec61Sdh155122 if (mdb_layered_walk("sctp_stacks", wsp) == -1) { 1362f4b3ec61Sdh155122 mdb_warn("can't walk 'sctp_stacks'"); 1363f4b3ec61Sdh155122 return (WALK_ERR); 1364f4b3ec61Sdh155122 } 1365f4b3ec61Sdh155122 1366f4b3ec61Sdh155122 return (WALK_NEXT); 1367f4b3ec61Sdh155122 } 1368f4b3ec61Sdh155122 1369f4b3ec61Sdh155122 int 1370f4b3ec61Sdh155122 sctp_ill_walk_step(mdb_walk_state_t *wsp) 1371f4b3ec61Sdh155122 { 1372f4b3ec61Sdh155122 if (mdb_pwalk("sctp_stack_walk_ill", wsp->walk_callback, 1373f4b3ec61Sdh155122 wsp->walk_cbdata, wsp->walk_addr) == -1) { 1374f4b3ec61Sdh155122 mdb_warn("couldn't walk 'sctp_stack_walk_ill' for addr %p", 1375f4b3ec61Sdh155122 wsp->walk_addr); 1376f4b3ec61Sdh155122 return (WALK_ERR); 1377f4b3ec61Sdh155122 } 1378f4b3ec61Sdh155122 return (WALK_NEXT); 1379f4b3ec61Sdh155122 } 1380f4b3ec61Sdh155122 1381f4b3ec61Sdh155122 /* 1382f4b3ec61Sdh155122 * wsp->walk_addr is the address of sctps_ill_list 1383f4b3ec61Sdh155122 */ 1384f4b3ec61Sdh155122 static int 1385f4b3ec61Sdh155122 sctp_stack_ill_walk_init(mdb_walk_state_t *wsp) 1386f4b3ec61Sdh155122 { 1387f4b3ec61Sdh155122 ill_walk_data_t iw; 13887c478bd9Sstevel@tonic-gate intptr_t i; 1389f4b3ec61Sdh155122 uintptr_t kaddr, uaddr; 1390f4b3ec61Sdh155122 size_t offset; 1391f4b3ec61Sdh155122 1392f4b3ec61Sdh155122 kaddr = wsp->walk_addr + OFFSETOF(sctp_stack_t, sctps_ills_count); 1393f4b3ec61Sdh155122 if (mdb_vread(&iw.count, sizeof (iw.count), kaddr) == -1) { 1394f4b3ec61Sdh155122 mdb_warn("can't read sctps_ills_count at %p", kaddr); 1395f4b3ec61Sdh155122 return (WALK_ERR); 1396f4b3ec61Sdh155122 } 1397f4b3ec61Sdh155122 kaddr = wsp->walk_addr + OFFSETOF(sctp_stack_t, sctps_g_ills); 1398f4b3ec61Sdh155122 1399f4b3ec61Sdh155122 if (mdb_vread(&kaddr, sizeof (kaddr), kaddr) == -1) { 1400f4b3ec61Sdh155122 mdb_warn("can't read scpts_g_ills %p", kaddr); 1401f4b3ec61Sdh155122 return (WALK_ERR); 1402f4b3ec61Sdh155122 } 1403f4b3ec61Sdh155122 if (mdb_vread(&iw.ills, sizeof (iw.ills), kaddr) == -1) { 1404f4b3ec61Sdh155122 mdb_warn("failed to read 'sctps_g_ills'"); 1405f4b3ec61Sdh155122 return (NULL); 1406f4b3ec61Sdh155122 } 14077c478bd9Sstevel@tonic-gate 14087c478bd9Sstevel@tonic-gate /* Find the first ill. */ 14097c478bd9Sstevel@tonic-gate for (i = 0; i < SCTP_ILL_HASH; i++) { 1410f4b3ec61Sdh155122 if (iw.ills[i].ill_count > 0) { 1411f4b3ec61Sdh155122 uaddr = (uintptr_t)&iw.ills[i].sctp_ill_list; 1412f4b3ec61Sdh155122 offset = uaddr - (uintptr_t)&iw.ills; 1413f4b3ec61Sdh155122 if (mdb_pwalk("list", wsp->walk_callback, 1414f4b3ec61Sdh155122 wsp->walk_cbdata, kaddr+offset) == -1) { 1415f4b3ec61Sdh155122 mdb_warn("couldn't walk 'list' for address %p", 1416f4b3ec61Sdh155122 kaddr); 14177c478bd9Sstevel@tonic-gate return (WALK_ERR); 14187c478bd9Sstevel@tonic-gate } 14197c478bd9Sstevel@tonic-gate } 14207c478bd9Sstevel@tonic-gate } 14217c478bd9Sstevel@tonic-gate return (WALK_DONE); 14227c478bd9Sstevel@tonic-gate } 14237c478bd9Sstevel@tonic-gate 14247c478bd9Sstevel@tonic-gate static int 1425f4b3ec61Sdh155122 sctp_stack_ill_walk_step(mdb_walk_state_t *wsp) 14267c478bd9Sstevel@tonic-gate { 1427f4b3ec61Sdh155122 return (wsp->walk_callback(wsp->walk_addr, wsp->walk_layer, 1428f4b3ec61Sdh155122 wsp->walk_cbdata)); 1429f4b3ec61Sdh155122 } 1430f4b3ec61Sdh155122 1431f4b3ec61Sdh155122 int 1432f4b3ec61Sdh155122 sctp_ipif_walk_init(mdb_walk_state_t *wsp) 1433f4b3ec61Sdh155122 { 1434f4b3ec61Sdh155122 if (mdb_layered_walk("sctp_stacks", wsp) == -1) { 1435f4b3ec61Sdh155122 mdb_warn("can't walk 'sctp_stacks'"); 1436f4b3ec61Sdh155122 return (WALK_ERR); 1437f4b3ec61Sdh155122 } 1438f4b3ec61Sdh155122 return (WALK_NEXT); 1439f4b3ec61Sdh155122 } 1440f4b3ec61Sdh155122 1441f4b3ec61Sdh155122 int 1442f4b3ec61Sdh155122 sctp_ipif_walk_step(mdb_walk_state_t *wsp) 1443f4b3ec61Sdh155122 { 1444f4b3ec61Sdh155122 if (mdb_pwalk("sctp_stack_walk_ipif", wsp->walk_callback, 1445f4b3ec61Sdh155122 wsp->walk_cbdata, wsp->walk_addr) == -1) { 1446f4b3ec61Sdh155122 mdb_warn("couldn't walk 'sctp_stack_walk_ipif' for addr %p", 1447f4b3ec61Sdh155122 wsp->walk_addr); 1448f4b3ec61Sdh155122 return (WALK_ERR); 1449f4b3ec61Sdh155122 } 1450f4b3ec61Sdh155122 return (WALK_NEXT); 1451f4b3ec61Sdh155122 } 1452f4b3ec61Sdh155122 1453f4b3ec61Sdh155122 /* 1454f4b3ec61Sdh155122 * wsp->walk_addr is the address of sctps_ipif_list 1455f4b3ec61Sdh155122 */ 1456f4b3ec61Sdh155122 static int 1457f4b3ec61Sdh155122 sctp_stack_ipif_walk_init(mdb_walk_state_t *wsp) 1458f4b3ec61Sdh155122 { 1459f4b3ec61Sdh155122 ipif_walk_data_t iw; 14607c478bd9Sstevel@tonic-gate intptr_t i; 1461f4b3ec61Sdh155122 uintptr_t kaddr, uaddr; 1462f4b3ec61Sdh155122 size_t offset; 14637c478bd9Sstevel@tonic-gate 1464f4b3ec61Sdh155122 kaddr = wsp->walk_addr + OFFSETOF(sctp_stack_t, sctps_g_ipifs_count); 1465f4b3ec61Sdh155122 if (mdb_vread(&iw.count, sizeof (iw.count), kaddr) == -1) { 1466f4b3ec61Sdh155122 mdb_warn("can't read sctps_g_ipifs_count at %p", kaddr); 1467f4b3ec61Sdh155122 return (WALK_ERR); 1468f4b3ec61Sdh155122 } 1469f4b3ec61Sdh155122 kaddr = wsp->walk_addr + OFFSETOF(sctp_stack_t, sctps_g_ipifs); 1470f4b3ec61Sdh155122 1471f4b3ec61Sdh155122 if (mdb_vread(&kaddr, sizeof (kaddr), kaddr) == -1) { 1472f4b3ec61Sdh155122 mdb_warn("can't read scpts_g_ipifs %p", kaddr); 1473f4b3ec61Sdh155122 return (WALK_ERR); 1474f4b3ec61Sdh155122 } 1475f4b3ec61Sdh155122 if (mdb_vread(&iw.ipifs, sizeof (iw.ipifs), kaddr) == -1) { 1476f4b3ec61Sdh155122 mdb_warn("failed to read 'sctps_g_ipifs'"); 1477f4b3ec61Sdh155122 return (NULL); 1478f4b3ec61Sdh155122 } 1479f4b3ec61Sdh155122 1480f4b3ec61Sdh155122 /* Find the first ipif. */ 14817c478bd9Sstevel@tonic-gate for (i = 0; i < SCTP_IPIF_HASH; i++) { 1482f4b3ec61Sdh155122 if (iw.ipifs[i].ipif_count > 0) { 1483f4b3ec61Sdh155122 uaddr = (uintptr_t)&iw.ipifs[i].sctp_ipif_list; 1484f4b3ec61Sdh155122 offset = uaddr - (uintptr_t)&iw.ipifs; 1485f4b3ec61Sdh155122 if (mdb_pwalk("list", wsp->walk_callback, 1486f4b3ec61Sdh155122 wsp->walk_cbdata, kaddr+offset) == -1) { 1487f4b3ec61Sdh155122 mdb_warn("couldn't walk 'list' for address %p", 1488f4b3ec61Sdh155122 kaddr); 1489f4b3ec61Sdh155122 return (WALK_ERR); 1490f4b3ec61Sdh155122 } 14917c478bd9Sstevel@tonic-gate } 14927c478bd9Sstevel@tonic-gate } 14937c478bd9Sstevel@tonic-gate return (WALK_DONE); 14947c478bd9Sstevel@tonic-gate } 14957c478bd9Sstevel@tonic-gate 14967c478bd9Sstevel@tonic-gate static int 1497f4b3ec61Sdh155122 sctp_stack_ipif_walk_step(mdb_walk_state_t *wsp) 14987c478bd9Sstevel@tonic-gate { 1499f4b3ec61Sdh155122 return (wsp->walk_callback(wsp->walk_addr, wsp->walk_layer, 1500f4b3ec61Sdh155122 wsp->walk_cbdata)); 15017c478bd9Sstevel@tonic-gate } 15027c478bd9Sstevel@tonic-gate 15035dd46ab5SKacheong Poon /* 15045dd46ab5SKacheong Poon * Initialization function for the per CPU SCTP stats counter walker of a given 15055dd46ab5SKacheong Poon * SCTP stack. 15065dd46ab5SKacheong Poon */ 15075dd46ab5SKacheong Poon int 15085dd46ab5SKacheong Poon sctps_sc_walk_init(mdb_walk_state_t *wsp) 15095dd46ab5SKacheong Poon { 15105dd46ab5SKacheong Poon sctp_stack_t sctps; 15115dd46ab5SKacheong Poon 15125dd46ab5SKacheong Poon if (wsp->walk_addr == NULL) 15135dd46ab5SKacheong Poon return (WALK_ERR); 15145dd46ab5SKacheong Poon 15155dd46ab5SKacheong Poon if (mdb_vread(&sctps, sizeof (sctps), wsp->walk_addr) == -1) { 15165dd46ab5SKacheong Poon mdb_warn("failed to read sctp_stack_t at %p", wsp->walk_addr); 15175dd46ab5SKacheong Poon return (WALK_ERR); 15185dd46ab5SKacheong Poon } 15195dd46ab5SKacheong Poon if (sctps.sctps_sc_cnt == 0) 15205dd46ab5SKacheong Poon return (WALK_DONE); 15215dd46ab5SKacheong Poon 15225dd46ab5SKacheong Poon /* 15235dd46ab5SKacheong Poon * Store the sctp_stack_t pointer in walk_data. The stepping function 15245dd46ab5SKacheong Poon * used it to calculate if the end of the counter has reached. 15255dd46ab5SKacheong Poon */ 15265dd46ab5SKacheong Poon wsp->walk_data = (void *)wsp->walk_addr; 15275dd46ab5SKacheong Poon wsp->walk_addr = (uintptr_t)sctps.sctps_sc; 15285dd46ab5SKacheong Poon return (WALK_NEXT); 15295dd46ab5SKacheong Poon } 15305dd46ab5SKacheong Poon 15315dd46ab5SKacheong Poon /* 15325dd46ab5SKacheong Poon * Stepping function for the per CPU SCTP stats counterwalker. 15335dd46ab5SKacheong Poon */ 15345dd46ab5SKacheong Poon int 15355dd46ab5SKacheong Poon sctps_sc_walk_step(mdb_walk_state_t *wsp) 15365dd46ab5SKacheong Poon { 15375dd46ab5SKacheong Poon int status; 15385dd46ab5SKacheong Poon sctp_stack_t sctps; 15395dd46ab5SKacheong Poon sctp_stats_cpu_t *stats; 15405dd46ab5SKacheong Poon char *next, *end; 15415dd46ab5SKacheong Poon 15425dd46ab5SKacheong Poon if (mdb_vread(&sctps, sizeof (sctps), (uintptr_t)wsp->walk_data) == 15435dd46ab5SKacheong Poon -1) { 15445dd46ab5SKacheong Poon mdb_warn("failed to read sctp_stack_t at %p", wsp->walk_addr); 15455dd46ab5SKacheong Poon return (WALK_ERR); 15465dd46ab5SKacheong Poon } 15475dd46ab5SKacheong Poon if (mdb_vread(&stats, sizeof (stats), wsp->walk_addr) == -1) { 15485dd46ab5SKacheong Poon mdb_warn("failed ot read sctp_stats_cpu_t at %p", 15495dd46ab5SKacheong Poon wsp->walk_addr); 15505dd46ab5SKacheong Poon return (WALK_ERR); 15515dd46ab5SKacheong Poon } 15525dd46ab5SKacheong Poon status = wsp->walk_callback((uintptr_t)stats, &stats, wsp->walk_cbdata); 15535dd46ab5SKacheong Poon if (status != WALK_NEXT) 15545dd46ab5SKacheong Poon return (status); 15555dd46ab5SKacheong Poon 15565dd46ab5SKacheong Poon next = (char *)wsp->walk_addr + sizeof (sctp_stats_cpu_t *); 15575dd46ab5SKacheong Poon end = (char *)sctps.sctps_sc + sctps.sctps_sc_cnt * 15585dd46ab5SKacheong Poon sizeof (sctp_stats_cpu_t *); 15595dd46ab5SKacheong Poon if (next >= end) 15605dd46ab5SKacheong Poon return (WALK_DONE); 15615dd46ab5SKacheong Poon wsp->walk_addr = (uintptr_t)next; 15625dd46ab5SKacheong Poon return (WALK_NEXT); 15635dd46ab5SKacheong Poon } 15645dd46ab5SKacheong Poon 15657c478bd9Sstevel@tonic-gate static void 15667c478bd9Sstevel@tonic-gate sctp_help(void) 15677c478bd9Sstevel@tonic-gate { 15687c478bd9Sstevel@tonic-gate mdb_printf("Print information for a given SCTP sctp_t\n\n"); 15697c478bd9Sstevel@tonic-gate mdb_printf("Options:\n"); 15707c478bd9Sstevel@tonic-gate mdb_printf("\t-a\t All the information\n"); 15717c478bd9Sstevel@tonic-gate mdb_printf("\t-f\t Flags\n"); 15727c478bd9Sstevel@tonic-gate mdb_printf("\t-h\t Hash Tables\n"); 15737c478bd9Sstevel@tonic-gate mdb_printf("\t-o\t Outbound Data\n"); 15747c478bd9Sstevel@tonic-gate mdb_printf("\t-i\t Inbound Data\n"); 15757c478bd9Sstevel@tonic-gate mdb_printf("\t-m\t Miscellaneous Information\n"); 15767c478bd9Sstevel@tonic-gate mdb_printf("\t-r\t RTT Tracking\n"); 15777c478bd9Sstevel@tonic-gate mdb_printf("\t-S\t Stats Counters\n"); 15787c478bd9Sstevel@tonic-gate mdb_printf("\t-F\t Flow Control\n"); 15797c478bd9Sstevel@tonic-gate mdb_printf("\t-H\t Composite Headers\n"); 15807c478bd9Sstevel@tonic-gate mdb_printf("\t-p\t PMTUD\n"); 15817c478bd9Sstevel@tonic-gate mdb_printf("\t-R\t Retransmit Information\n"); 15827c478bd9Sstevel@tonic-gate mdb_printf("\t-C\t Connection State\n"); 15837c478bd9Sstevel@tonic-gate mdb_printf("\t-c\t Cleanup / Close\n"); 15847c478bd9Sstevel@tonic-gate mdb_printf("\t-e\t Extensions and Reliable Control Chunks\n"); 15857c478bd9Sstevel@tonic-gate mdb_printf("\t-d\t Local and Peer addresses\n"); 15867c478bd9Sstevel@tonic-gate mdb_printf("\t-P\t Peer addresses\n"); 15877c478bd9Sstevel@tonic-gate } 15885dd46ab5SKacheong Poon 15897c478bd9Sstevel@tonic-gate static const mdb_dcmd_t dcmds[] = { 15907c478bd9Sstevel@tonic-gate { "sctp", ":[-afhoimrSFHpRCcedP]", 15917c478bd9Sstevel@tonic-gate "display sctp control structure", sctp, sctp_help }, 15927c478bd9Sstevel@tonic-gate { "sctp_set", ":", "display a SCTP set", sctp_set }, 15937c478bd9Sstevel@tonic-gate { "sctp_faddr", ":", "display a faddr", sctp_faddr }, 15947c478bd9Sstevel@tonic-gate { "sctp_istr_msgs", ":", "display msg list on an instream", 15957c478bd9Sstevel@tonic-gate sctp_istr_msgs }, 15967c478bd9Sstevel@tonic-gate { "sctp_mdata_chunk", ":", "display a data chunk in an mblk", 15977c478bd9Sstevel@tonic-gate sctp_mdata_chunk }, 15987c478bd9Sstevel@tonic-gate { "sctp_xmit_list", ":", "display sctp xmit lists", sctp_xmit_list }, 15997c478bd9Sstevel@tonic-gate { "sctp_instr", ":", "display instr", sctp_instr }, 16007c478bd9Sstevel@tonic-gate { "sctp_reass_list", ":", "display reass list", sctp_reass_list }, 16017c478bd9Sstevel@tonic-gate { "sctp_uo_reass_list", ":", "display un-ordered reass list", 16027c478bd9Sstevel@tonic-gate sctp_uo_reass_list }, 16037c478bd9Sstevel@tonic-gate { NULL } 16047c478bd9Sstevel@tonic-gate }; 16057c478bd9Sstevel@tonic-gate 16067c478bd9Sstevel@tonic-gate static const fanout_init_t listen_fanout_init = { 1607f4b3ec61Sdh155122 "sctp_stack_listen_fanout", OFFSETOF(sctp_stack_t, sctps_listen_fanout), 1608f4b3ec61Sdh155122 listen_size, listen_next 16097c478bd9Sstevel@tonic-gate }; 16107c478bd9Sstevel@tonic-gate 16117c478bd9Sstevel@tonic-gate static const fanout_init_t conn_fanout_init = { 1612f4b3ec61Sdh155122 "sctp_stack_conn_fanout", OFFSETOF(sctp_stack_t, sctps_conn_fanout), 1613f4b3ec61Sdh155122 conn_size, conn_next 16147c478bd9Sstevel@tonic-gate }; 16157c478bd9Sstevel@tonic-gate 16167c478bd9Sstevel@tonic-gate static const fanout_init_t bind_fanout_init = { 1617f4b3ec61Sdh155122 "sctp_stack_bind_fanout", OFFSETOF(sctp_stack_t, sctps_bind_fanout), 1618f4b3ec61Sdh155122 bind_size, bind_next 16197c478bd9Sstevel@tonic-gate }; 16207c478bd9Sstevel@tonic-gate 16217c478bd9Sstevel@tonic-gate static const mdb_walker_t walkers[] = { 1622f4b3ec61Sdh155122 { "sctps", "walk the full chain of sctps for all stacks", 1623f4b3ec61Sdh155122 sctps_walk_init, sctps_walk_step, NULL }, 1624f4b3ec61Sdh155122 { "sctp_listen_fanout", "walk the sctp listen fanout for all stacks", 1625f4b3ec61Sdh155122 fanout_walk_init, fanout_walk_step, NULL, 16267c478bd9Sstevel@tonic-gate (void *)&listen_fanout_init }, 1627f4b3ec61Sdh155122 { "sctp_conn_fanout", "walk the sctp conn fanout for all stacks", 1628f4b3ec61Sdh155122 fanout_walk_init, fanout_walk_step, NULL, 16297c478bd9Sstevel@tonic-gate (void *)&conn_fanout_init }, 1630f4b3ec61Sdh155122 { "sctp_bind_fanout", "walk the sctp bind fanout for all stacks", 1631f4b3ec61Sdh155122 fanout_walk_init, fanout_walk_step, NULL, 1632f4b3ec61Sdh155122 (void *)&bind_fanout_init }, 1633f4b3ec61Sdh155122 { "sctp_stack_listen_fanout", 1634f4b3ec61Sdh155122 "walk the sctp listen fanout for one stack", 1635f4b3ec61Sdh155122 fanout_stack_walk_init, fanout_stack_walk_step, 1636f4b3ec61Sdh155122 fanout_stack_walk_fini, 1637f4b3ec61Sdh155122 (void *)&listen_fanout_init }, 1638f4b3ec61Sdh155122 { "sctp_stack_conn_fanout", "walk the sctp conn fanout for one stack", 1639f4b3ec61Sdh155122 fanout_stack_walk_init, fanout_stack_walk_step, 1640f4b3ec61Sdh155122 fanout_stack_walk_fini, 1641f4b3ec61Sdh155122 (void *)&conn_fanout_init }, 1642f4b3ec61Sdh155122 { "sctp_stack_bind_fanout", "walk the sctp bind fanoutfor one stack", 1643f4b3ec61Sdh155122 fanout_stack_walk_init, fanout_stack_walk_step, 1644f4b3ec61Sdh155122 fanout_stack_walk_fini, 16457c478bd9Sstevel@tonic-gate (void *)&bind_fanout_init }, 16467c478bd9Sstevel@tonic-gate { "sctp_walk_faddr", "walk the peer address list of a given sctp_t", 16477c478bd9Sstevel@tonic-gate sctp_walk_faddr_init, sctp_walk_faddr_step, NULL }, 16487c478bd9Sstevel@tonic-gate { "sctp_walk_saddr", "walk the local address list of a given sctp_t", 16497c478bd9Sstevel@tonic-gate sctp_walk_saddr_init, sctp_walk_saddr_step, sctp_walk_saddr_fini }, 1650f4b3ec61Sdh155122 { "sctp_walk_ill", "walk the sctp_g_ills list for all stacks", 1651f4b3ec61Sdh155122 sctp_ill_walk_init, sctp_ill_walk_step, NULL }, 1652f4b3ec61Sdh155122 { "sctp_walk_ipif", "walk the sctp_g_ipif list for all stacks", 1653f4b3ec61Sdh155122 sctp_ipif_walk_init, sctp_ipif_walk_step, NULL }, 1654f4b3ec61Sdh155122 { "sctp_stack_walk_ill", "walk the sctp_g_ills list for one stack", 1655f4b3ec61Sdh155122 sctp_stack_ill_walk_init, sctp_stack_ill_walk_step, NULL }, 1656f4b3ec61Sdh155122 { "sctp_stack_walk_ipif", "walk the sctp_g_ipif list for one stack", 1657f4b3ec61Sdh155122 sctp_stack_ipif_walk_init, sctp_stack_ipif_walk_step, NULL }, 16585dd46ab5SKacheong Poon { "sctps_sc", "walk all the per CPU stats counters of a sctp_stack_t", 16595dd46ab5SKacheong Poon sctps_sc_walk_init, sctps_sc_walk_step, NULL }, 16607c478bd9Sstevel@tonic-gate { NULL } 16617c478bd9Sstevel@tonic-gate }; 16627c478bd9Sstevel@tonic-gate 16637c478bd9Sstevel@tonic-gate static const mdb_modinfo_t modinfo = { MDB_API_VERSION, dcmds, walkers }; 16647c478bd9Sstevel@tonic-gate 16657c478bd9Sstevel@tonic-gate const mdb_modinfo_t * 16667c478bd9Sstevel@tonic-gate _mdb_init(void) 16677c478bd9Sstevel@tonic-gate { 16687c478bd9Sstevel@tonic-gate return (&modinfo); 16697c478bd9Sstevel@tonic-gate } 1670