blob: 229411d87412b32ac743869399cc4cf3ea76fa64 [file] [log] [blame]
# Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
from autotest_lib.client.common_lib import error
from autotest_lib.client.cros import dhcp_handling_rule
from autotest_lib.client.cros import dhcp_packet
from autotest_lib.client.cros import dhcp_test_base
# dhcpcd has a 20 second minimal accepted lease time
LEASE_TIME_SECONDS = 20
# We'll fill in the subnet and give this address to the client.
INTENDED_IP_SUFFIX = "0.0.0.101"
class network_DhcpRenewWithOptionSubset(dhcp_test_base.DhcpTestBase):
"""Tests DHCP renewal process in the connection manager."""
def test_body(self):
subnet_mask = self.ethernet_pair.interface_subnet_mask
intended_ip = dhcp_test_base.DhcpTestBase.rewrite_ip_suffix(
subnet_mask,
self.server_ip,
INTENDED_IP_SUFFIX)
# Two real name servers, and a bogus one to be unpredictable.
dns_servers = ["8.8.8.8", "8.8.4.4", "192.168.87.88"]
domain_name = "corp.google.com"
dns_search_list = [
"corgie.google.com",
"lies.google.com",
"that.is.a.tasty.burger.google.com",
]
# This is the pool of information the server will give out to the client
# upon request.
minimal_options = {
dhcp_packet.OPTION_SERVER_ID : self.server_ip,
dhcp_packet.OPTION_SUBNET_MASK : subnet_mask,
dhcp_packet.OPTION_IP_LEASE_TIME : LEASE_TIME_SECONDS,
dhcp_packet.OPTION_REQUESTED_IP : intended_ip,
dhcp_packet.OPTION_DNS_SERVERS : dns_servers,
}
dhcp_options = minimal_options.copy()
dhcp_options.update({
dhcp_packet.OPTION_DOMAIN_NAME : domain_name,
dhcp_packet.OPTION_DNS_DOMAIN_SEARCH_LIST : dns_search_list,
})
self.negotiate_and_check_lease(dhcp_options)
# At renewal time, respond without the search list, and with a
# different domain name from the original lease.
changed_options = {
dhcp_packet.OPTION_DOMAIN_NAME : "mail.google.com",
}
renew_options = minimal_options.copy()
renew_options.update(changed_options)
rules = [
dhcp_handling_rule.DhcpHandlingRule_RespondToRequest(
intended_ip,
self.server_ip,
renew_options,
{},
should_respond=True,
# Per RFC-2131, the server identifier must be false
# during REBOOT.
expect_server_ip_set=False)
]
rules[-1].is_final_handler = True
self.server.start_test(
rules, dhcp_test_base.DHCP_NEGOTIATION_TIMEOUT_SECONDS)
# Trigger lease renewal on the client.
interface_name = self.ethernet_pair.peer_interface_name
self.get_interface_ipconfig_objects(interface_name)[0].Refresh()
self.server.wait_for_test_to_finish()
if not self.server.last_test_passed:
raise error.TestFail("Test server didn't get a renewal request.")
# Check to make sure the system retained the search list from the
# initial lease, but also has the domain name from the ACK of the
# DHCPREQUEST.
dhcp_options.update(changed_options)
self.check_dhcp_config(dhcp_options)