Skip to main content
The QUIC tile provides a TPU (Transaction Processing Unit) server that handles incoming transactions clients request to be included in blocks. It supports both TPU/UDP and TPU/QUIC protocols.

Overview

The QUIC tile acts as a plain Tango producer:
  • Defragments multi-packet TPU streams from QUIC
  • Each frag_meta refers to a complete transaction
  • Requires dcache MTU at least as large as max serialized transaction size
  • Does not service network devices directly (relies on net tiles)
  • Arbitrary number of QUIC tiles can run
  • Each UDP flow must stick to one QUIC tile

Architecture

Tile Structure

The QUIC tile consists of:

Output Indices

The QUIC tile has two output paths:
  • VERIFY: Complete transactions sent to verify tile
  • NET: Outgoing QUIC packets sent back to net tile

Transaction Processing

UDP Fast Path

Legacy TPU/UDP transactions are processed via legacy_stream_notify:
  • UDP transactions must fit in one packet (no fragmentation)
  • Entire packet received when notify is called
  • Published directly to verify tile
  • Simple, fast path with minimal overhead

QUIC Path

QUIC protocol handling involves:
  1. Packet Reception: IP packets received from net tile
  2. QUIC Processing: fd_quic_process_packet() handles QUIC protocol
  3. Stream Reassembly: Multi-packet transactions are reassembled
  4. Publishing: Complete transactions sent to verify tile
The QUIC tile always publishes messages downstream, even without credits available. It ignores flow control of the downstream verify tile, enabling the QUIC tile to publish as fast as possible.

Stream Reception

The quic_stream_rx callback handles incoming QUIC stream data:

Fast Path (Single Packet)

When offset==0 and fin flag is set:

Slow Path (Fragmented)

Multi-packet transactions go through reassembly:
  • Fragments tracked per connection and stream
  • Reassembly buffer manages incomplete transactions
  • Published when complete transaction received

Connection Management

QUIC Limits

The tile configures QUIC with:

Connection Finalization

When connections close, the quic_conn_final callback:
  • Counts abandoned reassembly streams
  • Updates metrics for active streams
  • Tracks abandoned transactions

Packet Filtering

Before Fragment Processing

The before_frag callback filters incoming packets:
Filtering criteria:
  • Protocol: Only TPU_UDP or TPU_QUIC
  • Load balancing: Round-robin based on hash

During Fragment Processing

The during_frag callback copies packet data:
The copy operation could potentially be optimized by combining it with the QUIC decrypt operation.

Transaction Validation

Size Checks

Both UDP and QUIC paths validate transaction sizes: Minimum size:
Maximum size:

Network Header Handling

For UDP packets:
For QUIC packets:

Metrics

The QUIC tile tracks comprehensive metrics:

Transaction Metrics

  • TXNS_RECEIVED_UDP - UDP transactions received
  • TXNS_RECEIVED_QUIC_FAST - Single-packet QUIC transactions
  • TXNS_RECEIVED_QUIC_FRAG - Multi-packet QUIC transactions
  • TXNS_OVERRUN - Reassembly buffer overruns
  • TXNS_ABANDONED - Abandoned incomplete transactions

Connection Metrics

  • CONNECTIONS_CREATED - New connections established
  • CONNECTIONS_CLOSED - Clean connection closes
  • CONNECTIONS_ABORTED - Aborted connections
  • CONNECTIONS_TIMED_OUT - Connection timeouts
  • CONNECTIONS_RETRIED - Retry connections

Packet Metrics

  • RECEIVED_PACKETS - Total packets received
  • RECEIVED_BYTES - Total bytes received
  • SENT_PACKETS - Total packets sent
  • SENT_BYTES - Total bytes sent
  • PKT_CRYPTO_FAILED - Decryption failures
  • PKT_NO_CONN - Packets for unknown connections

Frame Metrics

  • RECEIVED_FRAMES - Frames received by type
  • FRAME_FAIL_PARSE - Frame parsing failures
  • ACK_TX - ACK frames transmitted

Performance Characteristics

Busy Polling

The before_credit callback services QUIC without sleeping:
  • Continuously polls for QUIC events
  • No blocking or sleeping
  • Updates current time for QUIC protocol
  • Services connections and handles retransmissions

Memory Layout

Scratch memory footprint includes:

Configuration

Tile Configuration

Key configuration parameters:
  • max_concurrent_connections - Maximum simultaneous QUIC connections
  • max_concurrent_handshakes - Maximum simultaneous handshakes
  • out_depth - Output queue depth
  • reasm_cnt - Maximum concurrent reassemblies
  • round_robin_cnt - Number of QUIC tiles for load balancing
  • round_robin_id - This tile’s ID in round-robin pool

Keylog Support

For debugging, QUIC supports keylog output:
Keylog allows decrypting QUIC traffic in Wireshark for analysis.