/* * Print the core fields in an NCA nca_conn_t. With the "-t" argument, skip * all nca_conn_t's that are in the TIME_WAIT state. With the "-x" argument, * show the xmit data. */ static int nca_conn(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) { unsigned int i; nca_conn_t conn; unsigned int show_timewait = TRUE; unsigned int show_xmit = FALSE; if (!(flags & DCMD_ADDRSPEC)) return (DCMD_USAGE); if (mdb_getopts(argc, argv, 'x', MDB_OPT_SETBITS, TRUE, &show_xmit, 't', MDB_OPT_CLRBITS, TRUE, &show_timewait, NULL) != argc) return (DCMD_USAGE); if (DCMD_HDRSPEC(flags)) { mdb_printf("%<u>%-*s %3s %8s %15s %15s %-*s %-10s%</u>\n", NCA_ADDR_WIDTH, "ADDR", "REF", "CREATE", "LOCAL_ADDR", "REMOTE_ADDR", NCA_ADDR_WIDTH, "NODE", "STATE"); } if (mdb_vread(&conn, sizeof (nca_conn_t), addr) == -1) { mdb_warn("cannot read nca_conn_t at %p", addr); return (DCMD_ERR); } if (!show_timewait && conn.tcp_state == TCPS_TIME_WAIT) return (DCMD_OK); mdb_printf("%0*p %3d %8lx %15I %15I %0*p %s\n", NCA_ADDR_WIDTH, addr, conn.ref, conn.create, conn.laddr, conn.faddr, NCA_ADDR_WIDTH, conn.req_np, state2name(conn.tcp_state)); if (show_xmit) { mdb_inc_indent(4); for (i = 0; i < TCP_XMIT_MAX_IX; i++) { mdb_printf("xmit[%d]\n", i); mdb_printf("\tref pointer\t\t%p\n", conn.xmit[i].np); mdb_printf("\tdata pointer\t\t%p\n", conn.xmit[i].dp); mdb_printf("\tcksum array\t\t%p\n", conn.xmit[i].cp); mdb_printf("\tremaining xmit data\t%d\n", conn.xmit[i].sz); mdb_printf("\tref to node_t\t\t%p\n", conn.xmit[i].refed); mdb_printf("\tremaining segment data\t%d\n", conn.xmit[i].dsz); mdb_printf("\tvirtual pointer\t\t%p\n", conn.xmit[i].dvp); } mdb_dec_indent(4); } return (DCMD_OK); }
/* * sppp_dlinforeq() * * MT-Perimeters: * shared inner, shared outer. * * Description: * Perform DL_INFO_REQ request, called by sppp_mproto. */ static int sppp_dlinforeq(queue_t *q, mblk_t *mp, spppstr_t *sps) { dl_info_ack_t *dlip; uint32_t size; uint32_t addr_size; sppa_t *ppa; ASSERT(q != NULL && q->q_ptr != NULL); ASSERT(mp != NULL && mp->b_rptr != NULL); ASSERT(sps != NULL); ppa = sps->sps_ppa; /* Exchange current msg for a DL_INFO_ACK. */ addr_size = SPPP_ADDRL; size = sizeof (dl_info_ack_t) + addr_size; if ((mp = mexchange(q, mp, size, M_PCPROTO, DL_INFO_ACK)) == NULL) { DBGERROR((CE_CONT, "DLPI info: mexchange failed\n")); /* mexchange already sent up an merror ENOSR */ return (0); } /* Fill in DL_INFO_ACK fields and reply */ dlip = (dl_info_ack_t *)mp->b_rptr; *dlip = sppp_infoack; dlip->dl_current_state = sps->sps_dlstate; dlip->dl_max_sdu = ppa != NULL ? ppa->ppa_mtu : PPP_MAXMTU; #ifdef DBG_DLPI { const char *cp = state2name(dlip->dl_current_state); if (cp != NULL) cmn_err(CE_CONT, "info returns state %s, max sdu %d\n", cp, dlip->dl_max_sdu); else cmn_err(CE_CONT, "info returns state %d, max sdu %d\n", dlip->dl_current_state, dlip->dl_max_sdu); } #endif qreply(q, mp); return (0); }
/* * Print the core TCP-related fields in an NCA nca_conn_t. With the "-t" * argument, skips all nca_conn_t's that are in the TIME_WAIT state. */ static int nca_tcpconn(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) { nca_conn_t conn; unsigned int show_timewait = TRUE; if (!(flags & DCMD_ADDRSPEC)) return (DCMD_USAGE); if (mdb_getopts(argc, argv, 't', MDB_OPT_CLRBITS, TRUE, &show_timewait, NULL) != argc) return (DCMD_USAGE); if (DCMD_HDRSPEC(flags)) { mdb_printf("%<u>%-*s %21s %5s %8s %5s %8s %5s %-9s%</u>\n", NCA_ADDR_WIDTH, "ADDR", "REMOTE_ADDR", "SWIND", "SUNASEQ", "SNSEQ", "RACKSEQ", "RNSEQ", "STATE"); } if (mdb_vread(&conn, sizeof (nca_conn_t), addr) == -1) { mdb_warn("cannot read nca_conn_t at %p", addr); return (DCMD_ERR); } if (!show_timewait && conn.tcp_state == TCPS_TIME_WAIT) return (DCMD_OK); mdb_nhconvert(&conn.conn_fport, &conn.conn_fport, sizeof (in_port_t)); mdb_printf("%0*p %15I:%05hu %5u %08x %+5d %08x %+5d %-9s\n", NCA_ADDR_WIDTH, addr, conn.faddr, conn.conn_fport, conn.tcp_swnd, conn.tcp_suna, conn.tcp_snxt - conn.tcp_suna, conn.tcp_rack, conn.tcp_rnxt - conn.tcp_rack, state2name(conn.tcp_state)); return (DCMD_OK); }