Commit a5fc8a24 authored by seb's avatar seb
Browse files

HomeAddressOption check added for mipHeader calculation

parent bcaf41ec
Loading
Loading
Loading
Loading
+46 −52
Original line number Diff line number Diff line
@@ -17,35 +17,11 @@
	import from LibIpv6_Interface all;
	import from LibIpv6_ExternalFunctions all;
	import from LibIpv6_MultiRfcs_Functions all;
	import from LibIpv6_MultiRfcs_TypesAndValues all;

	group ipv6Packets {	

	/*
		 * @desc  	This sends an IPv6 epacket from an IPv6 node to 
		 *          any NUT. Prior it modifies IPv6 packet payload length.
		 * @remark  The template passed in must NOT contain any matching expressions!
		 * @param 	p_genIpv6 Ipv6 packet value or template with Ipv6 packet to be sent
		 * @return	execution status
		*/
		function f_sendIpv6Packet (in template GeneralIpv6 p_genIpv6) 
		runs on LibIpv6Node
		return FncRetCode {
			var Ipv6Packet v_ipPkt;
			v_ipPkt.generalIpv6 := valueof(p_genIpv6);
			//calc payloadLen
			v_ipPkt.generalIpv6.ipv6Hdr.payloadLength := fx_payloadLength (v_ipPkt);
			//send
			ipPort.send(v_ipPkt.generalIpv6);

			return e_success;

        }//end f_sendIpv6Packet

    } //end group ipv6Packets

	group extHdrFns {
		
		/*
	 * @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
@@ -63,7 +39,7 @@
		//calc payloadLen
		v_ipPkt.generalIpv6.ipv6Hdr.payloadLength := fx_payloadLength (v_ipPkt);
		//set extensionHeaders
			if(f_setExtensionHeaders(v_ipPkt.generalIpv6.extHdrList) != e_success) {
		if(f_setGeneralIpv6ExtensionHeaders(v_ipPkt.generalIpv6) != e_success) {
			log(" **** f_sendIpv6ExtHdrs: Error whem calculating length of extension headers ****");
			return e_error;
		}
@@ -71,31 +47,49 @@
		ipPort.send(v_ipPkt.generalIpv6);

		return e_success;
		}
	}//end f_sendGeneralIpv6

	/*
	 * @desc 	This goes through the extension header list and calculates length, checksum
	 *			and other specific functions of the different extension headers
	 * @param 	p_msg ExtensionHeaderList to be treated	
	 * @param 	p_mipPrefixSol GeneralIpv6	
	 * @return 	execution status 
	*/
	function f_setExtensionHeaders(inout ExtensionHeaderList p_extHdrList)
	function f_setGeneralIpv6ExtensionHeaders(inout GeneralIpv6 p_generalIpv6)
	runs on LibIpv6Node
	return FncRetCode {
		var UInt8 i;
		var Ipv6Address v_homeAddress := c_16ZeroBytes;

		//select ext hdrs that need special calculation
		for (i:=0; i<=sizeof(p_extHdrList);i:=i+1) {
			if (ischosen(p_extHdrList[i].mipHeader)) {
				f_setMipHeader(p_extHdrList[i].mipHeader);
		for (i:=0; i<=sizeof(p_generalIpv6.extHdrList);i:=i+1) {
			if (ischosen(p_generalIpv6.extHdrList[i].mipHeader)) {
				if (f_isPresentHomeAddressOption(p_generalIpv6.extHdrList, v_homeAddress) == e_success) {
					f_setMipHeader(	v_homeAddress,
									p_generalIpv6.ipv6Hdr.destinationAddress,
									p_generalIpv6.extHdrList[i].mipHeader);	
				}
				else {
					f_setMipHeader(	p_generalIpv6.ipv6Hdr.sourceAddress,
									p_generalIpv6.ipv6Hdr.destinationAddress,
									p_generalIpv6.extHdrList[i].mipHeader);
				}
			}
		/*	else if (ischosen(p_extHdrList[i].)) {
				f_setSecurityHdr();
			}  */
		}

		return e_success;
	}		
	}//end f_setGeneralIpv6ExtensionHeaders


    } //end group ipv6Packets

	group extHdrFns {
		
	
		
		

	}//end group extHdrFns
	
+68 −2
Original line number Diff line number Diff line
@@ -55,7 +55,7 @@ module LibIpv6_Rfc3775Mipv6_Functions {
			v_ipPkt.homeAgentAddressDiscoveryRequest := valueof(p_haAddrDreq);

			//calc MipHeader length/checksum if present
			f_setExtensionHeaders(v_ipPkt.homeAgentAddressDiscoveryRequest.extHdrList);
			f_setHaAddrDreqExtensionHeaders(v_ipPkt.homeAgentAddressDiscoveryRequest);
			//calc payloadLen
			v_ipPkt.homeAgentAddressDiscoveryRequest.ipv6Hdr.payloadLength := fx_payloadLength (v_ipPkt);
			//set checksum to zero
@@ -69,6 +69,39 @@ module LibIpv6_Rfc3775Mipv6_Functions {

		} // end f_sendHaAddrDreq

		/*
	 * @desc 	This goes through the extension header list and calculates length, checksum
	 *			and other specific functions of the different extension headers
	 * @param 	p_haAddrDreq HomeAgentAddressDiscoveryRequest	
	 * @return 	execution status 
	*/
	function f_setHaAddrDreqExtensionHeaders(inout HomeAgentAddressDiscoveryRequest p_haAddrDreq)
	runs on LibIpv6Node
	return FncRetCode {
		var UInt8 i;
		var Ipv6Address v_homeAddress := c_16ZeroBytes;

		//select ext hdrs that need special calculation
		for (i:=0; i<=sizeof(p_haAddrDreq.extHdrList);i:=i+1) {
			if (ischosen(p_haAddrDreq.extHdrList[i].mipHeader)) {
				if (f_isPresentHomeAddressOption(p_haAddrDreq.extHdrList, v_homeAddress) == e_success) {
					f_setMipHeader(	v_homeAddress,
									p_haAddrDreq.ipv6Hdr.destinationAddress,
									p_haAddrDreq.extHdrList[i].mipHeader);	
				}
				else {
					f_setMipHeader(	p_haAddrDreq.ipv6Hdr.sourceAddress,
									p_haAddrDreq.ipv6Hdr.destinationAddress,
									p_haAddrDreq.extHdrList[i].mipHeader);
				}
			}
		/*	else if (ischosen(p_extHdrList[i].)) {
				f_setSecurityHdr();
			}  */
		}
		return e_success;
	}//end f_setHaAddrDreqExtensionHeaders	

		/*
		 * @desc  DHAADRequest message is sent, and DHAADResp is expected
		 *			The gla of HA is returned via inout variable.
@@ -355,7 +388,7 @@ module LibIpv6_Rfc3775Mipv6_Functions {
			v_ipPkt.mobilePrefixSolicitation := valueof(p_mipPrefixSol);

			//calc MipHeader length/checksum if present
			f_setExtensionHeaders(v_ipPkt.mobilePrefixSolicitation.extHdrList);
			f_setMipPrefixSolExtensionHeaders(v_ipPkt.mobilePrefixSolicitation);
			//calc payloadLen
			v_ipPkt.mobilePrefixSolicitation.ipv6Hdr.payloadLength := fx_payloadLength (v_ipPkt);
			//set checksum to zero
@@ -369,6 +402,39 @@ module LibIpv6_Rfc3775Mipv6_Functions {

		} // end f_sendMipPrefixSol

	/*
	 * @desc 	This goes through the extension header list and calculates length, checksum
	 *			and other specific functions of the different extension headers
	 * @param 	p_mipPrefixSol MobilePrefixSolicitation	
	 * @return 	execution status 
	*/
	function f_setMipPrefixSolExtensionHeaders(inout MobilePrefixSolicitation p_mipPrefixSol)
	runs on LibIpv6Node
	return FncRetCode {
		var UInt8 i;
		var Ipv6Address v_homeAddress := c_16ZeroBytes;

		//select ext hdrs that need special calculation
		for (i:=0; i<=sizeof(p_mipPrefixSol.extHdrList);i:=i+1) {
			if (ischosen(p_mipPrefixSol.extHdrList[i].mipHeader)) {
				if (f_isPresentHomeAddressOption(p_mipPrefixSol.extHdrList, v_homeAddress) == e_success) {
					f_setMipHeader(	v_homeAddress,
									p_mipPrefixSol.ipv6Hdr.destinationAddress,
									p_mipPrefixSol.extHdrList[i].mipHeader);	
				}
				else {
					f_setMipHeader(	p_mipPrefixSol.ipv6Hdr.sourceAddress,
									p_mipPrefixSol.ipv6Hdr.destinationAddress,
									p_mipPrefixSol.extHdrList[i].mipHeader);
				}
			}
		/*	else if (ischosen(p_extHdrList[i].)) {
				f_setSecurityHdr();
			}  */
		}
		return e_success;
	}//end f_setMipPrefixSolExtensionHeaders	

		/*
		 * @desc  DHAADReply messages is sent, and DHAADResp is expected
	 	 * @param p_mnCoaTn Mobile Node Care Of Address of test node
+7 −1
Original line number Diff line number Diff line
@@ -38,10 +38,16 @@
	return octetstring;

	/* @desc   This external function calculates the checksum for MIPv6 Header.
	 *	       If HomeAddressOption present, then this external function is called with the
	 *		   HomeAddress as Source Address
	 * @param  p_srcAddr Source Address to be used for Checksum calculation
	 * @param  p_dstAddr MipHeader
	 * @param  p_mipHeader MipHeader
	 * @return MIPv6 Header checksum
	*/
	external function fx_mipHeaderChecksum( in  MipHeader p_mipHeader) 
	external function fx_mipHeaderChecksum( in Ipv6Address p_srcAddr,
											in Ipv6Address p_dstAddr,
											in MipHeader p_mipHeader) 
	return Oct2;

	/* @desc   This external function calculates the length of MIPv6 Header.
+36 −4
Original line number Diff line number Diff line
@@ -80,9 +80,13 @@
	 * @param 	p_msg ExtensionHeaderList to be treated	
	 * @return 	execution status 
	*/
	function f_setMipHeader(inout MipHeader p_mipHeader)
	function f_setMipHeader(in Ipv6Address p_srcAddr,
							in Ipv6Address p_dstAddr,
							inout MipHeader p_mipHeader)
	runs on LibIpv6Node
	return FncRetCode {
		var MipHeader v_mipHeader := valueof(p_mipHeader);
		var Ipv6Address v_homeAddress := c_16ZeroBytes ;

		if (ischosen(p_mipHeader.mipMessage.homeTestInit)) {
			//calc homeNonceIndex TODO
@@ -99,11 +103,39 @@
		//set mipChecksum to zero
		p_mipHeader.checksum := c_2ZeroBytes;  
		//calc mipChecksum
		p_mipHeader.checksum := fx_mipHeaderChecksum(p_mipHeader);

		p_mipHeader.checksum := fx_mipHeaderChecksum(	p_srcAddr,
														p_dstAddr,
														p_mipHeader);
		return e_success;
	}

	/*
	 * @desc 	This goes through the ExtensionHeaderList and
	 *			checks if a HomeAddressOption is present.
	 * @param 	p_extHdrList ExtensionHeaderList to be treated
	 * @param 	p_homeAddr Home address of HomeAddressOption
	 * @return 	execution status 
	*/
	function f_isPresentHomeAddressOption(	in ExtensionHeaderList p_extHdrList,
											inout Ipv6Address p_homeAddr)
	runs on LibIpv6Node
	return FncRetCode {
		var FncRetCode v_ret := e_error;
		var UInt8 i,j;

		//select ext hdrs that need special calculation
		for (i:=0; i<=sizeof(p_extHdrList);i:=i+1) {
			if (ischosen(p_extHdrList[i].destinationOptionHeader)) {
				for (j:=0; j<=sizeof(p_extHdrList[i].destinationOptionHeader.destOptionList);j:=j+1) {
					if (ischosen(p_extHdrList[i].destinationOptionHeader.destOptionList[j].homeAddressOption)) {
						p_homeAddr := p_extHdrList[i].destinationOptionHeader.destOptionList[j].homeAddressOption.homeAddress;
						v_ret := e_success;
					}
				}
			}
		}
		return v_ret;
	}//end function f_isPresentHomeAddressOption
		
}//end group mipHdrFns