/* * @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; 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, v_ipPkt.ipv6Hdr.sourceAddress, v_ipPkt.ipv6Hdr.destinationAddress) != 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_srcAddr Source Address of IPv6 packet * @param p_dstAddr Dst Address of IPv6 packet * @param p_extHdrList Extension Header List * @return execution status */ function f_setExtensionHeaders( inout Ipv6Packet p_ipv6Packet, in Ipv6Address p_srcAddr, in Ipv6Address p_dstAddr) runs on LibIpv6Node return FncRetCode { var FncRetCode v_ret := e_success; var UInt8 i, j; var Ipv6Address v_homeAddress := c_16ZeroBytes; var UInt8 v_nrOfTunnelHdr := 0; var Ipv6Address v_pseudoSrcAddr := c_16ZeroBytes; var Ipv6Address v_pseudoDstAddr := c_16ZeroBytes; var boolean v_loop := true; var Ipv6Packet v_pseudoIpv6Packet; var Ipv6Packet v_activeIpv6Packet := p_ipv6Packet; v_pseudoDstAddr := v_activeIpv6Packet.ipv6Hdr.destinationAddress; v_pseudoSrcAddr := v_activeIpv6Packet.ipv6Hdr.sourceAddress; //calc payloadLen if (v_activeIpv6Packet.ipv6Hdr.payloadLength == c_uInt16Zero ) { v_activeIpv6Packet.ipv6Hdr.payloadLength := fx_payloadLength (v_activeIpv6Packet); } if (ispresent(v_activeIpv6Packet.extHdrList)) { for (i:=0; i 32))){ return false; } else if((p_encryptionAlgo == e_aes_ctr) and (p_keyLen != 20) and (p_keyLen != 28) and (p_keyLen != 36)){ return false; } else if((p_encryptionAlgo == e_des_cbc) and (p_keyLen != 8)){ return false; } return true; } /* * @desc This generates Security Parameters Index * @return Security Parameters Index */ function f_createSpi() runs on LibIpv6Node return UInt32 { var Oct4 v_spi := int2oct(float2int(int2float(20000-5000)*rnd())+5000, 4); return oct2int(v_spi); }//end f_createSpi /* * @desc This generates a secret key * @return Secret key */ function f_createSecretKey() runs on LibIpv6Node return octetstring { var Oct20 v_key := int2oct(float2int(int2float(20000-5000)*rnd())+5000, 20); return v_key; }//end f_createSecretKey /* * @desc * This function is used when sending messages. * @param p_msg ExtensionHeaderList to be treated * @return execution status */ function f_getOriginalIpv6Packet( in Ipv6Packet p_ipv6Packet, in EspHeader p_espHeader, out Ipv6Packet p_originalIpv6Packet) runs on LibIpv6Node return FncRetCode { var UInt8 i; var boolean v_loop := true; if (not(ispresent(p_espHeader.espPayload.espIpDatagram.extHdrList)) and not(ispresent(p_espHeader.espPayload.espIpDatagram.ipv6Payload))) { log("**** f_setEspHeader: EspHeader.espPayload.espIpDatagram received that does neither contain extHdrList not ipv6Payload => EspHeader is not constructed correctly ****") ; return e_error; } //Build original packet p_originalIpv6Packet.ipv6Hdr := p_ipv6Packet.ipv6Hdr; 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 // FIXME: check only the first extHdr if (ispresent(p_espHeader.espPayload.espIpDatagram.extHdrList)) { for (i:=0; i