LibIpv6_Rfc2461NeighborDiscovery_Functions.ttcn 6.21 KB
Newer Older
alex's avatar
alex committed
/*
 *	@author 	STF 276
 *  @version 	$Id$
 *	@desc		This module specifies common neighborhood and router
 *              discovery messages interchanges (= operations)
 *              for an Ipv6 test component.
 *              Functions do not set a test component verdict but instead
 *              use the function return value instead to notify the function
 *              caller about the success of the operation.
 *
 */
module LibIpv6_Rfc2461NeighborDiscovery_Functions {

	//LibCommon
	import from LibCommon_BasicTypesAndValues all;
	import from LibCommon_DataStrings all;
	import from LibCommon_VerdictControl { type FncRetCode };
	//LibIpv6
	import from LibIpv6_ExternalFunctions all;
	import from LibIpv6_Interface all ;
	import from LibIpv6_Rfc2460Root_TypesAndValues { type all };
	import from LibIpv6_ModuleParameters all ;
	import from LibIpv6_MultiRfcs_Templates all;
	import from LibIpv6_MultiRfcs_TypesAndValues all;
	import from LibIpv6_Rfc2461NeighborDiscovery_Templates all;
	import from LibIpv6_Rfc2461NeighborDiscovery_TypesAndValues all;

	/*
	** @desc  	This sends an ICMPv6 router advertisement from a router node
	**			to any NUT. Prior it modifies IPv6 packet payload length
	**			and ICMPv6 checksum to their correct values
	** @remark  The template passed in must NOT contain any matching expressions!
	** @param 	p_rtAdv Ipv6 packet template with router advertisement to be sent
	** @returns	execution status
	*/
	function f_sendRtAdv (in template RouterAdvertisement p_rtAdv)
	runs on LibIpv6Node
	return FncRetCode {
		var Ipv6Packet v_ipPkt;
		v_ipPkt.routerAdvert := valueof(p_rtAdv);
		//calc payloadLen
		v_ipPkt.routerAdvert.ipv6Hdr.payloadLength := fx_payloadLength (v_ipPkt);
		//set checksum to zero
		v_ipPkt.routerAdvert.checksum := c_2ZeroBytes;
		//calc checksum
		v_ipPkt.routerAdvert.checksum := fx_icmpv6Checksum(v_ipPkt);
		//send
		ipPort.send(v_ipPkt.routerAdvert);

		return e_success;

	} // end f_sendRtAdv

	/*
	** @desc  	This functions sends a router advertisement with the specified
	**			prefix, so that NUT adds the test component as its RT to its
	**          default router list
	** @param 	p_llaAddrTn Local link address of testing node which calls this function
	** @param 	p_llaAddrNut Local link address of node under test
	** @param 	p_prefix Router advertisement option prefix value
	** @param 	p_glaAddrTn Global address of testing node which calls this function
	*/
	function f_sendRtAdvWithPrefix( in Ipv6Address 	p_llaAddrTn,
									in Ipv6Address 	p_dstAddr,
									in PrefixLength p_prefixLength,
									in Ipv6Address 	p_glaAddrTn)
	runs on LibIpv6Node
	return FncRetCode {

			var FncRetCode v_ret;

			v_ret := f_sendRtAdv( m_rtAdv_noExtHdr( p_llaAddrTn,
													p_dstAddr,
													c_mFlag0,
													c_oFlag0,
													c_infiniteLifetime,
													c_unspecifiedReachTime,
													c_unspecifiedRetransTime,
													m_rtAdvOpt_prefix (		p_prefixLength,
																			c_lFlag1,
																			c_aFlag1,
																			c_infiniteLifetime,
																			c_infiniteLifetime,
																			p_glaAddrTn)) ) ;
			return v_ret ;
	}

	/*
		** @desc  	This functions sends a router advertisement with the specified
		**			prefix with routerLifetime and prefixLifetime set to Zero.
		**			This is used in the postamble to make the IUT to delete neighbor cache.
		** @param 	p_llaAddrTn Local link address of testing node which calls this function
		** @param 	p_llaAddrNut Local link address of node under test
		** @param 	p_prefix Router advertisement option prefix value
    	** @param 	p_glaAddrTn Global address of testing node which calls this function
		*/
		function f_sendRtAdvCleanUp( in Ipv6Address 	p_llaAddrTn,
										in Ipv6Address 	p_dstAddr,
										in PrefixLength p_prefixLength,
										in Ipv6Address 	p_glaAddrTn)
		runs on LibIpv6Node
		return FncRetCode {

				var FncRetCode v_ret;

				v_ret := f_sendRtAdv( m_rtAdv_noExtHdr( p_llaAddrTn,
														p_dstAddr,
														c_mFlag0,
														c_oFlag0,
														c_zeroLifetime,
														c_unspecifiedReachTime,
														c_unspecifiedRetransTime,
														m_rtAdvOpt_prefix (		p_prefixLength,
																				c_lFlag1,
																				c_aFlag1,
																				c_zeroLifetime,
																				c_zeroLifetime,
																				p_glaAddrTn)) ) ;
				return v_ret ;
		}


	group neighborDiscovery {

		/*
		** @desc  	This sends an ICMPv6 neighborhood advertisement from any
		**			Ipv6 node to the NUT. Prior it modifies IPv6 packet payload
		**			length and ICMPv6 checksum to their correct values
		** @remark  The template passed in must NOT contain any matching expressions!
		** @param 	Ipv6 packet template with neighborhood advertisement to be sent
		** @returns	execution status
		*/
		function f_sendNbrAdv(in template NeighborAdvertisement p_nbrAdv)
		runs on LibIpv6Node
		return FncRetCode {
			var Ipv6Packet v_ipPkt;
			v_ipPkt.nbrAdvert := valueof(p_nbrAdv);
			//calc payloadLen
			v_ipPkt.nbrAdvert.ipv6Hdr.payloadLength := fx_payloadLength (v_ipPkt);
			//set checksum to zero
			v_ipPkt.nbrAdvert.checksum := c_2ZeroBytes;
			//calc checksum
			v_ipPkt.nbrAdvert.checksum := fx_icmpv6Checksum(v_ipPkt);
			//send
			ipPort.send(v_ipPkt.nbrAdvert);

			return e_success;

		}// end f_sendNbrAdv

	}//end group neighborDiscovery

	/*
	** @desc  	This sends an ICMPv6 redirect 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 	Ipv6 packet template with neighborhood advertisement to be sent
	** @returns	execution status
	*/
	function f_sendRedirect(in template Redirect p_redirect)
	runs on LibIpv6Node
	return FncRetCode {
		var Ipv6Packet v_ipPkt;
		v_ipPkt.redirect := valueof(p_redirect);
		//calc payloadLen
		v_ipPkt.redirect.ipv6Hdr.payloadLength := fx_payloadLength (v_ipPkt);
		//set checksum to zero
		v_ipPkt.redirect.checksum := c_2ZeroBytes;
		//calc checksum
		v_ipPkt.redirect.checksum := fx_icmpv6Checksum(v_ipPkt);
		//send
		ipPort.send(v_ipPkt.redirect);

		return e_success;

	}// end f_sendRedirect

} // end module LibIpv6_Rfc2461NeighborDiscovery_Functions