#!/usr/bin/perl
#
# $Copyright$
#
# $TAHI: ct/nd/routerSendUnsolRaDefault2.seq,v 1.9 2002/02/27 01:08:29 masaxmasa Exp $

########################################################################
BEGIN { $V6evalTool::TestVersion = '$Name:  $ '; }
 
use V6evalTool;
use nd;
use ra;

ndOptions(@ARGV);

# The following generate debugging messages.
$nd::debug=$ndOpt_v|$ndOpt_vv;

# You can specifies debug options 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_ra=$ra::defaultRA2maxInterval*2;
$max_ras=$nd::MAX_INITIAL_RTR_ADVERTISEMENTS*2;
$ra_mininterval=$ra::defaultRA2minInterval;
$ra_maxinterval=$ra::defaultRA2maxInterval;
$ra_advs=$nd::MAX_INITIAL_RTR_ADVERTISEMENTS;

#
#
#
$type=$V6evalTool::NutDef{Type};
if($type eq host) {
    vLogHTML("This test is for the router only<BR>");
    exit $V6evalTool::exitRouterOnly;
}

$type=$V6evalTool::NutDef{Type};
if($type ne router) {
    vLogHTML(ndErrmsg("ERROR: $V6evalTool::NutDef{Type}: ".
		      "Unknown target type<BR>"));
    exit $V6evalTool::exitFail;
}

#
#
#
raStartDefaultRA2() || exit $V6evalTool::exitFail;

#
#
#
vCapture($IF);

#
#
#
vLogHTML("Wait for RA<BR>");
for($i=0; $i<$max_ras; $i++) {
#    $r=raRecvDefaultRA($IF, $wait_ra, 0, 0, %ret);
    $r=raRecvAnyRA($IF, $wait_ra, 0, 0, %ret);
    last if $ret{status} == 1; # timeout
    if($ret{status} != 0) {
	vLogHTML(ndErrmsg(vErrmsg(%ret))."<BR>");
	goto end;
    }
    $exit_rtn=$V6evalTool::exitFail if $r == 0;
    $n = $ret{recvCount};
    $time[$i] = $ret{"recvTime$n"};
}
if($i == 0) {
    vLogHTML(ndErrmsg("ERROR: Could not get any unsolicited RA<BR>"));
    goto end;
} elsif($i == 1) {
    vLogHTML(ndErrmsg("ERROR: Got single RA, ".
                      "could not test interval time<BR>"));
    goto end;
}

#
# Check intervals of the RAs
#
for($j=0, $over=0, $mark=''; $j<$i-1; $j++, $mark='') {
    #$delta = int(vRoundoff($time[$j+1] - $time[$j] + 0.5));
    $delta = int($time[$j+1] - $time[$j] + 0.5);
    if($delta < $ra_mininterval || $delta > $ra_maxinterval) {
        $over=1;
        $mark=ndErrmsg('*');
    }
    vLogHTML("Retransmit interval[$j]: $mark$delta sec.<BR>");
}
if($over) {
    vLogHTML(ndErrmsg("ERROR: Rate limit violation ".
                      "(&lt; $ra_mininterval, &gt; $ra_maxinterval sec.)".
		      "<BR>"));
    $exit_rtn=$V6evalTool::exitFail;
}

#
#
#
end:
    if($exit_rtn == $V6evalTool::exitPass) {
	vLogHTML("OK<BR>");
    } else {
	vLogHTML(ndErrmsg("NG<BR>"));
    }
    exit $exit_rtn;

########################################################################
__END__

=head1 NAME

routerSendUnsolRaDefault2 - verify a host sending valid RSs

=head1 TARGET

  Router Only

=head1 SYNOPSIS

  routerSendUnsolRaDefault2.seq [-tooloption ...] -p routerSendUnsolRaDefault2.def

=head1 INITIALIZATION

=begin html
Start NUT advertising RAs whose parameters are as same as 
<A HREF="startDefaultRA.html#INITIALIZATION">those</A>
except the followings:
<UL>
  <LI>MaxRtrAdvInterval:7
  <LI>MinRtrAdvInterval:10
</UL>

=end html

=head1 TEST PROCEDURE

B<routerSendUnsolRaDefault2> verifies that a NUT send valid RAs by the rules.
The interval of RAs is between 7 sec. and 10 sec.

=head1 JUDGMENT

=begin html
<PRE>
  1. NUT throw valid RAs:
     - whose parameter are as same as <A HREF="startDefaultRA.html#INITIALIZATION">those</A>.
     - that may contain a source link-layer option.
     - that may contain a MTU option.
     - that may contain a Prefix option.
<BR>
  2. The interval of RAs is between 7 sec. and 10 sec.
</PRE>

=end html

=head1 TERMINATION

  N/A

=head1 NOTE

  TBD

=head1 REFERENCE

=begin html
<PRE>
6.2.4.  Sending Unsolicited Router Advertisements
<BR>
   Unsolicited Router Advertisements are not strictly periodic: the
   interval between subsequent transmissions is randomized to reduce the
   probability of synchronization with the advertisements from other
   routers on the same link [SYNC].  Each advertising interface has its
   own timer.  <B>Whenever a multicast advertisement is sent from an
   interface, the timer is reset to a uniformly-distributed random value
   between the interface's configured MinRtrAdvInterval and
   MaxRtrAdvInterval; expiration of the timer causes the next
   advertisement to be sent and a new random value to be chosen.</B>
<BR>
   <B>For the first few advertisements (up to
   MAX_INITIAL_RTR_ADVERTISEMENTS) sent from an interface when it
   becomes an advertising interface, if the randomly chosen interval is
   greater than MAX_INITIAL_RTR_ADVERT_INTERVAL, the timer SHOULD be set
   to MAX_INITIAL_RTR_ADVERT_INTERVAL instead.</B>  Using a smaller interval
   for the initial advertisements increases the likelihood of a router
   being discovered quickly when it first becomes available, in the
   presence of possible packet loss.
</PRE>

=end html

=head1 SEE ALSO

  perldoc V6evalTool
  perldoc V6evalRemote

=cut
