public RDPUDP_ACK_VECTOR_HEADER CreateAckVectorHeader()
{
RDPUDP_ACK_VECTOR_HEADER ackVectorHeader = new RDPUDP_ACK_VECTOR_HEADER();
if (inPacketDic.Count == 0)
{
// Not receive any source packet
ackVectorHeader.uAckVectorSize = 0;
ackVectorHeader.AckVectorElement = null;
ackVectorHeader.Padding = null;
}
else
{
lock (inPacketDic)
{
// Generate an ACK header.
List<AckVector> ackVectorElements = new List<AckVector>();
VECTOR_ELEMENT_STATE currentState = inPacketDic.ContainsKey(InSnAckOfAcksSeqNum) ? VECTOR_ELEMENT_STATE.DATAGRAM_RECEIVED : VECTOR_ELEMENT_STATE.DATAGRAM_NOT_YET_RECEIVED;
AckVector ackVectorElement = new AckVector();
ackVectorElement.State = currentState;
ackVectorElement.Length = 0;
// RLE encoding.
for (uint i = InSnAckOfAcksSeqNum + 1; i <= SnSourceAck; i++)
{
currentState = inPacketDic.ContainsKey(i) ? VECTOR_ELEMENT_STATE.DATAGRAM_RECEIVED : VECTOR_ELEMENT_STATE.DATAGRAM_NOT_YET_RECEIVED;
// 0x40 is the max length of state length, of which I believe sould be indicate from soket config or types config not hard code here.
if (currentState != ackVectorElement.State || ackVectorElement.Length >= 0x40)
{
// If current state differs from last state, assign a new ack vector.
ackVectorElements.Add(ackVectorElement);
ackVectorElement = new AckVector();
ackVectorElement.State = currentState;
ackVectorElement.Length = 0;
}
else
{
// Else count++.
ackVectorElement.Length++;
}
}
ackVectorElements.Add(ackVectorElement);
ackVectorHeader.uAckVectorSize = (ushort)ackVectorElements.Count;
ackVectorHeader.AckVectorElement = ackVectorElements.ToArray();
// ACK Vector created for all received packet, set number of received packets for ACK to 0
sourceNumNotAcked = 0;
}
}
return ackVectorHeader;
}