// // 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_DHCPV6_CONFIG_H_ #define SHILL_DHCP_DHCPV6_CONFIG_H_ #include <string> #include <vector> #include <gtest/gtest_prod.h> // for FRIEND_TEST #include "shill/dhcp/dhcp_config.h" namespace shill { // This class provides a DHCPv6 client instance for the device |device_name|. // // The DHCPv6Config instance asks the DHCPv6 client to request both ia_na // (Non-temporary Addresss) and ia_pd (Prefix Delegation) options from the // DHCPv6 server. class DHCPv6Config : public DHCPConfig { public: DHCPv6Config(ControlInterface* control_interface, EventDispatcher* dispatcher, DHCPProvider* provider, const std::string& device_name, const std::string& lease_file_suffix); ~DHCPv6Config() 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; std::vector<std::string> GetFlags() override; private: friend class DHCPv6ConfigTest; FRIEND_TEST(DHCPv6ConfigCallbackTest, ProcessEventSignalFail); FRIEND_TEST(DHCPv6ConfigCallbackTest, ProcessEventSignalSuccess); FRIEND_TEST(DHCPv6ConfigCallbackTest, ProcessEventSignalUnknown); FRIEND_TEST(DHCPv6ConfigCallbackTest, StoppedDuringFailureCallback); FRIEND_TEST(DHCPv6ConfigCallbackTest, StoppedDuringSuccessCallback); FRIEND_TEST(DHCPv6ConfigTest, ParseConfiguration); static const char kDHCPCDPathFormatPID[]; static const char kConfigurationKeyDelegatedPrefix[]; static const char kConfigurationKeyDelegatedPrefixLength[]; static const char kConfigurationKeyDelegatedPrefixLeaseTime[]; static const char kConfigurationKeyDNS[]; static const char kConfigurationKeyDomainSearch[]; static const char kConfigurationKeyIPAddress[]; static const char kConfigurationKeyIPAddressLeaseTime[]; static const char kConfigurationKeyServerIdentifier[]; static const char kReasonBound[]; static const char kReasonFail[]; static const char kReasonRebind[]; static const char kReasonReboot[]; static const char kReasonRenew[]; static const char kType[]; // Parses |configuration| into |properties|. Returns true on success, and // false otherwise. bool ParseConfiguration(const KeyValueStore& configuration); void UpdateLeaseTime(uint32_t lease_time); // Non-temporary address and prefix delegation are considered separate // requests with separate leases, which mean there will be a dedicated // response/event for each. So maintain a configuration properties here to // combine the two lease/configuration into one. The lease time of the combine // configuration will be the shorter of the two leases (most likely the two // lease time will be identical). IPConfig::Properties properties_; DISALLOW_COPY_AND_ASSIGN(DHCPv6Config); }; } // namespace shill #endif // SHILL_DHCP_DHCPV6_CONFIG_H_