#!/usr/bin/perl
#
# $Copyright_v6PC$
#
# $Intap$
# $TINY: LLA_DAD_NAPostDAD_wSLL.seq,v 1.5 2002/03/05 03:04:55 masaxmasa Exp $
# 

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

#------------------------------------------------------
#----- get sequence arguments
#------------------------------------------------------
$howto_initNUT="none";
$send = "ok";
foreach (@ARGV) {
# How to configure address of NUT?
# sample: boot, ra, manual+_GLOBAL0A0N_UCAST
    /^addrconf=(\S+)/ && do {$SAA::howto_addrconf=$1; next; };

# How to initialize NUT?
# sample: none, DADSuccess_boot, DADFail_boot
    /^init=(\S+)/     && do {$howto_initNUT=$1; next; };

# "none" if send no pakcet to NUT in state DADPostSendNS
# sample: ok, none
    /^send=(\S+)/     && do {$send=$1; next; };

# sequence debug options
# sample: qR
    /^sd=(\S+)/       && do {$seqdebugopt=$1; next; };
    seqERROR("Unknown sequence option '$_'");
}
#------------------------------------------------------

#----- test condition
$IF=Link0;                 # network interface

$max_retry_count = 10;     # retry if NUT state becomes DADPostSendNS
$max_retry_count = 2 if $SAA::sd =~ /q/;    # quick retry
$send_interval  = 1;
	       # 1[sec] time between DAD NS and DAD NS, send to NUT
               #     (RandomDelay is 0-1sec  e.g. default RetransTimer 1000msec)

##########################################################
#----- Check Target Type

$type=$V6evalTool::NutDef{Type};
if($type eq host) {
    vCPP('-DRFLAG=0');
}
if($type eq router) {
    vCPP('-DRFLAG=1');
}
if($type eq special) {
    vCPP('-DRFLAG=any');
}

##########################################################
#----- Preparetion
vCapture($IF);
seqPrepareLLA($IF, $V6evalTool::NutDef{System});


#----- initialize NUT
vLog("*** Target initialization phase ***");
if($V6evalTool::NutDef{System} ne "manual"){ vSleep($SAA::test_interval); }
$rret=vRemote("reboot_async.rmt","","timeout=$SAA::wait_rebootcmd");
vLog("reboot_async.rmt returned status $rret");

#----- start Capturing
vLog("*** Target testing phase ***");
vClear($IF);

#----- Wait DAD NS from NUT or timeout

vLog("TN wait DAD NS(DADNS_from_NUT) from NUT for $SAA::wait_dadns{$SAA::howto_addrconf} [sec],");

%ret=vRecv($IF,$SAA::wait_dadns{$SAA::howto_addrconf},0,$count,DADNS_from_NUT);

if ($ret{status} == 0){
    %retSend=vSend($IF, DADNA_from_TN_wSLL);

    #----- check if NUT's address is configured
    vSleep($SAA::wait_addrconf);
    if (seqCheckNUTAddrConfigured($IF) eq TRUE) {
	vLog("NUT assigned the address to the interface.");
	vLog("NUT seems to ignore entire packet not only SLL.");
	if ($SAA::DupAddrDetectTransmits == 0) {
	    vLog("NUT transmit DAD NS though DupAddrDetectTransmits == 0");
	    seqNG();
	}else{
	    seqNG();
	}
    }else{
	vLog("NUT seems to detect Address Duplication,");
	vLog("even though NUT received NA with SLL.");
	vLog("NUT seems to ignore only SLL not entire packet.");
	seqOK();
    }
} else{
    vLog("TN wait DAD NS from NUT for $SAA::wait_dadns{$SAA::howto_addrconf}, but NUT had not transmit DAD NS");
    seqNG();
}
##########################################################


#end
########################################################################
__END__


=head1 NAME

LLA_DAD_NAPostDAD_wSLL - check the process when NUT receives DAD NA with same Target address which contains SLL option, while DAD process(after transmitting DAD NS).

=head1 TARGET

All Node

=head1 SYNOPSIS

LLA_DAD_NAPostDAD_wSLL.seq [-tooloption ...] -pkt <packetdef> [addrconf=<addrconfname>] 

  -tooloption   : v6eval tool option
  <packetdef>   : packet definition file (v6eval tool option)
  <addrconfname>: how to configure address on NUT; boot/reboot

=begin html
<PRE>
 detail of v6eval tool option: see perldoc V6evalTool.pm, perldoc V6evalRemote.pm
</PRE>

=end html


=head1 INITIALIZATION

=begin html
<PRE>
 Reboot NUT or Initialize interface of NUT or Initialize IPv6 stack of NUT.
</PRE>

=end html

=head1 TEST PROCEDURE

=over 1

=item Test for Unicast address configuration

The following tests are prepared in this test package. See INDEX file.

B<Test for all node>
   When NUT performs DAD for its Link-local unicast address made by stateless
   address autoconfiguration, NUT receives DAD NA which contains same target as
   NUT's tentative Link-local address and contains SLL option 
   after transimitting DAD NS.

B<Test sequence>

  TN                            NUT
  ---------------------------------
  Initialize NUT

  Configure address of NUT (reboot or interface initialization etc...)

  TN wait the DAD NS sent from NUT
  <=== Judgement #1: DAD NS =======
        name: DADNS_from_NUT

  ==== Action #1: DAD NA =========>
        name: DADNA_from_TN_wSLL

  Wait for 5+DupAddrDetectTransmits*(RetransTimer/1000)[sec]

  Check if NUT's address is configured
  ==== Action #2: SOL NS =========>
        name: SOLNS_from_TN_SameTgt

  X<== Judgement #2: SOL NA =======
        name: NA_from_NUT, NA_from_NUT_woTLL


=back 1

=head1 JUDGEMENT

=over 1

=item Test for Link-local Unicast address autoconfiguration

B<Test for all NODE>

B<NUT performs Stateless Address Autoconfiguration(Link-local) on its interface>

   Judgement #1. NUT MUST transmit DAD NS for its autoconfigured Link-local address.
        name: DADNS_from_NUT
	src: ::0
	dst: solnode[NUT's tentative Link-local]
        TargetAddress: NUT's tentative Link-local

   Action #1. TN transmits DAD NA which contains same target Address as NUT's tentative Link-local address.
        name: DADNA_from_TN_wSLL
	src: TN's Link-local
	dst: allnode
        TargetAddress: NUT's tentative Link-local
        RFlag: 0 
        SFlag: 0
        OFlag: 1
        TLLOPT: TN's MAC address
        SLLOPT: TN's MAC address

   Action #2. TN transmits SOL NS to check if NUT's address is configured.
        name: SOLNS_from_TN_SameTgt
        src: TN's Link-local
	dst: solnode[NUT's Link-local]
        TargetAddress: NUT's Link-local

   Judgement #2. NUT MUST NOT transmit DAD NA for its autoconfigured  Link-local address.
        name: DADNA_from_NUT, DADNA_from_NUT_woTLL
	src: NUT's Link-local
	dst: TN's Link-local
        TargetAddress: NUT's Link-local
        RFlag: 0 ( if NUT is a Router then 1)
        SFlag: 1
        OFlag: 1
	TLLOPT: NUT's MAC address

=back 1

=head1 REFERENCE

=begin html
<PRE>
RFC2462
<HR>
   (omit)
5.4.4.  Receiving Neighbor Advertisement Messages
<BR>
   On receipt of a valid Neighbor Advertisement message on an interface,
   node behavior depends on whether the target address is tentative or
   matches a unicast or anycast address assigned to the interface.  If
   the target address is assigned to the receiving interface, the
   solicitation is processed as described in [DISCOVERY]. <B>If the target
   address is tentative, the tentative address is not unique.</B>
   (omit)
</PRE>
<HR>
<PRE>
RFC2461
<HR>
   (omit)
4.6.1.  Source/Target Link-layer Address
<BR>
      0                   1                   2                   3
      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |     Type      |    Length     |    Link-Layer Address ...
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
<BR>
   Fields:
<BR>
      Type
                     1 for Source Link-layer Address
                     2 for Target Link-layer Address
<BR>
      Length         The length of the option (including the type and
                     length fields) in units of 8 octets.  For example,
                     the length for IEEE 802 addresses is 1 [IPv6-
                     ETHER].
<BR>
      Link-Layer Address
                     The variable length link-layer address.
<BR>
                     The content and format of this field (including
                     byte and bit ordering) is expected to be specified
                     in specific documents that describe how IPv6
                     operates over different link layers.  For instance,
                     [IPv6-ETHER].
<BR>
   Description
                     The Source Link-Layer Address option contains the
                     link-layer address of the sender of the packet.  <B>It
                     is used in the Neighbor Solicitation, Router
                     Solicitation, and Router Advertisement packets.</B>
<BR>
                     The Target Link-Layer Address option contains the
                     link-layer address of the target.  It is used in
                     Neighbor Advertisement and Redirect packets.
<BR>
                     <B>These options MUST be silently ignored for other
                     Neighbor Discovery messages.</B>
   (omit)
<BR>
<BR>
7.1.2.  Validation of Neighbor Advertisements
<BR>
   A node MUST silently discard any received Neighbor Advertisement
   messages that do not satisfy all of the following validity checks:
<BR>
      - The IP Hop Limit field has a value of 255, i.e., the packet
        could not possibly have been forwarded by a router.
<BR>
      - If the message includes an IP Authentication Header, the message
        authenticates correctly.
<BR>
      - ICMP Checksum is valid.
<BR>
      - ICMP Code is 0.
<BR>
      - ICMP length (derived from the IP length) is 24 or more octets.
<BR>
      - Target Address is not a multicast address.
<BR>
      - If the IP Destination Address is a multicast address the
        Solicited flag is zero.
<BR>
      - All included options have a length that is greater than zero.
<BR>
   The contents of the Reserved field, and of any unrecognized options,
   MUST be ignored.  Future, backward-compatible changes to the protocol
   may specify the contents of the Reserved field or add new options;
   backward-incompatible changes may  use different Code values.
<BR>
   <B>The contents of any defined options that are not specified to be used
   with Neighbor Advertisement messages MUST be ignored and the packet
   processed as normal.</B>  The only defined option that may appear is the
   Target Link-Layer Address option.
<BR>
   A Neighbor Advertisements that passes the validity checks is called a
   "valid advertisement".
<BR>
   (omit)
</PRE>

=end html

=head1 SEE ALSO

=begin html
<PRE>
 detail of v6eval tool option: see perldoc V6evalTool.pm, perldoc V6evalRemote.pm
</PRE>

=end html

=cut
