LibIpv6_Interface_Functions.ttcn 44 KB
Newer Older
			log(" **** f_sendCoti: Error when calculating length of extension headers ****");
			return e_error;
		}

mullers's avatar
mullers committed
		//send
		ipPort.send(v_ipPkt);

		return e_success;
	}//end f_sendCot

			/*
	 * @desc 	This sends a IPv6 packet with MipExtHdr - Fast Nbr Adv
	 *			from an IPv6 node to any NUT.
	 *			
	 * @remark  
	 * @param 	p_msg MIPHeader to be sent	
	 * @return 	execution status
	*/
	function f_sendFastNbrAdv(template FastNeighborAdvertisement p_msg)
mullers's avatar
mullers committed
	runs on LibIpv6Node
	return FncRetCode {
		//Variables
mullers's avatar
mullers committed
		v_ipPkt := valueof(p_msg);

		//set extensionHeaders
		if(f_setExtensionHeaders(	v_ipPkt ) != e_success) {
			log(" **** f_sendFastNbrAdv: Error when calculating length of extension headers ****");
			return e_error;
		}

mullers's avatar
mullers committed
		//send
		ipPort.send(v_ipPkt);

		return e_success;
	}//end f_sendFastNbrAdv

}//end group rfc3775Mipv6_ExtHdrFunctions


group rfc4303Esp_ExtHdrFunctions {
	
	 * @desc 	Rebuild original packet from an ESP packet (removes ESP encapsulation)
	 * @param 	p_ipv6Packet complete packet containing ESP Header to be processed
	 * @param   p_espHeader ESP Header to be processed
	 * @param   p_originalIpv6Packet retrieved original packet 
	 * @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_getOriginalIpv6Packet: 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
berge's avatar
berge committed
		// FIXME: check only the first extHdr
		if (ispresent(p_espHeader.espPayload.espIpDatagram.extHdrList)) {
			for (i:=0; i<sizeof(p_espHeader.espPayload.espIpDatagram.extHdrList) and v_loop ;i:=i+1) {
				if (ischosen(p_espHeader.espPayload.espIpDatagram.extHdrList[i].tunneledIpv6)) {
					p_originalIpv6Packet.ipv6Hdr := p_espHeader.espPayload.espIpDatagram.extHdrList[i].tunneledIpv6;
					v_loop := false;
				}
				else {
					p_originalIpv6Packet.extHdrList[i] := p_espHeader.espPayload.espIpDatagram.extHdrList[i];	
				}
			}
		}

		p_originalIpv6Packet.ipv6Hdr.payloadLength := fx_payloadLength (p_originalIpv6Packet);

		return e_success;

	}//end f_getOriginalIpv6Packet
mullers's avatar
mullers committed
	/*
mullers's avatar
mullers committed
	 *			This function is used when sending messages.
	 * @param 	p_msg ExtensionHeaderList to be treated	
	 * @return 	execution status 
	*/
/*	function f_setEspHeader(	in Ipv6Packet p_ipv6Packet,
								inout EspHeader p_espHeader)
mullers's avatar
mullers committed
	runs on LibIpv6Node
	return FncRetCode {
		var Ipv6Header v_originalIpv6Hdr;
		var EchoRequest v_originalEchoRequest;
		var EchoReply v_originalEchoReply;

		//treat MipHdr and other ext
		if (ispresent(p_espHeader.espPayload.espIpDatagram.extHdrList)) {
			
			
		}

mullers's avatar
mullers committed
		if (ispresent(p_espHeader.espPayload.espIpDatagram.ipv6Payload)) {
			if (ischosen(p_espHeader.espPayload.espIpDatagram.ipv6Payload.echoRequestMsg)) {	
				if (ischosen(p_espHeader.espPayload.espIpDatagram.extHdrList[0].tunneledIpv6)) {//tunnelMode
					v_originalIpv6Hdr := p_espHeader.espPayload.espIpDatagram.extHdrList[0].tunneledIpv6;
				}
				else { //transportMode
					v_originalIpv6Hdr := p_ipv6Packet.ipv6Hdr;
				}
				//build original packet
				v_originalEchoRequest := {
					ipv6Hdr := v_originalIpv6Hdr,
					extHdrList := omit,
					ipv6Payload := p_espHeader.espPayload.espIpDatagram.ipv6Payload
				}
				//calc checksum 
				if (v_originalEchoRequest.ipv6Payload.echoRequestMsg.checksum != c_2ZeroBytes) {
					//calc checksum
					v_originalEchoRequest.ipv6Payload.echoRequestMsg.checksum := fx_icmpv6Checksum(v_originalEchoRequest);
				}
				//assign checksum
				p_espHeader.espPayload.espIpDatagram.ipv6Payload.echoRequestMsg.checksum := v_originalEchoRequest.ipv6Payload.echoRequestMsg.checksum;
			}
			else if (ischosen(p_espHeader.espPayload.espIpDatagram.ipv6Payload.echoReplyMsg)) {
				if (ischosen(p_espHeader.espPayload.espIpDatagram.extHdrList[0].tunneledIpv6)) {//tunnelMode
					v_originalIpv6Hdr := p_espHeader.espPayload.espIpDatagram.extHdrList[0].tunneledIpv6;
				}
				else { //transportMode
					v_originalIpv6Hdr := p_ipv6Packet.ipv6Hdr;
				}
				//build original packet
				v_originalEchoReply := {
					ipv6Hdr := v_originalIpv6Hdr,
					extHdrList := omit,
					ipv6Payload := p_espHeader.espPayload.espIpDatagram.ipv6Payload
				}
				//calc checksum 
				if (v_originalEchoReply.ipv6Payload.echoReplyMsg.checksum != c_2ZeroBytes) {
					//calc checksum
					v_originalEchoReply.ipv6Payload.echoReplyMsg.checksum := fx_icmpv6Checksum(v_originalEchoReply);
				}
				//assign checksum
				p_espHeader.espPayload.espIpDatagram.ipv6Payload.echoReplyMsg.checksum := v_originalEchoReply.ipv6Payload.echoReplyMsg.checksum;
			}
mullers's avatar
mullers committed
		return e_success;
mullers's avatar
mullers committed
	}//end f_setEspHeader
	
}//end group rfc4303Esp_ExtHdrFunctions

	
} // end module LibIpv6_Interface_Functions