Skip to content

C# — Message Types

Message types for control-plane and data-plane operations. All message classes are in Nnrp.Core.

Import

csharp
using Nnrp.Core;

Handshake Messages

ClientHelloMessage

PropertyTypeDescription
SessionIduintClient-assigned session ID
MaxViewsintMax concurrent views
EnableCacheboolEnable server-side cache
PayloadKindMaskPayloadKindSupported payload type mask
AuthBlockReadOnlyMemory<byte>Auth block (application-defined)
ExtensionsIReadOnlyList<ControlExtensionEntry>Extension entries
csharp
public static ClientHelloMessage Parse(NnrpFramedMessage msg);
public NnrpFramedMessage Build();

ServerHelloAckMessage

PropertyTypeDescription
SessionIduintServer-confirmed session ID
TransportIdTransportIdSelected transport
EnableCacheboolCache enabled
MaxCacheEntriesintMax cache entries
MaxCacheByteslongMax cache bytes
PayloadKindMaskPayloadKindServer supported payload types
ExtensionsIReadOnlyList<ControlExtensionEntry>Extension entries
csharp
public static ServerHelloAckMessage Parse(NnrpFramedMessage msg);
public NnrpFramedMessage Build();

Session Management Messages

SessionPatchMessage

PropertyTypeDescription
PatchFieldsSessionPatchFieldFields to update
TargetCadenceintTarget frame rate
QualityTierintQuality tier
ActiveLaneMaskuintActive view mask
PreferredCodecintPreferred codec ID
PreferredCompressionintPreferred compression level
csharp
public static SessionPatchMessage Parse(NnrpFramedMessage msg);
public NnrpFramedMessage Build(uint sessionId);

SessionPatchAckMessage

PropertyTypeDescription
PatchFieldsSessionPatchFieldSuccessfully applied fields
StatusSessionPatchAckStatusApplication result
RejectReasonSessionPatchRejectReasonReject reason (valid when Status is Rejected)
csharp
public static SessionPatchAckMessage Parse(NnrpFramedMessage msg);
public NnrpFramedMessage Build(uint sessionId);

CloseMessage

csharp
public static CloseMessage Parse(NnrpFramedMessage msg);
public NnrpFramedMessage Build(uint sessionId, HeaderFlags flags = HeaderFlags.None);

ErrorMessage

PropertyTypeDescription
ErrorCodeErrorCodeError code
ErrorScopeErrorScopeError scope
FrameIduintRelated frame ID
csharp
public static ErrorMessage Parse(NnrpFramedMessage msg);
public NnrpFramedMessage Build(uint sessionId);
public static NnrpFramedMessage BuildFrom(NnrpProtocolFailure failure);

Data-plane Messages

FrameSubmitMessage

PropertyTypeDescription
InputProfileInputProfileInput data format
SubmitModeSubmitModeSubmission mode
BudgetPolicyBudgetPolicyAllowed degradation
PayloadKindBitmapPayloadKindPayload type bitmask
TileCountintTotal tile count
SectionCountintTensor section count
InferenceBudgetMsintMax inference budget (ms)
DeadlineMslongAbsolute deadline
BodyBytesReadOnlyMemory<byte>Raw body bytes
csharp
public static FrameSubmitMessage Parse(NnrpFramedMessage msg);
public NnrpFramedMessage Build(uint sessionId, uint frameId);

FrameCancelMessage

csharp
public static FrameCancelMessage Parse(NnrpFramedMessage msg);
public NnrpFramedMessage Build(uint sessionId, uint frameId);

ResultPushMessage

PropertyTypeDescription
ResultClassResultClassResult completeness class
ResultFlagsResultFlagsResult flags
AppliedBudgetPolicyBudgetPolicyApplied degradation policy
ActiveProfileIdintInference profile ID used
InferenceMsintInference time (ms)
QueueMsintQueue wait time (ms)
ServerTotalMsintTotal server time (ms)
StatusCodeintStatus code
TileIndexModeTileIndexModeTile index encoding
CoveredTileCountintCovered tile count
DroppedTileCountintDropped tile count
ReusedFrameIduintReused frame ID
PayloadKindBitmapPayloadKindActual payload types present
BodyBytesReadOnlyMemory<byte>Raw result body
csharp
public static ResultPushMessage Parse(NnrpFramedMessage msg);
public NnrpFramedMessage Build(uint sessionId, uint frameId);

ResultDropMessage

csharp
public static ResultDropMessage Parse(NnrpFramedMessage msg);
public NnrpFramedMessage Build(uint sessionId, uint frameId);

Cache Messages

CachePutMessage

PropertyTypeDescription
KeyNnrpCacheKeyCache object key
FlagsCachePutFlagsPut flags (Pinned, Reusable)
ObjectBytesReadOnlyMemory<byte>Cache object data
csharp
public static CachePutMessage Parse(NnrpFramedMessage msg);
public NnrpFramedMessage Build(uint sessionId);

CacheAckMessage

PropertyTypeDescription
KeyNnrpCacheKeyCache object key
StatusCacheAckStatusStore result
csharp
public static CacheAckMessage Parse(NnrpFramedMessage msg);
public NnrpFramedMessage Build(uint sessionId);

CacheInvalidateMessage

PropertyTypeDescription
ScopeCacheInvalidateScopeInvalidation scope
KeyNnrpCacheKeyTarget key (valid for Single scope)
KindCacheObjectKindTarget kind (valid for ByKind scope)
csharp
public static CacheInvalidateMessage Parse(NnrpFramedMessage msg);
public NnrpFramedMessage Build(uint sessionId);

Flow Control Messages

FlowUpdateMessage

PropertyTypeDescription
ScopeKindFlowUpdateScopeKindUpdate scope
UpdateReasonFlowUpdateReasonUpdate reason
BackpressureLevelFlowUpdateBackpressureLevelBackpressure level
ConnectionCreditintConnection-level credit delta
SessionCreditintSession-level credit delta
OperationCreditintOperation-level credit delta
OperationIduintTarget operation ID
RetryAfterMsintSuggested retry delay (ms)
CreditEpochuintCredit epoch
FlagsFlowUpdateFlagsFlow update flags
csharp
public static FlowUpdateMessage Parse(NnrpFramedMessage msg);
public NnrpFramedMessage Build(uint sessionId);

ResultHintMessage

PropertyTypeDescription
BudgetPolicyResultHintBudgetPolicySuggested budget policy
CongestionStateResultHintCongestionStateCurrent congestion state
ReasonResultHintReasonHint reason
FrameIduintRelated frame ID
QueueDepthintCurrent queue depth
EstimatedWaitMsintEstimated wait (ms)
csharp
public static ResultHintMessage Parse(NnrpFramedMessage msg);
public NnrpFramedMessage Build(uint sessionId);

Control Extension Type

ControlExtensionEntry

csharp
public readonly struct ControlExtensionEntry
{
    public ushort TypeId { get; }
    public ControlExtensionFlags Flags { get; }
    public ReadOnlyMemory<byte> Payload { get; }
}

Built-in extension types: ClientHelloTransportPolicyExtension, ServerHelloAckTransportPolicyExtension, ClientHelloLossToleranceExtension, ServerHelloAckLossToleranceExtension, ClientHelloPayloadCapabilitiesExtension, ServerHelloAckPayloadCapabilitiesExtension.


Typical Use Cases

Building a FRAME_SUBMIT packet (low-level)

csharp
var metadata = new FrameSubmitMetadata
{
    FrameId           = 42,
    InputProfile      = InputProfile.ChangedTilesLuma,
    SubmitMode        = SubmitMode.Inline,
    BudgetPolicy      = BudgetPolicy.AllowPartial,
    InferenceBudgetMs = 8,
    TileIds           = new ushort[] { 3, 7, 12 },
};
var packet = NnrpMessageBuilder.BuildFrameSubmit(
    sessionId: 42, metadata: metadata, sections: new[] { tensorSection });
await transport.SendAsync(packet.Pack());

Parsing control extensions

csharp
var entries = ControlExtensionParser.Unpack(packet.Metadata);
foreach (var entry in entries)
{
    if (entry.TypeId == NnrpExtensionTypeIds.ClientHelloTransportPolicy)
    {
        var ext = ClientHelloTransportPolicyExtension.Unpack(entry.Payload.Span);
        Console.WriteLine("Requested policy: " + ext.Policy);
    }
}

Common Pitfalls

WARNING

  1. Metadata vs Body: NnrpPacket.Metadata contains small structured fields; NnrpPacket.Body contains large binary payloads. Do not call Tensor unpack on Metadata.

  2. TileIds and TilePayloads must be index-aligned. Mismatched order causes tile reconstruction errors.

  3. ReadOnlyMemory<byte> slices from a pooled packet share lifetime with the packet. If the packet is returned to the pool before you finish reading the slice, you will read garbage data.

NNRP Documentation