LibIpv6_Rfc2461NeighborDiscovery_Functions.ttcn 9.36 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;
peter's avatar
peter committed
	import from LibCommon_VerdictControl { type FncRetCode };
	import from LibCommon_Time all;
alex's avatar
alex committed
	//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_Rfc2461NeighborDiscovery_Templates all;
validator's avatar
validator committed
	import from LibIpv6_Rfc2461NeighborDiscovery_TypesAndValues all;
peter's avatar
peter committed
	import from LibIpv6_Rfc2463Icmpv6_Functions all;
	import from LibIpv6_MultiRfcs_TypesAndValues all;
	import from LibIpv6_MultiRfcs_Templates all;

	group routerDiscovery {

		/*
		** @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
		*/
validator's avatar
validator committed
		function f_sendRtAdvWithPrefix( in template Ipv6Address 	p_llaAddrTn,
										in template Ipv6Address 	p_dstAddr,
peter's avatar
peter committed
										in template PrefixLength p_prefixLength,
validator's avatar
validator committed
										in template Ipv6Address 	p_glaAddrTn)
peter's avatar
peter committed
		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,
peter's avatar
peter committed
														m_rtAdvOpt_prefixOpt (		p_prefixLength,
peter's avatar
peter committed
																				c_lFlag1,
																				c_aFlag1,
																				c_infiniteLifetime,
																				c_infiniteLifetime,
																				f_createPrefix ( p_glaAddrTn, p_prefixLength ) ) ) ) ;
				return v_ret ;
		}

	} // end group routerDiscovery
alex's avatar
alex committed

	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

peter's avatar
peter committed
        /*
        ** @desc  	This sends an ICMPv6 router advertisement from a router node
        **			to any NUT and waits 1 sec (give IUT time tp process the packet).
        **          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_sendRtAdvAndWait (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);

            f_sleep ( PX_T_BUILD_GLA );

	        return e_success;

        } // end f_sendRtAdv

		/*
		** @desc  	This sends an ICMPv6 Neighbor Solicitation 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 Neighbor Solicitation to be sent
		** @returns	execution status
		*/
		function f_sendNbrSol(in template NeighborSolicitation p_nbrSol) 
		runs on LibIpv6Node 
		return FncRetCode {
			var Ipv6Packet v_ipPkt;
			v_ipPkt.nbrSolicitation := valueof(p_nbrSol);
			//calc payloadLen
			v_ipPkt.nbrSolicitation.ipv6Hdr.payloadLength := fx_payloadLength (v_ipPkt);
			//set checksum to zero
			v_ipPkt.nbrSolicitation.checksum := c_2ZeroBytes;
			//calc checksum
			v_ipPkt.nbrSolicitation.checksum := fx_icmpv6Checksum(v_ipPkt);
			//send
			ipPort.send(v_ipPkt.nbrSolicitation);
			
			return e_success;
			
		}// end f_sendNbrSol

		/*
		** @desc  	This sends an ICMPv6 Router Solicitation 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 Router Solicitation to be sent
		** @returns	execution status
		*/
		function f_sendRtSol(in template RouterSolicitation p_rtrSol) 
		runs on LibIpv6Node 
		return FncRetCode {
			var Ipv6Packet v_ipPkt;
			v_ipPkt.routerSolicitation := valueof(p_rtrSol);
			//calc payloadLen
			v_ipPkt.routerSolicitation.ipv6Hdr.payloadLength := fx_payloadLength (v_ipPkt);
			//set checksum to zero
			v_ipPkt.routerSolicitation.checksum := c_2ZeroBytes;
			//calc checksum
			v_ipPkt.routerSolicitation.checksum := fx_icmpv6Checksum(v_ipPkt);
			//send
			ipPort.send(v_ipPkt.routerSolicitation);
			
			return e_success;
			
		}// end f_sendRtSol

	/*
	** @desc 	This function initiates Neighbor detection.
	**			Sent and received packets must be given as templates.
	** @remark  Time limit is defined by module parameter PX_TAC (see comp type)
	** @param 	p_echoRequest Echo Request to be sent
	** @param 	p_nbrSol Neighbor Solicitation to be sent
	** @param 	p_nbrAdv template of an NA that is sent by NUT
	** @return 	execution status
	*/
	function f_performNeighborDetection (
		in template NeighborSolicitation p_nbrSol,
		in template NeighborAdvertisement p_nbrAdv )
	runs on LibIpv6Node
	return FncRetCode {

		var FncRetCode v_ret;

		// Send a Neighbor Solicitation
		v_ret := f_sendNbrSol ( p_nbrSol );
		if ( v_ret != e_success ) { return v_ret; }

		tc_ac.start;
		alt {
			[]	ipPort.receive ( p_nbrAdv ) {
					tc_ac.stop;
					v_ret := e_success;
				}
			[]	tc_ac.timeout{
					v_ret := e_timeout;
				}
		} // end alt

		return v_ret;

	} // end f_performNeighborDetection

alex's avatar
alex committed
	}//end group neighborDiscovery

peter's avatar
peter committed
	group redirect {

		/*
		** @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 group redirect
alex's avatar
alex committed

} // end module LibIpv6_Rfc2461NeighborDiscovery_Functions