Print this page
7898 mdb's ::netstat doesn't print UDP conn_t pointer correctly


 626                 net_ipv6addrport_pr(&connp->conn_faddr_v6, connp->conn_fport);
 627         }
 628         mdb_printf(" %5i", ns_to_stackid((uintptr_t)connp->conn_netstack));
 629         mdb_printf(" %4i\n", connp->conn_zoneid);
 630         if (opts & NETSTAT_VERBOSE)
 631                 netstat_tcp_verbose_pr(tcp);
 632 
 633         return (WALK_NEXT);
 634 }
 635 
 636 /*ARGSUSED*/
 637 static int
 638 netstat_udp_cb(uintptr_t kaddr, const void *walk_data, void *cb_data)
 639 {
 640         netstat_cb_data_t *ncb = cb_data;
 641         uint_t opts = ncb->opts;
 642         int af = ncb->af;
 643         udp_t udp;
 644         conn_t *connp = &ncb->conn;
 645         char *state;

 646 
 647         if (mdb_vread(connp, sizeof (conn_t), kaddr) == -1) {
 648                 mdb_warn("failed to read conn_t at %p", kaddr);
 649                 return (WALK_ERR);
 650         }
 651 
 652         if (mdb_vread(&udp, sizeof (udp_t),
 653             (uintptr_t)connp->conn_udp) == -1) {
 654                 mdb_warn("failed to read conn_udp at %p",
 655                     (uintptr_t)connp->conn_udp);
 656                 return (WALK_ERR);
 657         }
 658 

 659         connp->conn_udp = &udp;
 660         udp.udp_connp = connp;
 661 
 662         if (!((opts & NETSTAT_ALL) || net_udp_active(&udp)) ||
 663             (af == AF_INET && !net_udp_ipv4(&udp)) ||
 664             (af == AF_INET6 && !net_udp_ipv6(&udp))) {
 665                 return (WALK_NEXT);
 666         }
 667 
 668         if (udp.udp_state == TS_UNBND)
 669                 state = "UNBOUND";
 670         else if (udp.udp_state == TS_IDLE)
 671                 state = "IDLE";
 672         else if (udp.udp_state == TS_DATA_XFER)
 673                 state = "CONNECTED";
 674         else
 675                 state = "UNKNOWN";
 676 
 677         mdb_printf("%0?p %10s ", (uintptr_t)connp->conn_udp, state);
 678         if (af == AF_INET) {
 679                 net_ipv4addrport_pr(&connp->conn_laddr_v6, connp->conn_lport);
 680                 mdb_printf(" ");
 681                 net_ipv4addrport_pr(&connp->conn_faddr_v6, connp->conn_fport);
 682         } else if (af == AF_INET6) {
 683                 net_ipv6addrport_pr(&connp->conn_laddr_v6, connp->conn_lport);
 684                 mdb_printf(" ");
 685                 net_ipv6addrport_pr(&connp->conn_faddr_v6, connp->conn_fport);
 686         }
 687         mdb_printf(" %5i", ns_to_stackid((uintptr_t)connp->conn_netstack));
 688         mdb_printf(" %4i\n", connp->conn_zoneid);
 689 
 690         return (WALK_NEXT);
 691 }
 692 
 693 /*ARGSUSED*/
 694 static int
 695 netstat_icmp_cb(uintptr_t kaddr, const void *walk_data, void *cb_data)
 696 {
 697         netstat_cb_data_t *ncb = cb_data;




 626                 net_ipv6addrport_pr(&connp->conn_faddr_v6, connp->conn_fport);
 627         }
 628         mdb_printf(" %5i", ns_to_stackid((uintptr_t)connp->conn_netstack));
 629         mdb_printf(" %4i\n", connp->conn_zoneid);
 630         if (opts & NETSTAT_VERBOSE)
 631                 netstat_tcp_verbose_pr(tcp);
 632 
 633         return (WALK_NEXT);
 634 }
 635 
 636 /*ARGSUSED*/
 637 static int
 638 netstat_udp_cb(uintptr_t kaddr, const void *walk_data, void *cb_data)
 639 {
 640         netstat_cb_data_t *ncb = cb_data;
 641         uint_t opts = ncb->opts;
 642         int af = ncb->af;
 643         udp_t udp;
 644         conn_t *connp = &ncb->conn;
 645         char *state;
 646         uintptr_t udp_kaddr;
 647 
 648         if (mdb_vread(connp, sizeof (conn_t), kaddr) == -1) {
 649                 mdb_warn("failed to read conn_t at %p", kaddr);
 650                 return (WALK_ERR);
 651         }
 652 
 653         udp_kaddr = (uintptr_t)connp->conn_udp;
 654         if (mdb_vread(&udp, sizeof (udp_t), udp_kaddr) == -1) {
 655                 mdb_warn("failed to read conn_udp at %p", udp_kaddr);

 656                 return (WALK_ERR);
 657         }
 658 
 659         /* Need to do these reassignments for the net_udp_*() routines below. */
 660         connp->conn_udp = &udp;
 661         udp.udp_connp = connp;
 662 
 663         if (!((opts & NETSTAT_ALL) || net_udp_active(&udp)) ||
 664             (af == AF_INET && !net_udp_ipv4(&udp)) ||
 665             (af == AF_INET6 && !net_udp_ipv6(&udp))) {
 666                 return (WALK_NEXT);
 667         }
 668 
 669         if (udp.udp_state == TS_UNBND)
 670                 state = "UNBOUND";
 671         else if (udp.udp_state == TS_IDLE)
 672                 state = "IDLE";
 673         else if (udp.udp_state == TS_DATA_XFER)
 674                 state = "CONNECTED";
 675         else
 676                 state = "UNKNOWN";
 677 
 678         mdb_printf("%0?p %10s ", udp_kaddr, state);
 679         if (af == AF_INET) {
 680                 net_ipv4addrport_pr(&connp->conn_laddr_v6, connp->conn_lport);
 681                 mdb_printf(" ");
 682                 net_ipv4addrport_pr(&connp->conn_faddr_v6, connp->conn_fport);
 683         } else if (af == AF_INET6) {
 684                 net_ipv6addrport_pr(&connp->conn_laddr_v6, connp->conn_lport);
 685                 mdb_printf(" ");
 686                 net_ipv6addrport_pr(&connp->conn_faddr_v6, connp->conn_fport);
 687         }
 688         mdb_printf(" %5i", ns_to_stackid((uintptr_t)connp->conn_netstack));
 689         mdb_printf(" %4i\n", connp->conn_zoneid);
 690 
 691         return (WALK_NEXT);
 692 }
 693 
 694 /*ARGSUSED*/
 695 static int
 696 netstat_icmp_cb(uintptr_t kaddr, const void *walk_data, void *cb_data)
 697 {
 698         netstat_cb_data_t *ncb = cb_data;