#!/usr/bin/perl
#
# $Copyright$
#
# $Id: hostRecvRedirect4RFlag2.seq,v 1.1.1.1 2000/10/31 22:38:59 sekiya Exp $
########################################################################
BEGIN { $V6evalTool::TestVersion = '$Name: $ '; }
use V6evalTool;
use nd;
ndOptions(@ARGV);
# The following generate debugging messages.
$nd::debug=$ndOpt_v|$ndOpt_vv;
# You can specifies debug optons to a remote control program.
# If you want to know more detail, please see the following:
# - V6evalTool.pm: perldoc V6evalTool
# - V6evalRemote.pm: perldoc V6evalRemote
$nd::remote_debug="-o1" if $ndOpt_vv;
$IF=Link0;
$wait_dad=3;
$wait_echo=2;
$wait_stale=$nd::REACHABLE_TIME * $nd::MAX_RANDOM_FACTOR;
#
#
#
$type=$V6evalTool::NutDef{Type};
if($type eq router) {
vLogHTML("This test is for the host only
");
exit $V6evalTool::exitHostOnly;
}
$type=$V6evalTool::NutDef{Type};
if($type ne host) {
vLogHTML(ndErrmsg("ERROR: $V6evalTool::NutDef{Type}: ".
"Unknown target type
"));
exit $V6evalTool::exitFail;
}
#
#
#
vLogHTML("
Initialization
");
vCapture($IF);
#
#
#
#goto error if ndClearPrefix() != 0;
#goto error if ndClearDefr() != 0;
goto error if ndClearRoutes() != 0;
goto error if nd2NoNce($IF) != 0;
#
#
#
vLogHTML("Set R1 as the default router
");
$pktdesc{ra_rone2allnode_sll}=
'Router R1 sends RA w/ SLL, then STALE';
$pktdesc{unicast_na_rone2nut_RSO_tll}=
'Router R1 sends NA w/ TLL, then REACHABLE';
vSend($IF,
ra_rone2allnode_sll,
unicast_na_rone2nut_RSO_tll,
);
#
#
#
vLogHTML("Wait for DAD
");
vRecv($IF, $wait_dad, 0, 0);
#
#
#
vLogHTML("
Test
");
#
#
#
vLogHTML("*** Verify that the default router work ***
");
$pktdesc{echo_request_a}=
"Send echo-request that is forwarded from the default router (R1)";
%ret=vSend($IF, echo_request_a);
$pktdesc{echo_reply_a}=
'Got echo-reply that was thrown to the default router (R1)';
%ret=vRecv($IF, $wait_echo, $ret{sentTime1}, 0, echo_reply_a);
goto error if $ret{status} != 0;
#
#
#
vLogHTML("*** Verify that redirect work ***
");
$pktdesc{redirect_rone2nut_tll}="Send redirect to the second router (TN)";
vSend($IF, redirect_rone2nut_tll);
#
#
#
vLogHTML("*** Verify that IsRouter=0 removes Destination Cache entry ***
");
$pktdesc{unicast_na_tn2nut_rSO_tll}="Send NA w/ R=0, then IsRouter=0";
vSend($IF, unicast_na_tn2nut_rSO_tll);
#
#
#
if(isRedirected($IF) ne IGNORED) {
vLogHTML("The echo-reply was thrown to the second router".
"whose IsRouter flag is 0
");
vLogHTML(ndErrmsg("ERROR: NUD does not work at redirected entry
"));
goto error;
}
#
#
#
vLogHTML("
Termination
");
clear();
vLogHTML("*** OK ***
");
exit $V6evalTool::exitPass;
error:
vLogHTML("
Termination
");
clear();
vLogHTML(ndErrmsg("*** NG ***
"));
vLogHTML(vErrmsg(%ret)."
");
exit $V6evalTool::exitFail;
########################################################################
sub isRedirected($)
{
my($if)=@_;
my(%ret, $p);
#
#
#
$pktdesc{echo_reply_b}=
'Got echo-reply that was thrown to the default router (R1)';
$pktdesc{echo_reply_b2}=
'Got echo-reply that was thrown to the second router (TN)';
$pktdesc{multicast_ns_nut2tnsol_sll}=
"Got multicast NS for TN";
$pktdesc{echo_request_b}=
"Send echo-request that is forwarded from the default router (R1)";
$p=echo_request_b;
while(1) {
%ret=vSend($if, $p);
%ret=vRecv($if, $wait_echo, $ret{sentTime1}, 0,
echo_reply_b,
echo_reply_b2,
multicast_ns_nut2tnsol_sll,
);
goto error if $ret{status} != 0;
#
#
#
if($ret{recvFrame} eq echo_reply_b) {
vLogHTML("Redirect is ignored
");
return("IGNORED");
} elsif($ret{recvFrame} eq echo_reply_b2) {
vLogHTML("Redirect is accepted
");
return("REDIRECTED");
} elsif($ret{recvFrame} eq multicast_ns_nut2tnsol_sll) {
$p=unicast_na_tn2nut_rSO_tll;
} else {
vLogHTML(ndErrmsg("ERROR: Got unexpected packet
"));
goto error;
}
}
error:
vLogHTML(vErrmsg(%ret)."
");
return ERROR;
}
#
#
#
sub clear()
{
$pktdesc{ra_rone2allnode_clrrtr}="Clear the Default Router List";
vSend($IF, ra_rone2allnode_clrrtr);
}
########################################################################
__END__
=head1 NAME
hostRecvRedirect4RFlag2 - Verifying Redirect (to a better router) vs. IsRouter flag
=head1 TARGET
Host only
=head1 SYNOPSIS
hostRecvRedirect4RFlag2.seq [-tooloption ...]
-p hostRecvRedirect4RFlag2.def
=head1 INITIALIZATION
=begin html
- Clear IPv6 routes.
- Clear NC state for TN.
- Set R1 as the default router by sending RA and NA.
TN NUT
----------------------
State: NONCE (for R1, TN)
==== unsolicited RA ===>
src=R1's link-local
dst=all-node
M=0, O=0
RouterLifetime=600
ReachableTime=0
RetransTimer=0
w/ SLLA
Prefix Option:
L=1, A=1
ValidLifetime=2592000
PreferredLifetime=604800
Prefix=3ffe:501:ffff:100::/64
State: STALE (for R1), NONCE (for TN)
==== solicited NA ===>
src=R1's link-local
dst=NUT's link-local
R=1, S=1, O=1
target=R1's link-local
TLLA=R1's LLA
State: REACHABLE (for R1), NONCE (for TN)
Wait (3 sec) for DAD NS
=end html
=head1 TEST PROCEDURE
B verifies that an entry of Destination Cache
updated by a redirect message (ICMP Target != ICMP Destination)
is removed by NA w/ RFlag=0.
=begin html
- Send echo-request (src:H1, dst:NUT)
- Verify that NUT send echo-reply to the default router, R1
- Send redirect message to NUT.
- Send NA whose R flag is 0.
- Send echo-request (src:H1, dst:NUT) again.
- Verify that NUT send echo-reply to the default router, R1
TN NUT
----------------------
State: REACHABLE (for R1), NONCE (for TN)
==== echo-request ===>
src=H1(off-link global), prefix=3ffe:501:ffff:109::/64,
but LLA is R1's one
dst=NUT's global, prefix=3ffe:501:ffff:100::/64
<=== Judgment #1: echo-reply ====
src=NUT's global, prefix=3ffe:501:ffff:100::/64
dst=H1(off-link global), prefix=3ffe:501:ffff:109::/64,
but LLA is R1's one
==== redirect ===>
src=R1's link-local
dst=NUT's link-local
icmp target=TN's link-local
icmp destination=H1's global
w/ TLLA
w/o Redirected header
State: REACHABLE (for R1), STALE (for TN)
==== solicited NA ===>
src=TN's link-local
dst=NUT's link-local
R=0, S=1, O=1
target=TN's link-local
TLLA=TN's LLA
State: REACHABLE (for R1, TN)
==== echo-request ===>
src=H1(off-link global), prefix=3ffe:501:ffff:109::/64,
but LLA is R1's one
dst=NUT's global, prefix=3ffe:501:ffff:100::/64
<=== Judgment #1: echo-reply ====
src=NUT's global, prefix=3ffe:501:ffff:100::/64
dst=H1(off-link global), prefix=3ffe:501:ffff:109::/64,
but LLA is R1's one
=end html
=head1 JUDGMENT
=for html
1. NUT must throw echo-reply whose destination is off-link global
to the default router (i.e. R1).
=head1 TERMINATION
Send RA with RouterLifetime=0 to clear the Default Router List.
Clear IPv6 routes by remote command. XXX
=head1 NOTE
The test invokes the following command:
- Clear IPv6 routes
=head1 SEE ALSO
perldoc V6evalTool
perldoc V6evalRemote
=cut