private void S8_ServerRedirection_PositiveTest_WithRoutingToken_VerifyMCSConnectInitialPDU(Client_MCS_Connect_Initial_Pdu_with_GCC_Conference_Create_Request mcsConnectRequest) { this.TestSite.Assert.AreEqual<uint>(RdpbcgrTestData.Test_Redirection_SessionId, mcsConnectRequest.mcsCi.gccPdu.clientClusterData.RedirectedSessionID, "Verify if the RefirectedSessionID field within Client Cluster Data is equal to the SessionID sent by the server in Server Redirection PDU."); }
/// <summary> /// Decode MCS Connect Initial PDU with GCC Conference Create Initial /// </summary> /// <param name="data">data to be parsed</param> /// <returns>Decoded MCS Connect Initial PDU with GCC Conference Create Initial</returns> public StackPacket DecodeMcsConnectInitialPDU(byte[] data) { // initialize int currentIndex = 0; Client_MCS_Connect_Initial_Pdu_with_GCC_Conference_Create_Request pdu = new Client_MCS_Connect_Initial_Pdu_with_GCC_Conference_Create_Request(); // McsConnectResponse: TpktHeader pdu.tpktHeader = ParseTpktHeader(data, ref currentIndex); // McsConnectResponse: X224 pdu.x224Data = ParseX224Data(data, ref currentIndex); // T125 Data: decode McsConnectResponse int t125DataLength = data.Length - currentIndex; if (t125DataLength <= 0) { throw new FormatException(ConstValue.ERROR_MESSAGE_DATA_INDEX_OUT_OF_RANGE); } byte[] t125Data = new byte[t125DataLength]; Array.Copy(data, currentIndex, t125Data, 0, t125Data.Length); Connect_Initial mcsConnectInitial = new Connect_Initial(); Asn1DecodingBuffer decodeBuffer = new Asn1DecodingBuffer(t125Data); mcsConnectInitial.BerDecode(decodeBuffer); // McsConnectResponse:result pdu.mcsCi.targetParameters.maxChannelIds = (long)mcsConnectInitial.targetParameters.maxChannelIds.Value; pdu.mcsCi.targetParameters.maxHeight = (long)mcsConnectInitial.targetParameters.maxHeight.Value; pdu.mcsCi.targetParameters.maxMcsPduSize = (long)mcsConnectInitial.targetParameters.maxMCSPDUsize.Value; pdu.mcsCi.targetParameters.maxTokenIds = (long)mcsConnectInitial.targetParameters.maxTokenIds.Value; pdu.mcsCi.targetParameters.maxUserIds = (long)mcsConnectInitial.targetParameters.maxUserIds.Value; pdu.mcsCi.targetParameters.minThroughput = (long)mcsConnectInitial.targetParameters.minThroughput.Value; pdu.mcsCi.targetParameters.numPriorities = (long)mcsConnectInitial.targetParameters.numPriorities.Value; pdu.mcsCi.targetParameters.protocolVersion = (long)mcsConnectInitial.targetParameters.protocolVersion.Value; pdu.mcsCi.minimumParameters.maxChannelIds = (long)mcsConnectInitial.minimumParameters.maxChannelIds.Value; pdu.mcsCi.minimumParameters.maxHeight = (long)mcsConnectInitial.minimumParameters.maxHeight.Value; pdu.mcsCi.minimumParameters.maxMcsPduSize = (long)mcsConnectInitial.minimumParameters.maxMCSPDUsize.Value; pdu.mcsCi.minimumParameters.maxTokenIds = (long)mcsConnectInitial.minimumParameters.maxTokenIds.Value; pdu.mcsCi.minimumParameters.maxUserIds = (long)mcsConnectInitial.minimumParameters.maxUserIds.Value; pdu.mcsCi.minimumParameters.minThroughput = (long)mcsConnectInitial.minimumParameters.minThroughput.Value; pdu.mcsCi.minimumParameters.numPriorities = (long)mcsConnectInitial.minimumParameters.numPriorities.Value; pdu.mcsCi.minimumParameters.protocolVersion = (long)mcsConnectInitial.minimumParameters.protocolVersion.Value; pdu.mcsCi.maximumParameters.maxChannelIds = (long)mcsConnectInitial.maximumParameters.maxChannelIds.Value; pdu.mcsCi.maximumParameters.maxHeight = (long)mcsConnectInitial.maximumParameters.maxHeight.Value; pdu.mcsCi.maximumParameters.maxMcsPduSize = (long)mcsConnectInitial.maximumParameters.maxMCSPDUsize.Value; pdu.mcsCi.maximumParameters.maxTokenIds = (long)mcsConnectInitial.maximumParameters.maxTokenIds.Value; pdu.mcsCi.maximumParameters.maxUserIds = (long)mcsConnectInitial.maximumParameters.maxUserIds.Value; pdu.mcsCi.maximumParameters.minThroughput = (long)mcsConnectInitial.maximumParameters.minThroughput.Value; pdu.mcsCi.maximumParameters.numPriorities = (long)mcsConnectInitial.maximumParameters.numPriorities.Value; pdu.mcsCi.maximumParameters.protocolVersion = (long)mcsConnectInitial.maximumParameters.protocolVersion.Value; // T125 User Data: get McsConnectResponse's user data //byte[] userData = new byte[mcsConnectInitial.userData.Length]; //Stream mscInput = mcsConnectInitial.userData.toInputStream(); //mscInput.Read(userData, 0, userData.Length); byte[] userData = mcsConnectInitial.userData.ByteArrayValue; // T125 User Data: decode McsConnectResponse's user data Asn1DecodingBuffer connectDataBuffer = new Asn1DecodingBuffer(userData); ConnectData connectData = new ConnectData(); connectData.PerDecode(connectDataBuffer); // Gcc Data: get Gcc data int gccDataLength = userData.Length - ConstValue.GCC_CCI_DATA_OFFSET; if (gccDataLength <= 0) { throw new FormatException(ConstValue.ERROR_MESSAGE_DATA_INDEX_OUT_OF_RANGE); } byte[] gccData = new byte[gccDataLength]; Array.Copy(userData, ConstValue.GCC_CCI_DATA_OFFSET, gccData, 0, gccData.Length); // Gcc Data: decode Gcc data ConnectGCCPDU gccPdu = new ConnectGCCPDU(); Asn1DecodingBuffer gccPduBuffer = new Asn1DecodingBuffer(gccData); gccPdu.PerDecode(gccPduBuffer); // McsConnectResponse: H221Key ConferenceCreateRequest conferenceRequest = (ConferenceCreateRequest)gccPdu.GetData(); H221NonStandardIdentifier identifier = (H221NonStandardIdentifier)conferenceRequest.userData.Elements[0].key.GetData(); pdu.mcsCi.gccPdu.h221Key = Encoding.ASCII.GetString(identifier.ByteArrayValue); // Gcc User Data: get Gcc user data byte[] gccUserData = conferenceRequest.userData.Elements[0].value.ByteArrayValue; // Reset current index currentIndex = 0; while (currentIndex < gccUserData.Length) { // Peek data type int tempIndex = currentIndex; int orgIndex = currentIndex; TS_UD_HEADER_type_Values type = (TS_UD_HEADER_type_Values)ParseUInt16(gccUserData, ref tempIndex, false); ushort userDataLength = ParseUInt16(gccUserData, ref tempIndex, false); // Parse data by type switch (type) { case TS_UD_HEADER_type_Values.CS_CORE: pdu.mcsCi.gccPdu.clientCoreData = ParseTsUdCsCore(gccUserData, ref currentIndex, userDataLength); break; case TS_UD_HEADER_type_Values.CS_NET: pdu.mcsCi.gccPdu.clientNetworkData = ParseTsUdCsNet(gccUserData, ref currentIndex); break; case TS_UD_HEADER_type_Values.CS_SECURITY: pdu.mcsCi.gccPdu.clientSecurityData = ParseTsUdCsSec(gccUserData, ref currentIndex); break; case TS_UD_HEADER_type_Values.CS_CLUSTER: pdu.mcsCi.gccPdu.clientClusterData = ParseTsUdCsCluster(gccUserData, ref currentIndex); break; case TS_UD_HEADER_type_Values.CS_MONITOR: pdu.mcsCi.gccPdu.clientMonitorData = ParseTsUdCsMon(gccUserData, ref currentIndex); break; case TS_UD_HEADER_type_Values.CS_MCS_MSGCHANNEL: pdu.mcsCi.gccPdu.clientMessageChannelData = ParseTsUdCsMcsMsgChannel(gccUserData, ref currentIndex); break; case TS_UD_HEADER_type_Values.CS_MULTITRANSPORT: pdu.mcsCi.gccPdu.clientMultitransportChannelData = ParseTsUdCsMultiTransport(gccUserData, ref currentIndex); break; case TS_UD_HEADER_type_Values.CS_MONITOR_EX: pdu.mcsCi.gccPdu.clientMonitorExtendedData = ParseTsUdCsMonitorEX(gccUserData, ref currentIndex); break; default: break; //throw new FormatException(ConstValue.ERROR_MESSAGE_ENUM_UNRECOGNIZED); } currentIndex = orgIndex + userDataLength; } // Check if data length exceeded expectation VerifyDataLength(gccUserData.Length, currentIndex, ConstValue.ERROR_MESSAGE_DATA_LENGTH_EXCEEDED); return pdu; }
/// <summary> /// 2.2.1.3 /// </summary> /// <param name="connectInitialPdu"></param> public void VerifyPdu(Client_MCS_Connect_Initial_Pdu_with_GCC_Conference_Create_Request connectInitialPdu) { //Site.Log.Add(TestTools.LogEntryKind.Debug, "CheckMCSConnectInitialPdu"); //<?> CaptureRequirement(connectInitialPdu.mcsCi.gccPdu != null, 41); //<?> //site.CaptureRequirementIfAreEqual<byte>(0, connectInitialPdu.x224Data.type, 66, // @"[In Client MCS Connect Initial PDU with GCC Conference Create Request] x224Data (3 bytes): An X.224 Class 0 Data PDU, as specified in [X224] section 13.7."); if (!serverConfig.isExtendedClientDataSupported) { //<capture> also capture R265 site.CaptureRequirementIfIsNull(connectInitialPdu.mcsCi.gccPdu.clientMonitorData, 78, @"In Client MCS Connect Initial PDU with GCC Conference Create Request, clientMonitorData (variable): This field MUST " + @"NOT be included if the server did not advertise support for Extended Client Data Blocks by using the EXTENDED_CLIENT_DATA_SUPPORTED" + @" flag (0x00000001) as described in section 2.2.1.2.1."); } bool isR81Satisfied = connectInitialPdu.mcsCi.gccPdu.clientCoreData.header.type == TS_UD_HEADER_type_Values.CS_CORE || connectInitialPdu.mcsCi.gccPdu.clientCoreData.header.type == TS_UD_HEADER_type_Values.CS_SECURITY || connectInitialPdu.mcsCi.gccPdu.clientCoreData.header.type == TS_UD_HEADER_type_Values.CS_NET || connectInitialPdu.mcsCi.gccPdu.clientCoreData.header.type == TS_UD_HEADER_type_Values.CS_CLUSTER || connectInitialPdu.mcsCi.gccPdu.clientCoreData.header.type == TS_UD_HEADER_type_Values.CS_MONITOR || connectInitialPdu.mcsCi.gccPdu.clientCoreData.header.type == TS_UD_HEADER_type_Values.SC_CORE || connectInitialPdu.mcsCi.gccPdu.clientCoreData.header.type == TS_UD_HEADER_type_Values.SC_SECURITY || connectInitialPdu.mcsCi.gccPdu.clientCoreData.header.type == TS_UD_HEADER_type_Values.SC_NET; site.CaptureRequirementIfIsTrue(isR81Satisfied, 81, @"In TS_UD_HEADER, the type field can take one of the following values: CS_CORE 0xC001,CS_SECURITY 0xC002,CS_NET 0xC003,CS_CLUSTER 0xC004," + @"SC_CORE 0x0C01,SC_SECURITY 0x0C02,SC_NET 0xOC03"); //<capture> also caputre R93 site.CaptureRequirementIfAreEqual<TS_UD_HEADER_type_Values>(TS_UD_HEADER_type_Values.CS_CORE, connectInitialPdu.mcsCi.gccPdu.clientCoreData.header.type, 82, @"In TS_UD_HEADER, if the type is CS_CORE0xC001 then the data block which follows User Data Header (TS_UD_HEADER) contains Client Core Data"); site.CaptureRequirementIfAreEqual<TS_UD_HEADER_type_Values>(TS_UD_HEADER_type_Values.CS_SECURITY, connectInitialPdu.mcsCi.gccPdu.clientSecurityData.header.type, 83, @"In TS_UD_HEADER, if the type is CS_SECURITY 0xC002 then the data block which follows User Data Header (TS_UD_HEADER) contains Client Security Data"); if (connectInitialPdu.mcsCi.gccPdu.clientNetworkData != null) { site.CaptureRequirementIfAreEqual<TS_UD_HEADER_type_Values>(TS_UD_HEADER_type_Values.CS_NET, connectInitialPdu.mcsCi.gccPdu.clientNetworkData.header.type, 84, @"In TS_UD_HEADER, if the type is CS_NET 0xC003 then the data block which follows contains User Data Header (TS_UD_HEADER) Client Network Data."); } if (connectInitialPdu.mcsCi.gccPdu.clientClusterData != null) { site.CaptureRequirementIfAreEqual<TS_UD_HEADER_type_Values>(TS_UD_HEADER_type_Values.CS_CLUSTER, connectInitialPdu.mcsCi.gccPdu.clientClusterData.header.type, 85, @"In TS_UD_HEADER, if the type is CS_CLUSTER 0xC004 then the data block which follows User Data Header (TS_UD_HEADER) contains Client Cluster Data."); } if (connectInitialPdu.mcsCi.gccPdu.clientMonitorData != null) { site.CaptureRequirementIfAreEqual<TS_UD_HEADER_type_Values>(TS_UD_HEADER_type_Values.CS_MONITOR, connectInitialPdu.mcsCi.gccPdu.clientMonitorData.header.type, 86, @"In User Data Header (TS_UD_HEADER), type (2 bytes): If the type is CS_MONITOR 0xC005 then the data block that follows contains Client Monitor" + @" Data (section 2.2.1.3.6)."); VerifyStructure(connectInitialPdu.mcsCi.gccPdu.clientMonitorData); } if (connectInitialPdu.mcsCi.gccPdu.clientCoreData != null) { VerifyStructure(connectInitialPdu.mcsCi.gccPdu.clientCoreData); } if (connectInitialPdu.mcsCi.gccPdu.clientSecurityData != null) { VerifyStructure(connectInitialPdu.mcsCi.gccPdu.clientSecurityData); } if (connectInitialPdu.mcsCi.gccPdu.clientNetworkData != null) { VerifyStructure(connectInitialPdu.mcsCi.gccPdu.clientNetworkData); } if(connectInitialPdu.mcsCi.gccPdu.clientClusterData != null) { VerifyStructure(connectInitialPdu.mcsCi.gccPdu.clientClusterData); } }
/// <summary> /// Create an instance of the class that is identical to the current PDU. /// </summary> /// <returns>The new instance.</returns> public override StackPacket Clone() { Client_MCS_Connect_Initial_Pdu_with_GCC_Conference_Create_Request cloneMCSInitialPdu = new Client_MCS_Connect_Initial_Pdu_with_GCC_Conference_Create_Request(context); cloneMCSInitialPdu.tpktHeader = tpktHeader; cloneMCSInitialPdu.x224Data = x224Data; if (mcsCi != null) { cloneMCSInitialPdu.mcsCi = new MCSConnectInitial(); cloneMCSInitialPdu.mcsCi.calledDomainSelector = RdpbcgrUtility.CloneByteArray(mcsCi.calledDomainSelector); cloneMCSInitialPdu.mcsCi.callingDomainSelector = RdpbcgrUtility.CloneByteArray(mcsCi.callingDomainSelector); cloneMCSInitialPdu.mcsCi.maximumParameters = mcsCi.maximumParameters; cloneMCSInitialPdu.mcsCi.minimumParameters = mcsCi.minimumParameters; cloneMCSInitialPdu.mcsCi.targetParameters = mcsCi.targetParameters; cloneMCSInitialPdu.mcsCi.upwardFlag = mcsCi.upwardFlag; if (mcsCi.gccPdu != null) { #region clone mcsCi.gccPdu filed cloneMCSInitialPdu.mcsCi.gccPdu = new ConnectGCC(); cloneMCSInitialPdu.mcsCi.gccPdu.callerIdentifier = mcsCi.gccPdu.callerIdentifier; cloneMCSInitialPdu.mcsCi.gccPdu.conductedPrivileges = (mcsCi.gccPdu.conductedPrivileges == null) ? null : (int[])mcsCi.gccPdu.conductedPrivileges.Clone(); cloneMCSInitialPdu.mcsCi.gccPdu.conductibleConference = mcsCi.gccPdu.conductibleConference; cloneMCSInitialPdu.mcsCi.gccPdu.conductorPrivileges = (mcsCi.gccPdu.conductorPrivileges == null) ? null : (int[])mcsCi.gccPdu.conductorPrivileges.Clone(); cloneMCSInitialPdu.mcsCi.gccPdu.conferenceDescription = mcsCi.gccPdu.conferenceDescription; cloneMCSInitialPdu.mcsCi.gccPdu.conferenceName = mcsCi.gccPdu.conferenceName; cloneMCSInitialPdu.mcsCi.gccPdu.convenerPassword = mcsCi.gccPdu.convenerPassword; cloneMCSInitialPdu.mcsCi.gccPdu.h221Key = mcsCi.gccPdu.h221Key; cloneMCSInitialPdu.mcsCi.gccPdu.listedConference = mcsCi.gccPdu.listedConference; cloneMCSInitialPdu.mcsCi.gccPdu.lockedConference = mcsCi.gccPdu.lockedConference; cloneMCSInitialPdu.mcsCi.gccPdu.nonConductedPrivileges = (mcsCi.gccPdu.nonConductedPrivileges == null) ? null : (int[])mcsCi.gccPdu.nonConductedPrivileges.Clone(); cloneMCSInitialPdu.mcsCi.gccPdu.password = mcsCi.gccPdu.password; cloneMCSInitialPdu.mcsCi.gccPdu.terminationMethod = mcsCi.gccPdu.terminationMethod; if (mcsCi.gccPdu.clientCoreData != null) { cloneMCSInitialPdu.mcsCi.gccPdu.clientCoreData = new TS_UD_CS_CORE(); cloneMCSInitialPdu.mcsCi.gccPdu.clientCoreData.header = mcsCi.gccPdu.clientCoreData.header; cloneMCSInitialPdu.mcsCi.gccPdu.clientCoreData.version = mcsCi.gccPdu.clientCoreData.version; cloneMCSInitialPdu.mcsCi.gccPdu.clientCoreData.desktopHeight = mcsCi.gccPdu.clientCoreData.desktopHeight; cloneMCSInitialPdu.mcsCi.gccPdu.clientCoreData.desktopWidth = mcsCi.gccPdu.clientCoreData.desktopWidth; cloneMCSInitialPdu.mcsCi.gccPdu.clientCoreData.colorDepth = mcsCi.gccPdu.clientCoreData.colorDepth; cloneMCSInitialPdu.mcsCi.gccPdu.clientCoreData.SASSequence = mcsCi.gccPdu.clientCoreData.SASSequence; cloneMCSInitialPdu.mcsCi.gccPdu.clientCoreData.keyboardLayout = mcsCi.gccPdu.clientCoreData.keyboardLayout; cloneMCSInitialPdu.mcsCi.gccPdu.clientCoreData.clientBuild = mcsCi.gccPdu.clientCoreData.clientBuild; cloneMCSInitialPdu.mcsCi.gccPdu.clientCoreData.clientDigProductId = mcsCi.gccPdu.clientCoreData.clientDigProductId; cloneMCSInitialPdu.mcsCi.gccPdu.clientCoreData.clientName = mcsCi.gccPdu.clientCoreData.clientName; cloneMCSInitialPdu.mcsCi.gccPdu.clientCoreData.clientProductId = mcsCi.gccPdu.clientCoreData.clientProductId; cloneMCSInitialPdu.mcsCi.gccPdu.clientCoreData.connnectionType = mcsCi.gccPdu.clientCoreData.connnectionType; cloneMCSInitialPdu.mcsCi.gccPdu.clientCoreData.earlyCapabilityFlags = mcsCi.gccPdu.clientCoreData.earlyCapabilityFlags; cloneMCSInitialPdu.mcsCi.gccPdu.clientCoreData.highColorDepth = mcsCi.gccPdu.clientCoreData.highColorDepth; cloneMCSInitialPdu.mcsCi.gccPdu.clientCoreData.imeFileName = mcsCi.gccPdu.clientCoreData.imeFileName; cloneMCSInitialPdu.mcsCi.gccPdu.clientCoreData.keyboardFunctionKey = mcsCi.gccPdu.clientCoreData.keyboardFunctionKey; cloneMCSInitialPdu.mcsCi.gccPdu.clientCoreData.keyboardSubType = mcsCi.gccPdu.clientCoreData.keyboardSubType; cloneMCSInitialPdu.mcsCi.gccPdu.clientCoreData.keyboardType = mcsCi.gccPdu.clientCoreData.keyboardType; cloneMCSInitialPdu.mcsCi.gccPdu.clientCoreData.pad1octets = mcsCi.gccPdu.clientCoreData.pad1octets; cloneMCSInitialPdu.mcsCi.gccPdu.clientCoreData.postBeta2ColorDepth = mcsCi.gccPdu.clientCoreData.postBeta2ColorDepth; cloneMCSInitialPdu.mcsCi.gccPdu.clientCoreData.serialNumber = mcsCi.gccPdu.clientCoreData.serialNumber; cloneMCSInitialPdu.mcsCi.gccPdu.clientCoreData.serverSelectedProtocol = mcsCi.gccPdu.clientCoreData.serverSelectedProtocol; cloneMCSInitialPdu.mcsCi.gccPdu.clientCoreData.supportedColorDepths = mcsCi.gccPdu.clientCoreData.supportedColorDepths; cloneMCSInitialPdu.mcsCi.gccPdu.clientCoreData.desktopPhysicalWidth = mcsCi.gccPdu.clientCoreData.desktopPhysicalWidth; cloneMCSInitialPdu.mcsCi.gccPdu.clientCoreData.desktopPhysicalHeight= mcsCi.gccPdu.clientCoreData.desktopPhysicalHeight; cloneMCSInitialPdu.mcsCi.gccPdu.clientCoreData.desktopOrientation = mcsCi.gccPdu.clientCoreData.desktopOrientation; cloneMCSInitialPdu.mcsCi.gccPdu.clientCoreData.desktopScaleFactor = mcsCi.gccPdu.clientCoreData.desktopScaleFactor; cloneMCSInitialPdu.mcsCi.gccPdu.clientCoreData.deviceScaleFactor = mcsCi.gccPdu.clientCoreData.deviceScaleFactor; } if (mcsCi.gccPdu.clientClusterData != null) { cloneMCSInitialPdu.mcsCi.gccPdu.clientClusterData = new TS_UD_CS_CLUSTER(); cloneMCSInitialPdu.mcsCi.gccPdu.clientClusterData.Flags = mcsCi.gccPdu.clientClusterData.Flags; cloneMCSInitialPdu.mcsCi.gccPdu.clientClusterData.header = mcsCi.gccPdu.clientClusterData.header; cloneMCSInitialPdu.mcsCi.gccPdu.clientClusterData.RedirectedSessionID = mcsCi.gccPdu.clientClusterData.RedirectedSessionID; } if (mcsCi.gccPdu.clientMonitorData != null) { cloneMCSInitialPdu.mcsCi.gccPdu.clientMonitorData = new TS_UD_CS_MONITOR(); cloneMCSInitialPdu.mcsCi.gccPdu.clientMonitorData.Flags = mcsCi.gccPdu.clientMonitorData.Flags; cloneMCSInitialPdu.mcsCi.gccPdu.clientMonitorData.header = mcsCi.gccPdu.clientMonitorData.header; cloneMCSInitialPdu.mcsCi.gccPdu.clientMonitorData.monitorCount = mcsCi.gccPdu.clientMonitorData.monitorCount; if (mcsCi.gccPdu.clientMonitorData.monitorDefArray != null) { cloneMCSInitialPdu.mcsCi.gccPdu.clientMonitorData.monitorDefArray = new Collection<TS_MONITOR_DEF>(); for (int count = 0; count < mcsCi.gccPdu.clientMonitorData.monitorDefArray.Count; count++) { cloneMCSInitialPdu.mcsCi.gccPdu.clientMonitorData.monitorDefArray.Add( mcsCi.gccPdu.clientMonitorData.monitorDefArray[count]); } } } if (mcsCi.gccPdu.clientNetworkData != null) { cloneMCSInitialPdu.mcsCi.gccPdu.clientNetworkData = new TS_UD_CS_NET(); cloneMCSInitialPdu.mcsCi.gccPdu.clientNetworkData.header = mcsCi.gccPdu.clientNetworkData.header; cloneMCSInitialPdu.mcsCi.gccPdu.clientNetworkData.channelCount = mcsCi.gccPdu.clientNetworkData.channelCount; if (mcsCi.gccPdu.clientNetworkData.channelDefArray != null) { cloneMCSInitialPdu.mcsCi.gccPdu.clientNetworkData.channelDefArray = new List<CHANNEL_DEF>(); cloneMCSInitialPdu.mcsCi.gccPdu.clientNetworkData.channelDefArray.AddRange (mcsCi.gccPdu.clientNetworkData.channelDefArray); } } if (mcsCi.gccPdu.clientSecurityData != null) { cloneMCSInitialPdu.mcsCi.gccPdu.clientSecurityData = new TS_UD_CS_SEC(); cloneMCSInitialPdu.mcsCi.gccPdu.clientSecurityData.encryptionMethods = mcsCi.gccPdu.clientSecurityData.encryptionMethods; cloneMCSInitialPdu.mcsCi.gccPdu.clientSecurityData.extEncryptionMethods = mcsCi.gccPdu.clientSecurityData.extEncryptionMethods; cloneMCSInitialPdu.mcsCi.gccPdu.clientSecurityData.header = mcsCi.gccPdu.clientSecurityData.header; } if (mcsCi.gccPdu.clientMessageChannelData != null) { cloneMCSInitialPdu.mcsCi.gccPdu.clientMessageChannelData = new TS_UD_CS_MCS_MSGCHANNEL(); cloneMCSInitialPdu.mcsCi.gccPdu.clientMessageChannelData.header = mcsCi.gccPdu.clientMessageChannelData.header; cloneMCSInitialPdu.mcsCi.gccPdu.clientMessageChannelData.flags = mcsCi.gccPdu.clientMessageChannelData.flags; } if (mcsCi.gccPdu.clientMultitransportChannelData != null) { cloneMCSInitialPdu.mcsCi.gccPdu.clientMultitransportChannelData = new TS_UD_CS_MULTITRANSPORT(); cloneMCSInitialPdu.mcsCi.gccPdu.clientMultitransportChannelData.header = mcsCi.gccPdu.clientMultitransportChannelData.header; cloneMCSInitialPdu.mcsCi.gccPdu.clientMultitransportChannelData.flags = mcsCi.gccPdu.clientMultitransportChannelData.flags; } if (mcsCi.gccPdu.clientMonitorExtendedData != null) { cloneMCSInitialPdu.mcsCi.gccPdu.clientMonitorExtendedData = new TS_UD_CS_MONITOR_EX(); cloneMCSInitialPdu.mcsCi.gccPdu.clientMonitorExtendedData.header = mcsCi.gccPdu.clientMonitorExtendedData.header; cloneMCSInitialPdu.mcsCi.gccPdu.clientMonitorExtendedData.flags = mcsCi.gccPdu.clientMonitorExtendedData.flags; cloneMCSInitialPdu.mcsCi.gccPdu.clientMonitorExtendedData.monitorAttributeSize = mcsCi.gccPdu.clientMonitorExtendedData.monitorAttributeSize; cloneMCSInitialPdu.mcsCi.gccPdu.clientMonitorExtendedData.monitorCount = mcsCi.gccPdu.clientMonitorExtendedData.monitorCount; List<TS_MONITOR_ATTRIBUTES> attributes = new List<TS_MONITOR_ATTRIBUTES>(); foreach (TS_MONITOR_ATTRIBUTES attribute in mcsCi.gccPdu.clientMonitorExtendedData.monitorAttributesArray) { attributes.Add(attribute.Clone()); } cloneMCSInitialPdu.mcsCi.gccPdu.clientMonitorExtendedData.monitorAttributesArray = attributes.ToArray(); } #endregion clone mcsCi.gccPdu filed } } return cloneMCSInitialPdu; }