Home | History | Annotate | Download | only in network_DhcpRenewWithOptionSubset
      1 # Copyright (c) 2014 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 
      5 from autotest_lib.client.common_lib import error
      6 from autotest_lib.client.cros import dhcp_handling_rule
      7 from autotest_lib.client.cros import dhcp_packet
      8 from autotest_lib.client.cros import dhcp_test_base
      9 
     10 # dhcpcd has a 20 second minimal accepted lease time
     11 LEASE_TIME_SECONDS = 20
     12 # We'll fill in the subnet and give this address to the client.
     13 INTENDED_IP_SUFFIX = "0.0.0.101"
     14 
     15 class network_DhcpRenewWithOptionSubset(dhcp_test_base.DhcpTestBase):
     16     """Tests DHCP renewal process in the connection manager."""
     17     def test_body(self):
     18         subnet_mask = self.ethernet_pair.interface_subnet_mask
     19         intended_ip = dhcp_test_base.DhcpTestBase.rewrite_ip_suffix(
     20                 subnet_mask,
     21                 self.server_ip,
     22                 INTENDED_IP_SUFFIX)
     23         # Two real name servers, and a bogus one to be unpredictable.
     24         dns_servers = ["8.8.8.8", "8.8.4.4", "192.168.87.88"]
     25         domain_name = "corp.google.com"
     26         dns_search_list = [
     27                 "corgie.google.com",
     28                 "lies.google.com",
     29                 "that.is.a.tasty.burger.google.com",
     30                 ]
     31         # This is the pool of information the server will give out to the client
     32         # upon request.
     33         minimal_options = {
     34                 dhcp_packet.OPTION_SERVER_ID : self.server_ip,
     35                 dhcp_packet.OPTION_SUBNET_MASK : subnet_mask,
     36                 dhcp_packet.OPTION_IP_LEASE_TIME : LEASE_TIME_SECONDS,
     37                 dhcp_packet.OPTION_REQUESTED_IP : intended_ip,
     38                 dhcp_packet.OPTION_DNS_SERVERS : dns_servers,
     39         }
     40         dhcp_options = minimal_options.copy()
     41         dhcp_options.update({
     42                 dhcp_packet.OPTION_DOMAIN_NAME : domain_name,
     43                 dhcp_packet.OPTION_DNS_DOMAIN_SEARCH_LIST : dns_search_list,
     44                 })
     45         self.negotiate_and_check_lease(dhcp_options)
     46 
     47         # At renewal time, respond without the search list, and with a
     48         # different domain name from the original lease.
     49         changed_options = {
     50                 dhcp_packet.OPTION_DOMAIN_NAME : "mail.google.com",
     51         }
     52         renew_options = minimal_options.copy()
     53         renew_options.update(changed_options)
     54         rules = [
     55                 dhcp_handling_rule.DhcpHandlingRule_RespondToRequest(
     56                         intended_ip,
     57                         self.server_ip,
     58                         renew_options,
     59                         {},
     60                         should_respond=True,
     61                         # Per RFC-2131, the server identifier must be false
     62                         # during REBOOT.
     63                         expect_server_ip_set=False)
     64                 ]
     65         rules[-1].is_final_handler = True
     66         self.server.start_test(
     67                 rules, dhcp_test_base.DHCP_NEGOTIATION_TIMEOUT_SECONDS)
     68 
     69         # Trigger lease renewal on the client.
     70         interface_name = self.ethernet_pair.peer_interface_name
     71         self.get_interface_ipconfig_objects(interface_name)[0].Refresh()
     72 
     73         self.server.wait_for_test_to_finish()
     74         if not self.server.last_test_passed:
     75             raise error.TestFail("Test server didn't get a renewal request.")
     76 
     77         # Check to make sure the system retained the search list from the
     78         # initial lease, but also has the domain name from the ACK of the
     79         # DHCPREQUEST.
     80         dhcp_options.update(changed_options)
     81         self.check_dhcp_config(dhcp_options)
     82