summaryrefslogtreecommitdiff
path: root/usr/src/cmd/mdb/common/modules/genunix/net.c
diff options
context:
space:
mode:
authormasputra <none@none>2005-10-22 22:50:14 -0700
committermasputra <none@none>2005-10-22 22:50:14 -0700
commitff550d0e264b51131fb34e9e83163b348d916640 (patch)
tree5cfa61832db382b34b7090acd22cfed2bed7cf82 /usr/src/cmd/mdb/common/modules/genunix/net.c
parentd56104979b99dfd4b6bb1294d1c318fbd990903a (diff)
downloadillumos-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.c81
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);
}
-
}
}