diff options
author | masputra <none@none> | 2005-10-22 22:50:14 -0700 |
---|---|---|
committer | masputra <none@none> | 2005-10-22 22:50:14 -0700 |
commit | ff550d0e264b51131fb34e9e83163b348d916640 (patch) | |
tree | 5cfa61832db382b34b7090acd22cfed2bed7cf82 /usr/src/cmd/mdb/common/modules/genunix/net.c | |
parent | d56104979b99dfd4b6bb1294d1c318fbd990903a (diff) | |
download | illumos-joyent-ff550d0e264b51131fb34e9e83163b348d916640.tar.gz |
PSARC 2005/082 Yosemite: UDP Performance Enhancement
4796051 Solaris needs a more complete HW checksumming support
4905227 duplicate macros in ipclassifier.h and ip.h
4915681 need hardware checksum offload for the case of IP/UDP reassembly
6201076 outbound flow-control dysfunctional, ip to ce using mdt
6223331 ipv6 flow control may corrupt UDP packets
6223809 16-bit aligned IP header should be allowed for all x86 platforms
6275398 Galaxy hangs when running lmbench
6281836 Yosemite project integration into Solaris
6281885 xge needs to support IPv6 checksum offload
6282776 IPv6 NCE fast path is not created for incoming solicitation
6304890 IP transmit-side checksum logic needs to be tightened
6304902 IP6_IN_NOCKSUM is obsolete and should be torched
6304904 UDP should reject TI_GETPEERNAME for non-connected endpoint
6306768 IP and UDP device and module definitions need to be centralized
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); } - } } |