Print this page
OS-277 add ZONE column to dlstat output
        
*** 60,70 ****
          boolean_t               lc_visited;
          dladm_stat_chain_t      *lc_statchain[DLADM_STAT_NUM_STATS];
          struct link_chain_s     *lc_next;
  } link_chain_t;
  
! typedef void *  (*stats2str_t)(const char *, void *,
                      char, boolean_t);
  
  typedef struct show_state {
          link_chain_t    *ls_linkchain;
          boolean_t       ls_stattype[DLADM_STAT_NUM_STATS];
--- 60,70 ----
          boolean_t               lc_visited;
          dladm_stat_chain_t      *lc_statchain[DLADM_STAT_NUM_STATS];
          struct link_chain_s     *lc_next;
  } link_chain_t;
  
! typedef void *  (*stats2str_t)(const char *, const char *, void *,
                      char, boolean_t);
  
  typedef struct show_state {
          link_chain_t    *ls_linkchain;
          boolean_t       ls_stattype[DLADM_STAT_NUM_STATS];
*** 139,148 ****
--- 139,149 ----
          char t_linkname[MAXLINKNAMELEN];
          char t_ipackets[MAXSTATLEN];
          char t_rbytes[MAXSTATLEN];
          char t_opackets[MAXSTATLEN];
          char t_obytes[MAXSTATLEN];
+         char t_zone[ZONENAME_MAX];
  } total_fields_buf_t;
  
  static ofmt_field_t total_s_fields[] = {
  { "LINK",       15,
      offsetof(total_fields_buf_t, t_linkname),   print_default_cb},
*** 152,161 ****
--- 153,164 ----
      offsetof(total_fields_buf_t, t_rbytes),     print_default_cb},
  { "OPKTS",      8,
      offsetof(total_fields_buf_t, t_opackets),   print_default_cb},
  { "OBYTES",     8,
      offsetof(total_fields_buf_t, t_obytes),     print_default_cb},
+ { "ZONE",       20,
+     offsetof(total_fields_buf_t, t_zone),       print_default_cb},
  { NULL,         0,      0,              NULL}};
  
  /*
   * dlstat show-phys: both Rx and Tx stat fields
   */
*** 955,966 ****
                  free(tofree);
          }
  }
  
  void *
! print_total_stats(const char *linkname, void *statentry, char unit,
!     boolean_t parsable)
  {
          total_stat_entry_t      *sentry = statentry;
          total_stat_t            *link_stats = &sentry->tse_stats;
          total_fields_buf_t      *buf;
  
--- 958,969 ----
                  free(tofree);
          }
  }
  
  void *
! print_total_stats(const char *linkname, const char *zonename, void *statentry,
!     char unit, boolean_t parsable)
  {
          total_stat_entry_t      *sentry = statentry;
          total_stat_t            *link_stats = &sentry->tse_stats;
          total_fields_buf_t      *buf;
  
*** 968,977 ****
--- 971,981 ----
          if (buf == NULL)
                  goto done;
  
          (void) snprintf(buf->t_linkname, sizeof (buf->t_linkname), "%s",
              linkname);
+         (void) snprintf(buf->t_zone, sizeof (buf->t_zone), "%s", zonename);
  
          map_to_units(buf->t_ipackets, sizeof (buf->t_ipackets),
              link_stats->ts_ipackets, unit, parsable);
  
          map_to_units(buf->t_rbytes, sizeof (buf->t_rbytes),
*** 986,997 ****
  done:
          return (buf);
  }
  
  void *
! print_rx_generic_ring_stats(const char *linkname, void *statentry, char unit,
!     boolean_t parsable)
  {
          ring_stat_entry_t       *sentry = statentry;
          ring_stat_t             *link_stats = &sentry->re_stats;
          ring_fields_buf_t       *buf;
  
--- 990,1001 ----
  done:
          return (buf);
  }
  
  void *
! print_rx_generic_ring_stats(const char *linkname, const char *zonename, 
!     void *statentry, char unit, boolean_t parsable)
  {
          ring_stat_entry_t       *sentry = statentry;
          ring_stat_t             *link_stats = &sentry->re_stats;
          ring_fields_buf_t       *buf;
  
*** 1020,1031 ****
  done:
          return (buf);
  }
  
  void *
! print_tx_generic_ring_stats(const char *linkname, void *statentry, char unit,
!     boolean_t parsable)
  {
          ring_stat_entry_t       *sentry = statentry;
          ring_stat_t             *link_stats = &sentry->re_stats;
          ring_fields_buf_t       *buf;
  
--- 1024,1035 ----
  done:
          return (buf);
  }
  
  void *
! print_tx_generic_ring_stats(const char *linkname, const char *zonename,
!     void *statentry, char unit, boolean_t parsable)
  {
          ring_stat_entry_t       *sentry = statentry;
          ring_stat_t             *link_stats = &sentry->re_stats;
          ring_fields_buf_t       *buf;
  
*** 1054,1065 ****
  done:
          return (buf);
  }
  
  void *
! print_rx_ring_stats(const char *linkname, void *statentry, char unit,
!     boolean_t parsable)
  {
          ring_stat_entry_t       *sentry = statentry;
          ring_stat_t             *link_stats = &sentry->re_stats;
          rx_ring_fields_buf_t    *buf;
  
--- 1058,1069 ----
  done:
          return (buf);
  }
  
  void *
! print_rx_ring_stats(const char *linkname, const char *zonename, void *statentry,
!     char unit, boolean_t parsable)
  {
          ring_stat_entry_t       *sentry = statentry;
          ring_stat_t             *link_stats = &sentry->re_stats;
          rx_ring_fields_buf_t    *buf;
  
*** 1088,1099 ****
  done:
          return (buf);
  }
  
  void *
! print_tx_ring_stats(const char *linkname, void *statentry, char unit,
!     boolean_t parsable)
  {
          ring_stat_entry_t       *sentry = statentry;
          ring_stat_t             *link_stats = &sentry->re_stats;
          tx_ring_fields_buf_t    *buf;
  
--- 1092,1103 ----
  done:
          return (buf);
  }
  
  void *
! print_tx_ring_stats(const char *linkname, const char *zonename, void *statentry,
!     char unit, boolean_t parsable)
  {
          ring_stat_entry_t       *sentry = statentry;
          ring_stat_t             *link_stats = &sentry->re_stats;
          tx_ring_fields_buf_t    *buf;
  
*** 1122,1133 ****
  done:
          return (buf);
  }
  
  void *
! print_rx_generic_lane_stats(const char *linkname, void *statentry, char unit,
!     boolean_t parsable)
  {
          rx_lane_stat_entry_t    *sentry = statentry;
          rx_lane_stat_t          *link_stats = &sentry->rle_stats;
          lane_fields_buf_t       *buf;
  
--- 1126,1137 ----
  done:
          return (buf);
  }
  
  void *
! print_rx_generic_lane_stats(const char *linkname, const char *zonename,
!     void *statentry, char unit, boolean_t parsable)
  {
          rx_lane_stat_entry_t    *sentry = statentry;
          rx_lane_stat_t          *link_stats = &sentry->rle_stats;
          lane_fields_buf_t       *buf;
  
*** 1170,1181 ****
  done:
          return (buf);
  }
  
  void *
! print_tx_generic_lane_stats(const char *linkname, void *statentry, char unit,
!     boolean_t parsable)
  {
          tx_lane_stat_entry_t    *sentry = statentry;
          tx_lane_stat_t          *link_stats = &sentry->tle_stats;
          lane_fields_buf_t       *buf;
  
--- 1174,1185 ----
  done:
          return (buf);
  }
  
  void *
! print_tx_generic_lane_stats(const char *linkname, const char *zonename,
!     void *statentry, char unit, boolean_t parsable)
  {
          tx_lane_stat_entry_t    *sentry = statentry;
          tx_lane_stat_t          *link_stats = &sentry->tle_stats;
          lane_fields_buf_t       *buf;
  
*** 1215,1226 ****
  done:
          return (buf);
  }
  
  void *
! print_rx_lane_stats(const char *linkname, void *statentry, char unit,
!     boolean_t parsable)
  {
          rx_lane_stat_entry_t    *sentry = statentry;
          rx_lane_stat_t          *link_stats = &sentry->rle_stats;
          rx_lane_fields_buf_t    *buf;
  
--- 1219,1230 ----
  done:
          return (buf);
  }
  
  void *
! print_rx_lane_stats(const char *linkname, const char *zonename, void *statentry,
!     char unit, boolean_t parsable)
  {
          rx_lane_stat_entry_t    *sentry = statentry;
          rx_lane_stat_t          *link_stats = &sentry->rle_stats;
          rx_lane_fields_buf_t    *buf;
  
*** 1281,1293 ****
  done:
          return (buf);
  }
  
  void *
! print_tx_lane_stats(const char *linkname, void *statentry, char unit,
!     boolean_t parsable)
! {
          tx_lane_stat_entry_t    *sentry = statentry;
          tx_lane_stat_t          *link_stats = &sentry->tle_stats;
          tx_lane_fields_buf_t    *buf = NULL;
  
          if (sentry->tle_id == L_DFNCT)
--- 1285,1296 ----
  done:
          return (buf);
  }
  
  void *
! print_tx_lane_stats(const char *linkname, const char *zonename, void *statentry,
!     char unit, boolean_t parsable) {
          tx_lane_stat_entry_t    *sentry = statentry;
          tx_lane_stat_t          *link_stats = &sentry->tle_stats;
          tx_lane_fields_buf_t    *buf = NULL;
  
          if (sentry->tle_id == L_DFNCT)
*** 1336,1347 ****
  done:
          return (buf);
  }
  
  void *
! print_fanout_stats(const char *linkname, void *statentry, char unit,
!     boolean_t parsable)
  {
          fanout_stat_entry_t             *sentry = statentry;
          fanout_stat_t                   *link_stats = &sentry->fe_stats;
          rx_fanout_lane_fields_buf_t     *buf;
  
--- 1339,1350 ----
  done:
          return (buf);
  }
  
  void *
! print_fanout_stats(const char *linkname, const char *zonename, void *statentry,
!     char unit, boolean_t parsable)
  {
          fanout_stat_entry_t             *sentry = statentry;
          fanout_stat_t                   *link_stats = &sentry->fe_stats;
          rx_fanout_lane_fields_buf_t     *buf;
  
*** 1390,1401 ****
  done:
          return (buf);
  }
  
  void *
! print_aggr_port_stats(const char *linkname, void *statentry, char unit,
!     boolean_t parsable)
  {
          aggr_port_stat_entry_t  *sentry = statentry;
          aggr_port_stat_t        *link_stats = &sentry->ape_stats;
          aggr_port_fields_buf_t  *buf;
          char                    portname[MAXLINKNAMELEN];
--- 1393,1404 ----
  done:
          return (buf);
  }
  
  void *
! print_aggr_port_stats(const char *linkname, const char *zonename,
!     void *statentry, char unit, boolean_t parsable)
  {
          aggr_port_stat_entry_t  *sentry = statentry;
          aggr_port_stat_t        *link_stats = &sentry->ape_stats;
          aggr_port_fields_buf_t  *buf;
          char                    portname[MAXLINKNAMELEN];
*** 1468,1488 ****
          return (diff_stat);
  }
  
  void
  walk_dlstat_stats(show_state_t *state, const char *linkname,
!     dladm_stat_type_t stattype, dladm_stat_chain_t *diff_stat)
  {
          dladm_stat_chain_t  *curr;
  
          /* Unpack invidual stat entry and call library consumer's callback */
          for (curr = diff_stat; curr != NULL; curr = curr->dc_next) {
                  void    *fields_buf;
  
                  /* Format the raw numbers for printing */
                  fields_buf = state->ls_stats2str[stattype](linkname,
!                     curr->dc_statentry, state->ls_unit, state->ls_parsable);
                  /* Print the stats */
                  if (fields_buf != NULL)
                          ofmt_print(state->ls_ofmt, fields_buf);
                  free(fields_buf);
          }
--- 1471,1493 ----
          return (diff_stat);
  }
  
  void
  walk_dlstat_stats(show_state_t *state, const char *linkname,
!     const char *zonename, dladm_stat_type_t stattype,
!     dladm_stat_chain_t *diff_stat)
  {
          dladm_stat_chain_t  *curr;
  
          /* Unpack invidual stat entry and call library consumer's callback */
          for (curr = diff_stat; curr != NULL; curr = curr->dc_next) {
                  void    *fields_buf;
  
                  /* Format the raw numbers for printing */
                  fields_buf = state->ls_stats2str[stattype](linkname,
!                     zonename, curr->dc_statentry, state->ls_unit,
!                     state->ls_parsable);
                  /* Print the stats */
                  if (fields_buf != NULL)
                          ofmt_print(state->ls_ofmt, fields_buf);
                  free(fields_buf);
          }
*** 1493,1516 ****
  {
          show_state_t            *state = arg;
          int                     i;
          dladm_stat_chain_t      *diff_stat;
          char                    linkname[DLPI_LINKNAME_MAX];
  
          if (dladm_datalink_id2info(dh, linkid, NULL, NULL, NULL, linkname,
              DLPI_LINKNAME_MAX) != DLADM_STATUS_OK) {
                  goto done;
          }
  
          for (i = 0; i < DLADM_STAT_NUM_STATS; i++) {
                  if (state->ls_stattype[i]) {
                          /*
                           * Query library for stats
                           * Stats are returned as chain of raw numbers
                           */
                          diff_stat = query_link_stats(handle, linkid, arg, i);
!                         walk_dlstat_stats(state, linkname, i, diff_stat);
                          dladm_link_stat_free(diff_stat);
                  }
          }
  done:
          return (DLADM_WALK_CONTINUE);
--- 1498,1530 ----
  {
          show_state_t            *state = arg;
          int                     i;
          dladm_stat_chain_t      *diff_stat;
          char                    linkname[DLPI_LINKNAME_MAX];
+         char                    zonename[DLADM_PROP_VAL_MAX + 1];
+         char                    *valptr[1];
+         uint_t                  valcnt = 1;
  
          if (dladm_datalink_id2info(dh, linkid, NULL, NULL, NULL, linkname,
              DLPI_LINKNAME_MAX) != DLADM_STATUS_OK) {
                  goto done;
          }
  
+         valptr[0] = zonename;
+         if (dladm_get_linkprop(handle, linkid, DLADM_PROP_VAL_CURRENT, "zone",
+             (char **)valptr, &valcnt) != 0)
+                 zonename[0] = '\0';
+ 
          for (i = 0; i < DLADM_STAT_NUM_STATS; i++) {
                  if (state->ls_stattype[i]) {
                          /*
                           * Query library for stats
                           * Stats are returned as chain of raw numbers
                           */
                          diff_stat = query_link_stats(handle, linkid, arg, i);
!                         walk_dlstat_stats(state, linkname, zonename, i,
!                             diff_stat);
                          dladm_link_stat_free(diff_stat);
                  }
          }
  done:
          return (DLADM_WALK_CONTINUE);
*** 1626,1636 ****
          dladm_status_t          status;
          char                    *fields_str = NULL;
          char                    *o_fields_str = NULL;
  
          char                    *total_stat_fields =
!             "link,ipkts,rbytes,opkts,obytes";
          char                    *rx_total_stat_fields =
              "link,ipkts,rbytes,intrs,polls,ch<10,ch10-50,ch>50";
          char                    *tx_total_stat_fields =
              "link,opkts,obytes,blkcnt,ublkcnt";
  
--- 1640,1650 ----
          dladm_status_t          status;
          char                    *fields_str = NULL;
          char                    *o_fields_str = NULL;
  
          char                    *total_stat_fields =
!             "link,ipkts,rbytes,opkts,obytes,zone";
          char                    *rx_total_stat_fields =
              "link,ipkts,rbytes,intrs,polls,ch<10,ch10-50,ch>50";
          char                    *tx_total_stat_fields =
              "link,opkts,obytes,blkcnt,ublkcnt";