diff --git a/src/core/ack_tracker.c b/src/core/ack_tracker.c index b54a91c690..764bad0e97 100644 --- a/src/core/ack_tracker.c +++ b/src/core/ack_tracker.c @@ -103,7 +103,7 @@ QuicAckTrackerAckPacket( _In_ uint64_t PacketNumber, _In_ uint64_t RecvTimeUs, _In_ CXPLAT_ECN_TYPE ECN, - _In_ BOOLEAN AckElicitingPayload + _In_ QUIC_ACK_TYPE AckType ) { QUIC_CONNECTION* Connection = QuicAckTrackerGetPacketSpace(Tracker)->Connection; @@ -166,7 +166,7 @@ QuicAckTrackerAckPacket( Tracker->AlreadyWrittenAckFrame = FALSE; - if (!AckElicitingPayload) { + if (AckType == QUIC_ACK_TYPE_NON_ACK_ELICITING) { goto Exit; } @@ -185,12 +185,14 @@ QuicAckTrackerAckPacket( // been loss and should indicate this info to the peer. This logic is // disabled if 'IgnoreReordering' is TRUE. // 3. The delayed ACK timer fires after the configured time. + // 4. The packet included an IMMEDIATE_ACK frame. // // If we don't queue an immediate ACK and this is the first ACK eliciting // packet received, we make sure the ACK delay timer is started. // - if ((Tracker->AckElicitingPacketsToAcknowledge >= (uint16_t)Connection->PacketTolerance) || + if (AckType == QUIC_ACK_TYPE_ACK_IMMEDIATE || + (Tracker->AckElicitingPacketsToAcknowledge >= (uint16_t)Connection->PacketTolerance) || (!Connection->State.IgnoreReordering && (NewLargestPacketNumber && QuicRangeSize(&Tracker->PacketNumbersToAck) > 1 && // There are more than two ranges, i.e. a gap somewhere. diff --git a/src/core/ack_tracker.h b/src/core/ack_tracker.h index b7b8b48e90..802c337ce9 100644 --- a/src/core/ack_tracker.h +++ b/src/core/ack_tracker.h @@ -91,6 +91,12 @@ QuicAckTrackerAddPacketNumber( _In_ uint64_t PacketNumber ); +typedef enum QUIC_ACK_TYPE { + QUIC_ACK_TYPE_NON_ACK_ELICITING, + QUIC_ACK_TYPE_ACK_ELICITING, + QUIC_ACK_TYPE_ACK_IMMEDIATE, +} QUIC_ACK_TYPE; + // // Adds the packet number to the list of packets that should be acknowledged. // @@ -101,7 +107,7 @@ QuicAckTrackerAckPacket( _In_ uint64_t PacketNumber, _In_ uint64_t RecvTimeUs, _In_ CXPLAT_ECN_TYPE ECN, - _In_ BOOLEAN AckElicitingPayload + _In_ QUIC_ACK_TYPE AckType ); // diff --git a/src/core/connection.c b/src/core/connection.c index c0a15355c5..27361358b5 100644 --- a/src/core/connection.c +++ b/src/core/connection.c @@ -4130,7 +4130,8 @@ QuicConnRecvFrames( _In_ CXPLAT_ECN_TYPE ECN ) { - BOOLEAN AckPacketImmediately = FALSE; // Allows skipping delayed ACK timer. + BOOLEAN AckEliciting = FALSE; + BOOLEAN AckImmediately = FALSE; BOOLEAN UpdatedFlowControl = FALSE; QUIC_ENCRYPT_LEVEL EncryptLevel = QuicKeyTypeToEncryptLevel(Packet->KeyType); BOOLEAN Closed = Connection->State.ClosedLocally || Connection->State.ClosedRemotely; @@ -4241,7 +4242,7 @@ QuicConnRecvFrames( // No other payload. Just need to acknowledge the packet this was // contained in. // - AckPacketImmediately = TRUE; + AckEliciting = TRUE; Packet->HasNonProbingFrame = TRUE; break; } @@ -4296,7 +4297,7 @@ QuicConnRecvFrames( Packet->KeyType, &Frame); if (QUIC_SUCCEEDED(Status)) { - AckPacketImmediately = TRUE; + AckEliciting = TRUE; } else if (Status == QUIC_STATUS_OUT_OF_MEMORY) { return FALSE; } else { @@ -4347,7 +4348,7 @@ QuicConnRecvFrames( // TODO - Save the token for future use. // - AckPacketImmediately = TRUE; + AckEliciting = TRUE; Packet->HasNonProbingFrame = TRUE; break; } @@ -4390,7 +4391,7 @@ QuicConnRecvFrames( return FALSE; } - AckPacketImmediately = TRUE; + AckEliciting = TRUE; BOOLEAN PeerOriginatedStream = QuicConnIsServer(Connection) ? @@ -4514,7 +4515,7 @@ QuicConnRecvFrames( &Connection->Send, REASON_CONNECTION_FLOW_CONTROL); } - AckPacketImmediately = TRUE; + AckEliciting = TRUE; Packet->HasNonProbingFrame = TRUE; break; } @@ -4546,7 +4547,7 @@ QuicConnRecvFrames( Frame.BidirectionalStreams, Frame.MaximumStreams); - AckPacketImmediately = TRUE; + AckEliciting = TRUE; Packet->HasNonProbingFrame = TRUE; break; } @@ -4577,7 +4578,7 @@ QuicConnRecvFrames( Frame.DataLimit); QuicSendSetSendFlag(&Connection->Send, QUIC_CONN_SEND_FLAG_MAX_DATA); - AckPacketImmediately = TRUE; + AckEliciting = TRUE; Packet->HasNonProbingFrame = TRUE; break; } @@ -4605,7 +4606,7 @@ QuicConnRecvFrames( "Peer Streams[%hu] FC blocked (%llu)", Frame.BidirectionalStreams, Frame.StreamLimit); - AckPacketImmediately = TRUE; + AckEliciting = TRUE; QUIC_CONNECTION_EVENT Event; Event.Type = QUIC_CONNECTION_EVENT_PEER_NEEDS_STREAMS; // TODO - Uni/Bidi @@ -4699,7 +4700,7 @@ QuicConnRecvFrames( return FALSE; } - AckPacketImmediately = TRUE; + AckEliciting = TRUE; break; } @@ -4751,7 +4752,7 @@ QuicConnRecvFrames( } } - AckPacketImmediately = TRUE; + AckEliciting = TRUE; Packet->HasNonProbingFrame = TRUE; break; } @@ -4776,7 +4777,7 @@ QuicConnRecvFrames( CxPlatCopyMemory(Path->Response, Frame.Data, sizeof(Frame.Data)); QuicSendSetSendFlag(&Connection->Send, QUIC_CONN_SEND_FLAG_PATH_RESPONSE); - AckPacketImmediately = TRUE; + AckEliciting = TRUE; break; } @@ -4807,7 +4808,7 @@ QuicConnRecvFrames( } } - AckPacketImmediately = TRUE; + AckEliciting = TRUE; break; } @@ -4835,7 +4836,7 @@ QuicConnRecvFrames( Frame.ReasonPhrase, (uint16_t)Frame.ReasonPhraseLength); - AckPacketImmediately = TRUE; + AckEliciting = TRUE; Packet->HasNonProbingFrame = TRUE; if (Connection->State.HandleClosed) { @@ -4867,7 +4868,7 @@ QuicConnRecvFrames( QuicCryptoHandshakeConfirmed(&Connection->Crypto); } - AckPacketImmediately = TRUE; + AckEliciting = TRUE; Packet->HasNonProbingFrame = TRUE; break; } @@ -4898,7 +4899,7 @@ QuicConnRecvFrames( QuicConnTransportError(Connection, QUIC_ERROR_FRAME_ENCODING_ERROR); return FALSE; } - AckPacketImmediately = TRUE; + AckEliciting = TRUE; break; } @@ -4924,7 +4925,7 @@ QuicConnRecvFrames( return FALSE; } - AckPacketImmediately = TRUE; + AckEliciting = TRUE; if (Frame.SequenceNumber < Connection->NextRecvAckFreqSeqNum) { // // This sequence number (or a higher one) has already been @@ -4954,6 +4955,10 @@ QuicConnRecvFrames( break; } + case QUIC_FRAME_IMMEDIATE_ACK: // Always accept the frame, because we always enable support. + AckImmediately = TRUE; + break; + default: // // No default case necessary, as we have already validated the frame @@ -4983,12 +4988,21 @@ QuicConnRecvFrames( Packet->NewLargestPacketNumber = TRUE; } + QUIC_ACK_TYPE AckType; + if (AckImmediately) { + AckType = QUIC_ACK_TYPE_ACK_IMMEDIATE; + } else if (AckEliciting) { + AckType = QUIC_ACK_TYPE_ACK_ELICITING; + } else { + AckType = QUIC_ACK_TYPE_NON_ACK_ELICITING; + } + QuicAckTrackerAckPacket( &Connection->Packets[EncryptLevel]->AckTracker, Packet->PacketNumber, RecvTime, ECN, - AckPacketImmediately); + AckType); } Packet->CompletelyValid = TRUE; diff --git a/src/core/crypto_tls.c b/src/core/crypto_tls.c index f43fb8de4d..5f04002820 100644 --- a/src/core/crypto_tls.c +++ b/src/core/crypto_tls.c @@ -63,7 +63,7 @@ typedef enum eSniNameType { #define QUIC_TP_ID_MAX_DATAGRAM_FRAME_SIZE 32 // varint #define QUIC_TP_ID_DISABLE_1RTT_ENCRYPTION 0xBAAD // N/A #define QUIC_TP_ID_VERSION_NEGOTIATION_EXT 0xFF73DB // Blob -#define QUIC_TP_ID_MIN_ACK_DELAY 0xFF02DE1AULL // varint +#define QUIC_TP_ID_MIN_ACK_DELAY 0xFF03DE1AULL // varint BOOLEAN QuicTpIdIsReserved( diff --git a/src/core/frame.c b/src/core/frame.c index ef7ee18672..ec487936bd 100644 --- a/src/core/frame.c +++ b/src/core/frame.c @@ -1184,6 +1184,19 @@ QuicDatagramFrameDecode( return TRUE; } +typedef struct QUIC_ACK_FREQUENCY_EXTRAS { + + union { + struct { + uint8_t IgnoreOrder : 1; + uint8_t IgnoreCE : 1; + uint8_t Reserved : 6; + }; + uint8_t Value; + }; + +} QUIC_ACK_FREQUENCY_EXTRAS; + _Success_(return != FALSE) BOOLEAN QuicAckFrequencyFrameEncode( @@ -1198,20 +1211,25 @@ QuicAckFrequencyFrameEncode( QuicVarIntSize(Frame->SequenceNumber) + QuicVarIntSize(Frame->PacketTolerance) + QuicVarIntSize(Frame->UpdateMaxAckDelay) + - sizeof(uint8_t); // IgnoreOrder + sizeof(QUIC_ACK_FREQUENCY_EXTRAS); if (BufferLength < *Offset + RequiredLength) { return FALSE; } CXPLAT_DBG_ASSERT(Frame->IgnoreOrder <= 1); // IgnoreOrder should only be 0 or 1. + CXPLAT_DBG_ASSERT(Frame->IgnoreCE <= 1); // IgnoreCE should only be 0 or 1. + + QUIC_ACK_FREQUENCY_EXTRAS Extras = { .Value = 0 }; + Extras.IgnoreOrder = Frame->IgnoreOrder; + Extras.IgnoreCE = Frame->IgnoreCE; Buffer = Buffer + *Offset; Buffer = QuicVarIntEncode(QUIC_FRAME_ACK_FREQUENCY, Buffer); Buffer = QuicVarIntEncode(Frame->SequenceNumber, Buffer); Buffer = QuicVarIntEncode(Frame->PacketTolerance, Buffer); Buffer = QuicVarIntEncode(Frame->UpdateMaxAckDelay, Buffer); - QuicUint8Encode(Frame->IgnoreOrder, Buffer); + QuicUint8Encode(Extras.Value, Buffer); *Offset += RequiredLength; return TRUE; @@ -1227,13 +1245,15 @@ QuicAckFrequencyFrameDecode( _Out_ QUIC_ACK_FREQUENCY_EX* Frame ) { + QUIC_ACK_FREQUENCY_EXTRAS Extras; if (!QuicVarIntDecode(BufferLength, Buffer, Offset, &Frame->SequenceNumber) || !QuicVarIntDecode(BufferLength, Buffer, Offset, &Frame->PacketTolerance) || !QuicVarIntDecode(BufferLength, Buffer, Offset, &Frame->UpdateMaxAckDelay) || - !QuicUint8tDecode(BufferLength, Buffer, Offset, &Frame->IgnoreOrder) || - Frame->IgnoreOrder > 1) { // IgnoreOrder should only be 0 or 1. + !QuicUint8tDecode(BufferLength, Buffer, Offset, &Extras.Value)) { return FALSE; } + Frame->IgnoreOrder = Extras.IgnoreOrder; + Frame->IgnoreCE = Extras.IgnoreCE; return TRUE; } @@ -1851,14 +1871,25 @@ QuicFrameLog( QuicTraceLogVerbose( FrameLogAckFrequency, - "[%c][%cX][%llu] ACK_FREQUENCY SeqNum:%llu PktTolerance:%llu MaxAckDelay:%llu IgnoreOrder:%hhu", + "[%c][%cX][%llu] ACK_FREQUENCY SeqNum:%llu PktTolerance:%llu MaxAckDelay:%llu IgnoreOrder:%hhu IgnoreCE:%hhu", PtkConnPre(Connection), PktRxPre(Rx), PacketNumber, Frame.SequenceNumber, Frame.PacketTolerance, Frame.UpdateMaxAckDelay, - Frame.IgnoreOrder); + Frame.IgnoreOrder, + Frame.IgnoreCE); + break; + } + + case QUIC_FRAME_IMMEDIATE_ACK: { + QuicTraceLogVerbose( + FrameLogImmediateAck, + "[%c][%cX][%llu] IMMEDIATE_ACK", + PtkConnPre(Connection), + PktRxPre(Rx), + PacketNumber); break; } diff --git a/src/core/frame.h b/src/core/frame.h index 286ac99059..5accf8f71e 100644 --- a/src/core/frame.h +++ b/src/core/frame.h @@ -150,6 +150,7 @@ typedef enum QUIC_FRAME_TYPE { QUIC_FRAME_DATAGRAM_1 = 0x31ULL, /* 0x32 to 0xad are unused currently */ QUIC_FRAME_ACK_FREQUENCY = 0xafULL, + QUIC_FRAME_IMMEDIATE_ACK = 0xacULL, QUIC_FRAME_MAX_SUPPORTED @@ -162,7 +163,7 @@ CXPLAT_STATIC_ASSERT( #define QUIC_FRAME_IS_KNOWN(X) \ (X <= QUIC_FRAME_HANDSHAKE_DONE || \ (X >= QUIC_FRAME_DATAGRAM && X <= QUIC_FRAME_DATAGRAM_1) || \ - X == QUIC_FRAME_ACK_FREQUENCY \ + X == QUIC_FRAME_ACK_FREQUENCY || X == QUIC_FRAME_IMMEDIATE_ACK \ ) // @@ -803,7 +804,8 @@ typedef struct QUIC_ACK_FREQUENCY_EX { QUIC_VAR_INT SequenceNumber; QUIC_VAR_INT PacketTolerance; QUIC_VAR_INT UpdateMaxAckDelay; // In microseconds (us) - uint8_t IgnoreOrder; + BOOLEAN IgnoreOrder; + BOOLEAN IgnoreCE; } QUIC_ACK_FREQUENCY_EX; diff --git a/src/core/send.c b/src/core/send.c index 9a15505a30..623269cd7d 100644 --- a/src/core/send.c +++ b/src/core/send.c @@ -825,6 +825,7 @@ QuicSendWriteFrames( (uint64_t)Connection->Settings.MaxAckDelayMs + (uint64_t)MsQuicLib.TimerResolutionMs); Frame.IgnoreOrder = FALSE; + Frame.IgnoreCE = FALSE; if (QuicAckFrequencyFrameEncode( &Frame, diff --git a/src/core/unittest/SpinFrame.cpp b/src/core/unittest/SpinFrame.cpp index 5c8df4ea9b..836ed23705 100644 --- a/src/core/unittest/SpinFrame.cpp +++ b/src/core/unittest/SpinFrame.cpp @@ -79,6 +79,7 @@ TEST(SpinFrame, SpinFrame1000000) switch(FrameType) { case QUIC_FRAME_PADDING: case QUIC_FRAME_PING: + case QUIC_FRAME_IMMEDIATE_ACK: break; // no-op case QUIC_FRAME_ACK: case QUIC_FRAME_ACK_1: diff --git a/src/core/unittest/main.h b/src/core/unittest/main.h index 45151ec9b1..1ad53dacd6 100644 --- a/src/core/unittest/main.h +++ b/src/core/unittest/main.h @@ -85,6 +85,8 @@ std::ostream& operator << (std::ostream& o, const QUIC_FRAME_TYPE& type) { return o << "QUIC_FRAME_DATAGRAM_1"; case QUIC_FRAME_ACK_FREQUENCY: return o << "QUIC_FRAME_ACK_FREQUENCY"; + case QUIC_FRAME_IMMEDIATE_ACK: + return o << "QUIC_FRAME_IMMEDIATE_ACK"; default: return o << "UNRECOGNIZED_FRAME_TYPE(" << (uint32_t) type << ")"; } diff --git a/src/generated/linux/frame.c.clog.h b/src/generated/linux/frame.c.clog.h index 35a4031d34..76e5a32b54 100644 --- a/src/generated/linux/frame.c.clog.h +++ b/src/generated/linux/frame.c.clog.h @@ -1173,17 +1173,18 @@ tracepoint(CLOG_FRAME_C, FrameLogAckFrequencyInvalid , arg2, arg3, arg4);\ /*---------------------------------------------------------- // Decoder Ring for FrameLogAckFrequency -// [%c][%cX][%llu] ACK_FREQUENCY SeqNum:%llu PktTolerance:%llu MaxAckDelay:%llu IgnoreOrder:%hhu +// [%c][%cX][%llu] ACK_FREQUENCY SeqNum:%llu PktTolerance:%llu MaxAckDelay:%llu IgnoreOrder:%hhu IgnoreCE:%hhu // QuicTraceLogVerbose( FrameLogAckFrequency, - "[%c][%cX][%llu] ACK_FREQUENCY SeqNum:%llu PktTolerance:%llu MaxAckDelay:%llu IgnoreOrder:%hhu", + "[%c][%cX][%llu] ACK_FREQUENCY SeqNum:%llu PktTolerance:%llu MaxAckDelay:%llu IgnoreOrder:%hhu IgnoreCE:%hhu", PtkConnPre(Connection), PktRxPre(Rx), PacketNumber, Frame.SequenceNumber, Frame.PacketTolerance, Frame.UpdateMaxAckDelay, - Frame.IgnoreOrder); + Frame.IgnoreOrder, + Frame.IgnoreCE); // arg2 = arg2 = PtkConnPre(Connection) = arg2 // arg3 = arg3 = PktRxPre(Rx) = arg3 // arg4 = arg4 = PacketNumber = arg4 @@ -1191,10 +1192,33 @@ tracepoint(CLOG_FRAME_C, FrameLogAckFrequencyInvalid , arg2, arg3, arg4);\ // arg6 = arg6 = Frame.PacketTolerance = arg6 // arg7 = arg7 = Frame.UpdateMaxAckDelay = arg7 // arg8 = arg8 = Frame.IgnoreOrder = arg8 +// arg9 = arg9 = Frame.IgnoreCE = arg9 ----------------------------------------------------------*/ -#ifndef _clog_9_ARGS_TRACE_FrameLogAckFrequency -#define _clog_9_ARGS_TRACE_FrameLogAckFrequency(uniqueId, encoded_arg_string, arg2, arg3, arg4, arg5, arg6, arg7, arg8)\ -tracepoint(CLOG_FRAME_C, FrameLogAckFrequency , arg2, arg3, arg4, arg5, arg6, arg7, arg8);\ +#ifndef _clog_10_ARGS_TRACE_FrameLogAckFrequency +#define _clog_10_ARGS_TRACE_FrameLogAckFrequency(uniqueId, encoded_arg_string, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9)\ +tracepoint(CLOG_FRAME_C, FrameLogAckFrequency , arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9);\ + +#endif + + + + +/*---------------------------------------------------------- +// Decoder Ring for FrameLogImmediateAck +// [%c][%cX][%llu] IMMEDIATE_ACK +// QuicTraceLogVerbose( + FrameLogImmediateAck, + "[%c][%cX][%llu] IMMEDIATE_ACK", + PtkConnPre(Connection), + PktRxPre(Rx), + PacketNumber); +// arg2 = arg2 = PtkConnPre(Connection) = arg2 +// arg3 = arg3 = PktRxPre(Rx) = arg3 +// arg4 = arg4 = PacketNumber = arg4 +----------------------------------------------------------*/ +#ifndef _clog_5_ARGS_TRACE_FrameLogImmediateAck +#define _clog_5_ARGS_TRACE_FrameLogImmediateAck(uniqueId, encoded_arg_string, arg2, arg3, arg4)\ +tracepoint(CLOG_FRAME_C, FrameLogImmediateAck , arg2, arg3, arg4);\ #endif diff --git a/src/generated/linux/frame.c.clog.h.lttng.h b/src/generated/linux/frame.c.clog.h.lttng.h index e708812200..2c51e44665 100644 --- a/src/generated/linux/frame.c.clog.h.lttng.h +++ b/src/generated/linux/frame.c.clog.h.lttng.h @@ -1479,17 +1479,18 @@ TRACEPOINT_EVENT(CLOG_FRAME_C, FrameLogAckFrequencyInvalid, /*---------------------------------------------------------- // Decoder Ring for FrameLogAckFrequency -// [%c][%cX][%llu] ACK_FREQUENCY SeqNum:%llu PktTolerance:%llu MaxAckDelay:%llu IgnoreOrder:%hhu +// [%c][%cX][%llu] ACK_FREQUENCY SeqNum:%llu PktTolerance:%llu MaxAckDelay:%llu IgnoreOrder:%hhu IgnoreCE:%hhu // QuicTraceLogVerbose( FrameLogAckFrequency, - "[%c][%cX][%llu] ACK_FREQUENCY SeqNum:%llu PktTolerance:%llu MaxAckDelay:%llu IgnoreOrder:%hhu", + "[%c][%cX][%llu] ACK_FREQUENCY SeqNum:%llu PktTolerance:%llu MaxAckDelay:%llu IgnoreOrder:%hhu IgnoreCE:%hhu", PtkConnPre(Connection), PktRxPre(Rx), PacketNumber, Frame.SequenceNumber, Frame.PacketTolerance, Frame.UpdateMaxAckDelay, - Frame.IgnoreOrder); + Frame.IgnoreOrder, + Frame.IgnoreCE); // arg2 = arg2 = PtkConnPre(Connection) = arg2 // arg3 = arg3 = PktRxPre(Rx) = arg3 // arg4 = arg4 = PacketNumber = arg4 @@ -1497,6 +1498,7 @@ TRACEPOINT_EVENT(CLOG_FRAME_C, FrameLogAckFrequencyInvalid, // arg6 = arg6 = Frame.PacketTolerance = arg6 // arg7 = arg7 = Frame.UpdateMaxAckDelay = arg7 // arg8 = arg8 = Frame.IgnoreOrder = arg8 +// arg9 = arg9 = Frame.IgnoreCE = arg9 ----------------------------------------------------------*/ TRACEPOINT_EVENT(CLOG_FRAME_C, FrameLogAckFrequency, TP_ARGS( @@ -1506,7 +1508,8 @@ TRACEPOINT_EVENT(CLOG_FRAME_C, FrameLogAckFrequency, unsigned long long, arg5, unsigned long long, arg6, unsigned long long, arg7, - unsigned char, arg8), + unsigned char, arg8, + unsigned char, arg9), TP_FIELDS( ctf_integer(unsigned char, arg2, arg2) ctf_integer(unsigned char, arg3, arg3) @@ -1515,6 +1518,34 @@ TRACEPOINT_EVENT(CLOG_FRAME_C, FrameLogAckFrequency, ctf_integer(uint64_t, arg6, arg6) ctf_integer(uint64_t, arg7, arg7) ctf_integer(unsigned char, arg8, arg8) + ctf_integer(unsigned char, arg9, arg9) + ) +) + + + +/*---------------------------------------------------------- +// Decoder Ring for FrameLogImmediateAck +// [%c][%cX][%llu] IMMEDIATE_ACK +// QuicTraceLogVerbose( + FrameLogImmediateAck, + "[%c][%cX][%llu] IMMEDIATE_ACK", + PtkConnPre(Connection), + PktRxPre(Rx), + PacketNumber); +// arg2 = arg2 = PtkConnPre(Connection) = arg2 +// arg3 = arg3 = PktRxPre(Rx) = arg3 +// arg4 = arg4 = PacketNumber = arg4 +----------------------------------------------------------*/ +TRACEPOINT_EVENT(CLOG_FRAME_C, FrameLogImmediateAck, + TP_ARGS( + unsigned char, arg2, + unsigned char, arg3, + unsigned long long, arg4), + TP_FIELDS( + ctf_integer(unsigned char, arg2, arg2) + ctf_integer(unsigned char, arg3, arg3) + ctf_integer(uint64_t, arg4, arg4) ) ) diff --git a/src/manifest/clog.sidecar b/src/manifest/clog.sidecar index 16718aa726..c24a47d4c1 100644 --- a/src/manifest/clog.sidecar +++ b/src/manifest/clog.sidecar @@ -7020,7 +7020,7 @@ }, "FrameLogAckFrequency": { "ModuleProperites": {}, - "TraceString": "[%c][%cX][%llu] ACK_FREQUENCY SeqNum:%llu PktTolerance:%llu MaxAckDelay:%llu IgnoreOrder:%hhu", + "TraceString": "[%c][%cX][%llu] ACK_FREQUENCY SeqNum:%llu PktTolerance:%llu MaxAckDelay:%llu IgnoreOrder:%hhu IgnoreCE:%hhu", "UniqueId": "FrameLogAckFrequency", "splitArgs": [ { @@ -7050,6 +7050,10 @@ { "DefinationEncoding": "hhu", "MacroVariableName": "arg8" + }, + { + "DefinationEncoding": "hhu", + "MacroVariableName": "arg9" } ], "macroName": "QuicTraceLogVerbose" @@ -10541,6 +10545,26 @@ } ], "macroName": "QuicTraceLogInfo" + }, + "FrameLogImmediateAck": { + "ModuleProperites": {}, + "TraceString": "[%c][%cX][%llu] IMMEDIATE_ACK", + "UniqueId": "FrameLogImmediateAck", + "splitArgs": [ + { + "DefinationEncoding": "c", + "MacroVariableName": "arg2" + }, + { + "DefinationEncoding": "c", + "MacroVariableName": "arg3" + }, + { + "DefinationEncoding": "llu", + "MacroVariableName": "arg4" + } + ], + "macroName": "QuicTraceLogVerbose" } }, "ConfigFile": { @@ -13262,11 +13286,6 @@ "TraceID": "FrameLogAckFrequencyInvalid", "EncodingString": "[%c][%cX][%llu] ACK_FREQUENCY [Invalid]" }, - { - "UniquenessHash": "851bd2b1-e157-5cea-5989-07884c45d69e", - "TraceID": "FrameLogAckFrequency", - "EncodingString": "[%c][%cX][%llu] ACK_FREQUENCY SeqNum:%llu PktTolerance:%llu MaxAckDelay:%llu IgnoreOrder:%hhu" - }, { "UniquenessHash": "60d753ab-6710-fe16-e47d-37f046f5973c", "TraceID": "IgnoreCryptoFrame", @@ -14361,6 +14380,16 @@ "UniquenessHash": "4f262ea3-4eb1-45f3-019c-54d89cf92893", "TraceID": "WindowsUserInitialized2", "EncodingString": "[ dll] Initialized (AvailMem = %llu bytes, TimerResolution = [%u, %u])" + }, + { + "UniquenessHash": "7470e68a-8ad6-563a-4957-76dc22e5deeb", + "TraceID": "FrameLogAckFrequency", + "EncodingString": "[%c][%cX][%llu] ACK_FREQUENCY SeqNum:%llu PktTolerance:%llu MaxAckDelay:%llu IgnoreOrder:%hhu IgnoreCE:%hhu" + }, + { + "UniquenessHash": "d0932f9a-e8e8-65d9-692c-3bd379a86d58", + "TraceID": "FrameLogImmediateAck", + "EncodingString": "[%c][%cX][%llu] IMMEDIATE_ACK" } ] }