/// <summary> /// Verify RDP RTT Measure Response packet /// </summary> /// <param name="rttResponse">RDP RTT Measure Response packet</param> /// <param name="sequenceNumber">The sequence Number</param> private void VerifyTunnelDataPdu_RTTResponse(RDP_RTT_RESPONSE rttResponse, ushort sequenceNumber) { if (rttResponse == null) { Site.Assert.Fail("Not get Bandwidth Measure Result"); } if (rttResponse.sequenceNumber != sequenceNumber) { Site.Assert.Fail("Expect sequence Number is {0}, but receive sequence Number: {1}", sequenceNumber, rttResponse.sequenceNumber); } }
/// <summary> /// Wait for a Tunnel Data PDU with RDP_RTT_RESPONSE and check its sequenceNumber. /// </summary> /// <param name="requestedProtocol">Which tunnel to be used, reliable or lossy</param> /// <param name="sequenceNumber"></param> /// <param name="timeout"></param> private void WaitForAndCheckTunnelDataPdu_RTTResponse(Multitransport_Protocol_value requestedProtocol, ushort sequenceNumber, TimeSpan timeout) { bool isReceived = false; TimeSpan leftTime = timeout; DateTime expiratedTime = DateTime.Now + timeout; RDP_RTT_RESPONSE rttResponse = null; RdpemtServer rdpemtServer = rdpemtServerR; if (requestedProtocol == Multitransport_Protocol_value.INITITATE_REQUEST_PROTOCOL_UDPFECL) { rdpemtServer = rdpemtServerL; } while (!isReceived && leftTime.CompareTo(new TimeSpan(0)) > 0) { try { RDP_TUNNEL_DATA tunnelData = rdpemtServer.ExpectTunnelData(leftTime); if (tunnelData != null) { RDP_TUNNEL_SUBHEADER[] SubHeaders = tunnelData.TunnelHeader.SubHeaders; if (SubHeaders != null) { foreach (RDP_TUNNEL_SUBHEADER subHeader in SubHeaders) { if (subHeader.SubHeaderType == RDP_TUNNEL_SUBHEADER_TYPE_Values.TYPE_ID_AUTODETECT_RESPONSE) { NETWORK_DETECTION_RESPONSE detectRsp = rdpbcgrServer.ParseNetworkDetectionResponse(subHeader.SubHeaderData, true); { if (detectRsp.responseType == AUTO_DETECT_RESPONSE_TYPE.RDP_RTT_RESPONSE) { rttResponse = (RDP_RTT_RESPONSE)detectRsp; isReceived = true; rttDataStore.responseTime = DateTime.Now; Site.Log.Add(LogEntryKind.Comment, "RequestTime: {0}\tResponseTime: {1}", rttDataStore.responseTime.Ticks, rttDataStore.responseTime.Ticks); } } } } } } } catch (TimeoutException) { Site.Assert.Fail("Timeout when expecting a Tunnel Data PDU with RDP_RTT_RESULTS"); } catch (InvalidOperationException ex) { //break; Site.Log.Add(LogEntryKind.Warning, "Exception thrown out when receiving client PDUs {0}.", ex.Message); } finally { System.Threading.Thread.Sleep(100);//Wait some time for next packet. leftTime = expiratedTime - DateTime.Now; } } if (isReceived) { VerifyTunnelDataPdu_RTTResponse(rttResponse, sequenceNumber); } else { Site.Assert.Fail("Timeout when expecting a Tunnel Data PDU with RDP_RTT_RESULTS"); } }