Print this page
XXXX adding PID information to netstat output

@@ -28,10 +28,17 @@
 #include <sys/tihdr.h>
 #include <sys/policy.h>
 #include <sys/tsol/tnet.h>
 #include <sys/kstat.h>
 
+#include <sys/strsun.h>
+#include <sys/stropts.h>
+#include <sys/strsubr.h>
+#include <sys/socket.h>
+#include <sys/socketvar.h>
+#include <sys/uio.h>
+
 #include <inet/common.h>
 #include <inet/ip.h>
 #include <inet/tcp.h>
 #include <inet/tcp_impl.h>
 #include <inet/tcp_stats.h>

@@ -95,14 +102,18 @@
         mblk_t                  *mpdata;
         mblk_t                  *mp_conn_ctl = NULL;
         mblk_t                  *mp_conn_tail;
         mblk_t                  *mp_attr_ctl = NULL;
         mblk_t                  *mp_attr_tail;
+        mblk_t                  *mp_pidnode_ctl = NULL;
+        mblk_t                  *mp_pidnode_tail;
         mblk_t                  *mp6_conn_ctl = NULL;
         mblk_t                  *mp6_conn_tail;
         mblk_t                  *mp6_attr_ctl = NULL;
         mblk_t                  *mp6_attr_tail;
+        mblk_t                  *mp6_pidnode_ctl = NULL;
+        mblk_t                  *mp6_pidnode_tail;
         struct opthdr           *optp;
         mib2_tcpConnEntry_t     tce;
         mib2_tcp6ConnEntry_t    tce6;
         mib2_transportMLPEntry_t mlp;
         connf_t                 *connfp;

@@ -125,16 +136,20 @@
 
         if (mpctl == NULL ||
             (mpdata = mpctl->b_cont) == NULL ||
             (mp_conn_ctl = copymsg(mpctl)) == NULL ||
             (mp_attr_ctl = copymsg(mpctl)) == NULL ||
+            (mp_pidnode_ctl = copymsg(mpctl)) == NULL ||
             (mp6_conn_ctl = copymsg(mpctl)) == NULL ||
-            (mp6_attr_ctl = copymsg(mpctl)) == NULL) {
+            (mp6_attr_ctl = copymsg(mpctl)) == NULL ||
+            (mp6_pidnode_ctl = copymsg(mpctl)) == NULL) {
                 freemsg(mp_conn_ctl);
                 freemsg(mp_attr_ctl);
+                freemsg(mp_pidnode_ctl);
                 freemsg(mp6_conn_ctl);
                 freemsg(mp6_attr_ctl);
+                freemsg(mp6_pidnode_ctl);
                 freemsg(mpctl);
                 freemsg(mp2ctl);
                 return (NULL);
         }
 

@@ -164,10 +179,11 @@
             secpolicy_ip_config((Q_TO_CONN(q))->conn_cred, B_TRUE) == 0;
         zoneid = Q_TO_CONN(q)->conn_zoneid;
 
         v4_conn_idx = v6_conn_idx = 0;
         mp_conn_tail = mp_attr_tail = mp6_conn_tail = mp6_attr_tail = NULL;
+        mp_pidnode_tail = mp6_pidnode_tail = NULL;
 
         for (i = 0; i < CONN_G_HASH_SIZE; i++) {
                 ipst = tcps->tcps_netstack->netstack_ip;
 
                 connfp = &ipst->ips_ipcl_globalhash_fanout[i];

@@ -279,10 +295,16 @@
                         tce6.tcp6ConnCreationTime = connp->conn_open_time;
 
                         (void) snmp_append_data2(mp6_conn_ctl->b_cont,
                             &mp6_conn_tail, (char *)&tce6, tce6_size);
 
+                        (void) snmp_append_data2(mp6_pidnode_ctl->b_cont,
+                            &mp6_pidnode_tail, (char *)&tce6, tce6_size);
+
+                        (void) snmp_append_mblk2(mp6_pidnode_ctl->b_cont,
+                            &mp6_pidnode_tail, conn_get_pid_mblk(connp));
+
                         mlp.tme_connidx = v6_conn_idx++;
                         if (needattr)
                                 (void) snmp_append_data2(mp6_attr_ctl->b_cont,
                                     &mp6_attr_tail, (char *)&mlp, sizeof (mlp));
                         }

@@ -346,10 +368,16 @@
                                 tce.tcpConnCreationTime = connp->conn_open_time;
 
                                 (void) snmp_append_data2(mp_conn_ctl->b_cont,
                                     &mp_conn_tail, (char *)&tce, tce_size);
 
+                                (void) snmp_append_data2(mp_pidnode_ctl->b_cont,
+                                    &mp_pidnode_tail, (char *)&tce, tce_size);
+
+                                (void) snmp_append_mblk2(mp_pidnode_ctl->b_cont,
+                                    &mp_pidnode_tail, conn_get_pid_mblk(connp));
+
                                 mlp.tme_connidx = v4_conn_idx++;
                                 if (needattr)
                                         (void) snmp_append_data2(
                                             mp_attr_ctl->b_cont,
                                             &mp_attr_tail, (char *)&mlp,

@@ -415,10 +443,33 @@
         optp->len = msgdsize(mp6_attr_ctl->b_cont);
         if (optp->len == 0)
                 freemsg(mp6_attr_ctl);
         else
                 qreply(q, mp6_attr_ctl);
+
+        /* table of EXPER_XPORT_PROC_INFO  ipv4 */
+        optp = (struct opthdr *)&mp_pidnode_ctl->b_rptr[
+            sizeof (struct T_optmgmt_ack)];
+        optp->level = MIB2_TCP;
+        optp->name = EXPER_XPORT_PROC_INFO;
+        optp->len = msgdsize(mp_pidnode_ctl->b_cont);
+        if (optp->len == 0)
+                freemsg(mp_pidnode_ctl);
+        else
+                qreply(q, mp_pidnode_ctl);
+
+        /* table of EXPER_XPORT_PROC_INFO  ipv6 */
+        optp = (struct opthdr *)&mp6_pidnode_ctl->b_rptr[
+            sizeof (struct T_optmgmt_ack)];
+        optp->level = MIB2_TCP6;
+        optp->name = EXPER_XPORT_PROC_INFO;
+        optp->len = msgdsize(mp6_pidnode_ctl->b_cont);
+        if (optp->len == 0)
+                freemsg(mp6_pidnode_ctl);
+        else
+                qreply(q, mp6_pidnode_ctl);
+
         return (mp2ctl);
 }
 
 /* Return 0 if invalid set request, 1 otherwise, including non-tcp requests  */
 /* ARGSUSED */