/* * @author STF 276 * @version $Id$ * @desc This module specifies functions definitions * based on the IPv6 meta message type. * */ module LibIpv6_Interface_Functions { //LibCommon import from LibCommon_BasicTypesAndValues all; import from LibCommon_DataStrings all; import from LibCommon_VerdictControl { type FncRetCode }; //LibIpv6 import from LibIpv6_Interface_TypesAndValues all; import from LibIpv6_Interface_Templates all; import from LibIpv6_ModuleParameters all; import from LibIpv6_ExternalFunctions all; import from LibIpv6_CommonRfcs_Functions all; import from LibIpv6_CommonRfcs_TypesAndValues all; import from LibIpv6_Rfc4306Ikev2_TypesAndValues all; group rfc2460Root_Functions { group ipv6Packets { /* * @desc This sends a General IPv6 packet * from an IPv6 node to any NUT. * A General IPv6 packet is used in the case where only Extension headers * need to be sent. * @remark Time limit is defined by module parameter PX_TAC (see comp type) * @param p_msg MIPHeader to be sent * @return execution status */ function f_sendGeneralIpv6(template Ipv6Packet p_msg) runs on LibIpv6Node return FncRetCode { //Variables var Ipv6Packet v_ipPkt; v_ipPkt := valueof(p_msg); //calc payloadLen v_ipPkt.ipv6Hdr.payloadLength := fx_payloadLength (v_ipPkt); //set extensionHeaders if(f_setExtensionHeaders( v_ipPkt ) != e_success) { log(" **** f_sendGeneralIpv6: Error when calculating length of extension headers ****"); return e_error; } //send ipPort.send(v_ipPkt); return e_success; }//end f_sendGeneralIpv6 group extHdrFns { /* * @desc This goes through the extension header list and calculates length, checksum * and other specific functions of the different extension headers * @param p_ipv6Packet IPv6 packet to be processed * @return execution status */ function f_setExtensionHeaders( inout Ipv6Packet p_ipv6Packet) runs on LibIpv6Node return FncRetCode { var FncRetCode v_ret := e_success; var UInt8 i, j; var UInt8 v_authHdrIndex := 0; var UInt8 v_spi := 0; var Ipv6Address v_pseudoSrcAddr := c_16ZeroBytes; var Ipv6Address v_pseudoDstAddr := c_16ZeroBytes; var boolean v_loop := true; var Ipv6Packet v_innerIpv6Packet; var Ipv6Packet v_tempIpv6Packet; var Ipv6Packet v_activeIpv6Packet := p_ipv6Packet; v_pseudoDstAddr := v_activeIpv6Packet.ipv6Hdr.destinationAddress; v_pseudoSrcAddr := v_activeIpv6Packet.ipv6Hdr.sourceAddress; //calc payloadLen of IPv6packet if (v_activeIpv6Packet.ipv6Hdr.payloadLength == c_uInt16Zero ) { v_activeIpv6Packet.ipv6Hdr.payloadLength := fx_payloadLength (v_activeIpv6Packet); } // Browse the differents extension headers and search for specific fields to be computed if (ispresent(v_activeIpv6Packet.extHdrList)) { for (i:=0; v_loop and i EspHeader is not constructed correctly ****") ; return e_error; } //Build original packet p_originalIpv6Packet.ipv6Hdr := p_ipv6Packet.ipv6Hdr; p_originalIpv6Packet.ipv6Hdr.nextHeader := p_espHeader.nextHeader; if (ispresent(p_espHeader.espPayload.espIpDatagram.extHdrList)) { p_originalIpv6Packet.extHdrList := p_espHeader.espPayload.espIpDatagram.extHdrList; } if (ispresent(p_espHeader.espPayload.espIpDatagram.ipv6Payload)) { p_originalIpv6Packet.ipv6Payload := p_espHeader.espPayload.espIpDatagram.ipv6Payload; } // is a tunneledIpv6Hdr in the extHdrList? If yes, then it becomes the Ipv6Hdr of the original packet if (ispresent(p_espHeader.espPayload.espIpDatagram.extHdrList)) { for (i:=0; i