public override int GetAllowedSends() { int retval = _windowSize - NetUtility.PowOf2Mod( _sendStart + NetConstants.SequenceNumbers - _windowStart, NetConstants.SequenceNumbers); LidgrenException.Assert(retval >= 0 && retval <= _windowSize); return(retval); }
public override int GetAllowedSends() { if (!_doFlowControl) { return(int.MaxValue); } int value = _windowSize - NetUtility.PowOf2Mod( _sendStart + NetConstants.SequenceNumbers - _windowStart, _windowSize); LidgrenException.Assert(value >= 0 && value <= _windowSize); return(value); }
private NetSocketResult ExecuteSend(NetOutgoingMessage message) { _connection.Peer.AssertIsOnLibraryThread(); int seqNr = _sendStart; var sendResult = _connection.QueueSendMessage(message, seqNr); if (sendResult.Success) { _sendStart = NetUtility.PowOf2Mod(seqNr + 1, NetConstants.SequenceNumbers); Interlocked.Decrement(ref message._recyclingCount); if (message._recyclingCount <= 0) { _connection.Peer.Recycle(message); } } return(sendResult); }
// remoteWindowStart is remote expected sequence number; everything below this has arrived properly // seqNr is the actual nr received public override NetSocketResult ReceiveAcknowledge(TimeSpan now, int seqNr) { if (!_doFlowControl) { // we have no use for acks on this channel since we don't respect the window anyway _connection.Peer.LogWarning(new NetLogMessage(NetLogCode.SuppressedUnreliableAck, endPoint: _connection)); return(new NetSocketResult(true, false)); } // late (dupe), on time or early ack? int relate = NetUtility.RelativeSequenceNumber(seqNr, _windowStart); if (relate < 0) { //m_connection.m_peer.LogDebug("Received late/dupe ack for #" + seqNr); return(new NetSocketResult(true, false)); // late/duplicate ack } if (relate == 0) { //m_connection.m_peer.LogDebug("Received right-on-time ack for #" + seqNr); // ack arrived right on time LidgrenException.Assert(seqNr == _windowStart); _receivedAcks[_windowStart] = false; _windowStart = NetUtility.PowOf2Mod(_windowStart + 1, NetConstants.SequenceNumbers); return(new NetSocketResult(true, false)); } // Advance window to this position _receivedAcks[seqNr] = true; while (_windowStart != seqNr) { _receivedAcks[_windowStart] = false; _windowStart = NetUtility.PowOf2Mod(_windowStart + 1, NetConstants.SequenceNumbers); } return(new NetSocketResult(true, false)); }
/// <summary> /// Encodes a <see cref="NetBitArray"/> to this buffer. /// </summary> public static void Write(this IBitBuffer buffer, NetBitArray bitArray) { buffer.WriteVar(bitArray.Length); ReadOnlySpan <uint> values = bitArray.GetBuffer().Span; int bitsLeft = NetUtility.PowOf2Mod(bitArray.Length, NetBitArray.BitsPerElement); if (bitsLeft == 0) { for (int i = 0; i < values.Length; i++) { buffer.Write(values[i]); } } else { for (int i = 0; i < values.Length - 1; i++) { buffer.Write(values[i]); } uint last = values[^ 1];
public static bool IsByteAligned(this IBitBuffer buffer) { return(NetUtility.PowOf2Mod(buffer.BitPosition, 8) == 0); }
private void AdvanceWindow() { _earlyReceived.Set(NetUtility.PowOf2Mod(_windowStart, _windowSize), false); _windowStart = NetUtility.PowOf2Mod(_windowStart + 1, NetConstants.SequenceNumbers); }