1 // 2 // Copyright (C) 2012 The Android Open Source Project 3 // 4 // Licensed under the Apache License, Version 2.0 (the "License"); 5 // you may not use this file except in compliance with the License. 6 // You may obtain a copy of the License at 7 // 8 // http://www.apache.org/licenses/LICENSE-2.0 9 // 10 // Unless required by applicable law or agreed to in writing, software 11 // distributed under the License is distributed on an "AS IS" BASIS, 12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 // See the License for the specific language governing permissions and 14 // limitations under the License. 15 // 16 17 #ifndef SHILL_WIMAX_WIMAX_PROVIDER_H_ 18 #define SHILL_WIMAX_WIMAX_PROVIDER_H_ 19 20 #include <map> 21 #include <memory> 22 #include <string> 23 24 #include <base/macros.h> 25 #include <gtest/gtest_prod.h> // for FRIEND_TEST 26 27 #include "shill/accessor_interface.h" 28 #include "shill/provider_interface.h" 29 #include "shill/refptr_types.h" 30 #include "shill/wimax/wimax_network_proxy_interface.h" 31 32 namespace shill { 33 34 class ControlInterface; 35 class EventDispatcher; 36 class KeyValueStore; 37 class Manager; 38 class Metrics; 39 class StoreInterface; 40 class WiMaxManagerProxyInterface; 41 42 class WiMaxProvider : public ProviderInterface { 43 public: 44 WiMaxProvider(ControlInterface* control, 45 EventDispatcher* dispatcher, 46 Metrics* metrics, 47 Manager* manager); 48 ~WiMaxProvider() override; 49 50 // Called by Manager as a part of the Provider interface. The attributes 51 // used for matching services for the WiMax provider are the NetworkId, 52 // mode and Name parameters. 53 void CreateServicesFromProfile(const ProfileRefPtr& profile) override; 54 ServiceRefPtr FindSimilarService( 55 const KeyValueStore& args, Error* error) const override; 56 ServiceRefPtr GetService(const KeyValueStore& args, Error* error) override; 57 ServiceRefPtr CreateTemporaryService( 58 const KeyValueStore& args, Error* error) override; 59 ServiceRefPtr CreateTemporaryServiceFromProfile( 60 const ProfileRefPtr& profile, 61 const std::string& entry_name, 62 Error* error) override; 63 void Start() override; 64 void Stop() override; 65 66 // Signaled by DeviceInfo when a new WiMAX device becomes available. 67 virtual void OnDeviceInfoAvailable(const std::string& link_name); 68 69 // Signaled by a WiMAX device when its set of live networks changes. 70 virtual void OnNetworksChanged(); 71 72 // Signaled by |service| when it's been unloaded by Manager. Returns true if 73 // this provider has released ownership of the service, and false otherwise. 74 virtual bool OnServiceUnloaded(const WiMaxServiceRefPtr& service); 75 76 // Selects and returns a WiMAX device to connect |service| through. 77 virtual WiMaxRefPtr SelectCarrier(const WiMaxServiceConstRefPtr& service); 78 79 private: 80 friend class WiMaxProviderTest; 81 FRIEND_TEST(WiMaxProviderTest, ConnectDisconnectWiMaxManager); 82 FRIEND_TEST(WiMaxProviderTest, CreateDevice); 83 FRIEND_TEST(WiMaxProviderTest, CreateServicesFromProfile); 84 FRIEND_TEST(WiMaxProviderTest, DestroyAllServices); 85 FRIEND_TEST(WiMaxProviderTest, DestroyDeadDevices); 86 FRIEND_TEST(WiMaxProviderTest, FindService); 87 FRIEND_TEST(WiMaxProviderTest, GetLinkName); 88 FRIEND_TEST(WiMaxProviderTest, GetUniqueService); 89 FRIEND_TEST(WiMaxProviderTest, OnDeviceInfoAvailable); 90 FRIEND_TEST(WiMaxProviderTest, OnDevicesChanged); 91 FRIEND_TEST(WiMaxProviderTest, OnNetworksChanged); 92 FRIEND_TEST(WiMaxProviderTest, OnServiceUnloaded); 93 FRIEND_TEST(WiMaxProviderTest, RetrieveNetworkInfo); 94 FRIEND_TEST(WiMaxProviderTest, SelectCarrier); 95 FRIEND_TEST(WiMaxProviderTest, StartLiveServices); 96 FRIEND_TEST(WiMaxProviderTest, StartStop); 97 FRIEND_TEST(WiMaxProviderTest, StopDeadServices); 98 99 struct NetworkInfo { 100 WiMaxNetworkId id; 101 std::string name; 102 }; 103 104 void ConnectToWiMaxManager(); 105 void DisconnectFromWiMaxManager(); 106 void OnWiMaxManagerAppeared(); 107 void OnWiMaxManagerVanished(); 108 109 void OnDevicesChanged(const RpcIdentifiers& devices); 110 111 void CreateDevice(const std::string& link_name, const RpcIdentifier& path); 112 void DestroyDeadDevices(const RpcIdentifiers& live_devices); 113 114 std::string GetLinkName(const RpcIdentifier& path); 115 116 // Retrieves network info for a network at RPC |path| into |networks_| if it's 117 // not already available. 118 void RetrieveNetworkInfo(const RpcIdentifier& path); 119 120 // Finds and returns the service identified by |storage_id|. Returns nullptr 121 // if the service is not found. 122 WiMaxServiceRefPtr FindService(const std::string& storage_id) const; 123 124 // Finds or creates a service with the given parameters. The parameters 125 // uniquely identify a service so no duplicate services will be created. 126 // The service will be registered and a memeber of the provider's 127 // |services_| map. 128 WiMaxServiceRefPtr GetUniqueService(const WiMaxNetworkId& id, 129 const std::string& name); 130 131 // Allocates a service with the given parameters. 132 WiMaxServiceRefPtr CreateService(const WiMaxNetworkId& id, 133 const std::string& name); 134 135 // Populates the |id_ptr| and |name_ptr| from the parameters in |args|. 136 // Returns true on success, otheriwse populates |error| and returns false. 137 static bool GetServiceParametersFromArgs(const KeyValueStore& args, 138 WiMaxNetworkId* id_ptr, 139 std::string* name_ptr, 140 Error* error); 141 142 static bool GetServiceParametersFromStorage(const StoreInterface* storage, 143 const std::string& entry_name, 144 WiMaxNetworkId* id_ptr, 145 std::string* name_ptr, 146 Error* error); 147 148 // Starts all services with network ids in the current set of live 149 // networks. This method also creates, registers and starts the default 150 // service for each live network. 151 void StartLiveServices(); 152 153 // Stops all services with network ids that are not in the current set of live 154 // networks. 155 void StopDeadServices(); 156 157 // Stops, deregisters and destroys all services. 158 void DestroyAllServices(); 159 160 ControlInterface* control_; 161 EventDispatcher* dispatcher_; 162 Metrics* metrics_; 163 Manager* manager_; 164 165 std::unique_ptr<WiMaxManagerProxyInterface> wimax_manager_proxy_; 166 167 // Key is the interface link name. 168 std::map<std::string, RpcIdentifier> pending_devices_; 169 std::map<std::string, WiMaxRefPtr> devices_; 170 // Key is service's storage identifier. 171 std::map<std::string, WiMaxServiceRefPtr> services_; 172 std::map<RpcIdentifier, NetworkInfo> networks_; 173 174 DISALLOW_COPY_AND_ASSIGN(WiMaxProvider); 175 }; 176 177 } // namespace shill 178 179 #endif // SHILL_WIMAX_WIMAX_PROVIDER_H_ 180