public override void ProcessPacket(NetPacket packet) { int relative = NetUtils.RelativeSequenceNumber(packet.Sequence, _remoteSequence); if (packet.Sequence < NetConstants.MaxSequence && relative > 0) { Peer.Statistics.PacketLoss += (ulong)(relative - 1); _remoteSequence = packet.Sequence; Peer.AddIncomingPacket(packet); } }
public override bool ProcessPacket(NetPacket packet) { if (packet.Property == PacketProperty.Ack) { if (_reliable && _lastPacket != null && packet.Sequence == _lastPacket.Sequence) { _lastPacket = null; } return(false); } int relative = NetUtils.RelativeSequenceNumber(packet.Sequence, _remoteSequence); bool packetProcessed = false; if (packet.Sequence < NetConstants.MaxSequence && relative > 0) { Peer.Statistics.PacketLoss += (ulong)(relative - 1); _remoteSequence = packet.Sequence; Peer.AddIncomingPacket(packet); packetProcessed = true; } _mustSendAck = true; return(packetProcessed); }
public override void ProcessPacket(NetPacket packet) { if (packet.Property == PacketProperty.Ack) { if (_reliable) { if (_lastPacket != null && packet.Sequence == _lastPacket.Sequence) { //TODO: recycle? _lastPacket = null; } } return; } int relative = NetUtils.RelativeSequenceNumber(packet.Sequence, _remoteSequence); if (packet.Sequence < NetConstants.MaxSequence && relative > 0) { Peer.Statistics.PacketLoss += (ulong)(relative - 1); _remoteSequence = packet.Sequence; Peer.AddIncomingPacket(packet); } _mustSendAck = true; }
//Process incoming packet public override void ProcessPacket(NetPacket packet) { int seq = packet.Sequence; if (seq >= NetConstants.MaxSequence) { NetUtils.DebugWrite("[RR]Bad sequence"); return; } int relate = NetUtils.RelativeSequenceNumber(seq, _remoteWindowStart); int relateSeq = NetUtils.RelativeSequenceNumber(seq, _remoteSequence); if (relateSeq > _windowSize) { NetUtils.DebugWrite("[RR]Bad sequence"); return; } //Drop bad packets if (relate < 0) { //Too old packet doesn't ack NetUtils.DebugWrite("[RR]ReliableInOrder too old"); return; } if (relate >= _windowSize * 2) { //Some very new packet NetUtils.DebugWrite("[RR]ReliableInOrder too new"); return; } //If very new - move window int ackIdx; int ackByte; int ackBit; Monitor.Enter(_outgoingAcks); if (relate >= _windowSize) { //New window position int newWindowStart = (_remoteWindowStart + relate - _windowSize + 1) % NetConstants.MaxSequence; _outgoingAcks.Sequence = (ushort)newWindowStart; //Clean old data while (_remoteWindowStart != newWindowStart) { ackIdx = _remoteWindowStart % _windowSize; ackByte = NetConstants.SequencedHeaderSize + ackIdx / BitsInByte; ackBit = ackIdx % BitsInByte; _outgoingAcks.RawData[ackByte] &= (byte)~(1 << ackBit); _remoteWindowStart = (_remoteWindowStart + 1) % NetConstants.MaxSequence; } } //Final stage - process valid packet //trigger acks send _mustSendAcks = true; ackIdx = seq % _windowSize; ackByte = NetConstants.SequencedHeaderSize + ackIdx / BitsInByte; ackBit = ackIdx % BitsInByte; if ((_outgoingAcks.RawData[ackByte] & (1 << ackBit)) != 0) { NetUtils.DebugWrite("[RR]ReliableInOrder duplicate"); Monitor.Exit(_outgoingAcks); return; } //save ack _outgoingAcks.RawData[ackByte] |= (byte)(1 << ackBit); Monitor.Exit(_outgoingAcks); //detailed check if (seq == _remoteSequence) { NetUtils.DebugWrite("[RR]ReliableInOrder packet succes"); Peer.AddIncomingPacket(packet); _remoteSequence = (_remoteSequence + 1) % NetConstants.MaxSequence; if (_ordered) { NetPacket p; while ((p = _receivedPackets[_remoteSequence % _windowSize]) != null) { //process holded packet _receivedPackets[_remoteSequence % _windowSize] = null; Peer.AddIncomingPacket(p); _remoteSequence = (_remoteSequence + 1) % NetConstants.MaxSequence; } } else { while (_earlyReceived[_remoteSequence % _windowSize]) { //process early packet _earlyReceived[_remoteSequence % _windowSize] = false; _remoteSequence = (_remoteSequence + 1) % NetConstants.MaxSequence; } } return; } //holded packet if (_ordered) { _receivedPackets[ackIdx] = packet; } else { _earlyReceived[ackIdx] = true; Peer.AddIncomingPacket(packet); } }