The Tx-Ring, also known as the Tx-Queue (transmit Queue) and as the hardware queue, is a small FIFO queue on each interface. It is the final queue before the packet is sent out the interface. The Tx-Ring’s purpose is to drive the link utilization to 100% when packets are waiting to exit an interface. The hardware queue can be accessed directly by the interface’s ASIC, so there is no need to wait on the general processor if it is busy.

The configured queues that exist are nothing more than a series of pointers to the memory buffers that hold the actual physical packets waiting to exit the interface. These are just software queues. All queuing tools that exist in IOS operate on software queues. The hardware queue, however, is an actual physical FIFO queue located on the interface. Its length can be adjusted manually, and IOS will automatically shorten the hardware queue when a software queueing method is configured.

Even if software queues exist, IOS checks the hardware queue for the outbound interface for available space. If it has availability, packets are sent directly to the hardware queue instead of being sent to the hold queues. The Hold Queues are available for both input and output. So, if the interface becomes congested, the TX-Ring fills up and packets are placed on its output hold queue instead, triggering congestion management.

Not suprisingly, the terminology is confusing when it comes to Hold Queues. To set the length (number of packets) of the input or output hold queues, use the following interface commands:

R1(config)# interface GigabitEthernet0/1
R1(config-if)# hold-queue 10 in
R1(config-if)# hold-queue 30 out
R1(config-if)# exit

However, if you then want to view them under the show interfaces command, you will see them called input and output queues.

R1#show interfaces GigabitEthernet0/1 | include queue
  Input queue: 0/10/0/0 (size/max/drops/flushes); Total output drops: 0
  Output queue: 0/30 (size/max)

To set the Tx-ring size, use the following:

R1(config)# interface GigabitEthernet0/1
R1(config-if)# tx-ring-limit 15
R1(config-if)# exit

Then to ensure it was set correctly, you must use the show controllers command.

R1#show controllers GigabitEthernet0/1 | include tx_limited
  tx_count=0, tx_ring_max=2048, tx_limited=1 (cur ring size 1024)