/****************************************************************************** * 函数名称:ConvertBetween_ConnID_IPv6() * 功能:实现ConnID协议到IPv6协议的转换 * 参数:data表示ConnID报文; * 返回值:IPv6_packet 返回IPv6报文 * ***************************************************************************/ private PDU_Network ConvertBetween_ConnID_IPv6(Object data) { PDU_ConnID pdu_connid = (PDU_ConnID)data; IPv6_packet = new PDU_Network(); //构造IPv6数据报 UDP_packet = new PDU_Transport(); //构造UDP数据报 UInt64 connid = pdu_connid.connid; //获取ConnID报文连接标识ConnID List <Byte[]> app_data = pdu_connid.application_data; //获取ConnID报文应用层数据 Communicarion_Patameter commPata = (Communicarion_Patameter)CommPara_ConnID_Mapping[connid]; IPv6_packet.version = 0x6; //版本号4bit IPv6_packet.traffic_class = 0x00; //通信类型8bit IPv6_packet.flow_label = 0x0000; //流标签20bit IPv6_packet.flow_label2 = 0x0; IPv6_packet.next_header = commPata.next_header; //下一首部8bit IPv6_packet.hop_limit = commPata.hop_limit; //跳数限制8bit IPv6_packet.source_ipv6_address = commPata.source_ipv6_addr; //源IPv6地址 IPv6_packet.dest_ipv6_address = commPata.dest_ipv6_addr; //目的IPv6地址 UDP_packet.source_port = commPata.source_port; //源端口号 UDP_packet.dest_port = commPata.dest_port; //目的端口号 UDP_packet.udp_checksum = 0x0000; UInt16 app_data_len = 0x0000; //应用层数据字节数 foreach (Byte[] B in app_data) { foreach (Byte b in B) { app_data_len++; } } //================== UDP长度 =====================// UDP_packet.udp_length = (UInt16)(0x0008 + app_data_len); //UDP长度为UDP报头+UDP数据长度 //================ IPv6有效载荷长度 ===============// IPv6_packet.payload_length = UDP_packet.udp_length; //================== UDP数据 ======================// UDP_packet.application_data = app_data; //================ IPv6上层PDU ====================// IPv6_packet.pdu_transport = UDP_packet; return(IPv6_packet); }
/****************************************************************************** * 函数名称:CommPara_ConnID_MappingTab() * 功能:建立通信参数-连接标识映射表 * 参数:无 * 返回值:无 * ***************************************************************************/ public void CommPara_ConnID_MappingTab() { CommPara_ConnID_Mapping = new Hashtable(); //ConnID 1 UInt64 ConnID1 = 0xF431CA185F74C6E6; //ConnID 2 UInt64 ConnID2 = 0x73B6D1725035878D; //2001:0DA8:D813:08A1:1201:0585:FEAB:6001 UInt16[] source_ipv6_addr1 = new UInt16[] { 0x0120, 0xA80D, 0x13D8, 0xA108, 0x0112, 0x8505, 0xABFE, 0x0160 }; UInt16[] source_ipv6_addr2 = new UInt16[] { 0x0120, 0xA80D, 0x13D8, 0xA108, 0x0112, 0x8505, 0xABFE, 0x0170 }; UInt16[] dest_ipv6_addr = new UInt16[] { 0x0120, 0xA80D, 0x18D8, 0x8200, 0x0000, 0x0000, 0x0000, 0x3412 }; Byte next_header = 0x11; Byte hop_limit = 0xFF; UInt16 source_port1 = 0xF0BF; UInt16 source_port2 = 0xF0BE; UInt16 dest_port = 0xF0B0; //Communicarion Patameter 1 Communicarion_Patameter commPara1 = new Communicarion_Patameter(); commPara1.source_ipv6_addr = source_ipv6_addr1; commPara1.dest_ipv6_addr = dest_ipv6_addr; commPara1.next_header = next_header; commPara1.hop_limit = hop_limit; commPara1.source_port = source_port1; commPara1.dest_port = dest_port; //Communicarion Patameter 2 Communicarion_Patameter commPara2 = new Communicarion_Patameter(); commPara2.source_ipv6_addr = source_ipv6_addr2; commPara2.dest_ipv6_addr = dest_ipv6_addr; commPara2.next_header = next_header; commPara2.hop_limit = hop_limit; commPara2.source_port = source_port2; commPara2.dest_port = dest_port; CommPara_ConnID_Mapping.Add(ConnID1, commPara1); CommPara_ConnID_Mapping.Add(ConnID2, commPara2); }