Print this page
11547 Want connstat(1M) command to display per-connection TCP statistics
Portions contributed by: Cody Peter Mello <cody.mello@joyent.com>
Portions contributed by: Ahmed G <ahmedg@delphix.com>
Reviewed by: Jason King <jason.king@joyent.com>
Reviewed by: Robert Mustacchi <rm@joyent.com>
Reviewed by: Dan McDonald <danmcd@joyent.com>

@@ -1271,11 +1271,13 @@
 
         tcpha->tha_seq = htonl(snxt);
 
         TCPS_BUMP_MIB(tcps, tcpOutDataSegs);
         TCPS_UPDATE_MIB(tcps, tcpOutDataBytes, len);
-        BUMP_LOCAL(tcp->tcp_obsegs);
+        TCPS_BUMP_MIB(tcps, tcpHCOutSegs);
+        tcp->tcp_cs.tcp_out_data_segs++;
+        tcp->tcp_cs.tcp_out_data_bytes += len;
 
         /* Update the latest receive window size in TCP header. */
         tcpha->tha_win = htons(tcp->tcp_rwnd >> tcp->tcp_rcv_ws);
 
         tcp->tcp_last_sent_len = (ushort_t)len;

@@ -1958,20 +1960,25 @@
                                     (mblk_t *)(uintptr_t)(*snxt);
                                 mp1 = mp1->b_cont;
                         }
                         *snxt += len;
                         *tail_unsent = (*xmit_tail)->b_wptr - mp1->b_wptr;
-                        BUMP_LOCAL(tcp->tcp_obsegs);
+                        TCPS_BUMP_MIB(tcps, tcpHCOutSegs);
                         TCPS_BUMP_MIB(tcps, tcpOutDataSegs);
                         TCPS_UPDATE_MIB(tcps, tcpOutDataBytes, len);
+                        tcp->tcp_cs.tcp_out_data_segs++;
+                        tcp->tcp_cs.tcp_out_data_bytes += len;
                         tcp_send_data(tcp, mp);
                         continue;
                 }
 
                 *snxt += len;   /* Adjust later if we don't send all of len */
+                TCPS_BUMP_MIB(tcps, tcpHCOutSegs);
                 TCPS_BUMP_MIB(tcps, tcpOutDataSegs);
                 TCPS_UPDATE_MIB(tcps, tcpOutDataBytes, len);
+                tcp->tcp_cs.tcp_out_data_segs++;
+                tcp->tcp_cs.tcp_out_data_bytes += len;
 
                 if (*tail_unsent) {
                         /* Are the bytes above us in flight? */
                         rptr = (*xmit_tail)->b_wptr - *tail_unsent;
                         if (rptr != (*xmit_tail)->b_rptr) {

@@ -2143,10 +2150,11 @@
                                  */
                                 *usable -= spill;
                                 *snxt += spill;
                                 tcp->tcp_last_sent_len += spill;
                                 TCPS_UPDATE_MIB(tcps, tcpOutDataBytes, spill);
+                                tcp->tcp_cs.tcp_out_data_bytes += spill;
                                 /*
                                  * Adjust the checksum
                                  */
                                 tcpha = (tcpha_t *)(rptr +
                                     ixa->ixa_ip_hdr_length);

@@ -2191,11 +2199,11 @@
                         /*
                          * Restore values of ixa_fragsize and ixa_extra_ident.
                          */
                         ixa->ixa_fragsize = ixa->ixa_pmtu;
                         ixa->ixa_extra_ident = 0;
-                        tcp->tcp_obsegs += num_lso_seg;
+                        TCPS_BUMP_MIB(tcps, tcpHCOutSegs);
                         TCP_STAT(tcps, tcp_lso_times);
                         TCP_STAT_UPDATE(tcps, tcp_lso_pkt_out, num_lso_seg);
                 } else {
                         /*
                          * Make sure to clean up LSO information. Wherever a

@@ -2202,11 +2210,11 @@
                          * new mp uses the prepended header room after dupb(),
                          * lso_info_cleanup() should be called.
                          */
                         lso_info_cleanup(mp);
                         tcp_send_data(tcp, mp);
-                        BUMP_LOCAL(tcp->tcp_obsegs);
+                        TCPS_BUMP_MIB(tcps, tcpHCOutSegs);
                 }
         }
 
         return (0);
 }

@@ -2418,11 +2426,11 @@
                 tcp->tcp_tcpha->tha_win = tcpha->tha_win;
                 tcp->tcp_rack = ack;
                 tcp->tcp_rack_cnt = 0;
                 TCPS_BUMP_MIB(tcps, tcpOutAck);
         }
-        BUMP_LOCAL(tcp->tcp_obsegs);
+        TCPS_BUMP_MIB(tcps, tcpHCOutSegs);
         tcpha->tha_seq = htonl(seq);
         tcpha->tha_ack = htonl(ack);
         /*
          * Include the adjustment for a source route if any.
          */

@@ -3392,10 +3400,12 @@
                 snxt_mp->b_prev = (mblk_t *)(intptr_t)gethrtime();
 
                 TCPS_BUMP_MIB(tcps, tcpRetransSegs);
                 TCPS_UPDATE_MIB(tcps, tcpRetransBytes, seg_len);
                 TCPS_BUMP_MIB(tcps, tcpOutSackRetransSegs);
+                tcp->tcp_cs.tcp_out_retrans_segs++;
+                tcp->tcp_cs.tcp_out_retrans_bytes += seg_len;
                 /*
                  * Update tcp_rexmit_max to extend this SACK recovery phase.
                  * This happens when new data sent during fast recovery is
                  * also lost.  If TCP retransmits those new data, it needs
                  * to extend SACK recover phase to avoid starting another

@@ -3462,10 +3472,12 @@
                          * retransmission.
                          */
                         old_snxt_mp->b_prev = (mblk_t *)(intptr_t)gethrtime();
                         TCPS_BUMP_MIB(tcps, tcpRetransSegs);
                         TCPS_UPDATE_MIB(tcps, tcpRetransBytes, cnt);
+                        tcp->tcp_cs.tcp_out_retrans_segs++;
+                        tcp->tcp_cs.tcp_out_retrans_bytes += cnt;
 
                         tcp->tcp_rexmit_nxt = snxt;
                 }
                 /*
                  * If we have transmitted all we have at the time