public SackChunk(CType type, byte flags, int length, ByteBuffer pkt) : base(type, flags, length, pkt) { _cumuTSNAck = _body.GetUInt(); _arWin = _body.GetUInt(); int ngaps = _body.GetUShort(); int nDTSNs = _body.GetUShort(); _gaps = new GapBlock[ngaps]; _duplicateTSNs = new uint[nDTSNs]; for (int i = 0; i < ngaps; i++) { _gaps[i] = new GapBlock(_body); } for (int i = 0; i < nDTSNs; i++) { _duplicateTSNs[i] = _body.GetUInt(); } }
public void setGaps(List <uint> seenTsns) { long cuTsn = _cumuTSNAck; List <GapBlock> gaplist = new List <GapBlock>(); GapBlock currentGap = null; ushort prevoff = (ushort)0; foreach (long t in seenTsns) { ushort offs = (ushort)(t - cuTsn); if (currentGap == null) { currentGap = new GapBlock(offs); currentGap.setEnd(offs); gaplist.Add(currentGap); } else { if (offs == prevoff + 1) { currentGap.setEnd(offs); } else { currentGap = new GapBlock(offs); currentGap.setEnd(offs); gaplist.Add(currentGap); } } prevoff = offs; } _gaps = new GapBlock[gaplist.Count]; int i = 0; foreach (GapBlock g in gaplist) { _gaps[i++] = g; } }