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
- 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 vialegacy_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:- Packet Reception: IP packets received from net tile
- QUIC Processing:
fd_quic_process_packet()handles QUIC protocol - Stream Reassembly: Multi-packet transactions are reassembled
- 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
Thequic_stream_rx callback handles incoming QUIC stream data:
Fast Path (Single Packet)
Whenoffset==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, thequic_conn_final callback:
- Counts abandoned reassembly streams
- Updates metrics for active streams
- Tracks abandoned transactions
Packet Filtering
Before Fragment Processing
Thebefore_frag callback filters incoming packets:
- Protocol: Only TPU_UDP or TPU_QUIC
- Load balancing: Round-robin based on hash
During Fragment Processing
Theduring_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:Network Header Handling
For UDP packets:Metrics
The QUIC tile tracks comprehensive metrics:Transaction Metrics
TXNS_RECEIVED_UDP- UDP transactions receivedTXNS_RECEIVED_QUIC_FAST- Single-packet QUIC transactionsTXNS_RECEIVED_QUIC_FRAG- Multi-packet QUIC transactionsTXNS_OVERRUN- Reassembly buffer overrunsTXNS_ABANDONED- Abandoned incomplete transactions
Connection Metrics
CONNECTIONS_CREATED- New connections establishedCONNECTIONS_CLOSED- Clean connection closesCONNECTIONS_ABORTED- Aborted connectionsCONNECTIONS_TIMED_OUT- Connection timeoutsCONNECTIONS_RETRIED- Retry connections
Packet Metrics
RECEIVED_PACKETS- Total packets receivedRECEIVED_BYTES- Total bytes receivedSENT_PACKETS- Total packets sentSENT_BYTES- Total bytes sentPKT_CRYPTO_FAILED- Decryption failuresPKT_NO_CONN- Packets for unknown connections
Frame Metrics
RECEIVED_FRAMES- Frames received by typeFRAME_FAIL_PARSE- Frame parsing failuresACK_TX- ACK frames transmitted
Performance Characteristics
Busy Polling
Thebefore_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 connectionsmax_concurrent_handshakes- Maximum simultaneous handshakesout_depth- Output queue depthreasm_cnt- Maximum concurrent reassembliesround_robin_cnt- Number of QUIC tiles for load balancinground_robin_id- This tile’s ID in round-robin pool