From 8c41ee5ada8f44b54209888372d5105f7914a47a Mon Sep 17 00:00:00 2001 From: Guillaume Hetier Date: Tue, 4 Feb 2025 15:54:07 -0800 Subject: [PATCH] Fixes and api completion --- src/core/api.c | 1 + src/core/api.h | 9 +++++++++ src/core/library.c | 1 + src/core/recv_buffer.c | 3 ++- src/core/stream_recv.c | 6 +++--- 5 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/core/api.c b/src/core/api.c index f9bfd0d1c7..cbcfc230ea 100644 --- a/src/core/api.c +++ b/src/core/api.c @@ -1469,6 +1469,7 @@ MsQuicStreamProvideReceiveBuffers( } Oper->API_CALL.Context->Type = QUIC_API_TYPE_STRM_PROVIDE_RECV_BUFFERS; Oper->API_CALL.Context->STRM_PROVIDE_RECV_BUFFERS.Stream = Stream; + CxPlatListInitializeHead(&Oper->API_CALL.Context->STRM_PROVIDE_RECV_BUFFERS.Chunks); CxPlatListMoveItems(&ChunkList, &Oper->API_CALL.Context->STRM_PROVIDE_RECV_BUFFERS.Chunks); // diff --git a/src/core/api.h b/src/core/api.h index 87c6631a04..0ee664a9f0 100644 --- a/src/core/api.h +++ b/src/core/api.h @@ -216,6 +216,15 @@ MsQuicStreamReceiveComplete( _In_ uint64_t BufferLength ); +_IRQL_requires_max_(DISPATCH_LEVEL) +QUIC_STATUS +QUIC_API +MsQuicStreamProvideReceiveBuffers( + _In_ _Pre_defensive_ HQUIC Handle, + _In_ uint32_t BufferCount, + _In_reads_(BufferCount) const QUIC_BUFFER *Buffers + ); + _IRQL_requires_max_(DISPATCH_LEVEL) QUIC_STATUS QUIC_API diff --git a/src/core/library.c b/src/core/library.c index a83973b8cc..09802a1168 100644 --- a/src/core/library.c +++ b/src/core/library.c @@ -1798,6 +1798,7 @@ MsQuicOpenVersion( Api->StreamSend = MsQuicStreamSend; Api->StreamReceiveComplete = MsQuicStreamReceiveComplete; Api->StreamReceiveSetEnabled = MsQuicStreamReceiveSetEnabled; + Api->StreamProvideReceiveBuffers = MsQuicStreamProvideReceiveBuffers; Api->DatagramSend = MsQuicDatagramSend; diff --git a/src/core/recv_buffer.c b/src/core/recv_buffer.c index 396b66b16e..e21fec8b78 100644 --- a/src/core/recv_buffer.c +++ b/src/core/recv_buffer.c @@ -1091,7 +1091,8 @@ QuicRecvBufferPartialDrain( // In external mode, memory is never re-used: a drain consumes // virtual buffer length. // - RecvBuffer->VirtualBufferLength -= RecvBuffer->ReadLength; + CXPLAT_DBG_ASSERT(RecvBuffer->VirtualBufferLength >= (uint32_t)DrainLength); + RecvBuffer->VirtualBufferLength -= (uint32_t)DrainLength; } } diff --git a/src/core/stream_recv.c b/src/core/stream_recv.c index 5223156d34..7b9dcf3a4c 100644 --- a/src/core/stream_recv.c +++ b/src/core/stream_recv.c @@ -767,8 +767,8 @@ QuicStreamOnBytesDelivered( // // Limit stream FC window growth by the connection FC window size. // - if (Stream->RecvBuffer.VirtualBufferLength < - Stream->Connection->Settings.ConnFlowControlWindow) { + if (Stream->RecvBuffer.VirtualBufferLength != 0 && + Stream->RecvBuffer.VirtualBufferLength < Stream->Connection->Settings.ConnFlowControlWindow) { uint64_t TimeThreshold = ((Stream->RecvWindowBytesDelivered * Stream->Connection->Paths[0].SmoothedRtt) / RecvBufferDrainThreshold); @@ -831,7 +831,7 @@ QuicStreamOnBytesDelivered( "Updating flow control window"); CXPLAT_DBG_ASSERT( - Stream->RecvBuffer.BaseOffset + Stream->RecvBuffer.VirtualBufferLength > + Stream->RecvBuffer.BaseOffset + Stream->RecvBuffer.VirtualBufferLength >= Stream->MaxAllowedRecvOffset); Stream->MaxAllowedRecvOffset =