Home | History | Annotate | Download | only in network_DhcpBrokenDefaultGateway
      1 # Copyright 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 
      5 from autotest_lib.client.common_lib import error
      6 from autotest_lib.client.common_lib.cros.network import interface
      7 from autotest_lib.client.cros import dhcp_handling_rule
      8 from autotest_lib.client.cros import dhcp_packet
      9 from autotest_lib.client.cros import dhcp_test_base
     10 from autotest_lib.client.cros.networking import shill_proxy
     11 
     12 # Length of time the lease from the DHCP server is valid.
     13 LEASE_TIME_SECONDS = 60
     14 # We'll fill in the subnet and give this address to the client.
     15 INTENDED_IP_SUFFIX = '0.0.0.101'
     16 # We should be able to complete a DHCP negotiation in this amount of time.
     17 DHCP_NEGOTIATION_TIMEOUT_SECONDS = 10
     18 
     19 class network_DhcpBrokenDefaultGateway(dhcp_test_base.DhcpTestBase):
     20     """Test application of broken gateway route from DHCP server."""
     21 
     22     def check_shill_gateway_setup(self, interface_name, gateway_ip):
     23         """Check that the ipconfig in the client shows the gateway IP.
     24 
     25         @param interface_name string client network interface name.
     26         @param gateway_ip string expected gateway IP address.
     27 
     28         """
     29         proxy = shill_proxy.ShillProxy()
     30         device = proxy.find_object('Device', {'Name': interface_name})
     31         if device is None:
     32             raise error.TestFail('Device was not found.')
     33         device_properties = device.GetProperties(utf8_strings=True)
     34         ipconfig_path = device_properties['IPConfigs'][0]
     35         ipconfig = proxy.get_dbus_object('org.chromium.flimflam.IPConfig',
     36                                          ipconfig_path)
     37         ipconfig_properties = ipconfig.GetProperties(utf8_strings=True)
     38         ipconfig_gateway = ipconfig_properties['Gateway']
     39         if ipconfig_gateway != gateway_ip:
     40             raise error.TestFail('Shill gateway %s does '
     41                                  'not match expected %s.' %
     42                                  (ipconfig_gateway, gateway_ip))
     43 
     44 
     45     def check_routing_table_gateway_setup(self, interface_name, gateway_ip):
     46         """Check that the routing table in the client shows the gateway IP.
     47 
     48         @param interface_name string client network interface name.
     49         @param gateway_ip string expected gateway IP address.
     50 
     51         """
     52         default_route = interface.get_prioritized_default_route(
     53             host=None, interface_name_regex=interface_name)
     54         if not default_route:
     55             raise error.TestFail('No default route found.')
     56         if default_route.gateway != gateway_ip:
     57             raise error.TestFail('Routing table gateway %s does '
     58                                  'not match expected %s.' %
     59                                  (default_route.gateway, gateway_ip))
     60 
     61 
     62     def test_body(self):
     63         """Main body of the test."""
     64         subnet_mask = self.ethernet_pair.interface_subnet_mask
     65         intended_ip = dhcp_test_base.DhcpTestBase.rewrite_ip_suffix(
     66                 subnet_mask,
     67                 self.server_ip,
     68                 INTENDED_IP_SUFFIX)
     69         # Pick an address that's unlikely to be in the broadcast domain of the
     70         # virtual network pair.
     71         gateway_ip = "10.11.12.13"
     72         # Two real name servers, and a bogus one to be unpredictable.
     73         dns_servers = ['8.8.8.8', '8.8.4.4', '192.168.87.88']
     74         vendor_options = 'ANDROID_METERED'
     75         # This is the pool of information the server will give out to the client
     76         # upon request.
     77         dhcp_options = {
     78                 dhcp_packet.OPTION_SERVER_ID : self.server_ip,
     79                 dhcp_packet.OPTION_SUBNET_MASK : subnet_mask,
     80                 dhcp_packet.OPTION_IP_LEASE_TIME : LEASE_TIME_SECONDS,
     81                 dhcp_packet.OPTION_REQUESTED_IP : intended_ip,
     82                 dhcp_packet.OPTION_DNS_SERVERS : dns_servers,
     83                 dhcp_packet.OPTION_ROUTERS : [ gateway_ip ],
     84                 }
     85         rules = [
     86                 dhcp_handling_rule.DhcpHandlingRule_RespondToDiscovery(
     87                         intended_ip, self.server_ip, dhcp_options, {}),
     88                 dhcp_handling_rule.DhcpHandlingRule_RespondToRequest(
     89                         intended_ip, self.server_ip, dhcp_options, {})
     90                 ]
     91         rules[-1].is_final_handler = True
     92 
     93         self.server.start_test(rules, DHCP_NEGOTIATION_TIMEOUT_SECONDS)
     94         self.server.wait_for_test_to_finish()
     95         if not self.server.last_test_passed:
     96             raise error.TestFail('Test server didn\'t get all the messages it '
     97                                  'was told to expect during negotiation.')
     98 
     99         self.wait_for_dhcp_propagation()
    100         interface_name = self.ethernet_pair.peer_interface_name
    101         self.check_shill_gateway_setup(interface_name, gateway_ip)
    102         self.check_routing_table_gateway_setup(interface_name, gateway_ip)
    103