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."); }