private int GetMaxiumPayloadSizeForSourcePacket(int upStreamMtu)
        {
            // Create a fake empty RDPEUDP ACK+SOURCE packet.
            var packet = new RdpeudpPacket();

            packet.fecHeader.snSourceAck = 0;
            packet.fecHeader.uReceiveWindowSize = 0;
            packet.fecHeader.uFlags = RDPUDP_FLAG.RDPUDP_FLAG_DATA | RDPUDP_FLAG.RDPUDP_FLAG_ACK;

            var ackVectorHeader = new RDPUDP_ACK_VECTOR_HEADER();
            ackVectorHeader.uAckVectorSize = 0;
            ackVectorHeader.AckVectorElement = null;
            ackVectorHeader.Padding = null;
            packet.ackVectorHeader = ackVectorHeader;

            var sourceHeader = new RDPUDP_SOURCE_PAYLOAD_HEADER();
            sourceHeader.snCoded = 0;
            sourceHeader.snSourceStart = 0;
            packet.sourceHeader = sourceHeader;

            var size = PduMarshaler.Marshal(packet).Length;

            // Maximum payload size = upstream MTU - empty ACK+SOURCE header size.
            return upStreamMtu - size;

        }
        public void S2_DataTransfer_RetransmitTest_ClientRetransmit()
        {
            // Record the sequenceNumber of the lost source packet.
            uint   sequenceNumberForLossPacket = 0;
            ushort receiveWindowSize           = 0;

            Site.Log.Add(LogEntryKind.Debug, "Establishing RDP connection ...");
            StartRDPConnection();

            this.TestSite.Log.Add(LogEntryKind.Comment, "Create a reliable UDP connection.");
            this.EstablishUDPConnection(TransportMode.Reliable, waitTime, true);

            this.TestSite.Log.Add(LogEntryKind.Comment, "Send the first RDPEUDP Source packet, but not acknowledge the receipt of the first source packet from client.");
            RdpeudpPacket packet = this.GetFirstValidUdpPacket(TransportMode.Reliable);

            #region Change packet.ackVectorHeader To Not Acknowledge The Receipt

            RDPUDP_ACK_VECTOR_HEADER ackVectorHeader = new RDPUDP_ACK_VECTOR_HEADER();
            ackVectorHeader.AckVectorElement = null;
            ackVectorHeader.uAckVectorSize   = 0;
            packet.ackVectorHeader           = ackVectorHeader;
            sequenceNumberForLossPacket      = packet.fecHeader.snSourceAck;
            receiveWindowSize = packet.fecHeader.uReceiveWindowSize;
            packet.fecHeader.snSourceAck--;

            #endregion Change packet.ackVectorHeader To Not Acknowledge The Receipt

            this.SendPacket(TransportMode.Reliable, packet);

            this.TestSite.Log.Add(LogEntryKind.Comment, "Wait for 200 ms so as to fire the retransmit timer.");
            Thread.Sleep(this.RetransmitTimer);

            this.TestSite.Log.Add(LogEntryKind.Comment, "Wait for the client to resend the lost packet.");
            RdpeudpPacket receivedPacket = this.WaitForSourcePacket(TransportMode.Reliable, waitTime, sequenceNumberForLossPacket);
            Site.Assert.IsNotNull(receivedPacket, "Client should resend the packet if not receiving an ACK for a specified time.");
        }