From f62b294fe84d124577eb604ebff60d81147a3750 Mon Sep 17 00:00:00 2001 From: Joel Wetzell Date: Fri, 6 Dec 2024 21:52:27 -0600 Subject: [PATCH] add basic wrapper and ack data decoding --- packages/acn/src/models.ts | 17 ++++++++++++++++- packages/acn/src/pdu/sdt.ts | 29 +++++++++++++++++++++++++++-- 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/packages/acn/src/models.ts b/packages/acn/src/models.ts index 5b1e4bf..e1c045a 100644 --- a/packages/acn/src/models.ts +++ b/packages/acn/src/models.ts @@ -88,8 +88,23 @@ export type SDTJoinRefuseData = { refuseCode: number; }; +export type SDTWrapperData = { + channelNumber: number; + totalSequenceNumber: number; + reliableSequenceNumber: number; + oldestAvailableWrapper: number; + firstMemberToAck: number; + lastMemberToAck: number; + makThreshold: number; + sdtClientBlock: Uint8Array; +}; + +export type SDTAckData = { + reliableSequenceNumber: number; +}; + export type SessionDataTransportPDU = { vector: SessionDataTransportVectors; // TODO(jwetzell): cleanup these types - data: SDTJoinData | SDTJoinAcceptData | SDTJoinRefuseData| Uint8Array; + data: SDTJoinData | SDTJoinAcceptData | SDTJoinRefuseData | SDTWrapperData | SDTAckData | Uint8Array; }; diff --git a/packages/acn/src/pdu/sdt.ts b/packages/acn/src/pdu/sdt.ts index 27108a8..b2224b9 100644 --- a/packages/acn/src/pdu/sdt.ts +++ b/packages/acn/src/pdu/sdt.ts @@ -1,4 +1,4 @@ -import { SessionDataTransportPDU, SessionDataTransportVectors, TransportLayerAddress } from '../models'; +import { SDTWrapperData, SessionDataTransportPDU, SessionDataTransportVectors, TransportLayerAddress } from '../models'; import { toHex } from '../utils'; // TODO(jwetzell): work out flag inheritance, will need previous PDU @@ -25,7 +25,6 @@ export function decode(bytes: Uint8Array): SessionDataTransportPDU { const lengthL = view.getUint8(lengthOffset); let length = (lengthH << 8) + lengthL; - console.log('length', length); if (lengthFlag) { lengthOffset += 1; const lengthX = view.getUint8(lengthOffset); @@ -107,6 +106,32 @@ export function decode(bytes: Uint8Array): SessionDataTransportPDU { data: joinData, }; } + case SessionDataTransportVectors.REL_WRAP: + case SessionDataTransportVectors.UNREL_WRAP: { + const wrapperData: SDTWrapperData = { + channelNumber: view.getUint16(dataOffset), + totalSequenceNumber: view.getUint32(dataOffset + 2), + reliableSequenceNumber: view.getUint32(dataOffset + 6), + oldestAvailableWrapper: view.getUint32(dataOffset + 10), + firstMemberToAck: view.getUint16(dataOffset + 14), + lastMemberToAck: view.getUint16(dataOffset + 16), + makThreshold: view.getUint16(dataOffset + 18), + // TODO(jwetzell): actually decode client block + sdtClientBlock: bytes.subarray(dataOffset + 20), + }; + return { + vector, + data: wrapperData, + }; + } + case SessionDataTransportVectors.ACK: { + return { + vector, + data: { + reliableSequenceNumber: view.getUint32(dataOffset), + }, + }; + } default: console.error(`unhandled SDT vector: ${vector}`); break;