//----------------------------------------------------------------------------- // Purpose: Updates the current sequence info with the new packet // scans the message window to see if future packets can be used //----------------------------------------------------------------------------- void CTrackerNET::UpdateSequence(NetworkTarget_t *target, int targetIndex, int seqNum) { // update sequence target->incomingSequence = seqNum; // check to see when we should send acknowledgement if (!target->needAck) { target->ackTime = m_pThreads->GetTime() + ACK_DELAY; target->needAck = true; // move the target to the end of the ack list m_TargetList.Unlink(targetIndex); if (m_TargetList.IsValidIndex(m_iHighestAckTarget) && m_TargetList.IsInList(m_iHighestAckTarget)) { m_TargetList.LinkAfter(m_iHighestAckTarget, targetIndex); } else { m_TargetList.LinkToHead(targetIndex); } // set the need high mark for the packets that need ack m_iHighestAckTarget = targetIndex; } // check to see if packets in the window are now valid while (target->m_MessageWindow.Count()) { int index = target->m_MessageWindow.Head(); if (target->m_MessageWindow[index].sequenceNumber == target->incomingSequence + 1) { // this is the next message // update sequence numbers target->incomingSequence = target->m_MessageWindow[index].sequenceNumber; // add message to received list int receivedIndex = m_ReceivedMsgs.AddToTail(); m_ReceivedMsgs[receivedIndex].message = target->m_MessageWindow[index].message; WriteToLog("-> Recv match in window (is: %d)\n", target->m_MessageWindow[index].sequenceNumber); // remove message from window target->m_MessageWindow.Remove(index); } else { // no more break; } } }