// // Copyright (C) 2015 The Android Open Source Project // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // #ifndef SHILL_DHCP_DHCPV4_CONFIG_H_ #define SHILL_DHCP_DHCPV4_CONFIG_H_ #include <string> #include <vector> #include <gtest/gtest_prod.h> // for FRIEND_TEST #include "shill/dhcp/dhcp_config.h" #include "shill/dhcp_properties.h" namespace shill { class Metrics; // DHCPv4 client instance. // |dhcp_props| may contain values for the request hostname and vendor class. // If these properties have non-empty values, they will be used in the DHCP // request. If the Hostname property in dhcp_props is non-empty, it asks the // DHCP server to register this hostname on our behalf, for purposes of // administration or creating a dynamic DNS entry. class DHCPv4Config : public DHCPConfig { public: DHCPv4Config(ControlInterface* control_interface, EventDispatcher* dispatcher, DHCPProvider* provider, const std::string& device_name, const std::string& lease_file_suffix, bool arp_gateway, const DhcpProperties& dhcp_props, Metrics* metrics); ~DHCPv4Config() override; // Inherited from DHCPConfig. void ProcessEventSignal(const std::string& reason, const KeyValueStore& configuration) override; void ProcessStatusChangeSignal(const std::string& status) override; protected: // Inherited from DHCPConfig. void CleanupClientState() override; bool ShouldFailOnAcquisitionTimeout() override; bool ShouldKeepLeaseOnDisconnect() override; std::vector<std::string> GetFlags() override; private: friend class DHCPv4ConfigTest; FRIEND_TEST(DHCPv4ConfigCallbackTest, ProcessEventSignalFail); FRIEND_TEST(DHCPv4ConfigCallbackTest, ProcessEventSignalGatewayArp); FRIEND_TEST(DHCPv4ConfigCallbackTest, ProcessEventSignalGatewayArpNak); FRIEND_TEST(DHCPv4ConfigCallbackTest, ProcessEventSignalSuccess); FRIEND_TEST(DHCPv4ConfigCallbackTest, ProcessEventSignalUnknown); FRIEND_TEST(DHCPv4ConfigCallbackTest, StoppedDuringFailureCallback); FRIEND_TEST(DHCPv4ConfigCallbackTest, StoppedDuringSuccessCallback); FRIEND_TEST(DHCPv4ConfigTest, GetIPv4AddressString); FRIEND_TEST(DHCPv4ConfigTest, ParseClasslessStaticRoutes); FRIEND_TEST(DHCPv4ConfigTest, ParseConfiguration); FRIEND_TEST(DHCPv4ConfigTest, ParseConfigurationWithMinimumMTU); FRIEND_TEST(DHCPv4ConfigTest, ProcessStatusChangeSingal); FRIEND_TEST(DHCPv4ConfigTest, StartWithEmptyHostname); FRIEND_TEST(DHCPv4ConfigTest, StartWithHostname); FRIEND_TEST(DHCPv4ConfigTest, StartWithVendorClass); FRIEND_TEST(DHCPv4ConfigTest, StartWithoutArpGateway); FRIEND_TEST(DHCPv4ConfigTest, StartWithoutHostname); FRIEND_TEST(DHCPv4ConfigTest, StartWithoutVendorClass); static const char kDHCPCDPathFormatPID[]; static const char kConfigurationKeyBroadcastAddress[]; static const char kConfigurationKeyClasslessStaticRoutes[]; static const char kConfigurationKeyDNS[]; static const char kConfigurationKeyDomainName[]; static const char kConfigurationKeyDomainSearch[]; static const char kConfigurationKeyHostname[]; static const char kConfigurationKeyIPAddress[]; static const char kConfigurationKeyLeaseTime[]; static const char kConfigurationKeyMTU[]; static const char kConfigurationKeyRouters[]; static const char kConfigurationKeySubnetCIDR[]; static const char kConfigurationKeyVendorEncapsulatedOptions[]; static const char kConfigurationKeyWebProxyAutoDiscoveryUrl[]; static const char kReasonBound[]; static const char kReasonFail[]; static const char kReasonGatewayArp[]; static const char kReasonNak[]; static const char kReasonRebind[]; static const char kReasonReboot[]; static const char kReasonRenew[]; static const char kStatusArpGateway[]; static const char kStatusArpSelf[]; static const char kStatusBound[]; static const char kStatusDiscover[]; static const char kStatusIgnoreAdditionalOffer[]; static const char kStatusIgnoreFailedOffer[]; static const char kStatusIgnoreInvalidOffer[]; static const char kStatusIgnoreNonOffer[]; static const char kStatusInform[]; static const char kStatusInit[]; static const char kStatusNakDefer[]; static const char kStatusRebind[]; static const char kStatusReboot[]; static const char kStatusRelease[]; static const char kStatusRenew[]; static const char kStatusRequest[]; static const char kType[]; // Parses |classless_routes| into |properties|. Sets the default gateway // if one is supplied and |properties| does not already contain one. It // also sets the "routes" parameter of the IPConfig properties for all // routes not converted into the default gateway. Returns true on // success, and false otherwise. static bool ParseClasslessStaticRoutes(const std::string& classless_routes, IPConfig::Properties* properties); // Parses |configuration| into |properties|. Returns true on success, and // false otherwise. bool ParseConfiguration(const KeyValueStore& configuration, IPConfig::Properties* properties); // Returns the string representation of the IP address |address|, or an // empty string on failure. static std::string GetIPv4AddressString(unsigned int address); // Specifies whether to supply an argument to the DHCP client to validate // the acquired IP address using an ARP request to the gateway IP address. bool arp_gateway_; // Whether it is valid to retain the lease acquired via gateway ARP. bool is_gateway_arp_active_; // Hostname to be used in DHCP request. Set from DhcpProperties in // constructor when present. std::string hostname_; // Vendor Class to be used in DHCP request. Set from DhcpProperties in // constructor when present. std::string vendor_class_; Metrics* metrics_; DISALLOW_COPY_AND_ASSIGN(DHCPv4Config); }; } // namespace shill #endif // SHILL_DHCP_DHCPV4_CONFIG_H_