#!/usr/bin/perl
#
#Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 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.
#
#$Id: C_RFC3315_17_1_3_MAdv.seq,v 1.16 2006/03/14 01:16:23 mnaoki Exp $
###############################################################################
BEGIN{
$V6evalTool::TestVersion = '$Name: DHCPv6_1_0 $';
}
use strict;
use V6evalTool;
use DHCPv6_common;
use Client_pktdesc;
dhcpExitNS if ChkFuncSupport('MServer');
#--------------------------------------------------------------
# Initialization variables
#--------------------------------------------------------------#
my $IF0_NUT = $V6evalTool::NutDef{"Link0_device"};
my $IF0 = "Link0";
#--------------------------------------------------------------#
# Initialize DHCPv6 Client
#--------------------------------------------------------------#
my $ret = vRemote("dhcp6c.rmt", "start", "link0=$IF0_NUT");
if($ret != 0){
vLogHTML('Cannot Initialize DHCPv6 Client program.
');
dhcpExitFail;
};
vCapture($IF0);
#--------------------------------------------------------------#
#1. Wait until Solicit arrives
#--------------------------------------------------------------#
my ($retsol,%sol) = wait_for_solicit($IF0,30) ;
if($retsol != 0){
dhcpExitFail;
}
vClear($IF0);
#--------------------------------------------------------------#
#2. send Advertise message Server1 --> NUT
#--------------------------------------------------------------#
$SID_OPTION = "opt_SID_LLT_server1";
$IA_NA_OPTION = "opt_IA_NA_Addr_woStatus";
$Preference_OPTION = "opt_Preference";
my ($retadv1, %adv1) = send_advertise($IF0, "advertise_server1_to_nut", \%sol, "-DPREFERENCE=0");
if($retadv1 != 0){
dhcpExitFail;
}
#--------------------------------------------------------------#
#3. send Advertise message Server2 --> NUT
#--------------------------------------------------------------#
$SID_OPTION = "opt_SID_LLT_server2";
$IA_NA_OPTION = "opt_IA_NA_Addr_woStatus";
$Preference_OPTION = "opt_Preference";
my ($retadv2, %adv2) = send_advertise($IF0, "advertise_server2_to_nut", \%sol, "-DPREFERENCE=255");
if($retadv2 != 0){
dhcpExitFail;
}
#--------------------------------------------------------------#
#4. Wait for Request to respond to high-preference Server
#--------------------------------------------------------------#
my ($retreq,%req) = wait_for_request($IF0,30);
if($retreq != 0){
dhcpExitFail;
}
$ret = compare_id(\%req, \%adv2, $CMP_SID);
if($ret != 0){
vLogHTML('Client has No response to high-preference Server!
');
dhcpExitFail;
}
#--------------------------------------------------------------#
#5. Wait for Request to respond to low-preference Server
#--------------------------------------------------------------#
while(compare_id(\%req, \%adv1, $CMP_SID)){
($retreq, %req) = wait_for_request($IF0,$REQ_MAX_RT);
if($retreq != 0){
vLogHTML('Client could NOT recored information of low-preference Server!
');
dhcpExitFail;
}
}
dhcpExitPass;
###############################################################################
# Note :
#
# This test is use TN to emulate two Server with different Preference.
# When receive Solicit, Two servers will both send Advertise to NUT with
# Preference options, one of which the preference value is 0 ,and the other
# of which the preference value is 255.
#
# Expected Result is as follows:
# NUT will ACCEPT the Advertise message with preference value of 255. At the
# same time, NUT will Store the information of low-prefernce server.
#
# After NUT sends request to high-preference server, and donnot get the
# response, NUT will send request to low-preference server.
#
################################################################################
###NEEDCHECK
###############################################################################
__END__
=head1 NAME
C_RFC3315_17_1_3_MAdv.seq - Test when receiving mulitple Advertises from mutiple DHCPv6 servers
=head1 TARGET
Client
=head1 SYNOPSIS
=begin html
C_RFC3315_17_1_3_MAdv.seq [-tooloption...]=end html =head1 INITIALIZATION =begin html
-pkt C_RFC3315_17_1_3_MAdv.def
-tooloption : v6eval tool option See Also DHCPv6.def
NUT(Client)
|
|
Link0 --+--------+------------------------ 3ffe:501:ffff:100::/64
|
|
TN(Server)
Upon receipt of one or more valid Advertise messages, the client selects one or more Advertise messages based upon the following criteria.
- Those Advertise messages with the highest server preference value are preferred over all other Advertise messages.
- Within a group of Advertise messages with the same server preference value, a client MAY select those servers whose Advertise messages advertise information of interest to the client. For example, the client may choose a server that returned an advertisement with configuration options of interest to the client.
- The client MAY choose a less-preferred server if that server has a better set of advertised parameters, such as the available addresses advertised in IAs.
Once a client has selected Advertise message(s), the client will typically store information about each server, such as server preference value, addresses advertised, when the advertisement was received, and so on.
If the client needs to select an alternate server in the case that a chosen server does not respond, the client chooses the next server according to the criteria given above.
| Device Name | Device Type | Interface | Assigned Prefix | Link Local Addr | MAC Addr |
| Client | NUT | Link0 | 3ffe:501:ffff:100::/64 | NUT's Linklocal address | NUT's MAC address |
| Server | TN | Link0 | 3ffe:501:ffff:100::/64 | fe80::200:ff:fe00:a1a1 | 00:00:00:00:a1:a1 |
=end html =head1 JUDGEMENT =begin html
NUT TN | | | |Initialize NUT (as a DHCPv6 Client) | | | ----> |Solicit | | | <---- |Advertise w/ Preference option/0 | | | <---- |Advertise w/ Preference option/255 | | | ----> |Request (4*) | | | |waiting till the time of retransmission reaches the MRC | | | ----> |Request (5*) | |
(4*)PASS: NUT sends Request to Server with higher Preference. (5*)PASS: NUT sends Request to Server with lower Prference.=end html =head1 TERMINATION =begin html
N/A=end html =head1 REFERENCE =begin html
Also see RFC3315=end html =head1 SEE ALSO =begin html
17.1.3. Receipt of Advertise Messages
=end html
perldoc V6evalTool