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_CommonRfcs_TypesAndValues all;
import from LibIpv6_CommonRfcs_Templates all;
import from LibIpv6_CommonRfcs_Functions 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);
//set extensionHeaders
if (ispresent(v_ipPkt.generalIpv6.extHdrList)) {
if(f_setExtensionHeaders( v_ipPkt.redirect.extHdrList,
v_ipPkt.redirect.ipv6Hdr.sourceAddress,
v_ipPkt.redirect.ipv6Hdr.destinationAddress,
v_ipPkt) != e_success) {
log(" **** f_sendRedirect: Error when calculating length of extension headers ****");
return e_error;
}
}
//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);
//set extensionHeaders
if (ispresent(v_ipPkt.generalIpv6.extHdrList)) {
if(f_setExtensionHeaders( v_ipPkt.routerAdvert.extHdrList,
v_ipPkt.routerAdvert.ipv6Hdr.sourceAddress,
v_ipPkt.routerAdvert.ipv6Hdr.destinationAddress,
v_ipPkt) != e_success) {
log(" **** f_sendRtAdv: Error when calculating length of extension headers ****");
return e_error;
}
}
//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 ;
}
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
/*
* @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_lifeTime( in template Ipv6Address p_llaAddrTn,
in template Ipv6Address p_dstAddr,
in template PrefixLength p_prefixLength,
in template Ipv6Address p_glaAddrTn,
in UInt32 p_validLifetime,
in UInt32 p_preferredLifetime)
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,
p_validLifetime,
p_preferredLifetime,
f_createPrefix ( p_glaAddrTn, p_prefixLength ) ) ) ) ;
return v_ret ;
}
/*
* @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_sendMipRtAdvWithPrefix( 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_mipRtAdv_noExtHdr( p_llaAddrTn,
p_dstAddr,
c_mFlag0,
c_oFlag0,
c_haFlag1,
c_infiniteLifetime,
c_unspecifiedReachTime,
c_unspecifiedRetransTime,
m_mipRtAdvOpt_prefixOpt ( p_prefixLength,
c_lFlag1,
c_aFlag1,
c_rtAddrFlag1,
c_validLifetime30s,
c_preferredLifetime10s,
p_glaAddrTn,
m_advInterval(c_rtrAdvInterval3000ms),
m_homeAgentInfo(c_haPref10s,
c_haLifetime600s)) ) ) ;
return v_ret ;
}//end f_sendMipRtAdvWithPrefix
* @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);
//set extensionHeaders
if (ispresent(v_ipPkt.nbrAdvert.extHdrList)) {
if(f_setExtensionHeaders( v_ipPkt.nbrAdvert.extHdrList,
v_ipPkt.nbrAdvert.ipv6Hdr.sourceAddress,
v_ipPkt.nbrAdvert.ipv6Hdr.destinationAddress,
v_ipPkt) != e_success) {
log(" **** f_sendNbrAdv: Error when calculating length of extension headers ****");
return e_error;
}
}
//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);
//set extensionHeaders
if (ispresent(v_ipPkt.routerAdvert.extHdrList)) {
if(f_setExtensionHeaders( v_ipPkt.routerAdvert.extHdrList,
v_ipPkt.routerAdvert.ipv6Hdr.sourceAddress,
v_ipPkt.routerAdvert.ipv6Hdr.destinationAddress,
v_ipPkt) != e_success) {
log(" **** f_sendRtAdv: Error when calculating length of extension headers ****");
return e_error;
}
}
//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);
//set extensionHeaders
if (ispresent(v_ipPkt.nbrSolicitation.extHdrList)) {
if(f_setExtensionHeaders( v_ipPkt.nbrSolicitation.extHdrList,
v_ipPkt.nbrSolicitation.ipv6Hdr.sourceAddress,
v_ipPkt.nbrSolicitation.ipv6Hdr.destinationAddress,
v_ipPkt) != e_success) {
log(" **** f_sendNbrSol: Error when calculating length of extension headers ****");
return e_error;
}
}
//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);
//set extensionHeaders
if (ispresent(v_ipPkt.routerSolicitation.extHdrList)) {
if(f_setExtensionHeaders( v_ipPkt.routerSolicitation.extHdrList,
v_ipPkt.routerSolicitation.ipv6Hdr.sourceAddress,
v_ipPkt.routerSolicitation.ipv6Hdr.destinationAddress,
v_ipPkt) != e_success) {
log(" **** f_sendRtSol: Error when calculating length of extension headers ****");
return e_error;
}
}
//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
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
*/
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