#!/usr/bin/perl # # $Copyright$ # $TINY: RA_incVLT.seq,v 1.8 2002/03/05 17:13:55 miyata Exp $ # ######################################################################## BEGIN { $V6evalTool::TestVersion = '$Name: $ '; } use V6evalTool; use DAD_LCNA; #------------------------------------------------------ #----- 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 {$DAD_LCNA::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 $DAD_LCNA::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 = $DAD_LCNA::DADTransmitsGA; $DAD_GA =~ tr/a-z/A-Z/ ; $shortVLT=30; $longVLT=60; ########################################################## #----- initialize NUT vLog("*** Target initialization phase ***"); $rret=vRemote("reboot_async.rmt","","timeout=5"); 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 $DAD_LCNA::wait_dadns{$DAD_LCNA::howto_addrconf} [sec],"); %ret1=vRecv($IF,$DAD_LCNA::wait_dadns{$DAD_LCNA::howto_addrconf},0,0,DADNS_from_NUT); if ($ret1{status} != 0){ vLog("TN wait DAD NS from NUT for $DAD_LCNA::wait_dadns{$DAD_LCNA::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,$DAD_LCNA::wait_rs,0,0,RS_from_NUT,RS_from_NUT_wSLL); if ($ret2{status} != 0){ vLog("Though TN had waited RS from NUT for $DAD_LCNA::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); #--- VLT=30/PLT=15 $t0 = time(); #----- Wait DAD NS from NUT or timeout vLog("TN wait DAD NS for Global address from NUT for $DAD_LCNA::wait_dadns{ra} [sec],"); %ret3=vRecv($IF,$DAD_LCNA::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."); vSleep($DAD_LCNA::RetransTimerSec); $t0 = time(); #-- Here is the better posiotion for t0 vLog("DAD complete time= $t0"); if (seqCheckNUTAddrConfiguredGA($IF,DADNS_from_TN_GA0Tgt, DADNA_from_NUT_GA0Tgt, DADNA_from_NUT_GA0Tgt_woTLL, DADNA_from_GA0NUT_GA0Tgt, DADNA_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 == 0"); seqNG(); }else{ vLog("OK! Let's go ahead."); } }else{ vLog(" NUT had not assign Global address."); seqNG(); } } elsif ($ret3{status} != 0){ vLog("NUT had not transmitted DAD NS for Global address."); if (seqCheckNUTAddrConfiguredGA($IF,DADNS_from_TN_GA0Tgt, DADNA_from_NUT_GA0Tgt, DADNA_from_NUT_GA0Tgt_woTLL, DADNA_from_GA0NUT_GA0Tgt, DADNA_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(); } } #--- Wait 1/2 of $shortVLT $t1 = time(); vSleep($t0+$shortVLT/2+5-$t1); #-------------------------- # Send RA with Longer VLT #-------------------------- vSend($IF, RA_GA0_VLT60); #--- VLT=60/PLT=30 $t2 = time(); #----- Wait DAD NS from NUT or timeout vLog("TN wait DAD NS for Global address from NUT for $DAD_LCNA::wait_dadns{ra} [sec],"); %ret4=vRecv($IF,$DAD_LCNA::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($DAD_LCNA::RetransTimerSec); if (seqCheckNUTAddrConfiguredGA($IF,DADNS_from_TN_GA0Tgt, DADNA_from_NUT_GA0Tgt, DADNA_from_NUT_GA0Tgt_woTLL, DADNA_from_GA0NUT_GA0Tgt, DADNA_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"); } }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 VLD."); if (seqCheckNUTAddrConfiguredGA($IF,DADNS_from_TN_GA0Tgt, DADNA_from_NUT_GA0Tgt, DADNA_from_NUT_GA0Tgt_woTLL, DADNA_from_GA0NUT_GA0Tgt, DADNA_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 3 sec before expiration of VLT in the 1st RA since receiving it #-------------------------- $t3 = time(); vSleep($t0+$shortVLT-$t3-3); vLog("3 sec before the expiration of VLT in the 1st RA since receiving it."); vLog("Confirming whether assinged address is available."); if (seqCheckNUTAddrConfiguredGA($IF,DADNS_from_TN_GA0Tgt, DADNA_from_NUT_GA0Tgt, DADNA_from_NUT_GA0Tgt_woTLL, DADNA_from_GA0NUT_GA0Tgt, DADNA_from_GA0NUT_GA0Tgt_woTLL) eq TRUE) { vLog("The address is still available."); }else{ vLog("The address is not available."); seqNG(); } #-------------------------- # Sleep until 3 sec after expiration of VLT in the 1st RA since receiving it #-------------------------- vSleep(6); vLog("3 sec after the expiration of VLT in the 1st RA since receiving it."); vLog("Confirming whether assinged address is available."); if (seqCheckNUTAddrConfiguredGA($IF,DADNS_from_TN_GA0Tgt, DADNA_from_NUT_GA0Tgt, DADNA_from_NUT_GA0Tgt_woTLL, DADNA_from_GA0NUT_GA0Tgt, DADNA_from_GA0NUT_GA0Tgt_woTLL) eq TRUE) { vLog("The address is still available."); }else{ vLog("The address is not available."); seqNG(); } #-------------------------- # Sleep until 3 sec before expiration of VLT in the 2nd RA since receiving it #-------------------------- $t4 = time(); vSleep($t2+$longVLT-$t4-3); vLog("3 sec before the expiration of VLT in the 2nd RA since receiving it."); vLog("Confirming whether assinged address is available."); if (seqCheckNUTAddrConfiguredGA($IF,DADNS_from_TN_GA0Tgt, DADNA_from_NUT_GA0Tgt, DADNA_from_NUT_GA0Tgt_woTLL, DADNA_from_GA0NUT_GA0Tgt, DADNA_from_GA0NUT_GA0Tgt_woTLL) eq TRUE) { vLog("The address is still available."); }else{ vLog("The address is not available."); seqNG(); } #-------------------------- # Sleep until 3 sec after expiration of VLT in the 2nd RA since receiving 2nd RA #-------------------------- vSleep(6); vLog("3 sec after the expiration of VLT in the 2nd RA since receiving it."); vLog("Confirming whether assinged address is available."); if (seqCheckNUTAddrConfiguredGA($IF,DADNS_from_TN_GA0Tgt, DADNA_from_NUT_GA0Tgt, DADNA_from_NUT_GA0Tgt_woTLL, DADNA_from_GA0NUT_GA0Tgt, DADNA_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_incVLT - check the address expiration process. NUT receives RAs twice which contain one Global Prefix and second RA contains greater VLT value than first one.(Assigning and Expiring Global address) =head1 TARGET All Node =head1 SYNOPSIS RA_incVLT.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, NUT assignes autoconfigured address. Later NUT receives different RA which contains same prefix but greater VLT than first one 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 (First RA VLT=shortVLT) <=== Judgement #3: DAD NS ======= name: DADNS_from_NUT_GA0Tgt Wait for DupAddrDetectTransmits*RetransTimer Check if NUT's address is configured ==== Action #2: DAD NS =========> name: DADNS_from_TN_GA0Tgt <=== Judgement #4: DAD NA ======= name: DADNA_from_NUT_GA0Tgt, DADNA_from_NUT_GA0Tgt_woTLL Wait until (shortVLT*1/2)+5[sec] pasts since receiving first RA ==== Action #3: RA =============> name: RA_GA0 (Second RA VLT=longVLT) X<== Judgement #5: DAD NS ======= name: DADNS_from_NUT_GA0Tgt,DADNS_any, DADNS_any_wSLL Check if NUT's address is configured ==== Action #4: DAD NS =========> name: DADNS_from_TN_GA0Tgt <=== Judgement #6: DAD NA ======= name: DADNA_from_NUT_GA0Tgt, DADNA_from_NUT_GA0Tgt_woTLL Wait until (shortVLT)-3[sec] pasts since receiving first RA Check if NUT's address is configured ==== Action #5: DAD NS =========> name: DADNS_from_TN_GA0Tgt <=== Judgement #7: DAD NA ======= name: DADNA_from_NUT_GA0Tgt, DADNA_from_NUT_GA0Tgt_woTLL Wait until (shortVLT)+3[sec] pasts since receiving first RA Check if NUT's address is configured ==== Action #6: DAD NS =========> name: DADNS_from_TN_GA0Tgt <=== Judgement #8: DAD NA ======= name: DADNA_from_NUT_GA0Tgt, DADNA_from_NUT_GA0Tgt_woTLL Wait until (longVLT)-3[sec] pasts since receiving second RA Check if NUT's address is configured ==== Action #7: DAD NS =========> name: DADNS_from_TN_GA0Tgt <=== Judgement #9: DAD NA ======= name: DADNA_from_NUT_GA0Tgt, DADNA_from_NUT_GA0Tgt_woTLL Wait until (longVLT)+3[sec] pasts since receiving second RA Check if NUT's address is configured ==== Action #8: DAD NS =========> name: DADNS_from_TN_GA0Tgt X<== Judgement #10: DAD NA ====== name: DADNA_from_NUT_GA0Tgt, DADNA_from_NUT_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 src: TN's Link-local dst: allnode PXOPT: Global0 VLT=30 PLT=15 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 DAD NS to check if NUT's address is configured. name: DADNS_from_TN_GA0Tgt src: ::0 dst: solnode[NUT's Global0] TargetAddress: NUT's Global0 Judgement #4. NUT MUST transmit DAD NA for its autoconfigured Global address. name: DADNA_from_NUT_GA0Tgt, DADNA_from_NUT_GA0Tgt_woTLL src: NUT's Link-local dst: allnode TargetAddress: NUT's Global0 RFlag: 0 SFlag: 0 OFlag: 1 TLLOPT: NUT's MAC address (* TLLOPT may be omitted) Action #3. TN transmits RA which contains Global Prefix. name: RA_GA0_VLT60 src: TN's Link-local dst: allnode PXOPT: Global0 VLT=60 PLT=30 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 src: ::0 dst: solnode[NUT's tentative Global0] TargetAddress: NUT's tentative Global0 Action #4. TN transmits DAD NS to check if NUT's address is configured. name: DADNS_from_TN_GA0Tgt src: ::0 dst: solnode[NUT's Global0] TargetAddress: NUT's Global0 Judgement #6. NUT MUST transmit DAD NA for its autoconfigured Global address. name: DADNA_from_NUT_GA0Tgt, DADNA_from_NUT_GA0Tgt_woTLL src: NUT's Link-local dst: allnode TargetAddress: NUT's Global0 RFlag: 0 SFlag: 0 OFlag: 1 TLLOPT: NUT's MAC address (* TLLOPT may be omitted) Action #5. TN transmits DAD NS to check if NUT's address is configured. name: DADNS_from_TN_GA0Tgt src: ::0 dst: solnode[NUT's Global0] TargetAddress: NUT's Global0 Judgement #7. NUT MUST transmit DAD NA for its autoconfigured Global address. name: DADNA_from_NUT_GA0Tgt, DADNA_from_NUT_GA0Tgt_woTLL src: NUT's Link-local dst: allnode TargetAddress: NUT's Global0 RFlag: 0 SFlag: 0 OFlag: 1 TLLOPT: NUT's MAC address (* TLLOPT may be omitted) Action #6. TN transmits DAD NS to check if NUT's address is configured. name: DADNS_from_TN_GA0Tgt src: ::0 dst: solnode[NUT's Global0] TargetAddress: NUT's Global0 Judgement #8. NUT MUST transmit DAD NA for its autoconfigured Global address. name: DADNA_from_NUT_GA0Tgt, DADNA_from_NUT_GA0Tgt_woTLL src: NUT's Link-local dst: allnode TargetAddress: NUT's Global0 RFlag: 0 SFlag: 0 OFlag: 1 TLLOPT: NUT's MAC address (* TLLOPT may be omitted) Action #7. TN transmits DAD NS to check if NUT's address is configured. name: DADNS_from_TN_GA0Tgt src: ::0 dst: solnode[NUT's Global0] TargetAddress: NUT's Global0 Judgement #9. NUT MUST transmit DAD NA for its autoconfigured Global address. name: DADNA_from_NUT_GA0Tgt, DADNA_from_NUT_GA0Tgt_woTLL src: NUT's Link-local dst: allnode TargetAddress: NUT's Global0 RFlag: 0 SFlag: 0 OFlag: 1 TLLOPT: NUT's MAC address (* TLLOPT may be omitted) Action #8. TN transmits DAD NS to check if NUT's address is configured. name: DADNS_from_TN_GA0Tgt src: ::0 dst: solnode[NUT's Global0] TargetAddress: NUT's Global0 Judgement #10. NUT MUST NOT transmit DAD NA for its autoconfigured Global address. name: DADNA_from_NUT_GA0Tgt, DADNA_from_NUT_GA0Tgt_woTLL src: NUT's Link-local dst: allnode TargetAddress: NUT's Global0 RFlag: 0 SFlag: 0 OFlag: 1 TLLOPT: NUT's MAC address (* TLLOPT may be omitted) =back 1 =head1 SEE ALSO =begin html
 detail of v6eval tool option: see perldoc V6evalTool.pm, perldoc V6evalRemote.pm
=end html =cut