1# Copyright (c) 2015 The Chromium OS Authors. All rights reserved. 2# Use of this source code is governed by a BSD-style license that can be 3# found in the LICENSE file. 4 5from autotest_lib.client.common_lib import error 6from autotest_lib.client.common_lib.cros.network import interface 7from autotest_lib.client.cros import dhcp_handling_rule 8from autotest_lib.client.cros import dhcp_packet 9from autotest_lib.client.cros import dhcp_test_base 10from autotest_lib.client.cros.networking import shill_proxy 11 12# Length of time the lease from the DHCP server is valid. 13LEASE_TIME_SECONDS = 60 14# We'll fill in the subnet and give this address to the client. 15INTENDED_IP_SUFFIX = "0.0.0.101" 16# We should be able to complete a DHCP negotiation in this amount of time. 17DHCP_NEGOTIATION_TIMEOUT_SECONDS = 10 18 19class network_DhcpFQDN(dhcp_test_base.DhcpTestBase): 20 """Test implemenation of client completing negotiation with FQDN flag.""" 21 22 def test_body(self): 23 """Main body of the test.""" 24 subnet_mask = self.ethernet_pair.interface_subnet_mask 25 intended_ip = dhcp_test_base.DhcpTestBase.rewrite_ip_suffix( 26 subnet_mask, 27 self.server_ip, 28 INTENDED_IP_SUFFIX) 29 # It doesn't matter what is contained in this option value, except that 30 # the DHCP client does not crash decoding it or passing its 31 # interpretation of it back to shill. 32 fqdn_option = '\x03\xff\x00' 33 # This is the pool of information the server will give out to the client 34 # upon request. 35 dhcp_options = { 36 dhcp_packet.OPTION_SERVER_ID : self.server_ip, 37 dhcp_packet.OPTION_SUBNET_MASK : subnet_mask, 38 dhcp_packet.OPTION_IP_LEASE_TIME : LEASE_TIME_SECONDS, 39 dhcp_packet.OPTION_REQUESTED_IP : intended_ip, 40 dhcp_packet.OPTION_FULLY_QUALIFIED_DOMAIN_NAME : fqdn_option 41 } 42 rules = [ 43 dhcp_handling_rule.DhcpHandlingRule_RespondToDiscovery( 44 intended_ip, self.server_ip, dhcp_options, {}), 45 dhcp_handling_rule.DhcpHandlingRule_RespondToRequest( 46 intended_ip, self.server_ip, dhcp_options, {}) 47 ] 48 rules[-1].is_final_handler = True 49 50 # In some DHCP server implementations, the FQDN option is provided in 51 # the DHCP ACK response without the client requesting it. 52 rules[-1].force_reply_options = [ 53 dhcp_packet.OPTION_FULLY_QUALIFIED_DOMAIN_NAME ] 54 55 self.server.start_test(rules, DHCP_NEGOTIATION_TIMEOUT_SECONDS) 56 self.server.wait_for_test_to_finish() 57 if not self.server.last_test_passed: 58 raise error.TestFail('Test server didn\'t get all the messages it ' 59 'was told to expect during negotiation.') 60 61 # This test passes if the DHCP client lives long enough to send 62 # the network configuration to shill. 63 self.wait_for_dhcp_propagation() 64 self.check_dhcp_config(dhcp_options) 65