da14cebe459d3275048785f25bd869cb09b5307fEric Cheng/*
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * CDDL HEADER START
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng *
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * The contents of this file are subject to the terms of the
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * Common Development and Distribution License (the "License").
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * You may not use this file except in compliance with the License.
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng *
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * or http://www.opensolaris.org/os/licensing.
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * See the License for the specific language governing permissions
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * and limitations under the License.
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng *
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * When distributing Covered Code, include this CDDL HEADER in each
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * If applicable, add the following below this CDDL HEADER, with the
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * fields enclosed by brackets "[]" replaced with your own identifying
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * information: Portions Copyright [yyyy] [name of copyright owner]
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng *
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * CDDL HEADER END
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng/*
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * Use is subject to license terms.
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng#include <sys/mdb_modapi.h>
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng#include <sys/types.h>
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng#include <inet/ip.h>
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng#include <inet/ip6.h>
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng#include <sys/mac.h>
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng#include <sys/mac_provider.h>
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng#include <sys/mac_client.h>
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng#include <sys/mac_client_impl.h>
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng#include <sys/mac_flow_impl.h>
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng#include <sys/mac_soft_ring.h>
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer#include <sys/mac_stat.h>
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng#define STRSIZE 64
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng#define MAC_RX_SRS_SIZE (MAX_RINGS_PER_GROUP * sizeof (uintptr_t))
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng#define LAYERED_WALKER_FOR_FLOW "flow_entry_cache"
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng#define LAYERED_WALKER_FOR_SRS "mac_srs_cache"
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng#define LAYERED_WALKER_FOR_RING "mac_ring_cache"
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi#define LAYERED_WALKER_FOR_GROUP "mac_impl_cache"
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng/* arguments passed to mac_flow dee-command */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng#define MAC_FLOW_NONE 0x01
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng#define MAC_FLOW_ATTR 0x02
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng#define MAC_FLOW_PROP 0x04
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng#define MAC_FLOW_RX 0x08
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng#define MAC_FLOW_TX 0x10
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng#define MAC_FLOW_USER 0x20
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng#define MAC_FLOW_STATS 0x40
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng#define MAC_FLOW_MISC 0x80
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng/* arguments passed to mac_srs dee-command */
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail#define MAC_SRS_NONE 0x00
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail#define MAC_SRS_RX 0x01
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail#define MAC_SRS_TX 0x02
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail#define MAC_SRS_STAT 0x04
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail#define MAC_SRS_CPU 0x08
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail#define MAC_SRS_VERBOSE 0x10
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer#define MAC_SRS_INTR 0x20
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail#define MAC_SRS_RXSTAT (MAC_SRS_RX|MAC_SRS_STAT)
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail#define MAC_SRS_TXSTAT (MAC_SRS_TX|MAC_SRS_STAT)
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail#define MAC_SRS_RXCPU (MAC_SRS_RX|MAC_SRS_CPU)
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail#define MAC_SRS_TXCPU (MAC_SRS_TX|MAC_SRS_CPU)
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail#define MAC_SRS_RXCPUVERBOSE (MAC_SRS_RXCPU|MAC_SRS_VERBOSE)
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail#define MAC_SRS_TXCPUVERBOSE (MAC_SRS_TXCPU|MAC_SRS_VERBOSE)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer#define MAC_SRS_RXINTR (MAC_SRS_RX|MAC_SRS_INTR)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer#define MAC_SRS_TXINTR (MAC_SRS_TX|MAC_SRS_INTR)
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi/* arguments passed to mac_group dcmd */
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi#define MAC_GROUP_NONE 0x00
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi#define MAC_GROUP_RX 0x01
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi#define MAC_GROUP_TX 0x02
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi#define MAC_GROUP_UNINIT 0x04
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi
da14cebe459d3275048785f25bd869cb09b5307fEric Chengstatic char *
da14cebe459d3275048785f25bd869cb09b5307fEric Chengmac_flow_proto2str(uint8_t protocol)
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng{
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng switch (protocol) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng case IPPROTO_TCP:
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return ("tcp");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng case IPPROTO_UDP:
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return ("udp");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng case IPPROTO_SCTP:
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return ("sctp");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng case IPPROTO_ICMP:
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return ("icmp");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng case IPPROTO_ICMPV6:
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return ("icmpv6");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng default:
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return ("--");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng}
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Chengstatic char *
da14cebe459d3275048785f25bd869cb09b5307fEric Chengmac_flow_priority2str(mac_priority_level_t prio)
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng{
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng switch (prio) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng case MPL_LOW:
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return ("low");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng case MPL_MEDIUM:
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return ("medium");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng case MPL_HIGH:
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return ("high");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng case MPL_RESET:
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return ("reset");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng default:
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return ("--");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng}
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng/*
4a3b1d5b615ff6e54da1cc17f331e1ac794c5191Bart Coddens * Convert bandwidth in bps to a string in Mbps.
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng */
da14cebe459d3275048785f25bd869cb09b5307fEric Chengstatic char *
da14cebe459d3275048785f25bd869cb09b5307fEric Chengmac_flow_bw2str(uint64_t bw, char *buf, ssize_t len)
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng{
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng int kbps, mbps;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng kbps = (bw % 1000000)/1000;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mbps = bw/1000000;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if ((mbps == 0) && (kbps != 0))
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mdb_snprintf(buf, len, "0.%03u", kbps);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng else
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mdb_snprintf(buf, len, "%5u", mbps);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return (buf);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng}
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Chengstatic void
da14cebe459d3275048785f25bd869cb09b5307fEric Chengmac_flow_print_header(uint_t args)
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng{
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng switch (args) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng case MAC_FLOW_NONE:
fcff38ebb7bf8c483f8a0427b4885ef7bbdc0c58Girish Moodalbail mdb_printf("%?s %-20s %4s %?s %?s %-16s\n",
fcff38ebb7bf8c483f8a0427b4885ef7bbdc0c58Girish Moodalbail "", "", "LINK", "", "", "MIP");
fcff38ebb7bf8c483f8a0427b4885ef7bbdc0c58Girish Moodalbail mdb_printf("%<u>%?s %-20s %4s %?s %?s %-16s%</u>\n",
fcff38ebb7bf8c483f8a0427b4885ef7bbdc0c58Girish Moodalbail "ADDR", "FLOW NAME", "ID", "MCIP", "MIP", "NAME");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng break;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng case MAC_FLOW_ATTR:
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mdb_printf("%<u>%?s %-32s %-7s %6s "
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng "%-9s %s%</u>\n",
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng "ADDR", "FLOW NAME", "PROTO", "PORT",
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng "DSFLD:MSK", "IPADDR");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng break;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng case MAC_FLOW_PROP:
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mdb_printf("%<u>%?s %-32s %8s %9s%</u>\n",
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng "ADDR", "FLOW NAME", "MAXBW(M)", "PRIORITY");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng break;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng case MAC_FLOW_MISC:
fcff38ebb7bf8c483f8a0427b4885ef7bbdc0c58Girish Moodalbail mdb_printf("%<u>%?s %-24s %10s %10s "
fcff38ebb7bf8c483f8a0427b4885ef7bbdc0c58Girish Moodalbail "%20s %4s%</u>\n",
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng "ADDR", "FLOW NAME", "TYPE", "FLAGS",
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng "MATCH_FN", "ZONE");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng break;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng case MAC_FLOW_RX:
fcff38ebb7bf8c483f8a0427b4885ef7bbdc0c58Girish Moodalbail mdb_printf("%?s %-24s %3s %s\n", "", "", "SRS", "RX");
fcff38ebb7bf8c483f8a0427b4885ef7bbdc0c58Girish Moodalbail mdb_printf("%<u>%?s %-24s %3s %s%</u>\n",
fcff38ebb7bf8c483f8a0427b4885ef7bbdc0c58Girish Moodalbail "ADDR", "FLOW NAME", "CNT", "SRS");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng break;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng case MAC_FLOW_TX:
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mdb_printf("%<u>%?s %-32s %?s %</u>\n",
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng "ADDR", "FLOW NAME", "TX_SRS");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng break;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng case MAC_FLOW_STATS:
fcff38ebb7bf8c483f8a0427b4885ef7bbdc0c58Girish Moodalbail mdb_printf("%<u>%?s %-32s %16s %16s%</u>\n",
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng "ADDR", "FLOW NAME", "RBYTES", "OBYTES");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng break;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng}
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng/*
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * Display selected fields of the flow_entry_t structure
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng */
da14cebe459d3275048785f25bd869cb09b5307fEric Chengstatic int
da14cebe459d3275048785f25bd869cb09b5307fEric Chengmac_flow_dcmd_output(uintptr_t addr, uint_t flags, uint_t args)
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng{
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng static const mdb_bitmask_t flow_type_bits[] = {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng {"P", FLOW_PRIMARY_MAC, FLOW_PRIMARY_MAC},
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng {"V", FLOW_VNIC_MAC, FLOW_VNIC_MAC},
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng {"M", FLOW_MCAST, FLOW_MCAST},
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng {"O", FLOW_OTHER, FLOW_OTHER},
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng {"U", FLOW_USER, FLOW_USER},
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng {"V", FLOW_VNIC, FLOW_VNIC},
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng {"NS", FLOW_NO_STATS, FLOW_NO_STATS},
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng { NULL, 0, 0 }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng };
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng#define FLOW_MAX_TYPE (sizeof (flow_type_bits) / sizeof (mdb_bitmask_t))
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng static const mdb_bitmask_t flow_flag_bits[] = {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng {"Q", FE_QUIESCE, FE_QUIESCE},
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng {"W", FE_WAITER, FE_WAITER},
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng {"T", FE_FLOW_TAB, FE_FLOW_TAB},
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng {"G", FE_G_FLOW_HASH, FE_G_FLOW_HASH},
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng {"I", FE_INCIPIENT, FE_INCIPIENT},
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng {"C", FE_CONDEMNED, FE_CONDEMNED},
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng {"NU", FE_UF_NO_DATAPATH, FE_UF_NO_DATAPATH},
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng {"NC", FE_MC_NO_DATAPATH, FE_MC_NO_DATAPATH},
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng { NULL, 0, 0 }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng };
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng#define FLOW_MAX_FLAGS (sizeof (flow_flag_bits) / sizeof (mdb_bitmask_t))
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng flow_entry_t fe;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mac_client_impl_t mcip;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mac_impl_t mip;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if (mdb_vread(&fe, sizeof (fe), addr) == -1) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mdb_warn("failed to read struct flow_entry_s at %p", addr);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return (DCMD_ERR);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if (args & MAC_FLOW_USER) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng args &= ~MAC_FLOW_USER;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if (fe.fe_type & FLOW_MCAST) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if (DCMD_HDRSPEC(flags))
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mac_flow_print_header(args);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return (DCMD_OK);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if (DCMD_HDRSPEC(flags))
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mac_flow_print_header(args);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng bzero(&mcip, sizeof (mcip));
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng bzero(&mip, sizeof (mip));
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if (fe.fe_mcip != NULL && mdb_vread(&mcip, sizeof (mcip),
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng (uintptr_t)fe.fe_mcip) == sizeof (mcip)) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng (void) mdb_vread(&mip, sizeof (mip), (uintptr_t)mcip.mci_mip);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng switch (args) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng case MAC_FLOW_NONE: {
fcff38ebb7bf8c483f8a0427b4885ef7bbdc0c58Girish Moodalbail mdb_printf("%?p %-20s %4d %?p "
fcff38ebb7bf8c483f8a0427b4885ef7bbdc0c58Girish Moodalbail "%?p %-16s\n",
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng addr, fe.fe_flow_name, fe.fe_link_id, fe.fe_mcip,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mcip.mci_mip, mip.mi_name);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng break;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng case MAC_FLOW_ATTR: {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng struct in_addr in4;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng uintptr_t desc_addr;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng flow_desc_t fdesc;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng desc_addr = addr + OFFSETOF(flow_entry_t, fe_flow_desc);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if (mdb_vread(&fdesc, sizeof (fdesc), desc_addr) == -1) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mdb_warn("failed to read struct flow_description at %p",
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng desc_addr);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return (DCMD_ERR);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mdb_printf("%?p %-32s "
fcff38ebb7bf8c483f8a0427b4885ef7bbdc0c58Girish Moodalbail "%-7s %6d "
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng "%4d:%-4d ",
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng addr, fe.fe_flow_name,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mac_flow_proto2str(fdesc.fd_protocol), fdesc.fd_local_port,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng fdesc.fd_dsfield, fdesc.fd_dsfield_mask);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if (fdesc.fd_ipversion == IPV4_VERSION) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng IN6_V4MAPPED_TO_INADDR(&fdesc.fd_local_addr, &in4);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mdb_printf("%I", in4.s_addr);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng } else if (fdesc.fd_ipversion == IPV6_VERSION) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mdb_printf("%N", &fdesc.fd_local_addr);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng } else {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mdb_printf("%s", "--");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mdb_printf("\n");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng break;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng case MAC_FLOW_PROP: {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng uintptr_t prop_addr;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng char bwstr[STRSIZE];
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mac_resource_props_t fprop;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng prop_addr = addr + OFFSETOF(flow_entry_t, fe_resource_props);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if (mdb_vread(&fprop, sizeof (fprop), prop_addr) == -1) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mdb_warn("failed to read struct mac_resoource_props "
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng "at %p", prop_addr);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return (DCMD_ERR);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mdb_printf("%?p %-32s "
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng "%8s %9s\n",
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng addr, fe.fe_flow_name,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mac_flow_bw2str(fprop.mrp_maxbw, bwstr, STRSIZE),
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mac_flow_priority2str(fprop.mrp_priority));
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng break;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng case MAC_FLOW_MISC: {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng char flow_flags[2 * FLOW_MAX_FLAGS];
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng char flow_type[2 * FLOW_MAX_TYPE];
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng GElf_Sym sym;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng char func_name[MDB_SYM_NAMLEN] = "";
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng uintptr_t func, match_addr;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng match_addr = addr + OFFSETOF(flow_entry_t, fe_match);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng (void) mdb_vread(&func, sizeof (func), match_addr);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng (void) mdb_lookup_by_addr(func, MDB_SYM_EXACT, func_name,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng MDB_SYM_NAMLEN, &sym);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mdb_snprintf(flow_flags, 2 * FLOW_MAX_FLAGS, "%hb",
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng fe.fe_flags, flow_flag_bits);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mdb_snprintf(flow_type, 2 * FLOW_MAX_TYPE, "%hb",
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng fe.fe_type, flow_type_bits);
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy mdb_printf("%?p %-24s %10s %10s %20s\n",
2b24ab6b3865caeede9eeb9db6b83e1d89dcd1eaSebastien Roy addr, fe.fe_flow_name, flow_type, flow_flags, func_name);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng break;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng case MAC_FLOW_RX: {
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail uintptr_t rxaddr, rx_srs[MAX_RINGS_PER_GROUP] = {0};
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng int i;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng rxaddr = addr + OFFSETOF(flow_entry_t, fe_rx_srs);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng (void) mdb_vread(rx_srs, MAC_RX_SRS_SIZE, rxaddr);
fcff38ebb7bf8c483f8a0427b4885ef7bbdc0c58Girish Moodalbail mdb_printf("%?p %-24s %3d ",
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail addr, fe.fe_flow_name, fe.fe_rx_srs_cnt);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng for (i = 0; i < MAX_RINGS_PER_GROUP; i++) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if (rx_srs[i] == 0)
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng continue;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mdb_printf("%p ", rx_srs[i]);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mdb_printf("\n");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng break;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng case MAC_FLOW_TX: {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng uintptr_t tx_srs = 0, txaddr;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng txaddr = addr + OFFSETOF(flow_entry_t, fe_tx_srs);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng (void) mdb_vread(&tx_srs, sizeof (uintptr_t), txaddr);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mdb_printf("%?p %-32s %?p\n",
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng addr, fe.fe_flow_name, fe.fe_tx_srs);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng break;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng case MAC_FLOW_STATS: {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer uint64_t totibytes = 0;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer uint64_t totobytes = 0;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mac_soft_ring_set_t *mac_srs;
78b013d7a408ae8e9eacdb67cae24fc8ecab1ebfRyan Zezeski mac_rx_stats_t mac_rx_stat;
78b013d7a408ae8e9eacdb67cae24fc8ecab1ebfRyan Zezeski mac_tx_stats_t mac_tx_stat;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer int i;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
78b013d7a408ae8e9eacdb67cae24fc8ecab1ebfRyan Zezeski /*
78b013d7a408ae8e9eacdb67cae24fc8ecab1ebfRyan Zezeski * Sum bytes for all Rx SRS.
78b013d7a408ae8e9eacdb67cae24fc8ecab1ebfRyan Zezeski */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer for (i = 0; i < fe.fe_rx_srs_cnt; i++) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mac_srs = (mac_soft_ring_set_t *)(fe.fe_rx_srs[i]);
78b013d7a408ae8e9eacdb67cae24fc8ecab1ebfRyan Zezeski if (mdb_vread(&mac_rx_stat, sizeof (mac_rx_stats_t),
78b013d7a408ae8e9eacdb67cae24fc8ecab1ebfRyan Zezeski (uintptr_t)&mac_srs->srs_rx.sr_stat) == -1) {
78b013d7a408ae8e9eacdb67cae24fc8ecab1ebfRyan Zezeski mdb_warn("failed to read mac_rx_stats_t at %p",
78b013d7a408ae8e9eacdb67cae24fc8ecab1ebfRyan Zezeski &mac_srs->srs_rx.sr_stat);
78b013d7a408ae8e9eacdb67cae24fc8ecab1ebfRyan Zezeski return (DCMD_ERR);
78b013d7a408ae8e9eacdb67cae24fc8ecab1ebfRyan Zezeski }
78b013d7a408ae8e9eacdb67cae24fc8ecab1ebfRyan Zezeski
78b013d7a408ae8e9eacdb67cae24fc8ecab1ebfRyan Zezeski totibytes += mac_rx_stat.mrs_intrbytes +
78b013d7a408ae8e9eacdb67cae24fc8ecab1ebfRyan Zezeski mac_rx_stat.mrs_pollbytes +
78b013d7a408ae8e9eacdb67cae24fc8ecab1ebfRyan Zezeski mac_rx_stat.mrs_lclbytes;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer }
78b013d7a408ae8e9eacdb67cae24fc8ecab1ebfRyan Zezeski
78b013d7a408ae8e9eacdb67cae24fc8ecab1ebfRyan Zezeski /*
78b013d7a408ae8e9eacdb67cae24fc8ecab1ebfRyan Zezeski * Sum bytes for Tx SRS.
78b013d7a408ae8e9eacdb67cae24fc8ecab1ebfRyan Zezeski */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mac_srs = (mac_soft_ring_set_t *)(fe.fe_tx_srs);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (mac_srs != NULL) {
78b013d7a408ae8e9eacdb67cae24fc8ecab1ebfRyan Zezeski if (mdb_vread(&mac_tx_stat, sizeof (mac_tx_stats_t),
78b013d7a408ae8e9eacdb67cae24fc8ecab1ebfRyan Zezeski (uintptr_t)&mac_srs->srs_tx.st_stat) == -1) {
78b013d7a408ae8e9eacdb67cae24fc8ecab1ebfRyan Zezeski mdb_warn("failed to read max_tx_stats_t at %p",
78b013d7a408ae8e9eacdb67cae24fc8ecab1ebfRyan Zezeski &mac_srs->srs_tx.st_stat);
78b013d7a408ae8e9eacdb67cae24fc8ecab1ebfRyan Zezeski return (DCMD_ERR);
78b013d7a408ae8e9eacdb67cae24fc8ecab1ebfRyan Zezeski }
78b013d7a408ae8e9eacdb67cae24fc8ecab1ebfRyan Zezeski
78b013d7a408ae8e9eacdb67cae24fc8ecab1ebfRyan Zezeski totobytes = mac_tx_stat.mts_obytes;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer }
78b013d7a408ae8e9eacdb67cae24fc8ecab1ebfRyan Zezeski
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mdb_printf("%?p %-32s %16llu %16llu\n",
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer addr, fe.fe_flow_name, totibytes, totobytes);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng break;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return (DCMD_OK);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng}
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng/*
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * Parse the arguments passed to the dcmd and print all or one flow_entry_t
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * structures
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng */
da14cebe459d3275048785f25bd869cb09b5307fEric Chengstatic int
da14cebe459d3275048785f25bd869cb09b5307fEric Chengmac_flow_dcmd(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng{
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng uint_t args = 0;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if (!(flags & DCMD_ADDRSPEC)) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if (mdb_walk_dcmd("mac_flow", "mac_flow", argc, argv) == -1) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mdb_warn("failed to walk 'mac_flow'");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return (DCMD_ERR);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return (DCMD_OK);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if ((mdb_getopts(argc, argv,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng 'a', MDB_OPT_SETBITS, MAC_FLOW_ATTR, &args,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng 'p', MDB_OPT_SETBITS, MAC_FLOW_PROP, &args,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng 'm', MDB_OPT_SETBITS, MAC_FLOW_MISC, &args,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng 'r', MDB_OPT_SETBITS, MAC_FLOW_RX, &args,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng 't', MDB_OPT_SETBITS, MAC_FLOW_TX, &args,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng 's', MDB_OPT_SETBITS, MAC_FLOW_STATS, &args,
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi 'u', MDB_OPT_SETBITS, MAC_FLOW_USER, &args,
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi NULL) != argc)) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return (DCMD_USAGE);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if (argc > 2 || (argc == 2 && !(args & MAC_FLOW_USER)))
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return (DCMD_USAGE);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng /*
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * If no arguments was specified or just "-u" was specified then
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * we default to printing basic information of flows.
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if (args == 0 || args == MAC_FLOW_USER)
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng args |= MAC_FLOW_NONE;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return (mac_flow_dcmd_output(addr, flags, args));
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng}
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Chengstatic void
da14cebe459d3275048785f25bd869cb09b5307fEric Chengmac_flow_help(void)
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng{
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mdb_printf("If an address is specified, then flow_entry structure at "
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng "that address is printed. Otherwise all the flows in the system "
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng "are printed.\n");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mdb_printf("Options:\n"
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng "\t-u\tdisplay user defined link & vnic flows.\n"
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng "\t-a\tdisplay flow attributes\n"
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng "\t-p\tdisplay flow properties\n"
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng "\t-r\tdisplay rx side information\n"
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng "\t-t\tdisplay tx side information\n"
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng "\t-s\tdisplay flow statistics\n"
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng "\t-m\tdisplay miscellaneous flow information\n\n");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mdb_printf("%<u>Interpreting Flow type and Flow flags output.%</u>\n");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mdb_printf("Flow Types:\n");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mdb_printf("\t P --> FLOW_PRIMARY_MAC\n");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mdb_printf("\t V --> FLOW_VNIC_MAC\n");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mdb_printf("\t M --> FLOW_MCAST\n");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mdb_printf("\t O --> FLOW_OTHER\n");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mdb_printf("\t U --> FLOW_USER\n");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mdb_printf("\t NS --> FLOW_NO_STATS\n\n");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mdb_printf("Flow Flags:\n");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mdb_printf("\t Q --> FE_QUIESCE\n");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mdb_printf("\t W --> FE_WAITER\n");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mdb_printf("\t T --> FE_FLOW_TAB\n");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mdb_printf("\t G --> FE_G_FLOW_HASH\n");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mdb_printf("\t I --> FE_INCIPIENT\n");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mdb_printf("\t C --> FE_CONDEMNED\n");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mdb_printf("\t NU --> FE_UF_NO_DATAPATH\n");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mdb_printf("\t NC --> FE_MC_NO_DATAPATH\n");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng}
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng/*
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * called once by the debugger when the mac_flow walk begins.
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng */
da14cebe459d3275048785f25bd869cb09b5307fEric Chengstatic int
da14cebe459d3275048785f25bd869cb09b5307fEric Chengmac_flow_walk_init(mdb_walk_state_t *wsp)
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng{
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if (mdb_layered_walk(LAYERED_WALKER_FOR_FLOW, wsp) == -1) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mdb_warn("failed to walk 'mac_flow'");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return (WALK_ERR);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return (WALK_NEXT);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng}
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng/*
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * Common walker step funciton for flow_entry_t, mac_soft_ring_set_t and
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * mac_ring_t.
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng *
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * Steps through each flow_entry_t and calls the callback function. If the
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * user executed ::walk mac_flow, it just prints the address or if the user
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * executed ::mac_flow it displays selected fields of flow_entry_t structure
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * by calling "mac_flow_dcmd"
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng */
da14cebe459d3275048785f25bd869cb09b5307fEric Chengstatic int
da14cebe459d3275048785f25bd869cb09b5307fEric Chengmac_common_walk_step(mdb_walk_state_t *wsp)
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng{
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng int status;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if (wsp->walk_addr == NULL)
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return (WALK_DONE);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng status = wsp->walk_callback(wsp->walk_addr, wsp->walk_data,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng wsp->walk_cbdata);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return (status);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng}
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Chengstatic char *
da14cebe459d3275048785f25bd869cb09b5307fEric Chengmac_srs_txmode2str(mac_tx_srs_mode_t mode)
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng{
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng switch (mode) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng case SRS_TX_DEFAULT:
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail return ("DEF");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng case SRS_TX_SERIALIZE:
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail return ("SER");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng case SRS_TX_FANOUT:
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail return ("FO");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng case SRS_TX_BW:
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail return ("BW");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng case SRS_TX_BW_FANOUT:
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail return ("BWFO");
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer case SRS_TX_AGGR:
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer return ("AG");
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer case SRS_TX_BW_AGGR:
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer return ("BWAG");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return ("--");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng}
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Chengstatic void
da14cebe459d3275048785f25bd869cb09b5307fEric Chengmac_srs_help(void)
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng{
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mdb_printf("If an address is specified, then mac_soft_ring_set "
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng "structure at that address is printed. Otherwise all the "
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng "SRS in the system are printed.\n");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mdb_printf("Options:\n"
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng "\t-r\tdisplay recieve side SRS structures\n"
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail "\t-t\tdisplay transmit side SRS structures\n"
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail "\t-s\tdisplay statistics for RX or TX side\n"
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail "\t-c\tdisplay CPU binding for RX or TX side\n"
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail "\t-v\tverbose flag for CPU binding to list cpus\n"
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer "\t-i\tdisplay mac_ring_t and interrupt information\n"
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail "Note: use -r or -t (to specify RX or TX side respectively) along "
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail "with -c or -s\n");
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail mdb_printf("\n%<u>Interpreting TX Modes%</u>\n");
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail mdb_printf("\t DEF --> Default\n");
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail mdb_printf("\t SER --> Serialize\n");
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail mdb_printf("\t FO --> Fanout\n");
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail mdb_printf("\t BW --> Bandwidth\n");
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail mdb_printf("\tBWFO --> Bandwidth Fanout\n");
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mdb_printf("\t AG --> Aggr\n");
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mdb_printf("\tBWAG --> Bandwidth Aggr\n");
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail}
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail/*
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail * In verbose mode "::mac_srs -rcv or ::mac_srs -tcv", we print the CPUs
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail * assigned to a link and CPUS assigned to the soft rings.
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail * 'len' is used for formatting the output and represents the number of
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail * spaces between CPU list and Fanout CPU list in the output.
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail */
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbailstatic boolean_t
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbailmac_srs_print_cpu(int *i, uint32_t cnt, uint32_t *cpu_list, int *len)
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail{
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail int num = 0;
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail if (*i == 0)
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail mdb_printf("(");
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail else
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail mdb_printf(" ");
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail while (*i < cnt) {
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail /* We print 6 CPU's at a time to keep display within 80 cols */
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail if (((num + 1) % 7) == 0) {
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail if (len != NULL)
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail *len = 2;
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail return (B_FALSE);
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail }
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail mdb_printf("%02x%c", cpu_list[*i], ((*i == cnt - 1)?')':','));
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail ++*i;
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail ++num;
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail }
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail if (len != NULL)
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail *len = (7 - num) * 3;
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail return (B_TRUE);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng}
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Chengstatic int
da14cebe459d3275048785f25bd869cb09b5307fEric Chengmac_srs_dcmd(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng{
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail uint_t args = MAC_SRS_NONE;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mac_soft_ring_set_t srs;
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail mac_client_impl_t mci;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if (!(flags & DCMD_ADDRSPEC)) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if (mdb_walk_dcmd("mac_srs", "mac_srs", argc, argv) == -1) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mdb_warn("failed to walk 'mac_srs'");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return (DCMD_ERR);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return (DCMD_OK);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail if (mdb_getopts(argc, argv,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng 'r', MDB_OPT_SETBITS, MAC_SRS_RX, &args,
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail 't', MDB_OPT_SETBITS, MAC_SRS_TX, &args,
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail 'c', MDB_OPT_SETBITS, MAC_SRS_CPU, &args,
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail 'v', MDB_OPT_SETBITS, MAC_SRS_VERBOSE, &args,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer 'i', MDB_OPT_SETBITS, MAC_SRS_INTR, &args,
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi 's', MDB_OPT_SETBITS, MAC_SRS_STAT, &args,
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi NULL) != argc) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return (DCMD_USAGE);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail if (argc > 2)
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return (DCMD_USAGE);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if (mdb_vread(&srs, sizeof (srs), addr) == -1) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mdb_warn("failed to read struct mac_soft_ring_set_s at %p",
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng addr);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return (DCMD_ERR);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail if (mdb_vread(&mci, sizeof (mci), (uintptr_t)srs.srs_mcip) == -1) {
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail mdb_warn("failed to read struct mac_client_impl_t at %p "
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail "for SRS %p", srs.srs_mcip, addr);
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail return (DCMD_ERR);
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng switch (args) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng case MAC_SRS_RX: {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if (DCMD_HDRSPEC(flags)) {
fcff38ebb7bf8c483f8a0427b4885ef7bbdc0c58Girish Moodalbail mdb_printf("%?s %-20s %-8s %-8s %8s "
fcff38ebb7bf8c483f8a0427b4885ef7bbdc0c58Girish Moodalbail "%8s %3s\n",
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail "", "", "", "", "MBLK",
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail "Q", "SR");
fcff38ebb7bf8c483f8a0427b4885ef7bbdc0c58Girish Moodalbail mdb_printf("%<u>%?s %-20s %-8s %-8s %8s "
fcff38ebb7bf8c483f8a0427b4885ef7bbdc0c58Girish Moodalbail "%8s %3s%</u>\n",
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail "ADDR", "LINK_NAME", "STATE", "TYPE", "CNT",
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail "BYTES", "CNT");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if (srs.srs_type & SRST_TX)
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return (DCMD_OK);
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail mdb_printf("%?p %-20s %08x %08x "
fcff38ebb7bf8c483f8a0427b4885ef7bbdc0c58Girish Moodalbail "%8d %8d %3d\n",
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail addr, mci.mci_name, srs.srs_state, srs.srs_type,
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail srs.srs_count, srs.srs_size, srs.srs_soft_ring_count);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng break;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng case MAC_SRS_TX: {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if (DCMD_HDRSPEC(flags)) {
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail mdb_printf("%?s %-16s %-4s %-8s "
fcff38ebb7bf8c483f8a0427b4885ef7bbdc0c58Girish Moodalbail "%-8s %8s %8s %3s\n",
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail "", "", "TX", "",
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail "", "MBLK", "Q", "SR");
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail mdb_printf("%<u>%?s %-16s %-4s %-8s "
fcff38ebb7bf8c483f8a0427b4885ef7bbdc0c58Girish Moodalbail "%-8s %8s %8s %3s%</u>\n",
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail "ADDR", "LINK_NAME", "MODE", "STATE",
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail "TYPE", "CNT", "BYTES", "CNT");
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail }
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail if (!(srs.srs_type & SRST_TX))
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail return (DCMD_OK);
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail mdb_printf("%?p %-16s %-4s "
fcff38ebb7bf8c483f8a0427b4885ef7bbdc0c58Girish Moodalbail "%08x %08x %8d %8d %3d\n",
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail addr, mci.mci_name, mac_srs_txmode2str(srs.srs_tx.st_mode),
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail srs.srs_state, srs.srs_type, srs.srs_count, srs.srs_size,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer srs.srs_tx_ring_count);
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail break;
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail }
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail case MAC_SRS_RXCPU: {
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail mac_cpus_t mc = srs.srs_cpu;
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail if (DCMD_HDRSPEC(flags)) {
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail mdb_printf("%?s %-20s %-4s %-4s "
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail "%-6s %-4s %-7s\n",
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail "", "", "NUM", "POLL",
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail "WORKER", "INTR", "FANOUT");
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail mdb_printf("%<u>%?s %-20s %-4s %-4s "
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail "%-6s %-4s %-7s%</u>\n",
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail "ADDR", "LINK_NAME", "CPUS", "CPU",
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail "CPU", "CPU", "CPU_CNT");
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail }
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail if ((args & MAC_SRS_RX) && (srs.srs_type & SRST_TX))
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail return (DCMD_OK);
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail mdb_printf("%?p %-20s %-4d %-4d "
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail "%-6d %-4d %-7d\n",
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer addr, mci.mci_name, mc.mc_ncpus, mc.mc_rx_pollid,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mc.mc_rx_workerid, mc.mc_rx_intr_cpu, mc.mc_rx_fanout_cnt);
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail break;
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail }
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail case MAC_SRS_TXCPU: {
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail mac_cpus_t mc = srs.srs_cpu;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mac_soft_ring_t *s_ringp, s_ring;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer boolean_t first = B_TRUE;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer int i;
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail if (DCMD_HDRSPEC(flags)) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mdb_printf("%?s %-12s %?s %8s %8s %8s\n",
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer "", "", "SOFT", "WORKER", "INTR", "RETARGETED");
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mdb_printf("%<u>%?s %-12s %?s %8s %8s %8s%</u>\n",
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer "ADDR", "LINK_NAME", "RING", "CPU", "CPU", "CPU");
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail }
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (!(srs.srs_type & SRST_TX))
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail return (DCMD_OK);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mdb_printf("%?p %-12s ", addr, mci.mci_name);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer /*
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * Case of no soft rings, print the info from
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * mac_srs_tx_t.
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (srs.srs_tx_ring_count == 0) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mdb_printf("%?p %8d %8d %8d\n",
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer 0, mc.mc_tx_fanout_cpus[0],
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mc.mc_tx_intr_cpu[0],
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mc.mc_tx_retargeted_cpu[0]);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer break;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer }
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer for (s_ringp = srs.srs_soft_ring_head, i = 0; s_ringp != NULL;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer s_ringp = s_ring.s_ring_next, i++) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) mdb_vread(&s_ring, sizeof (s_ring),
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (uintptr_t)s_ringp);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (first) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mdb_printf("%?p %8d %8d %8d\n",
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer s_ringp, mc.mc_tx_fanout_cpus[i],
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mc.mc_tx_intr_cpu[i],
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mc.mc_tx_retargeted_cpu[i]);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer first = B_FALSE;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer continue;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer }
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mdb_printf("%?s %-12s %?p %8d %8d %8d\n",
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer "", "", s_ringp, mc.mc_tx_fanout_cpus[i],
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mc.mc_tx_intr_cpu[i], mc.mc_tx_retargeted_cpu[i]);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer }
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer break;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer }
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer case MAC_SRS_TXINTR: {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mac_cpus_t mc = srs.srs_cpu;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mac_soft_ring_t *s_ringp, s_ring;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mac_ring_t *m_ringp, m_ring;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer boolean_t first = B_TRUE;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer int i;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (DCMD_HDRSPEC(flags)) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mdb_printf("%?s %-12s %?s %8s %?s %6s %6s\n",
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer "", "", "SOFT", "WORKER", "MAC", "", "INTR");
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mdb_printf("%<u>%?s %-12s %?s %8s %?s %6s %6s%</u>\n",
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer "ADDR", "LINK_NAME", "RING", "CPU", "RING",
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer "SHARED", "CPU");
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer }
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (!(srs.srs_type & SRST_TX))
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer return (DCMD_OK);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mdb_printf("%?p %-12s ", addr, mci.mci_name);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer /*
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * Case of no soft rings, print the info from
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * mac_srs_tx_t.
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (srs.srs_tx_ring_count == 0) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer m_ringp = srs.srs_tx.st_arg2;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (m_ringp != NULL) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) mdb_vread(&m_ring, sizeof (m_ring),
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (uintptr_t)m_ringp);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mdb_printf("%?p %8d %?p %6d %6d\n",
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer 0, mc.mc_tx_fanout_cpus[0], m_ringp,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer m_ring.mr_info.mri_intr.mi_ddi_shared,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mc.mc_tx_retargeted_cpu[0]);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer } else {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mdb_printf("%?p %8d %?p %6d %6d\n",
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer 0, mc.mc_tx_fanout_cpus[0], 0,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer 0, mc.mc_tx_retargeted_cpu[0]);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer }
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer break;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer }
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer for (s_ringp = srs.srs_soft_ring_head, i = 0; s_ringp != NULL;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer s_ringp = s_ring.s_ring_next, i++) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) mdb_vread(&s_ring, sizeof (s_ring),
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (uintptr_t)s_ringp);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer m_ringp = s_ring.s_ring_tx_arg2;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) mdb_vread(&m_ring, sizeof (m_ring),
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (uintptr_t)m_ringp);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (first) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mdb_printf("%?p %8d %?p %6d %6d\n",
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer s_ringp, mc.mc_tx_fanout_cpus[i],
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer m_ringp,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer m_ring.mr_info.mri_intr.mi_ddi_shared,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mc.mc_tx_retargeted_cpu[i]);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer first = B_FALSE;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer continue;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer }
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mdb_printf("%?s %-12s %?p %8d %?p %6d %6d\n",
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer "", "", s_ringp, mc.mc_tx_fanout_cpus[i],
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer m_ringp, m_ring.mr_info.mri_intr.mi_ddi_shared,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mc.mc_tx_retargeted_cpu[i]);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer }
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer break;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer }
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer case MAC_SRS_RXINTR: {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mac_cpus_t mc = srs.srs_cpu;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mac_ring_t *m_ringp, m_ring;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (DCMD_HDRSPEC(flags)) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mdb_printf("%?s %-12s %?s %8s %6s %6s\n",
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer "", "", "MAC", "", "POLL", "INTR");
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mdb_printf("%<u>%?s %-12s %?s %8s %6s %6s%</u>\n",
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer "ADDR", "LINK_NAME", "RING", "SHARED", "CPU",
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer "CPU");
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer }
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if ((args & MAC_SRS_RX) && (srs.srs_type & SRST_TX))
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer return (DCMD_OK);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mdb_printf("%?p %-12s ", addr, mci.mci_name);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer m_ringp = srs.srs_ring;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (m_ringp != NULL) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) mdb_vread(&m_ring, sizeof (m_ring),
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (uintptr_t)m_ringp);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mdb_printf("%?p %8d %6d %6d\n",
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer m_ringp, m_ring.mr_info.mri_intr.mi_ddi_shared,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mc.mc_rx_pollid, mc.mc_rx_intr_cpu);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer } else {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mdb_printf("%?p %8d %6d %6d\n",
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer 0, 0, mc.mc_rx_pollid, mc.mc_rx_intr_cpu);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer }
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail break;
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail }
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail case MAC_SRS_RXCPUVERBOSE:
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail case MAC_SRS_TXCPUVERBOSE: {
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail mac_cpus_t mc = srs.srs_cpu;
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail int cpu_index = 0, fanout_index = 0, len = 0;
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail boolean_t cpu_done = B_FALSE, fanout_done = B_FALSE;
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail if (DCMD_HDRSPEC(flags)) {
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail mdb_printf("%?s %-20s %-20s %-20s\n",
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail "", "", "CPU_COUNT", "FANOUT_CPU_COUNT");
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail mdb_printf("%<u>%?s %-20s "
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail "%-20s %-20s%</u>\n",
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail "ADDR", "LINK_NAME",
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail "(CPU_LIST)", "(CPU_LIST)");
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail }
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail if (((args & MAC_SRS_TX) && !(srs.srs_type & SRST_TX)) ||
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail ((args & MAC_SRS_RX) && (srs.srs_type & SRST_TX)))
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail return (DCMD_OK);
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail mdb_printf("%?p %-20s %-20d %-20d\n", addr, mci.mci_name,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mc.mc_ncpus, mc.mc_rx_fanout_cnt);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (mc.mc_ncpus == 0 && mc.mc_rx_fanout_cnt == 0)
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail break;
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail /* print all cpus and cpus for soft rings */
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail while (!cpu_done || !fanout_done) {
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail boolean_t old_value = cpu_done;
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail if (!cpu_done) {
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail mdb_printf("%?s %20s ", "", "");
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail cpu_done = mac_srs_print_cpu(&cpu_index,
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail mc.mc_ncpus, mc.mc_cpus, &len);
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail }
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail if (!fanout_done) {
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail if (old_value)
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail mdb_printf("%?s %-40s", "", "");
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail else
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail mdb_printf("%*s", len, "");
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail fanout_done = mac_srs_print_cpu(&fanout_index,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mc.mc_rx_fanout_cnt,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mc.mc_rx_fanout_cpus, NULL);
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail }
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail mdb_printf("\n");
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail }
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail break;
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail }
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail case MAC_SRS_RXSTAT: {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mac_rx_stats_t *mac_rx_stat = &srs.srs_rx.sr_stat;
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail if (DCMD_HDRSPEC(flags)) {
fcff38ebb7bf8c483f8a0427b4885ef7bbdc0c58Girish Moodalbail mdb_printf("%?s %-16s %8s %8s "
fcff38ebb7bf8c483f8a0427b4885ef7bbdc0c58Girish Moodalbail "%8s %8s %8s\n",
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail "", "", "INTR", "POLL",
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail "CHAIN", "CHAIN", "CHAIN");
fcff38ebb7bf8c483f8a0427b4885ef7bbdc0c58Girish Moodalbail mdb_printf("%<u>%?s %-16s %8s %8s "
fcff38ebb7bf8c483f8a0427b4885ef7bbdc0c58Girish Moodalbail "%8s %8s %8s%</u>\n",
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail "ADDR", "LINK_NAME", "COUNT", "COUNT",
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail "<10", "10-50", ">50");
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail }
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail if (srs.srs_type & SRST_TX)
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail return (DCMD_OK);
fcff38ebb7bf8c483f8a0427b4885ef7bbdc0c58Girish Moodalbail mdb_printf("%?p %-16s %8d "
fcff38ebb7bf8c483f8a0427b4885ef7bbdc0c58Girish Moodalbail "%8d %8d "
fcff38ebb7bf8c483f8a0427b4885ef7bbdc0c58Girish Moodalbail "%8d %8d\n",
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer addr, mci.mci_name, mac_rx_stat->mrs_intrcnt,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mac_rx_stat->mrs_pollcnt, mac_rx_stat->mrs_chaincntundr10,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mac_rx_stat->mrs_chaincnt10to50,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mac_rx_stat->mrs_chaincntover50);
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail break;
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail }
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail case MAC_SRS_TXSTAT: {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mac_tx_stats_t *mac_tx_stat = &srs.srs_tx.st_stat;
fcff38ebb7bf8c483f8a0427b4885ef7bbdc0c58Girish Moodalbail mac_soft_ring_t *s_ringp, s_ring;
fcff38ebb7bf8c483f8a0427b4885ef7bbdc0c58Girish Moodalbail boolean_t first = B_TRUE;
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail if (DCMD_HDRSPEC(flags)) {
fcff38ebb7bf8c483f8a0427b4885ef7bbdc0c58Girish Moodalbail mdb_printf("%?s %-20s %?s %8s %8s %8s\n",
fcff38ebb7bf8c483f8a0427b4885ef7bbdc0c58Girish Moodalbail "", "", "SOFT", "DROP", "BLOCK", "UNBLOCK");
fcff38ebb7bf8c483f8a0427b4885ef7bbdc0c58Girish Moodalbail mdb_printf("%<u>%?s %-20s %?s %8s %8s %8s%</u>\n",
fcff38ebb7bf8c483f8a0427b4885ef7bbdc0c58Girish Moodalbail "ADDR", "LINK_NAME", "RING", "COUNT", "COUNT",
fcff38ebb7bf8c483f8a0427b4885ef7bbdc0c58Girish Moodalbail "COUNT");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if (!(srs.srs_type & SRST_TX))
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return (DCMD_OK);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
fcff38ebb7bf8c483f8a0427b4885ef7bbdc0c58Girish Moodalbail mdb_printf("%?p %-20s ", addr, mci.mci_name);
fcff38ebb7bf8c483f8a0427b4885ef7bbdc0c58Girish Moodalbail
fcff38ebb7bf8c483f8a0427b4885ef7bbdc0c58Girish Moodalbail /*
fcff38ebb7bf8c483f8a0427b4885ef7bbdc0c58Girish Moodalbail * Case of no soft rings, print the info from
fcff38ebb7bf8c483f8a0427b4885ef7bbdc0c58Girish Moodalbail * mac_srs_tx_t.
fcff38ebb7bf8c483f8a0427b4885ef7bbdc0c58Girish Moodalbail */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (srs.srs_tx_ring_count == 0) {
fcff38ebb7bf8c483f8a0427b4885ef7bbdc0c58Girish Moodalbail mdb_printf("%?p %8d %8d %8d\n",
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer 0, mac_tx_stat->mts_sdrops,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mac_tx_stat->mts_blockcnt,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mac_tx_stat->mts_unblockcnt);
fcff38ebb7bf8c483f8a0427b4885ef7bbdc0c58Girish Moodalbail break;
fcff38ebb7bf8c483f8a0427b4885ef7bbdc0c58Girish Moodalbail }
fcff38ebb7bf8c483f8a0427b4885ef7bbdc0c58Girish Moodalbail
fcff38ebb7bf8c483f8a0427b4885ef7bbdc0c58Girish Moodalbail for (s_ringp = srs.srs_soft_ring_head; s_ringp != NULL;
fcff38ebb7bf8c483f8a0427b4885ef7bbdc0c58Girish Moodalbail s_ringp = s_ring.s_ring_next) {
fcff38ebb7bf8c483f8a0427b4885ef7bbdc0c58Girish Moodalbail (void) mdb_vread(&s_ring, sizeof (s_ring),
fcff38ebb7bf8c483f8a0427b4885ef7bbdc0c58Girish Moodalbail (uintptr_t)s_ringp);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mac_tx_stat = &s_ring.s_st_stat;
fcff38ebb7bf8c483f8a0427b4885ef7bbdc0c58Girish Moodalbail if (first) {
fcff38ebb7bf8c483f8a0427b4885ef7bbdc0c58Girish Moodalbail mdb_printf("%?p %8d %8d %8d\n",
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer s_ringp, mac_tx_stat->mts_sdrops,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mac_tx_stat->mts_blockcnt,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mac_tx_stat->mts_unblockcnt);
fcff38ebb7bf8c483f8a0427b4885ef7bbdc0c58Girish Moodalbail first = B_FALSE;
fcff38ebb7bf8c483f8a0427b4885ef7bbdc0c58Girish Moodalbail continue;
fcff38ebb7bf8c483f8a0427b4885ef7bbdc0c58Girish Moodalbail }
fcff38ebb7bf8c483f8a0427b4885ef7bbdc0c58Girish Moodalbail mdb_printf("%?s %-20s %?p %8d %8d %8d\n",
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer "", "", s_ringp, mac_tx_stat->mts_sdrops,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mac_tx_stat->mts_blockcnt,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mac_tx_stat->mts_unblockcnt);
fcff38ebb7bf8c483f8a0427b4885ef7bbdc0c58Girish Moodalbail }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng break;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail case MAC_SRS_NONE: {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if (DCMD_HDRSPEC(flags)) {
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail mdb_printf("%<u>%?s %-20s %?s %?s %-3s%</u>\n",
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail "ADDR", "LINK_NAME", "FLENT", "HW RING", "DIR");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail mdb_printf("%?p %-20s %?p %?p "
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail "%-3s ",
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail addr, mci.mci_name, srs.srs_flent, srs.srs_ring,
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail (srs.srs_type & SRST_TX ? "TX" : "RX"));
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng break;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail default:
2ae51e795e518fd8980f736920a1a38dd17b3ad6Girish Moodalbail return (DCMD_USAGE);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return (DCMD_OK);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng}
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Chengstatic int
da14cebe459d3275048785f25bd869cb09b5307fEric Chengmac_srs_walk_init(mdb_walk_state_t *wsp)
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng{
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if (mdb_layered_walk(LAYERED_WALKER_FOR_SRS, wsp) == -1) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mdb_warn("failed to walk 'mac_srs'");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return (WALK_ERR);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return (WALK_NEXT);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng}
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Chengstatic char *
da14cebe459d3275048785f25bd869cb09b5307fEric Chengmac_ring_state2str(mac_ring_state_t state)
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng{
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng switch (state) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng case MR_FREE:
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return ("free");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng case MR_NEWLY_ADDED:
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return ("new");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng case MR_INUSE:
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return ("inuse");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return ("--");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng}
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Chengstatic char *
da14cebe459d3275048785f25bd869cb09b5307fEric Chengmac_ring_classify2str(mac_classify_type_t classify)
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng{
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng switch (classify) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng case MAC_NO_CLASSIFIER:
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return ("no");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng case MAC_SW_CLASSIFIER:
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return ("sw");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng case MAC_HW_CLASSIFIER:
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return ("hw");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return ("--");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng}
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Chengstatic int
da14cebe459d3275048785f25bd869cb09b5307fEric Chengmac_ring_dcmd(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng{
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mac_ring_t ring;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mac_group_t group;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng flow_entry_t flent;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mac_soft_ring_set_t srs;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if (!(flags & DCMD_ADDRSPEC)) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if (mdb_walk_dcmd("mac_ring", "mac_ring", argc, argv) == -1) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mdb_warn("failed to walk 'mac_ring'");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return (DCMD_ERR);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return (DCMD_OK);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if (mdb_vread(&ring, sizeof (ring), addr) == -1) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mdb_warn("failed to read struct mac_ring_s at %p", addr);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return (DCMD_ERR);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng bzero(&flent, sizeof (flent));
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if (mdb_vread(&srs, sizeof (srs), (uintptr_t)ring.mr_srs) != -1) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng (void) mdb_vread(&flent, sizeof (flent),
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng (uintptr_t)srs.srs_flent);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng (void) mdb_vread(&group, sizeof (group), (uintptr_t)ring.mr_gh);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if (DCMD_HDRSPEC(flags)) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mdb_printf("%<u>%?s %4s %5s %4s %?s "
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng "%5s %?s %?s %s %</u>\n",
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng "ADDR", "TYPE", "STATE", "FLAG", "GROUP",
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng "CLASS", "MIP", "SRS", "FLOW NAME");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mdb_printf("%?p %-4s "
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng "%5s %04x "
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng "%?p %-5s "
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng "%?p %?p %s\n",
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng addr, ((ring.mr_type == 1)? "RX" : "TX"),
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mac_ring_state2str(ring.mr_state), ring.mr_flag,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng ring.mr_gh, mac_ring_classify2str(ring.mr_classify_type),
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng group.mrg_mh, ring.mr_srs, flent.fe_flow_name);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return (DCMD_OK);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng}
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Chengstatic int
da14cebe459d3275048785f25bd869cb09b5307fEric Chengmac_ring_walk_init(mdb_walk_state_t *wsp)
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng{
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if (mdb_layered_walk(LAYERED_WALKER_FOR_RING, wsp) == -1) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mdb_warn("failed to walk `mac_ring`");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return (WALK_ERR);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return (WALK_NEXT);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng}
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Chengstatic void
da14cebe459d3275048785f25bd869cb09b5307fEric Chengmac_ring_help(void)
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng{
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mdb_printf("If an address is specified, then mac_ring_t "
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng "structure at that address is printed. Otherwise all the "
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng "hardware rings in the system are printed.\n");
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng}
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi/*
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi * To walk groups we have to have our own somewhat-complicated state machine. We
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi * basically start by walking the mac_impl_t walker as all groups are stored off
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi * of the various mac_impl_t in the system. The tx and rx rings are kept
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi * separately. So we'll need to walk through all the rx rings and then all of
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi * the tx rings.
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi */
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchistatic int
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchimac_group_walk_init(mdb_walk_state_t *wsp)
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi{
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi int ret;
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi if (wsp->walk_addr != NULL) {
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi mdb_warn("non-global walks are not supported\n");
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi return (WALK_ERR);
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi }
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi if ((ret = mdb_layered_walk(LAYERED_WALKER_FOR_GROUP, wsp)) == -1) {
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi mdb_warn("couldn't walk '%s'", LAYERED_WALKER_FOR_GROUP);
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi return (ret);
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi }
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi return (WALK_NEXT);
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi}
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchistatic int
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchimac_group_walk_step(mdb_walk_state_t *wsp)
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi{
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi int ret;
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi mac_impl_t mi;
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi mac_group_t mg;
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi uintptr_t mgp;
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi /*
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi * Nothing to do if we can't find the layer above us. But the kmem
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi * walkers are a bit unsporting, they don't actually read in the data
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi * for us.
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi */
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi if (wsp->walk_addr == NULL)
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi return (WALK_DONE);
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi if (mdb_vread(&mi, sizeof (mac_impl_t), wsp->walk_addr) == -1) {
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi mdb_warn("failed to read mac_impl_t at %p", wsp->walk_addr);
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi return (DCMD_ERR);
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi }
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi /*
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi * First go for rx groups, then tx groups.
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi */
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi mgp = (uintptr_t)mi.mi_rx_groups;
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi while (mgp != NULL) {
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi if (mdb_vread(&mg, sizeof (mac_group_t), mgp) == -1) {
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi mdb_warn("failed to read mac_group_t at %p", mgp);
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi return (WALK_ERR);
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi }
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi ret = wsp->walk_callback(mgp, &mg, wsp->walk_cbdata);
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi if (ret != WALK_NEXT)
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi return (ret);
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi mgp = (uintptr_t)mg.mrg_next;
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi }
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi mgp = (uintptr_t)mi.mi_tx_groups;
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi while (mgp != NULL) {
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi if (mdb_vread(&mg, sizeof (mac_group_t), mgp) == -1) {
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi mdb_warn("failed to read mac_group_t at %p", mgp);
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi return (WALK_ERR);
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi }
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi ret = wsp->walk_callback(mgp, &mg, wsp->walk_cbdata);
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi if (ret != WALK_NEXT)
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi return (ret);
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi mgp = (uintptr_t)mg.mrg_next;
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi }
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi return (WALK_NEXT);
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi}
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchistatic int
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchimac_group_count_clients(mac_group_t *mgp)
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi{
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi int clients = 0;
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi uintptr_t mcp = (uintptr_t)mgp->mrg_clients;
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi while (mcp != NULL) {
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi mac_grp_client_t c;
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi if (mdb_vread(&c, sizeof (c), mcp) == -1) {
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi mdb_warn("failed to read mac_grp_client_t at %p", mcp);
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi return (-1);
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi }
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi clients++;
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi mcp = (uintptr_t)c.mgc_next;
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi }
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi return (clients);
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi}
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchistatic const char *
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchimac_group_type(mac_group_t *mgp)
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi{
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi const char *ret;
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi switch (mgp->mrg_type) {
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi case MAC_RING_TYPE_RX:
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi ret = "RECEIVE";
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi break;
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi case MAC_RING_TYPE_TX:
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi ret = "TRANSMIT";
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi break;
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi default:
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi ret = "UNKNOWN";
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi break;
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi }
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi return (ret);
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi}
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchistatic const char *
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchimac_group_state(mac_group_t *mgp)
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi{
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi const char *ret;
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi switch (mgp->mrg_state) {
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi case MAC_GROUP_STATE_UNINIT:
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi ret = "UNINT";
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi break;
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi case MAC_GROUP_STATE_REGISTERED:
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi ret = "REGISTERED";
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi break;
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi case MAC_GROUP_STATE_RESERVED:
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi ret = "RESERVED";
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi break;
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi case MAC_GROUP_STATE_SHARED:
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi ret = "SHARED";
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi break;
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi default:
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi ret = "UNKNOWN";
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi break;
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi }
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi return (ret);
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi}
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchistatic int
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchimac_group_dcmd(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi{
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi uint_t args = MAC_SRS_NONE;
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi mac_group_t mg;
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi int clients;
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi if (!(flags & DCMD_ADDRSPEC)) {
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi if (mdb_walk_dcmd("mac_group", "mac_group", argc, argv) == -1) {
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi mdb_warn("failed to walk 'mac_group'");
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi return (DCMD_ERR);
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi }
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi return (DCMD_OK);
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi }
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi if (mdb_getopts(argc, argv,
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi 'r', MDB_OPT_SETBITS, MAC_GROUP_RX, &args,
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi 't', MDB_OPT_SETBITS, MAC_GROUP_TX, &args,
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi 'u', MDB_OPT_SETBITS, MAC_GROUP_UNINIT, &args,
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi NULL) != argc)
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi return (DCMD_USAGE);
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi if (mdb_vread(&mg, sizeof (mac_group_t), addr) == -1) {
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi mdb_warn("failed to read mac_group_t at %p", addr);
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi return (DCMD_ERR);
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi }
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi if (DCMD_HDRSPEC(flags) && !(flags & DCMD_PIPE_OUT)) {
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi mdb_printf("%<u>%-?s %-8s %-10s %6s %8s %-?s%</u>\n",
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi "ADDR", "TYPE", "STATE", "NRINGS", "NCLIENTS", "RINGS");
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi }
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi if ((args & MAC_GROUP_RX) != 0 && mg.mrg_type != MAC_RING_TYPE_RX)
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi return (DCMD_OK);
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi if ((args & MAC_GROUP_TX) != 0 && mg.mrg_type != MAC_RING_TYPE_TX)
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi return (DCMD_OK);
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi /*
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi * By default, don't show uninitialized groups. They're not very
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi * interesting. They have no rings and no clients.
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi */
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi if (mg.mrg_state == MAC_GROUP_STATE_UNINIT &&
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi (args & MAC_GROUP_UNINIT) == 0)
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi return (DCMD_OK);
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi if (flags & DCMD_PIPE_OUT) {
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi mdb_printf("%lr\n", addr);
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi return (DCMD_OK);
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi }
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi clients = mac_group_count_clients(&mg);
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi mdb_printf("%?p %-8s %-10s %6d %8d %?p\n", addr, mac_group_type(&mg),
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi mac_group_state(&mg), mg.mrg_cur_count, clients, mg.mrg_rings);
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi return (DCMD_OK);
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi}
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng/* Supported dee-commands */
da14cebe459d3275048785f25bd869cb09b5307fEric Chengstatic const mdb_dcmd_t dcmds[] = {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng {"mac_flow", "?[-u] [-aprtsm]", "display Flow Entry structures",
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mac_flow_dcmd, mac_flow_help},
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi {"mac_group", "?[-rtu]", "display MAC Ring Groups", mac_group_dcmd,
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi NULL },
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer {"mac_srs", "?[ -r[i|s|c[v]] | -t[i|s|c[v]] ]",
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer "display MAC Soft Ring Set" " structures", mac_srs_dcmd,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mac_srs_help},
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng {"mac_ring", "?", "display MAC ring (hardware) structures",
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mac_ring_dcmd, mac_ring_help},
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng { NULL }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng};
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng/* Supported walkers */
da14cebe459d3275048785f25bd869cb09b5307fEric Chengstatic const mdb_walker_t walkers[] = {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng {"mac_flow", "walk list of flow entry structures", mac_flow_walk_init,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mac_common_walk_step, NULL, NULL},
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi {"mac_group", "walk list of ring group structures", mac_group_walk_init,
d47ced1f1801c1c1ca309ff7c5997bf0c8cb4092Robert Mustacchi mac_group_walk_step, NULL, NULL},
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng {"mac_srs", "walk list of mac soft ring set structures",
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mac_srs_walk_init, mac_common_walk_step, NULL, NULL},
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng {"mac_ring", "walk list of mac ring structures", mac_ring_walk_init,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng mac_common_walk_step, NULL, NULL},
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng { NULL }
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng};
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Chengstatic const mdb_modinfo_t modinfo = { MDB_API_VERSION, dcmds, walkers };
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng
da14cebe459d3275048785f25bd869cb09b5307fEric Chengconst mdb_modinfo_t *
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng_mdb_init(void)
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng{
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return (&modinfo);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng}