diff options
Diffstat (limited to 'usr/src/cmd/mdb/common/modules/genunix/net.c')
-rw-r--r-- | usr/src/cmd/mdb/common/modules/genunix/net.c | 81 |
1 files changed, 44 insertions, 37 deletions
diff --git a/usr/src/cmd/mdb/common/modules/genunix/net.c b/usr/src/cmd/mdb/common/modules/genunix/net.c index 0b6d826491..209b207bd3 100644 --- a/usr/src/cmd/mdb/common/modules/genunix/net.c +++ b/usr/src/cmd/mdb/common/modules/genunix/net.c @@ -107,7 +107,8 @@ net_tcp_ipv6(const tcp_t *tcp) static int net_udp_active(const udp_t *udp) { - return ((udp->udp_state != TS_UNBND) && (udp->udp_state != TS_IDLE)); + return ((udp->udp_state == TS_IDLE) || + (udp->udp_state == TS_DATA_XFER)); } static int @@ -355,11 +356,6 @@ mi_payload_walk_fini(mdb_walk_state_t *wsp) delete_mi_payload_walk_data(wsp->walk_data, arg->mi_pwa_size); } -const mi_payload_walk_arg_t mi_udp_arg = { - "udp", "udp_g_head", sizeof (udp_t), - MI_PAYLOAD_DEVICE | MI_PAYLOAD_MODULE -}; - const mi_payload_walk_arg_t mi_ar_arg = { "arp", "ar_g_head", sizeof (ar_t), MI_PAYLOAD_DEVICE | MI_PAYLOAD_MODULE @@ -595,7 +591,7 @@ netstat_tcp_cb(uintptr_t kaddr, const void *walk_data, void *cb_data, int af) tcp = (tcp_t *)((uintptr_t)connp + (tcp_kaddr - kaddr)); if ((uintptr_t)tcp < (uintptr_t)connp || - (uintptr_t)&tcp->tcp_connp > (uintptr_t)connp + itc_size || + (uintptr_t)(tcp + 1) > (uintptr_t)connp + itc_size || (uintptr_t)tcp->tcp_connp != kaddr) { mdb_warn("conn_tcp %p is invalid", tcp_kaddr); return (WALK_NEXT); @@ -603,7 +599,7 @@ netstat_tcp_cb(uintptr_t kaddr, const void *walk_data, void *cb_data, int af) connp->conn_tcp = tcp; tcp->tcp_connp = connp; - if (!(opts & NETSTAT_ALL || net_tcp_active(tcp)) || + if (!((opts & NETSTAT_ALL) || net_tcp_active(tcp)) || (af == AF_INET && !net_tcp_ipv4(tcp)) || (af == AF_INET6 && !net_tcp_ipv6(tcp))) { return (WALK_NEXT); @@ -639,45 +635,57 @@ netstat_tcpv6_cb(uintptr_t kaddr, const void *walk_data, void *cb_data) return (netstat_tcp_cb(kaddr, walk_data, cb_data, AF_INET6)); } +/*ARGSUSED*/ static int -netstat_udpv4_cb(uintptr_t kaddr, const void *walk_data, void *cb_data) +netstat_udp_cb(uintptr_t kaddr, const void *walk_data, void *cb_data, int af) { - const udp_t *udp = walk_data; const uintptr_t opts = (uintptr_t)cb_data; + udp_t udp; + conn_t connp; + + if (mdb_vread(&udp, sizeof (udp_t), kaddr) == -1) { + mdb_warn("failed to read udp at %p", kaddr); + return (WALK_ERR); + } - if (!((opts & NETSTAT_ALL || net_udp_active(udp)) && net_udp_ipv4(udp))) + if (mdb_vread(&connp, sizeof (conn_t), + (uintptr_t)udp.udp_connp) == -1) { + mdb_warn("failed to read udp_connp at %p", + (uintptr_t)udp.udp_connp); + return (WALK_ERR); + } + + if (!((opts & NETSTAT_ALL) || net_udp_active(&udp)) || + (af == AF_INET && !net_udp_ipv4(&udp)) || + (af == AF_INET6 && !net_udp_ipv6(&udp))) { return (WALK_NEXT); + } - mdb_printf("%0?p %2i ", kaddr, udp->udp_state); - net_ipv4addrport_pr(&udp->udp_v6src, udp->udp_port); - mdb_printf(" "); - net_ipv4addrport_pr(&udp->udp_v6dst, udp->udp_dstport); - mdb_printf(" %4i\n", udp->udp_zoneid); + mdb_printf("%0?p %2i ", kaddr, udp.udp_state); + if (af == AF_INET) { + net_ipv4addrport_pr(&udp.udp_v6src, udp.udp_port); + mdb_printf(" "); + net_ipv4addrport_pr(&udp.udp_v6dst, udp.udp_dstport); + } else if (af == AF_INET6) { + net_ipv6addrport_pr(&udp.udp_v6src, udp.udp_port); + mdb_printf(" "); + net_ipv6addrport_pr(&udp.udp_v6dst, udp.udp_dstport); + } + mdb_printf(" %4i\n", connp.conn_zoneid); return (WALK_NEXT); } static int -netstat_udpv6_cb(uintptr_t kaddr, const void *walk_data, void *cb_data) +netstat_udpv4_cb(uintptr_t kaddr, const void *walk_data, void *cb_data) { - const udp_t *udp = walk_data; - const uintptr_t opts = (uintptr_t)cb_data; - - if (!((opts & NETSTAT_ALL || net_udp_active(udp)) && net_udp_ipv6(udp))) - return (WALK_NEXT); - - mdb_printf("%0?p %2i ", kaddr, udp->udp_state); - net_ipv6addrport_pr(&udp->udp_v6src, udp->udp_port); - mdb_printf(" "); - - /* Remote */ - if (udp->udp_state == TS_DATA_XFER) - net_ipv6addrport_pr(&udp->udp_v6dst, udp->udp_dstport); - else - mdb_printf("%*s.0 ", ADDR_V6_WIDTH, "0:0:0:0:0:0:0:0"); - mdb_printf(" %4i\n", udp->udp_zoneid); + return (netstat_udp_cb(kaddr, walk_data, cb_data, AF_INET)); +} - return (WALK_NEXT); +static int +netstat_udpv6_cb(uintptr_t kaddr, const void *walk_data, void *cb_data) +{ + return (netstat_udp_cb(kaddr, walk_data, cb_data, AF_INET6)); } /* @@ -855,7 +863,7 @@ netstat(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) "UDPv4", ADDR_V4_WIDTH, "Local Address", ADDR_V4_WIDTH, "Remote Address", "Zone"); - if (mdb_walk("genunix`udp", netstat_udpv4_cb, + if (mdb_walk("udp_cache", netstat_udpv4_cb, (void *)(uintptr_t)opts) == -1) { mdb_warn("failed to walk genunix`udp"); return (DCMD_ERR); @@ -870,12 +878,11 @@ netstat(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) "UDPv6", ADDR_V6_WIDTH, "Local Address", ADDR_V6_WIDTH, "Remote Address", "Zone"); - if (mdb_walk("genunix`udp", netstat_udpv6_cb, + if (mdb_walk("udp_cache", netstat_udpv6_cb, (void *)(uintptr_t)opts) == -1) { mdb_warn("failed to walk genunix`udp"); return (DCMD_ERR); } - } } |