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
5from autotest_lib.client.common_lib import error
6from autotest_lib.client.cros import dhcp_handling_rule
7from autotest_lib.client.cros import dhcp_packet
8from autotest_lib.client.cros import dhcp_test_base
9
10# dhcpcd has a 20 second minimal accepted lease time
11LEASE_TIME_SECONDS = 20
12# We'll fill in the subnet and give this address to the client.
13INTENDED_IP_SUFFIX = "0.0.0.101"
14
15class 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_device(interface_name).RenewDHCPLease()
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