#!/usr/bin/perl # # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 # Yokogawa Electric Corporation. # All rights reserved. # # Redistribution and use of this software in source and binary # forms, with or without modification, are permitted provided that # the following conditions and disclaimer are agreed and accepted # by the user: # # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in # the documentation and/or other materials provided with # the distribution. # # 3. Neither the names of the copyrighters, the name of the project # which is related to this software (hereinafter referred to as # "project") nor the names of the contributors may be used to # endorse or promote products derived from this software without # specific prior written permission. # # 4. No merchantable use may be permitted without prior written # notification to the copyrighters. # # 5. The copyrighters, the project and the contributors may prohibit # the use of this software at any time. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHTERS, THE PROJECT AND # CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING # BUT NOT LIMITED THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE, ARE DISCLAIMED. IN NO EVENT SHALL THE # COPYRIGHTERS, THE PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, # INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING # IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # $TINY: RA_decVLT.seq,v 1.9 2002/03/05 17:13:55 miyata Exp $ # ######################################################################## BEGIN { $V6evalTool::TestVersion = '$Name: V6LC_4_0_1 $ '; } 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) $DAD_GA = $SAA::DADTransmitsGA; $DAD_GA =~ tr/a-z/A-Z/ ; $longVLT = 10800; #10800 $shortVLT = 7230; #7230 ########################################################## #----- Check Target Type $type=$V6evalTool::NutDef{Type}; if($type eq router) { vLogHTML("This test is for the host only
"); exit $V6evalTool::exitHostOnly; } if($type ne host) { vLogHTML(ndErrmsg("ERROR: $V6evalTool::NutDef{Type}: ". "Unknown target type
")); exit $V6evalTool::exitFail; } ########################################################## #----- 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 ***"); vCapture($IF); #----- LLA PHASE #----- 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],"); %ret1=vRecv($IF,$SAA::wait_dadns{$SAA::howto_addrconf},0,0,DADNS_from_NUT); if ($ret1{status} != 0){ vLog("TN wait DAD NS from NUT for $SAA::wait_dadns{$SAA::howto_addrconf}, but NUT had not transmit DAD NS"); seqNG(); } #----- RA PHASE vLog("TN received DAD NS from NUT."); vLog("OK! Let's go ahead!"); %ret2=vRecv($IF,$SAA::wait_rs,0,0,RS_from_NUT,RS_from_NUT_wSLL); if ($ret2{status} != 0){ vLog("Though TN had waited RS from NUT for $SAA::wait_rs,"); vLog(" NUT seems not to send RS."); vLog(" Anyway TN is sending Unsolicited RA (Prefix=Global)"); }else{ vLog("TN received RS from NUT."); vLog("TN is sending RA (Prefix=Global)"); } #-------------------------- # First RA #-------------------------- vSend($IF, RA_GA0_VP10800); #--- VLT=10800/PLT=10800 $t0 = time(); #----- Wait DAD NS from NUT or timeout vLog("TN wait DAD NS for Global address from NUT for $SAA::wait_dadns{ra} [sec],"); %ret3=vRecv($IF,$SAA::wait_dadns{ra},0,0,DADNS_from_NUT_GA0Tgt); if ($ret3{status} == 0){ #----- check if NUT's address is configured vLog("NUT had transmitted DAD NS for its Global address."); $t0 = time(); #-- Here is the better posiotion for t0 vLog("DAD complete time= $t0"); vSleep($SAA::wait_addrconf_with_RA); if (seqCheckNUTAddrConfiguredGA($IF, SOLNS_from_TN_GA0Tgt, NA_from_NUT_GA0Tgt, NA_from_NUT_GA0Tgt_woTLL, NA_from_GA0NUT_GA0Tgt, NA_from_GA0NUT_GA0Tgt_woTLL) eq TRUE) { vLog("NUT assigned Global address to the interface."); if ($DAD_GA eq "NO") { vLog("NUT transmit DAD NS though DADTransmitsGA == NO"); seqNG(); }else{ vLog("OK! Let's go ahead."); } }else{ vLog("NUT did not assign Global address."); seqNG(); } } elsif ($ret3{status} != 0){ vLog("NUT had not transmitted DAD NS for Global address."); if (seqCheckNUTAddrConfiguredGA($IF, SOLNS_from_TN_GA0Tgt, NA_from_NUT_GA0Tgt, NA_from_NUT_GA0Tgt_woTLL, NA_from_GA0NUT_GA0Tgt, NA_from_GA0NUT_GA0Tgt_woTLL) eq TRUE) { vLog("NUT assigned Global address to the interface."); if ($DAD_GA eq "YES") { vLog("NUT did not transmit DAD NS though DADTransmitsGA == YES"); seqNG(); }else{ vLog("But it is OK if Global address consists of MAC address as LLA."); vLog("OK! Let's go ahead."); } }else{ vLog("NUT did not assign Global address."); seqNG(); } } $t1 = time(); #--- Wait 1/2 of $longerVLT #vSleep($t0 + ($longVLT/2) - $t1); #-------------------------- # Send RA with shorter VLT(2nd) #-------------------------- vSend($IF, RA_GA0_VP7230); #--- VLT=7230/PLT=7230 $t2 = time(); #----- Wait DAD NS from NUT or timeout vLog("TN wait DAD NS for Global address from NUT for $SAA::wait_dadns{ra} [sec],"); %ret4=vRecv($IF,$SAA::wait_dadns{ra},0,0,DADNS_from_NUT_GA0Tgt,DADNS_any, DADNS_any_wSLL); if ($ret4{status} == 0){ #----- check if NUT's address is configured vLog("NUT transmitted DAD NS for its Global address"); vLog("by receiving RA with greater VLT."); vSleep($SAA::wait_addrconf_with_RA); if (seqCheckNUTAddrConfiguredGA($IF, SOLNS_from_TN_GA0Tgt, NA_from_NUT_GA0Tgt, NA_from_NUT_GA0Tgt_woTLL, NA_from_GA0NUT_GA0Tgt, NA_from_GA0NUT_GA0Tgt_woTLL) eq TRUE) { vLog("The address is still available."); if ($DAD_GA eq "NO") { vLog("NUT transmitted DAD NS though DADTransmitsGA == NO"); seqNG(); } vLog("OK! Let's go ahead."); }else{ vLog("The address is not available."); seqNG(); } } elsif ($ret4{status} != 0){ vLog("NUT did not transmitted DAD NS for Global address"); vLog("by receiving RA with greater VLT."); if (seqCheckNUTAddrConfiguredGA($IF, SOLNS_from_TN_GA0Tgt, NA_from_NUT_GA0Tgt, NA_from_NUT_GA0Tgt_woTLL, NA_from_GA0NUT_GA0Tgt, NA_from_GA0NUT_GA0Tgt_woTLL) eq TRUE) { vLog("The address is still available."); vLog("OK! Let's go ahead."); }else{ vLog("The address is not available."); seqNG(); } } #-------------------------- # Sleep until 15 sec before expiration of VLT in the 2nd RA since receiving it #-------------------------- $t3 = time(); vSleep($t2+$shortVLT-$t3-15); vLog("15 sec before the expiration of VLT in the 2nd RA since receiving it."); vLog("Confirming whether assinged address is available."); if (seqCheckNUTAddrConfiguredGA($IF, SOLNS_from_TN_GA0Tgt, NA_from_NUT_GA0Tgt, NA_from_NUT_GA0Tgt_woTLL, NA_from_GA0NUT_GA0Tgt, NA_from_GA0NUT_GA0Tgt_woTLL) eq TRUE) { vLog("The address is still available."); }else{ vLog("The address is not available."); seqNG(); } #-------------------------- # Sleep until 15 sec after expiration of VLT in the 2nd RA since receiving it #-------------------------- $t4 = time(); vSleep($t2+$shortVLT-$t4+15); vLog("15 sec after the expiration of VLT in the 2nd RA since receiving it."); vLog("Confirming whether assinged address is available."); if (seqCheckNUTAddrConfiguredGA($IF, SOLNS_from_TN_GA0Tgt, NA_from_NUT_GA0Tgt, NA_from_NUT_GA0Tgt_woTLL, NA_from_GA0NUT_GA0Tgt, NA_from_GA0NUT_GA0Tgt_woTLL) eq TRUE) { vLog("The address is still available."); seqNG(); }else{ vLog("The address is not available."); seqOK(); } ######################### ######################### ######################### ######################### ######################### ######################### ########################################################## #end ######################################################################## __END__ =head1 NAME RA_gt2gt2 - check the address expiration process. NUT receives RAs twice times which contain one Global Prefix, and first RA contains 3hours as VLT value, second RA contains 2hours 30second VLT value.(Assigning and Expiring Global address) =head1 TARGET Host only =head1 SYNOPSIS RA_gt2gt2.seq [-tooloption ...] -pkt [addrconf=] -tooloption : v6eval tool option : packet definition file (v6eval tool option) : how to configure address on NUT; boot/reboot =begin html
 detail of v6eval tool option: see perldoc V6evalTool.pm, perldoc V6evalRemote.pm
=end html =head1 INITIALIZATION =begin html
 Reboot NUT or Initialize interface of NUT or Initialize IPv6 stack of NUT.
=end html =head1 TEST PROCEDURE =over 1 =item Test for Unicast address autoconfiguration The following tests are prepared in this test package. See INDEX file. B When NUT receives RA which contains Global Prefix and 3hours as VLT value, NUT assignes autoconfigured address. Later NUT receives different RA which contains same prefix and 2hours 30second as VLT value before first VLT exires. At this point, NUT resets its VLT using second VLT, and the assinged address MUST expire second VLT[sec] later. B 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 <=== Judgement #2: RS =========== name: RS_from_NUT, RS_from_NUT_wSLL ==== Action #1: RA =============> name: RA_GA0_VP10800 (1st RA VLT=longVLT) <=== Judgement #3: DAD NS ======= name: DADNS_from_NUT_GA0Tgt Wait for 5+DupAddrDetectTransmits*(RetransTimer/1000)[sec] Check if NUT's address is configured ==== Action #2: SOL NS =========> name: SOLNS_from_TN_GA0Tgt <=== Judgement #4: SOL NA ======= name: NA_from_NUT_GA0Tgt, NA_from_NUT_GA0Tgt_woTLL, NA_from_GA0NUT_GA0Tgt, NA_from_GA0NUT_GA0Tgt_woTLL ==== Action #3: RA =============> name: RA_GA0_VP7230 (2nd RA VLT=shortVLT) X<== Judgement #5: DAD NS ======= name: DADNS_from_NUT_GA0Tgt,DADNS_any, DADNS_any_wSLL Check if NUT's address is configured ==== Action #4: SOL NS =========> name: SOLNS_from_TN_GA0Tgt <=== Judgement #6: SOL NA ======= name: NA_from_NUT_GA0Tgt, NA_from_NUT_GA0Tgt_woTLL, NA_from_GA0NUT_GA0Tgt, NA_from_GA0NUT_GA0Tgt_woTLL Wait until (shortVLT)-15[sec] pasts since receiving 2nd RA Check if NUT's address is configured ==== Action #5: SOL NS =========> name: SOLNS_from_TN_GA0Tgt <=== Judgement #7: SOL NA ======= name: NA_from_NUT_GA0Tgt, NA_from_NUT_GA0Tgt_woTLL, NA_from_GA0NUT_GA0Tgt, NA_from_GA0NUT_GA0Tgt_woTLL Wait until (shortVLT)+15[sec] pasts since receiving 2nd RA Check if NUT's address is configured ==== Action #6: SOL NS =========> name: SOLNS_from_TN_GA0Tgt X<=== Judgement #8: DAD NA ======= name: NA_from_NUT_GA0Tgt, NA_from_NUT_GA0Tgt_woTLL, NA_from_GA0NUT_GA0Tgt, NA_from_GA0NUT_GA0Tgt_woTLL =back 1 =head1 JUDGEMENT =over 1 =item Test for Unicast address autoconfiguration B B 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 Judgement #2. NUT SHOULD transmit RS. name: RS_from_NUT src: NUT's Link-local dst: allrouter Action #1. TN transmits RA which contains Global Prefix. name: RA_GA0_VP10800 src: TN's Link-local dst: allnode PXOPT: Global0 VLT=10800 PLT=10800 Judgement #3. NUT MUST transmit DAD NS for its autoconfigured Global address. (* If the address is consisits of EUI64, as same as Link-local address, This DAD MAY be omitted.) name: DADNS_from_NUT_GA0Tgt src: ::0 dst: solnode[NUT's tentative Global0] TargetAddress: NUT's tentative Global0 Action #2. TN transmits SOL NS to check if NUT's address is configured. name: SOLNS_from_TN_GA0Tgt src: TN's Link-local dst: solnode[NUT's Global0] TargetAddress: NUT's Global0 Judgement #4. NUT MUST transmit SOL NA for its autoconfigured Global address. name: NA_from_NUT_GA0Tgt, NA_from_NUT_GA0Tgt_woTLL, NA_from_GA0NUT_GA0Tgt, NA_from_GA0NUT_GA0Tgt_woTLL src: NUT's any Unicast Address dst: TN's Link-local TargetAddress: NUT's Global0 RFlag: 0 SFlag: 1 OFlag: 1 TLLOPT: NUT's MAC address (* TLLOPT may be omitted) Action #3. TN transmits RA which contains Global Prefix. name: RA_GA0_VP7230 src: TN's Link-local dst: allnode PXOPT: Global0 VLT=7230 PLT=7230 Judgement #5. NUT MUST NOT transmit DAD NS for its autoconfigured Global address. (* If the address is consisits of EUI64, as same as Link-local address, This DAD MAY be omitted.) name: DADNS_from_NUT_GA0Tgt,DADNS_any, DADNS_any_wSLL src: ::0 dst: solnode[NUT's tentative Global0] TargetAddress: NUT's tentative Global0 Action #4. TN transmits SOL NS to check if NUT's address is configured. name: SOLNS_from_TN_GA0Tgt src: TN's Link-local dst: solnode[NUT's Global0] TargetAddress: NUT's Global0 Judgement #6. NUT MUST transmit SOL NA for its autoconfigured Global address. name: NA_from_NUT_GA0Tgt, NA_from_NUT_GA0Tgt_woTLL, NA_from_GA0NUT_GA0Tgt, NA_from_GA0NUT_GA0Tgt_woTLL src: NUT's any Unicast Address dst: TN's Link-local TargetAddress: NUT's Global0 RFlag: 0 SFlag: 1 OFlag: 1 TLLOPT: NUT's MAC address (* TLLOPT may be omitted) Action #5. TN transmits SOL NS to check if NUT's address is configured. name: SOLNS_from_TN_GA0Tgt src: TN's Link-local dst: solnode[NUT's Global0] TargetAddress: NUT's Global0 Judgement #7. NUT MUST transmit SOL NA for its autoconfigured Global address. name: NA_from_NUT_GA0Tgt, NA_from_NUT_GA0Tgt_woTLL, NA_from_GA0NUT_GA0Tgt, NA_from_GA0NUT_GA0Tgt_woTLL src: NUT's any Unicast Address dst: TN's Link-local TargetAddress: NUT's Global0 RFlag: 0 SFlag: 1 OFlag: 1 TLLOPT: NUT's MAC address (* TLLOPT may be omitted) Action #6. TN transmits SOL NS to check if NUT's address is configured. name: SOLNS_from_TN_GA0Tgt src: TN's Link-local dst: solnode[NUT's Global0] TargetAddress: NUT's Global0 Judgement #8. NUT MUST NOT transmit SOL NA for its autoconfigured Global address. name: NA_from_NUT_GA0Tgt, NA_from_NUT_GA0Tgt_woTLL, NA_from_GA0NUT_GA0Tgt, NA_from_GA0NUT_GA0Tgt_woTLL src: NUT's any Unicast Address dst: TN's Link-local TargetAddress: NUT's Global0 RFlag: 0 SFlag: 1 OFlag: 1 TLLOPT: NUT's MAC address (* TLLOPT may be omitted) =back 1 =cut # =head1 REFERENCE # # =begin html #
# RFC2462
# 
# (omit) #
# 5.5.3. Router Advertisement Processing #
# (omit) #
# e) If the advertised prefix matches the prefix of an autoconfigured # address (i.e., one obtained via stateless or stateful address # autoconfiguration) in the list of addresses associated with the # interface, the specific action to perform depends on the Valid # Lifetime in the received advertisement and the Lifetime # associated with the previously autoconfigured address (which we # call StoredLifetime in the discussion that follows): #
# 1) If the received Lifetime is greater than 2 hours or greater # than StoredLifetime, update the stored Lifetime of the # corresponding address. #
# 2) If the StoredLifetime is less than or equal to 2 hours and the # received Lifetime is less than or equal to StoredLifetime, # ignore the prefix, unless the Router Advertisement from which # this Prefix Information option was obtained has been # authenticated (e.g., via IPSec [RFC2402]). If the Router # Advertisment was authenticated, the StoredLifetime should be # set to the Lifetime in the received option. #
# 3) Otherwise, reset the stored Lifetime in the corresponding # address to two hours. #
# The above rules address a specific denial of service attack in # which a bogus advertisement could contain prefixes with very # small Valid Lifetimes. Without the above rules, a single # unauthenticated advertisement containing bogus Prefix Information # options with short Lifetimes could cause all of a node's # addresses to expire prematurely. The above rules insure that # legitimate advertisements (which are sent periodically) will # "cancel" the short lifetimes before they actually take effect. #
# 5.5.4. Address Lifetime Expiry #
# A preferred address becomes deprecated when its preferred lifetime # expires. A deprecated address SHOULD continue to be used as a source # address in existing communications, but SHOULD NOT be used in new # communications if an alternate (non-deprecated) address is available # and has sufficient scope. IP and higher layers (e.g., TCP, UDP) MUST # continue to accept datagrams destined to a deprecated address since a # deprecated address is still a valid address for the interface. An # implementation MAY prevent any new communication from using a # deprecated address, but system management MUST have the ability to # disable such a facility, and the facility MUST be disabled by # default. #
# An address (and its association with an interface) becomes invalid # when its valid lifetime expires. An invalid address MUST NOT be used # as a source address in outgoing communications and MUST NOT be # recognized as a destination on a receiving interface. #
# (omit) #
# # =end html # =pod =head1 REFERENCE =begin html
RFC 2462 - IPv6 Stateless Address Autoconfiguration
=end html =head1 SEE ALSO =begin html
 detail of v6eval tool option: see perldoc V6evalTool.pm, perldoc V6evalRemote.pm
=end html =cut