381a2a9a387f449fab7d0c7e97c4184c26963abfdr/*
381a2a9a387f449fab7d0c7e97c4184c26963abfdr * CDDL HEADER START
381a2a9a387f449fab7d0c7e97c4184c26963abfdr *
381a2a9a387f449fab7d0c7e97c4184c26963abfdr * The contents of this file are subject to the terms of the
381a2a9a387f449fab7d0c7e97c4184c26963abfdr * Common Development and Distribution License (the "License").
381a2a9a387f449fab7d0c7e97c4184c26963abfdr * You may not use this file except in compliance with the License.
381a2a9a387f449fab7d0c7e97c4184c26963abfdr *
381a2a9a387f449fab7d0c7e97c4184c26963abfdr * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
381a2a9a387f449fab7d0c7e97c4184c26963abfdr * or http://www.opensolaris.org/os/licensing.
381a2a9a387f449fab7d0c7e97c4184c26963abfdr * See the License for the specific language governing permissions
381a2a9a387f449fab7d0c7e97c4184c26963abfdr * and limitations under the License.
381a2a9a387f449fab7d0c7e97c4184c26963abfdr *
381a2a9a387f449fab7d0c7e97c4184c26963abfdr * When distributing Covered Code, include this CDDL HEADER in each
381a2a9a387f449fab7d0c7e97c4184c26963abfdr * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
381a2a9a387f449fab7d0c7e97c4184c26963abfdr * If applicable, add the following below this CDDL HEADER, with the
381a2a9a387f449fab7d0c7e97c4184c26963abfdr * fields enclosed by brackets "[]" replaced with your own identifying
381a2a9a387f449fab7d0c7e97c4184c26963abfdr * information: Portions Copyright [yyyy] [name of copyright owner]
381a2a9a387f449fab7d0c7e97c4184c26963abfdr *
381a2a9a387f449fab7d0c7e97c4184c26963abfdr * CDDL HEADER END
381a2a9a387f449fab7d0c7e97c4184c26963abfdr */
381a2a9a387f449fab7d0c7e97c4184c26963abfdr/*
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
381a2a9a387f449fab7d0c7e97c4184c26963abfdr * Use is subject to license terms.
381a2a9a387f449fab7d0c7e97c4184c26963abfdr */
381a2a9a387f449fab7d0c7e97c4184c26963abfdr
381a2a9a387f449fab7d0c7e97c4184c26963abfdr#include <sys/types.h>
381a2a9a387f449fab7d0c7e97c4184c26963abfdr#include <sys/rwlock.h>
381a2a9a387f449fab7d0c7e97c4184c26963abfdr#include <mdb/mdb_modapi.h>
381a2a9a387f449fab7d0c7e97c4184c26963abfdr#include <sys/queue.h>
381a2a9a387f449fab7d0c7e97c4184c26963abfdr#include <sys/neti.h>
381a2a9a387f449fab7d0c7e97c4184c26963abfdr
381a2a9a387f449fab7d0c7e97c4184c26963abfdr
381a2a9a387f449fab7d0c7e97c4184c26963abfdr/*
381a2a9a387f449fab7d0c7e97c4184c26963abfdr * PROT_LENGTH is the max length. If the true length is bigger
381a2a9a387f449fab7d0c7e97c4184c26963abfdr * it is truncated.
381a2a9a387f449fab7d0c7e97c4184c26963abfdr */
381a2a9a387f449fab7d0c7e97c4184c26963abfdr#define PROT_LENGTH 32
381a2a9a387f449fab7d0c7e97c4184c26963abfdr
381a2a9a387f449fab7d0c7e97c4184c26963abfdr/*
381a2a9a387f449fab7d0c7e97c4184c26963abfdr * List pfhooks netinfo information.
381a2a9a387f449fab7d0c7e97c4184c26963abfdr */
381a2a9a387f449fab7d0c7e97c4184c26963abfdr/*ARGSUSED*/
381a2a9a387f449fab7d0c7e97c4184c26963abfdrint
381a2a9a387f449fab7d0c7e97c4184c26963abfdrnetinfolist(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
381a2a9a387f449fab7d0c7e97c4184c26963abfdr{
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh struct neti_stack *nts;
381a2a9a387f449fab7d0c7e97c4184c26963abfdr struct netd_listhead nlh;
381a2a9a387f449fab7d0c7e97c4184c26963abfdr struct net_data nd, *p;
381a2a9a387f449fab7d0c7e97c4184c26963abfdr char str[PROT_LENGTH];
381a2a9a387f449fab7d0c7e97c4184c26963abfdr
381a2a9a387f449fab7d0c7e97c4184c26963abfdr if (argc)
381a2a9a387f449fab7d0c7e97c4184c26963abfdr return (DCMD_USAGE);
381a2a9a387f449fab7d0c7e97c4184c26963abfdr
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh if (mdb_vread((void *)&nts, sizeof (nts),
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh (uintptr_t)(addr + OFFSETOF(netstack_t, netstack_neti))) == -1) {
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh mdb_warn("couldn't read netstack_neti");
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh return (DCMD_ERR);
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh }
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh if (mdb_vread((void *)&nlh, sizeof (nlh), (uintptr_t)((uintptr_t)nts +
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh OFFSETOF(neti_stack_t, nts_netd_head))) == -1) {
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh mdb_warn("couldn't read netd list head");
381a2a9a387f449fab7d0c7e97c4184c26963abfdr return (DCMD_ERR);
381a2a9a387f449fab7d0c7e97c4184c26963abfdr }
381a2a9a387f449fab7d0c7e97c4184c26963abfdr mdb_printf("%<u>%?s %?s %10s%</u>\n",
381a2a9a387f449fab7d0c7e97c4184c26963abfdr "ADDR(netinfo)", "ADDR(hookevent)", "netinfo");
381a2a9a387f449fab7d0c7e97c4184c26963abfdr p = LIST_FIRST(&nlh);
381a2a9a387f449fab7d0c7e97c4184c26963abfdr while (p) {
381a2a9a387f449fab7d0c7e97c4184c26963abfdr if (mdb_vread((void *)&nd, sizeof (nd), (uintptr_t)p) == -1) {
381a2a9a387f449fab7d0c7e97c4184c26963abfdr mdb_warn("couldn't read netinfo at %p", p);
381a2a9a387f449fab7d0c7e97c4184c26963abfdr return (DCMD_ERR);
381a2a9a387f449fab7d0c7e97c4184c26963abfdr }
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed if (!nd.netd_info.netp_name) {
381a2a9a387f449fab7d0c7e97c4184c26963abfdr mdb_warn("netinfo at %p has null protocol",
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed nd.netd_info.netp_name);
381a2a9a387f449fab7d0c7e97c4184c26963abfdr return (DCMD_ERR);
381a2a9a387f449fab7d0c7e97c4184c26963abfdr }
381a2a9a387f449fab7d0c7e97c4184c26963abfdr if (mdb_readstr((char *)str, sizeof (str),
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed (uintptr_t)nd.netd_info.netp_name) == -1) {
381a2a9a387f449fab7d0c7e97c4184c26963abfdr mdb_warn("couldn't read protocol at %p",
7ddc9b1afd18f260b9fb78ec7732facd91769131Darren Reed nd.netd_info.netp_name);
381a2a9a387f449fab7d0c7e97c4184c26963abfdr return (DCMD_ERR);
381a2a9a387f449fab7d0c7e97c4184c26963abfdr }
381a2a9a387f449fab7d0c7e97c4184c26963abfdr
381a2a9a387f449fab7d0c7e97c4184c26963abfdr mdb_printf("%0?p %0?p %10s\n",
381a2a9a387f449fab7d0c7e97c4184c26963abfdr (char *)p + (uintptr_t)&((struct net_data *)0)->netd_info,
381a2a9a387f449fab7d0c7e97c4184c26963abfdr nd.netd_hooks, str);
381a2a9a387f449fab7d0c7e97c4184c26963abfdr
381a2a9a387f449fab7d0c7e97c4184c26963abfdr p = LIST_NEXT(&nd, netd_list);
381a2a9a387f449fab7d0c7e97c4184c26963abfdr }
381a2a9a387f449fab7d0c7e97c4184c26963abfdr
381a2a9a387f449fab7d0c7e97c4184c26963abfdr return (DCMD_OK);
381a2a9a387f449fab7d0c7e97c4184c26963abfdr}
381a2a9a387f449fab7d0c7e97c4184c26963abfdr
381a2a9a387f449fab7d0c7e97c4184c26963abfdrstatic const mdb_dcmd_t dcmds[] = {
381a2a9a387f449fab7d0c7e97c4184c26963abfdr { "netinfolist", "", "display netinfo information",
381a2a9a387f449fab7d0c7e97c4184c26963abfdr netinfolist, NULL },
381a2a9a387f449fab7d0c7e97c4184c26963abfdr { NULL }
381a2a9a387f449fab7d0c7e97c4184c26963abfdr};
381a2a9a387f449fab7d0c7e97c4184c26963abfdr
381a2a9a387f449fab7d0c7e97c4184c26963abfdrstatic const mdb_modinfo_t modinfo = { MDB_API_VERSION, dcmds };
381a2a9a387f449fab7d0c7e97c4184c26963abfdr
381a2a9a387f449fab7d0c7e97c4184c26963abfdrconst mdb_modinfo_t *
381a2a9a387f449fab7d0c7e97c4184c26963abfdr_mdb_init(void)
381a2a9a387f449fab7d0c7e97c4184c26963abfdr{
381a2a9a387f449fab7d0c7e97c4184c26963abfdr return (&modinfo);
381a2a9a387f449fab7d0c7e97c4184c26963abfdr}