Print this page
XXXX adding PID information to netstat output

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/inet/tcp/tcp_stats.c
          +++ new/usr/src/uts/common/inet/tcp/tcp_stats.c
↓ open down ↓ 22 lines elided ↑ open up ↑
  23   23   * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
  24   24   * Copyright (c) 2011, Joyent Inc. All rights reserved.
  25   25   */
  26   26  
  27   27  #include <sys/types.h>
  28   28  #include <sys/tihdr.h>
  29   29  #include <sys/policy.h>
  30   30  #include <sys/tsol/tnet.h>
  31   31  #include <sys/kstat.h>
  32   32  
       33 +#include <sys/strsun.h>
       34 +#include <sys/stropts.h>
       35 +#include <sys/strsubr.h>
       36 +#include <sys/socket.h>
       37 +#include <sys/socketvar.h>
       38 +#include <sys/uio.h>
       39 +
  33   40  #include <inet/common.h>
  34   41  #include <inet/ip.h>
  35   42  #include <inet/tcp.h>
  36   43  #include <inet/tcp_impl.h>
  37   44  #include <inet/tcp_stats.h>
  38   45  #include <inet/kstatcom.h>
  39   46  #include <inet/snmpcom.h>
  40   47  
  41   48  static int      tcp_kstat_update(kstat_t *, int);
  42   49  static int      tcp_kstat2_update(kstat_t *, int);
↓ open down ↓ 47 lines elided ↑ open up ↑
  90   97   * Return SNMP stuff in buffer in mpdata.
  91   98   */
  92   99  mblk_t *
  93  100  tcp_snmp_get(queue_t *q, mblk_t *mpctl, boolean_t legacy_req)
  94  101  {
  95  102          mblk_t                  *mpdata;
  96  103          mblk_t                  *mp_conn_ctl = NULL;
  97  104          mblk_t                  *mp_conn_tail;
  98  105          mblk_t                  *mp_attr_ctl = NULL;
  99  106          mblk_t                  *mp_attr_tail;
      107 +        mblk_t                  *mp_pidnode_ctl = NULL;
      108 +        mblk_t                  *mp_pidnode_tail;
 100  109          mblk_t                  *mp6_conn_ctl = NULL;
 101  110          mblk_t                  *mp6_conn_tail;
 102  111          mblk_t                  *mp6_attr_ctl = NULL;
 103  112          mblk_t                  *mp6_attr_tail;
      113 +        mblk_t                  *mp6_pidnode_ctl = NULL;
      114 +        mblk_t                  *mp6_pidnode_tail;
 104  115          struct opthdr           *optp;
 105  116          mib2_tcpConnEntry_t     tce;
 106  117          mib2_tcp6ConnEntry_t    tce6;
 107  118          mib2_transportMLPEntry_t mlp;
 108  119          connf_t                 *connfp;
 109  120          int                     i;
 110  121          boolean_t               ispriv;
 111  122          zoneid_t                zoneid;
 112  123          int                     v4_conn_idx;
 113  124          int                     v6_conn_idx;
 114  125          conn_t                  *connp = Q_TO_CONN(q);
 115  126          tcp_stack_t             *tcps;
 116  127          ip_stack_t              *ipst;
 117  128          mblk_t                  *mp2ctl;
 118  129          mib2_tcp_t              tcp_mib;
 119  130          size_t                  tcp_mib_size, tce_size, tce6_size;
 120  131  
      132 +        conn_pid_node_list_hdr_t        *cph;
      133 +
 121  134          /*
 122  135           * make a copy of the original message
 123  136           */
 124  137          mp2ctl = copymsg(mpctl);
 125  138  
 126  139          if (mpctl == NULL ||
 127  140              (mpdata = mpctl->b_cont) == NULL ||
 128  141              (mp_conn_ctl = copymsg(mpctl)) == NULL ||
 129  142              (mp_attr_ctl = copymsg(mpctl)) == NULL ||
      143 +            (mp_pidnode_ctl = copymsg(mpctl)) == NULL ||
 130  144              (mp6_conn_ctl = copymsg(mpctl)) == NULL ||
 131      -            (mp6_attr_ctl = copymsg(mpctl)) == NULL) {
      145 +            (mp6_attr_ctl = copymsg(mpctl)) == NULL ||
      146 +            (mp6_pidnode_ctl = copymsg(mpctl)) == NULL) {
 132  147                  freemsg(mp_conn_ctl);
 133  148                  freemsg(mp_attr_ctl);
      149 +                freemsg(mp_pidnode_ctl);
 134  150                  freemsg(mp6_conn_ctl);
 135  151                  freemsg(mp6_attr_ctl);
      152 +                freemsg(mp6_pidnode_ctl);
 136  153                  freemsg(mpctl);
 137  154                  freemsg(mp2ctl);
 138  155                  return (NULL);
 139  156          }
 140  157  
 141  158          ipst = connp->conn_netstack->netstack_ip;
 142  159          tcps = connp->conn_netstack->netstack_tcp;
 143  160  
 144  161          if (legacy_req) {
 145  162                  tcp_mib_size = LEGACY_MIB_SIZE(&tcp_mib, mib2_tcp_t);
↓ open down ↓ 13 lines elided ↑ open up ↑
 159  176          SET_MIB(tcp_mib.tcpRtoMax, tcps->tcps_rexmit_interval_max);
 160  177          SET_MIB(tcp_mib.tcpMaxConn, -1);
 161  178          SET_MIB(tcp_mib.tcpCurrEstab, 0);
 162  179  
 163  180          ispriv =
 164  181              secpolicy_ip_config((Q_TO_CONN(q))->conn_cred, B_TRUE) == 0;
 165  182          zoneid = Q_TO_CONN(q)->conn_zoneid;
 166  183  
 167  184          v4_conn_idx = v6_conn_idx = 0;
 168  185          mp_conn_tail = mp_attr_tail = mp6_conn_tail = mp6_attr_tail = NULL;
      186 +        mp_pidnode_tail = mp6_pidnode_tail = NULL;
 169  187  
 170  188          for (i = 0; i < CONN_G_HASH_SIZE; i++) {
 171  189                  ipst = tcps->tcps_netstack->netstack_ip;
 172  190  
 173  191                  connfp = &ipst->ips_ipcl_globalhash_fanout[i];
 174  192  
 175  193                  connp = NULL;
 176  194  
 177  195                  while ((connp =
 178  196                      ipcl_get_next_conn(connfp, connp, IPCL_TCPCONN)) != NULL) {
↓ open down ↓ 95 lines elided ↑ open up ↑
 274  292                          tce6.tcp6ConnEntryInfo.ce_state = tcp->tcp_state;
 275  293  
 276  294                          tce6.tcp6ConnCreationProcess =
 277  295                              (connp->conn_cpid < 0) ? MIB2_UNKNOWN_PROCESS :
 278  296                              connp->conn_cpid;
 279  297                          tce6.tcp6ConnCreationTime = connp->conn_open_time;
 280  298  
 281  299                          (void) snmp_append_data2(mp6_conn_ctl->b_cont,
 282  300                              &mp6_conn_tail, (char *)&tce6, tce6_size);
 283  301  
      302 +                        /* my data */
      303 +                        /* push connt_t */
      304 +                        (void) snmp_append_data2(mp6_pidnode_ctl->b_cont,
      305 +                                &mp6_pidnode_tail, (char *)&tce6, tce6_size);
      306 +
      307 +                        cph = conn_get_pid_list(connp);
      308 +
      309 +                        /* push the header + conn pid nodes */
      310 +                        (void) snmp_append_data2(mp6_pidnode_ctl->b_cont,
      311 +                            &mp6_pidnode_tail,
      312 +                            (char *)cph, cph->cph_tot_size);
      313 +
      314 +                        kmem_free(cph, cph->cph_tot_size);
      315 +                        /* end of my  data */
      316 +
 284  317                          mlp.tme_connidx = v6_conn_idx++;
 285  318                          if (needattr)
 286  319                                  (void) snmp_append_data2(mp6_attr_ctl->b_cont,
 287  320                                      &mp6_attr_tail, (char *)&mlp, sizeof (mlp));
 288  321                          }
 289  322                          /*
 290  323                           * Create an IPv4 table entry for IPv4 entries and also
 291  324                           * for IPv6 entries which are bound to in6addr_any
 292  325                           * but don't have IPV6_V6ONLY set.
 293  326                           * (i.e. anything an IPv4 peer could connect to)
↓ open down ↓ 47 lines elided ↑ open up ↑
 341  374  
 342  375                                  tce.tcpConnCreationProcess =
 343  376                                      (connp->conn_cpid < 0) ?
 344  377                                      MIB2_UNKNOWN_PROCESS :
 345  378                                      connp->conn_cpid;
 346  379                                  tce.tcpConnCreationTime = connp->conn_open_time;
 347  380  
 348  381                                  (void) snmp_append_data2(mp_conn_ctl->b_cont,
 349  382                                      &mp_conn_tail, (char *)&tce, tce_size);
 350  383  
      384 +                                /* my data */
      385 +                                /* push connt_t */
      386 +                                (void) snmp_append_data2(mp_pidnode_ctl->b_cont,
      387 +                                    &mp_pidnode_tail, (char *)&tce, tce_size);
      388 +
      389 +                                cph = conn_get_pid_list(connp);
      390 +
      391 +                                /* push the header + conn pid nodes */
      392 +                                (void) snmp_append_data2(mp_pidnode_ctl->b_cont,
      393 +                                        &mp_pidnode_tail, (char *)cph,
      394 +                                        cph->cph_tot_size);
      395 +
      396 +                                kmem_free(cph, cph->cph_tot_size);
      397 +                                /* end of my code */
      398 +
 351  399                                  mlp.tme_connidx = v4_conn_idx++;
 352  400                                  if (needattr)
 353  401                                          (void) snmp_append_data2(
 354  402                                              mp_attr_ctl->b_cont,
 355  403                                              &mp_attr_tail, (char *)&mlp,
 356  404                                              sizeof (mlp));
 357  405                          }
 358  406                  }
 359  407          }
 360  408  
↓ open down ↓ 49 lines elided ↑ open up ↑
 410  458          /* table of IPv6 MLP attributes... */
 411  459          optp = (struct opthdr *)&mp6_attr_ctl->b_rptr[
 412  460              sizeof (struct T_optmgmt_ack)];
 413  461          optp->level = MIB2_TCP6;
 414  462          optp->name = EXPER_XPORT_MLP;
 415  463          optp->len = msgdsize(mp6_attr_ctl->b_cont);
 416  464          if (optp->len == 0)
 417  465                  freemsg(mp6_attr_ctl);
 418  466          else
 419  467                  qreply(q, mp6_attr_ctl);
      468 +
      469 +
      470 +        /* table of EXPER_XPORT_PROC_INFO  ipv4 */
      471 +        optp = (struct opthdr *)&mp_pidnode_ctl->b_rptr[
      472 +                sizeof (struct T_optmgmt_ack)];
      473 +        optp->level = MIB2_TCP;
      474 +        optp->name = EXPER_XPORT_PROC_INFO;
      475 +        optp->len = msgdsize(mp_pidnode_ctl->b_cont);
      476 +        if (optp->len == 0)
      477 +                freemsg(mp_pidnode_ctl);
      478 +        else
      479 +                qreply(q, mp_pidnode_ctl);
      480 +
      481 +        /* table of EXPER_XPORT_PROC_INFO  ipv6 */
      482 +        optp = (struct opthdr *)&mp6_pidnode_ctl->b_rptr[
      483 +                sizeof (struct T_optmgmt_ack)];
      484 +        optp->level = MIB2_TCP6;
      485 +        optp->name = EXPER_XPORT_PROC_INFO;
      486 +        optp->len = msgdsize(mp6_pidnode_ctl->b_cont);
      487 +        if (optp->len == 0)
      488 +                freemsg(mp6_pidnode_ctl);
      489 +        else
      490 +                qreply(q, mp6_pidnode_ctl);
      491 +
 420  492          return (mp2ctl);
 421  493  }
 422  494  
 423  495  /* Return 0 if invalid set request, 1 otherwise, including non-tcp requests  */
 424  496  /* ARGSUSED */
 425  497  int
 426  498  tcp_snmp_set(queue_t *q, int level, int name, uchar_t *ptr, int len)
 427  499  {
 428  500          mib2_tcpConnEntry_t     *tce = (mib2_tcpConnEntry_t *)ptr;
 429  501  
↓ open down ↓ 628 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX