Newer
Older
/*
* @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
* @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,
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,
f_createPrefix ( p_glaAddrTn, p_prefixLength ) ) ) ) ;
return v_ret ;
}
} // end group routerDiscovery
* @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
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
*/
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