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);
 }
Example #7
0
 private void AdvanceWindow()
 {
     _earlyReceived.Set(NetUtility.PowOf2Mod(_windowStart, _windowSize), false);
     _windowStart = NetUtility.PowOf2Mod(_windowStart + 1, NetConstants.SequenceNumbers);
 }