/* * @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 }; import from LibCommon_Time all; //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; import from LibIpv6_Rfc2461NeighborDiscovery_TypesAndValues all; import from LibIpv6_Rfc2463Icmpv6_Functions all; import from LibIpv6_MultiRfcs_TypesAndValues all; import from LibIpv6_MultiRfcs_Templates all; 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 p_redirect Ipv6 packet template with neighborhood advertisement to be sent * @return 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 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 * @return 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_dstAddr Local link address of node under test * @param p_prefixLength Router advertisement option prefix length value * @param p_glaAddrTn Global address of testing node which calls this function */ function f_sendRtAdvWithPrefix( in template Ipv6Address p_llaAddrTn, in template Ipv6Address p_dstAddr, in template PrefixLength p_prefixLength, in template 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_prefixOpt ( p_prefixLength, c_lFlag1, c_aFlag1, c_validLifetime30s, c_preferredLifetime10s, f_createPrefix ( p_glaAddrTn, p_prefixLength ) ) ) ) ; return v_ret ; } } // end group routerDiscovery 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 p_nbrAdv Ipv6 packet template with neighborhood advertisement to be sent * @return 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 /* * @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 * @return 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 p_nbrSol Ipv6 packet template with Neighbor Solicitation to be sent * @return 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 p_rtrSol Ipv6 packet template with Router Solicitation to be sent * @return 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 }//end group neighborDiscovery } // end module LibIpv6_Rfc2461NeighborDiscovery_Functions