Print this page
OS-277 add ZONE column to dlstat output

@@ -60,11 +60,11 @@
         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 *,
+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,10 +139,11 @@
         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,10 +153,12 @@
     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,12 +958,12 @@
                 free(tofree);
         }
 }
 
 void *
-print_total_stats(const char *linkname, void *statentry, char unit,
-    boolean_t parsable)
+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,10 +971,11 @@
         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,12 +990,12 @@
 done:
         return (buf);
 }
 
 void *
-print_rx_generic_ring_stats(const char *linkname, void *statentry, char unit,
-    boolean_t parsable)
+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,12 +1024,12 @@
 done:
         return (buf);
 }
 
 void *
-print_tx_generic_ring_stats(const char *linkname, void *statentry, char unit,
-    boolean_t parsable)
+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,12 +1058,12 @@
 done:
         return (buf);
 }
 
 void *
-print_rx_ring_stats(const char *linkname, void *statentry, char unit,
-    boolean_t parsable)
+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,12 +1092,12 @@
 done:
         return (buf);
 }
 
 void *
-print_tx_ring_stats(const char *linkname, void *statentry, char unit,
-    boolean_t parsable)
+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,12 +1126,12 @@
 done:
         return (buf);
 }
 
 void *
-print_rx_generic_lane_stats(const char *linkname, void *statentry, char unit,
-    boolean_t parsable)
+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,12 +1174,12 @@
 done:
         return (buf);
 }
 
 void *
-print_tx_generic_lane_stats(const char *linkname, void *statentry, char unit,
-    boolean_t parsable)
+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,12 +1219,12 @@
 done:
         return (buf);
 }
 
 void *
-print_rx_lane_stats(const char *linkname, void *statentry, char unit,
-    boolean_t parsable)
+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,13 +1285,12 @@
 done:
         return (buf);
 }
 
 void *
-print_tx_lane_stats(const char *linkname, void *statentry, char unit,
-    boolean_t parsable)
-{
+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,12 +1339,12 @@
 done:
         return (buf);
 }
 
 void *
-print_fanout_stats(const char *linkname, void *statentry, char unit,
-    boolean_t parsable)
+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,12 +1393,12 @@
 done:
         return (buf);
 }
 
 void *
-print_aggr_port_stats(const char *linkname, void *statentry, char unit,
-    boolean_t parsable)
+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,21 +1471,23 @@
         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)
+    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,
-                    curr->dc_statentry, state->ls_unit, state->ls_parsable);
+                    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,24 +1498,33 @@
 {
         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, i, diff_stat);
+                        walk_dlstat_stats(state, linkname, zonename, i,
+                            diff_stat);
                         dladm_link_stat_free(diff_stat);
                 }
         }
 done:
         return (DLADM_WALK_CONTINUE);

@@ -1626,11 +1640,11 @@
         dladm_status_t          status;
         char                    *fields_str = NULL;
         char                    *o_fields_str = NULL;
 
         char                    *total_stat_fields =
-            "link,ipkts,rbytes,opkts,obytes";
+            "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";