quiche icon indicating copy to clipboard operation
quiche copied to clipboard

Exposing the write capacity

Open ruuda opened this issue 1 year ago • 3 comments

Background

I am working on an application, where I have a small-ish number of bytes to send (they usually fit in one UDP packet), and all of those bytes should go in one fresh stream that is marked fin immediately. Due to the way the application is structured, it is very inconvenient to deal with partial writes, so I would like to check beforehand that Quiche can accept the entire write.

Problem

  • We can check whether a new stream can be opened with peer_streams_left_uni, but that is no guarantee that we can write all bytes.
  • There is stream_capacity, but it only works for existing streams, not new streams.
  • I suppose I could try to do a zero-length stream_send first to ensure the stream exists, and then check its capacity, but this is wasteful because there is a lot of logic in stream_send that would be executed twice.

Ideas

Looking through the implementation of stream_capacity, there is tx_cap, which looks like exactly what I need. Are there any caveats to exposing it?

ruuda avatar Nov 30 '24 16:11 ruuda

The amount of stream data that can be buffered is determined by both flow control and congestion control. stream_capacity() returns the minimum of these. Returning either in isolation risks confusing apps about what will subsequently happen.

Possibly one solution is to have a reserve_stream() function. However, it would need to take care to initialize all the relevant internal data structures

LPardue avatar Nov 30 '24 16:11 LPardue

Maybe stream_capacity could do the logic for streams that don’t yet exist, and treat them as what their capacity would be after they are created?

ruuda avatar Nov 30 '24 17:11 ruuda

That would risk breaking existing apps

LPardue avatar Nov 30 '24 17:11 LPardue