Commit a0c09ae4 authored by seb's avatar seb
Browse files

TC01-08 for HA Under Test added

parent 4707feec
Loading
Loading
Loading
Loading
+423 −184
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ module LibIpv6_Rfc3775Mipv6_Functions {
	import from LibIpv6_Rfc2461NeighborDiscovery_TypesAndValues all;
	import from LibIpv6_Rfc2461NeighborDiscovery_Functions all;
	import from LibIpv6_Rfc2463Icmpv6_Functions all;
	import from LibIpv6_Rfc2463Icmpv6_TypesAndValues all;
	import from LibIpv6_MultiRfcs_TypesAndValues all;
	import from LibIpv6_MultiRfcs_Templates all;
	import from LibIpv6_MultiRfcs_Functions all;
@@ -38,43 +39,7 @@ module LibIpv6_Rfc3775Mipv6_Functions {

	group dhaadFns {

		/*
		 * @desc  	This sends a MIPv6 HaAddrDreq for a test component
		 *          acting as any IPv6 node to the NUT.
		 *			Prior it modifies IPv6 packet payload ength and ICMPv6
		 *			checksum to their correct values
		 * @remark  The template passed in must NOT contain any matching expressions!
		 * @param 	p_haAddrDreq Ipv6 packet template with neighborhood advertisement to be sent
		 * @return 	execution status
		*/
		function f_sendHaAddrDreq(in template HomeAgentAddressDiscoveryRequest p_haAddrDreq)
		runs on LibIpv6Node
		return FncRetCode {
			var Ipv6Packet v_ipPkt;
			var ExtensionHeader v_extHdr;
			v_ipPkt.homeAgentAddressDiscoveryRequest := valueof(p_haAddrDreq);
			//set Extension Header
			if (ispresent(v_ipPkt.homeAgentAddressDiscoveryRequest.extHdrList)) {
				if(f_setExtensionHeaders(	v_ipPkt.homeAgentAddressDiscoveryRequest.extHdrList,
											v_ipPkt.homeAgentAddressDiscoveryRequest.ipv6Hdr.sourceAddress,
											v_ipPkt.homeAgentAddressDiscoveryRequest.ipv6Hdr.destinationAddress,
											v_ipPkt) != e_success) {
					log(" **** f_sendHaAddrDreq: Error when calculating length of extension headers ****");
					return e_error;
				}
			}
			//calc payloadLen
			v_ipPkt.homeAgentAddressDiscoveryRequest.ipv6Hdr.payloadLength := fx_payloadLength (v_ipPkt);
			//set checksum to zero
			v_ipPkt.homeAgentAddressDiscoveryRequest.checksum := c_2ZeroBytes;
			//calc checksum
			v_ipPkt.homeAgentAddressDiscoveryRequest.checksum := fx_icmpv6Checksum(v_ipPkt);
			//send
			ipPort.send(v_ipPkt.homeAgentAddressDiscoveryRequest);
		
			return e_success;

		} // end f_sendHaAddrDreq


	/*
@@ -123,7 +88,7 @@ module LibIpv6_Rfc3775Mipv6_Functions {
		 * @param p_haGlasNut Home Agent Addresses of node under test
		*/
		function f_sendHaAddrDreqAndWaitForReply(	in template Ipv6Address p_mnCoaTn,
													in Ipv6Address p_haAcaNut,
													in template Ipv6Address p_haAcaNut,
													out Ipv6AddressList p_haGlasNut)
		runs on Ipv6Node
		return FncRetCode {
@@ -168,9 +133,83 @@ module LibIpv6_Rfc3775Mipv6_Functions {
		 * @param p_mnHoaTn Mobile Node Home Address of test node
		 * @param p_haGlaNut Home Agent Address of node under test
		*/
		function f_registerMnToHa(	in template Ipv6Address p_mnCoaTn,
		function f_receiveBindingUpdateAndReply(	//in template Ipv6Address p_mnCoaTn,
													//	in template Ipv6Address p_mnHoaTn,
													//	in template Ipv6Address p_haGlaNut,
													//	in UInt16 p_timeUnits
													)
		runs on Ipv6Node
		return FncRetCode {
			var FncRetCode v_ret := e_error;
			
/*			tc_wait.start;
			alt {
				[]	ipPort.receive(mw_generalIpv6_srcDst(c_dstHdr,
																p_mnCoaTn,
																p_haGlaNut,
																m_extHdrList_2Elem(
																	m_extHdr_dstOptHeader(	c_mipHdr,
																							c_optLen2,
																							m_dstOptList_2Elem(
																								m_dstOpt_padN(m_optPad4),
																								m_dstOpt_homeAddr(p_mnHoaTn))),
																	mw_extHdr_mipHeader (c_noNextHdr,
																						c_bindingUpdate,
																						mw_bindingUpdate(c_aFlag1,
																										c_hFlag1,
																										c_lFlag0,
																										c_kFlag0,
																										p_timeUnits,
																										m_mipOptList_2Elem(
																											m_mipOpt_padN(m_optPad2),
																											m_mipOpt_altCoa(m_mipOptAltCoA(p_mnCoaTn)))))))) {
						v_seqNr := 
						tc_wait.stop;	
						v_ret := e_success ;
					}
				[]	tc_wait.timeout{
						v_ret :=  e_timeout;
						log("**** f_registerMnToHa: ERROR: tc_ac.timeout **** ");
					}		
			} // end alt

			if ( v_ret == e_success ) {
				v_ret := f_sendGeneralIpv6(m_generalIpv6_srcDst(c_dstHdr,
																p_mnCoaTn,
																p_haGlaNut,
																m_extHdrList_2Elem(
																	m_extHdr_dstOptHeader(	c_mipHdr,
																							c_optLen2,
																							m_dstOptList_2Elem(
																								m_dstOpt_padN(m_optPad4),
																								m_dstOpt_homeAddr(p_mnHoaTn))),
																	m_extHdr_mipHeader (c_noNextHdr,
																						c_bindingUpdate,
																						m_bindingUpdate(c_defSeqNo,
																										c_aFlag1,
																										c_hFlag1,
																										c_lFlag0,
																										c_kFlag0,
																										p_timeUnits,
																										m_mipOptList_2Elem(
																											m_mipOpt_padN(m_optPad2),
																											m_mipOpt_altCoa(m_mipOptAltCoA(p_mnCoaTn))))))));
			}//end if
*/
			return v_ret;

		}//end f_receiveBindingUpdateAndReply

		/*
		 * @desc  primaryCareOfAddressRegistration
	 	 * @param p_mnCoaTn Mobile Node Care Of Address of test node
		 * @param p_mnHoaTn Mobile Node Home Address of test node
		 * @param p_haGlaNut Home Agent Address of node under test
		*/
		function f_sendBindUpAndWaitForBindAck(	in template Ipv6Address p_mnCoaTn,
														in template Ipv6Address p_mnHoaTn,
														in template Ipv6Address p_haGlaNut)
														in template Ipv6Address p_haGlaNut,
														in UInt16 p_timeUnits)
		runs on Ipv6Node
		return FncRetCode {
			var FncRetCode v_ret;
@@ -191,9 +230,10 @@ module LibIpv6_Rfc3775Mipv6_Functions {
																									c_hFlag1,
																									c_lFlag0,
																									c_kFlag0,
																									c_100TimeUnits,
																									m_mipOptList_1Elem(
																										m_mipOpt_padN(m_optPad4)))))));
																									p_timeUnits,
																									m_mipOptList_2Elem(
																										m_mipOpt_padN(m_optPad2),
																										m_mipOpt_altCoa(m_mipOptAltCoA(p_mnCoaTn))))))));
			if ( v_ret != e_success ) {return v_ret;}
			tc_ac.start;
			alt {
@@ -212,16 +252,6 @@ module LibIpv6_Rfc3775Mipv6_Functions {
						tc_ac.stop;	
						v_ret := e_success ;
					}
				[]	ipPort.receive(mw_generalIpv6_srcDst(	c_mipHdr,
															p_haGlaNut,
															p_mnCoaTn,
															m_extHdrList_1Elem(
																mw_extHdr_mipHeader (	c_noNextHdr,
																						c_bindingError,
																						mw_bindingError)))) {
						tc_ac.stop;
						v_ret := e_error ;
					}
				[]	tc_ac.timeout{
						v_ret :=  e_timeout;
						log("**** f_registerMnToHa: ERROR: tc_ac.timeout **** ");
@@ -230,70 +260,82 @@ module LibIpv6_Rfc3775Mipv6_Functions {

			return v_ret;

		}//end f_registerMnToHa
		}//end f_sendBindUpAndWaitForBindAck

		/*
		 * @desc  Mobile Node returns Home procedure
		 * @desc  primaryCareOfAddressRegistration
	 	 * @param p_mnCoaTn Mobile Node Care Of Address of test node
		 * @param p_mnHoaTn Mobile Node Home Address of test node
		 * @param p_mnLlaTn Mobile Node Link Local Address of test node
		 * @param p_macUcaTn Mobile Node Mac Address of test node
		 * @param p_haLlaNut Link Local Address of Node Under Test
		 * @param p_haGlaNut Home Agent Address of node under test
		*/
		function f_mnReturnsHome(	in template Ipv6Address p_mnHoaTn,
									in template Ipv6Address p_mnLlaTn,
									in template Oct6to15 p_macUcaTn,
									in template Ipv6Address p_haGlaNut)
		function f_sendBindUpAndCheckForDiscard(	in template Ipv6Address p_notRoutableCoaTn,
														in template Ipv6Address p_mnHoaTn,
														in template Ipv6Address p_haGlaNut,
														in UInt16 p_timeUnits)
		runs on Ipv6Node
		return FncRetCode {
			var FncRetCode v_ret;
				
			v_ret := f_sendGeneralIpv6(m_generalIpv6_srcDst(c_mipHdr,
															p_mnHoaTn,
			v_ret := f_sendGeneralIpv6(m_generalIpv6_srcDst(c_dstHdr,
															p_notRoutableCoaTn,
															p_haGlaNut,
															m_extHdrList_1Elem(
																m_extHdr_mipHeader (
																	c_noNextHdr,
															m_extHdrList_2Elem(
																m_extHdr_dstOptHeader(	c_mipHdr,
																						c_optLen2,
																						m_dstOptList_2Elem(
																							m_dstOpt_padN(m_optPad4),
																							m_dstOpt_homeAddr(p_mnHoaTn))),
																m_extHdr_mipHeader (c_noNextHdr,
																					c_bindingUpdate,
																	m_bindingUpdate(
																		c_defSeqNo + 1,
																					m_bindingUpdate(c_defSeqNo,
																									c_aFlag1,
																									c_hFlag1,
																									c_lFlag0,
																									c_kFlag0,
																		c_zeroTimeUnits,
																		m_mipOptList_1Elem(
																			m_mipOpt_padN(m_optPad4)))))));
																									p_timeUnits,
																									m_mipOptList_2Elem(
																										m_mipOpt_padN(m_optPad2),
																										m_mipOpt_altCoa(m_mipOptAltCoA(p_notRoutableCoaTn))))))));
			if ( v_ret != e_success ) {return v_ret;}
			tc_ac.start;
			alt {
				[]	ipPort.receive(mw_generalIpv6_srcDst(	c_routeHdr,
														p_haGlaNut,
														p_notRoutableCoaTn,
														m_extHdrList_2Elem(
														mw_extHdr_routingHeader(	c_mipHdr,
																					c_routeHdrLen2,
																					c_routeHdrType2,
																					c_routeHdrSegmentsLeft1,
																					m_routingHeaderData_homeAddress(p_mnHoaTn)),
														mw_extHdr_mipHeader (	c_noNextHdr,
																				c_bindingAck,
																				mw_bindingAck(c_defSeqNo))))) {
						tc_ac.stop;	
						v_ret := e_error ;
						log("**** f_sendBindUpAndCheckForDiscartion: ERROR: IUT did not discard message **** ");
					}
				[]	ipPort.receive(mw_generalIpv6_srcDst(	c_mipHdr,
															p_haGlaNut,
															p_mnHoaTn,
															p_notRoutableCoaTn,
															m_extHdrList_1Elem(
																mw_extHdr_mipHeader (	c_noNextHdr,
																					c_bindingAck,
																					mw_bindingAck(c_defSeqNo + 1))))) {
																						c_bindingError,
																						mw_bindingError)))) {
						tc_ac.stop;
						v_ret := e_success ;
						v_ret := e_error ;
						log("**** f_sendBindUpAndCheckForDiscartion: ERROR: IUT did not discard message **** ");
					}
				[]	tc_ac.timeout{
						return e_timeout;
						log("**** f_mnReturnsHome: ERROR: tc_ac.timeout **** ");
						v_ret :=  e_success;
					}		
			} // end alt

			v_ret := f_sendNbrAdv (m_nbrAdv_noExtHdr( 	p_mnLlaTn,
														c_allNodesMca,
														c_rFlag0,
														c_sFlag0,
														c_oFlag1,
														p_mnHoaTn,
														m_nbrAdvOpt_tllaOpt(p_macUcaTn))) ;

			return v_ret;

		}//end f_mnReturnsHome
		}//end f_sendBindUpAndCheckForDiscartion


		
	}//end group bindingFns

@@ -313,7 +355,7 @@ module LibIpv6_Rfc3775Mipv6_Functions {
	return FncRetCode {
		var FncRetCode v_ret;

		tc_ac.start;
		tc_wait.start;
		alt {
			[]	ipPort.receive(mw_generalIpv6_srcDst(	c_mipHdr,
												p_mnHoa,
@@ -321,10 +363,10 @@ module LibIpv6_Rfc3775Mipv6_Functions {
												m_extHdrList_1Elem( mw_extHdr_mipHeader (	c_noNextHdr,
																							c_homeTestInit,
																							mw_hoti)))) {
					tc_ac.stop;	
					tc_wait.stop;	
					v_ret := e_success ;
				}
			[]	tc_ac.timeout{
			[]	tc_wait.timeout{
					v_ret :=  e_timeout;
					log("**** f_waitForHomeTestInitAndReply: ERROR: tc_ac.timeout **** ");
					return v_ret;
@@ -392,13 +434,153 @@ module LibIpv6_Rfc3775Mipv6_Functions {
	}//end f_sendHomeTestInitAndWaitForReply




	}//end group homeTestFns


	group mobilePrefixFns{

		/*
		 * @desc  DHAADReply messages is sent, and DHAADResp is expected
	 	 * @param p_mnCoaTn Mobile Node Care Of Address of test node
		 * @param p_haAcaNut Home Agent Anycast Address of test nodev
		 * @param p_haGlasNut Home Agent Addresses of node under test
		*/
		function f_sendMipPrefixSolAndWaitForReply(	in template Ipv6Address p_mnCoaTn,
													in template Ipv6Address p_haGla,
													in template Ipv6Address p_mnHoaTn)
		runs on Ipv6Node
		return FncRetCode {
			var FncRetCode v_ret;
				
			v_ret := f_sendMipPrefixSol(m_mipPrefixSol(
											c_dstHdr,
											p_mnCoaTn,
											p_haGla,
											m_extHdrList_1Elem(
												m_extHdr_dstOptHeader(	
													c_icmpHdr,
													c_optLen2,
													m_dstOptList_2Elem(
														m_dstOpt_padN(m_optPad4),
														m_dstOpt_homeAddr(p_mnHoaTn)))),
											c_defId));
			if ( v_ret != e_success ) {return v_ret;}
			tc_ac.start;
			alt {
				[]	ipPort.receive(mw_mipPrefixAdv_extHdr(
										c_routeHdr,
										p_haGla,
										p_mnCoaTn,
										m_extHdrList_1Elem(
											mw_extHdr_routingHeader(	
												c_icmpHdr,
												c_routeHdrLen2,
												c_routeHdrType2,
												c_routeHdrSegmentsLeft1,
												m_routingHeaderData_homeAddress(p_mnHoaTn))))) {
						tc_ac.stop;
						v_ret := e_success ;
					}
				[]	tc_ac.timeout{
						v_ret :=  e_timeout;
						log("**** f_sendMipPrefixSolAndWaitForReply: ERROR: tc_ac.timeout **** ");
					}		
			} // end alt

			return v_ret;

		}//end f_sendMipPrefixSolAndWaitForReply

			/*
		 * @desc  DHAADReply messages is sent, and DHAADResp is expected
	 	 * @param p_mnCoaTn Mobile Node Care Of Address of test node
		 * @param p_haAcaNut Home Agent Anycast Address of test nodev
		 * @param p_haGlasNut Home Agent Addresses of node under test
		*/
		function f_sendMipPrefixSolAndWaitForBindingError(	in template Ipv6Address p_mnCoaTn,
													in template Ipv6Address p_haGla,
													in template Ipv6Address p_mnHoaTn)
		runs on Ipv6Node
		return FncRetCode {
			var FncRetCode v_ret;
				
			v_ret := f_sendMipPrefixSol(m_mipPrefixSol(
											c_dstHdr,
											p_mnCoaTn,
											p_haGla,
											m_extHdrList_1Elem(
												m_extHdr_dstOptHeader(	
													c_icmpHdr,
													c_optLen2,
													m_dstOptList_2Elem(
														m_dstOpt_padN(m_optPad4),
														m_dstOpt_homeAddr(p_mnHoaTn)))),
											c_defId));
			if ( v_ret != e_success ) {return v_ret;}
			tc_ac.start;
			alt {
				[]	ipPort.receive(mw_generalIpv6_srcDst(	c_mipHdr,
															p_haGla,
															p_mnCoaTn,
															m_extHdrList_1Elem(
																mw_extHdr_mipHeader (	c_noNextHdr,
																						c_bindingError,
																						mw_bindingError)))) {
						tc_ac.stop;
						v_ret := e_success ;
					}
				[]	tc_ac.timeout{
						v_ret :=  e_timeout;
						log("**** f_sendMipPrefixSolAndWaitForBindingError: ERROR: tc_ac.timeout **** ");
					}		
			} // end alt

			return v_ret;

		}//end f_sendMipPrefixSolAndWaitForBindingError

			}//end group mobilePrefixFns

	group sendFns{

	/*
	 * @desc  	This sends a MIPv6 HaAddrDreq for a test component
	 *          acting as any IPv6 node to the NUT.
	 *			Prior it modifies IPv6 packet payload ength and ICMPv6
	 *			checksum to their correct values
	 * @remark  The template passed in must NOT contain any matching expressions!
	 * @param 	p_haAddrDreq Ipv6 packet template with neighborhood advertisement to be sent
	 * @return 	execution status
	*/
	function f_sendHaAddrDreq(in template HomeAgentAddressDiscoveryRequest p_haAddrDreq)
	runs on LibIpv6Node
	return FncRetCode {
		var Ipv6Packet v_ipPkt;
		var ExtensionHeader v_extHdr;
		v_ipPkt.homeAgentAddressDiscoveryRequest := valueof(p_haAddrDreq);
		//set Extension Header
		if (ispresent(v_ipPkt.homeAgentAddressDiscoveryRequest.extHdrList)) {
			if(f_setExtensionHeaders(	v_ipPkt.homeAgentAddressDiscoveryRequest.extHdrList,
										v_ipPkt.homeAgentAddressDiscoveryRequest.ipv6Hdr.sourceAddress,
										v_ipPkt.homeAgentAddressDiscoveryRequest.ipv6Hdr.destinationAddress,
										v_ipPkt) != e_success) {
				log(" **** f_sendHaAddrDreq: Error when calculating length of extension headers ****");
				return e_error;
			}
		}
		//calc payloadLen
		v_ipPkt.homeAgentAddressDiscoveryRequest.ipv6Hdr.payloadLength := fx_payloadLength (v_ipPkt);
		//set checksum to zero
		v_ipPkt.homeAgentAddressDiscoveryRequest.checksum := c_2ZeroBytes;
		//calc checksum
		v_ipPkt.homeAgentAddressDiscoveryRequest.checksum := fx_icmpv6Checksum(v_ipPkt);
		//send
		ipPort.send(v_ipPkt.homeAgentAddressDiscoveryRequest);

		return e_success;

	} // end f_sendHaAddrDreq

	/*
	 * @desc  	This sends a MIPv6 HaAddrDreq for a test component
	 *          acting as any IPv6 node to the NUT.
@@ -437,7 +619,6 @@ module LibIpv6_Rfc3775Mipv6_Functions {

	} // end f_sendMipPrefixSol

	
	/*
	 * @desc  	This sends a MIPv6 HaAddrDreq for a test component
	 *          acting as any IPv6 node to the NUT.
@@ -476,70 +657,128 @@ module LibIpv6_Rfc3775Mipv6_Functions {

	} // end f_sendMipPrefixSol
	
	}//end group sendFns

	group preambles {
		
	/*
		 * @desc  DHAADReply messages is sent, and DHAADResp is expected
	 * @desc  NUll to Prefix Discovered
 	 * @param p_mnCoaTn Mobile Node Care Of Address of test node
	 * @param p_haAcaNut Home Agent Anycast Address of test nodev
	 * @param p_haGlasNut Home Agent Addresses of node under test
	*/
		function f_sendMipPrefixSolAndWaitForReply(	in template Ipv6Address p_mnCoaTn,
													in template Ipv6Address p_haGla,
													in template Ipv6Address p_mnHoaTn)
	function f_mn_ha_null2MipPrefixDiscovery(	in template Ipv6Address p_mnCoaTn,
										in template Ipv6Address p_mnHoaTn,
										in template Ipv6Address p_haAca)
	runs on Ipv6Node
	return FncRetCode {
			var FncRetCode v_ret;
		//Variables
		var FncRetCode v_ret := e_success;
		var Ipv6AddressList v_haGlasNut;
		
			v_ret := f_sendMipPrefixSol(m_mipPrefixSol(
											c_dstHdr,
											p_mnCoaTn,
											p_haGla,
											m_extHdrList_1Elem(
												m_extHdr_dstOptHeader(	
													c_icmpHdr,
													c_optLen2,
													m_dstOptList_2Elem(
														m_dstOpt_padN(m_optPad4),
														m_dstOpt_homeAddr(p_mnHoaTn)))),
											c_defId));
			if ( v_ret != e_success ) {return v_ret;}
			tc_ac.start;
			alt {
				[]	ipPort.receive(mw_mipPrefixAdv_extHdr(
										c_routeHdr,
										p_haGla,
										p_mnCoaTn,
										m_extHdrList_1Elem(
											mw_extHdr_routingHeader(	
												c_icmpHdr,
												c_routeHdrLen2,
												c_routeHdrType2,
												c_routeHdrSegmentsLeft1,
												m_routingHeaderData_homeAddress(p_mnHoaTn))))) {
						tc_ac.stop;
						v_ret := e_success ;
		v_ret := f_sendHaAddrDreqAndWaitForReply(	p_mnCoaTn,
													p_haAca,
													v_haGlasNut);

		if (v_ret == e_success) {
			//TODO align param Order with other fns
			v_ret := f_sendBindUpAndWaitForBindAck(	p_mnCoaTn,
													p_mnHoaTn,
													v_haGlasNut[0],
													c_100TimeUnits);
		}
				[]	ipPort.receive(mw_generalIpv6_srcDst(	c_mipHdr,
															p_haGla,
															p_mnCoaTn,
															m_extHdrList_1Elem(
																mw_extHdr_mipHeader (	c_noNextHdr,
																						c_bindingError,
																						mw_bindingError)))) {
						tc_ac.stop;
						v_ret := e_error ;
		if (v_ret == e_success) {
			tc_ac.start(10.0);
			tc_ac.timeout;
			v_ret := f_sendMipPrefixSolAndWaitForReply(	p_mnCoaTn,
														v_haGlasNut[0],
														p_mnHoaTn);
		}
				[]	tc_ac.timeout{
						v_ret :=  e_timeout;
						log("**** f_sendMipPrefixSolAndWaitForReply: ERROR: tc_ac.timeout **** ");
		return v_ret;
	}//end function f_mn_ha_null2MipPrefixDiscovery

	function f_mn_ha_null2ReturnRoutability(	in template Ipv6Address p_mnCoaTn,
											in template Ipv6Address p_mnHoaTn,
											in template Ipv6Address p_glaCnTn,
											in template Ipv6Address p_haAca,
											out Ipv6AddressList p_haGlasNut)
	runs on Ipv6Node
	return FncRetCode {
		//Variables
		var FncRetCode v_ret := e_success;
		var Ipv6AddressList v_haGlasNut := {c_16ZeroBytes};

		v_ret := f_sendHaAddrDreqAndWaitForReply(	p_mnCoaTn,
													p_haAca,
													v_haGlasNut);

		if(v_ret == e_success) {
			f_sendBindUpAndWaitForBindAck(	p_mnCoaTn,
											p_mnHoaTn,
											v_haGlasNut[0],
											c_100TimeUnits);
		}
			} // end alt
		if(v_ret == e_success) {
			v_ret := f_sendHomeTestInitAndWaitForReply(	p_mnCoaTn,
														p_mnHoaTn,
														p_glaCnTn,
														v_haGlasNut[0]);
				
		}
		p_haGlasNut := v_haGlasNut;
		return v_ret ;
	}//end function f_haNull2ReturnRoutability

		}//end f_sendMipPrefixSolAndWaitForReply
	function f_mn_ha_null2ReverseTunneling(	in template Ipv6Address p_mnCoaTn,
											in template Ipv6Address p_mnHoaTn,
											in template Ipv6Address p_glaCnTn,
											in template Ipv6Address p_haAca)
	runs on Ipv6Node
	return FncRetCode {
		//Variables
		var FncRetCode v_ret := e_success;
		var Ipv6AddressList v_haGlasNut := {c_16ZeroBytes};
		var EchoReply v_echoRep;

	}//end group mobilePrefixFns
		v_ret := f_mn_ha_null2ReturnRoutability(	p_mnCoaTn,
												p_mnHoaTn,
												p_glaCnTn,
												p_haAca,
												v_haGlasNut);
		if(v_ret == e_success) {
			v_ret := f_echoProc_tunneled(	p_mnCoaTn, //p_glaA
											v_haGlasNut[0], //p_glaB
											p_mnHoaTn, //p_glaC
											p_glaCnTn, //p_glaD
											c_defId, 
											c_defSeqNo,
											v_echoRep);
		}
		return v_ret ;
	}//end function f_mn_ha_null2ReverseTunneling

	function f_cn_ha_null2ReverseTunneling(	in template Ipv6Address p_glaCnTn,
											in template Ipv6Address p_mnHoaTn)
	runs on Ipv6Node
	return FncRetCode {
		//Variables
		var FncRetCode v_ret := e_success;

		v_ret := f_waitForHomeTestInitAndReply(	p_glaCnTn,
												p_mnHoaTn);
		if(v_ret == e_success) {
			v_ret := f_replyToEchoRequest(	p_glaCnTn,
											p_mnHoaTn,
											c_defId, 
											c_defSeqNo);
		}
		return v_ret;
	}//end function f_cn_ha_null2ReverseTunneling

	

		
	}//end group preambles



+0 −14
Original line number Diff line number Diff line
@@ -36,20 +36,6 @@
			identifier := p_identifier,
			reserved := c_uInt16Zero
		}
		//todo exthdr param
		template HomeAgentAddressDiscoveryRequest m_dhaadReq_mipHdr (	template Ipv6Address p_src,
															template Ipv6Address p_dst,
															UInt8 p_mobilityHeaderType,
															template MipMessage p_mipMessage,
															UInt16 p_ident) := {
			ipv6Hdr :=  m_ipHdr_nextHdr_srcDst(c_mipHdr, p_src, p_dst),
			extHdrList := {m_extHdr_mipHeader(c_icmpHdr, p_mobilityHeaderType, p_mipMessage )},
			icmpType := c_mipIcmpHomeAgentAddressDiscoveryRequest,
			icmpCode := c_icmpCode0,
			checksum := c_2ZeroBytes,
			identifier := p_ident,
			reserved := c_uInt16Zero
		}

		template HomeAgentAddressDiscoveryRequest mw_dhaadReq (	template Ipv6Address p_src,
															template Ipv6Address p_dst) := {
+43 −5
Original line number Diff line number Diff line
@@ -41,6 +41,12 @@ module LibIpv6_MultiRfcs_Templates {

	group paddingTemplates {

		template OptPadN  m_optPad2 := {
			optType := 1,
			optLen := 0,
			padding := omit
		}

		template OptPadN  m_optPad4 := {
			optType := 1,
			optLen := 2,
@@ -146,6 +152,24 @@ module LibIpv6_MultiRfcs_Templates {
			}
		}

		template MipMessage mw_bindingUpdate(	UInt1 p_aFlag,
												UInt1 p_hFlag,
												UInt1 p_lFlag,
												UInt1 p_kFlag,
												UInt16 p_lifeTime,
												template MipOptionList p_mipOptions) := {	
			bindingUpdate := {
				sequenceNumber := ?,
				aFlag := p_aFlag,
				hFlag := p_hFlag,
				lFlag := p_lFlag,
				kFlag := p_kFlag,
				reserved := c_uInt12Zero,
				lifeTime := p_lifeTime,		
				mipOptions := p_mipOptions
			}
		}

		template MipMessage mw_bindingAck(UInt16 p_seqNr) := {	
			bindingAck := {
				status := c_mipCodeBindingUpdateAccepted,
@@ -208,17 +232,31 @@ module LibIpv6_MultiRfcs_Templates {
	group mobilityOptTemplates {

		/*
		 *	@desc This message is 4 Octets long
		 *	@param  p_dstOpt First element in the Destination option list
		*/
		template MipOption m_mipOpt_padN(template OptPadN p_optPadN) := {
			optPadN := p_optPadN
		template MipOptionList m_mipOptList_1Elem ( template MipOption p_mipOpt ) := {
			p_mipOpt
		}

		/*
		 *	@param  p_dstOpt First element in the Destination option list
		*/
		template MipOptionList m_mipOptList_1Elem ( template MipOption p_mipOpt ) := {
			p_mipOpt
		template MipOptionList m_mipOptList_2Elem ( template MipOption p_mipOpt1, template MipOption p_mipOpt2 ) := {
			p_mipOpt1, p_mipOpt2
		}

		template MipOption m_mipOpt_altCoa(template MipOptAltCoA p_mipOptAltCoA) := {
			mipOptAltCoA := p_mipOptAltCoA
		}

		template MipOption m_mipOpt_padN(template OptPadN p_optPadN) := {
			optPadN := p_optPadN
		}

		template MipOptAltCoA m_mipOptAltCoA(in template Ipv6Address p_addr) := {
			mipOptType :=3,
			mipOptLen := 16,
			alternateCoA := p_addr
		}
		
	}//end group mobilityOptTemplates