anchor.diff:  
   ==== Tx Scale to millions of flows
   
  -image::images/t_c5.png[title="TCP Tx side",align="left",width={p_width}, link="images/t_c5.png"]
  +image::images/t_c5.png[title="TCP Tx side",align="center",width={p_width}, link="images/t_c5.png"]
   
   Most TCP stacks have an API that allow the user to provide his buffer for write (push) and the TCP module will save them until the packets are acknowledged by the remote side. Figure 4 shows how one TX queue of one TCP flow looks like on the Tx side. This could create a scale issue in worst case. Let's assume we need 1M active flows with 64K TX buffer (with reasonable buffer, let's say RTT is small). The worst case buffer in this case could be
   1M x 64K * mbuf-factor (let's assume 2) = 128GB. The mbuf resource is expensive and needs to be allocated ahead of time.
  
positive.code: 
  * Ability to work when the DUT terminates the TCP stack (e.g. compress/uncompress, see figure 1). In this case there is a different TCP session on each side, but L7 data are *almost* the same.
  
  image::images/t_c2.png[title="DUT is TCP proxy",align="left",width={p_width}, link="images/t_c2.png"]
  
  * Ability to work in either client mode or server mode. This way TRex client side could be installed in one physical location on the network and TRex server in another. figure 2 shows such an example
  
  image::images/t_c3.png[title="C/S mode",align="left",width={p_width}, link="images/t_c2.png"]
  
  * Performance and scale
  ** High bandwidth - ~200gb/sec with many realistic flows (not one elephant flow)
  
negative.code: * Total Tx L7 bytes are tcps_sndbyte_ok+tcps_sndrexmitbyte+tcps_sndprobe
  * The Console/JSON does not show/sent zero counters
  
  .Pseudo code tcp counters
  [source,c]
  ----
              if ( (c->tcps_drops ==0) && 
                   (s->tcps_drops ==0) ){
                 /* flow wasn't initiated due to drop of SYN too many times */
                 
              /* client side */    
              assert(c->tcps_sndbyte==UPLOAD_BYTES);
              assert(c->tcps_rcvbyte==DOWNLOAD_BYTES);
              assert(c->tcps_rcvackbyte==UPLOAD_BYTES);
  
              /* server side */
              assert(s->tcps_rcvackbyte==DOWNLOAD_BYTES);
              assert(s->tcps_sndbyte==DOWNLOAD_BYTES);
              assert(s->tcps_rcvbyte==UPLOAD_BYTES);
              }
  ----
  
  
  ==== TSO/LRO NIC support 
  
  