add basic wrapper and ack data decoding

This commit is contained in:
2024-12-06 21:52:27 -06:00
parent 76892f6e19
commit f62b294fe8
2 changed files with 43 additions and 3 deletions
+16 -1
View File
@@ -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;
};
+27 -2
View File
@@ -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;