1 /*
2  * Copyright (C) 2019 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 WIFI_IFACE_UTIL_H_
18 #define WIFI_IFACE_UTIL_H_
19 
20 #include <wifi_system/interface_tool.h>
21 
22 #include <android/hardware/wifi/1.0/IWifi.h>
23 
24 namespace android {
25 namespace hardware {
26 namespace wifi {
27 namespace V1_4 {
28 namespace implementation {
29 namespace iface_util {
30 
31 // Iface event handlers.
32 struct IfaceEventHandlers {
33     // Callback to be invoked when the iface is set down & up for MAC address
34     // change.
35     std::function<void(const std::string& iface_name)> on_state_toggle_off_on;
36 };
37 
38 /**
39  * Util class for common iface operations.
40  */
41 class WifiIfaceUtil {
42    public:
43     WifiIfaceUtil(const std::weak_ptr<wifi_system::InterfaceTool> iface_tool);
44     virtual ~WifiIfaceUtil() = default;
45 
46     virtual std::array<uint8_t, 6> getFactoryMacAddress(
47         const std::string& iface_name);
48     virtual bool setMacAddress(const std::string& iface_name,
49                                const std::array<uint8_t, 6>& mac);
50     // Get or create a random MAC address. The MAC address returned from
51     // this method will remain the same throughout the lifetime of the HAL
52     // daemon. (So, changes on every reboot)
53     virtual std::array<uint8_t, 6> getOrCreateRandomMacAddress();
54 
55     // Register for any iface event callbacks for the provided interface.
56     virtual void registerIfaceEventHandlers(const std::string& iface_name,
57                                             IfaceEventHandlers handlers);
58     virtual void unregisterIfaceEventHandlers(const std::string& iface_name);
59     virtual bool setUpState(const std::string& iface_name, bool request_up);
60     virtual unsigned ifNameToIndex(const std::string& iface_name);
61 
62    private:
63     std::array<uint8_t, 6> createRandomMacAddress();
64 
65     std::weak_ptr<wifi_system::InterfaceTool> iface_tool_;
66     std::unique_ptr<std::array<uint8_t, 6>> random_mac_address_;
67     std::map<std::string, IfaceEventHandlers> event_handlers_map_;
68 };
69 
70 }  // namespace iface_util
71 }  // namespace implementation
72 }  // namespace V1_4
73 }  // namespace wifi
74 }  // namespace hardware
75 }  // namespace android
76 
77 #endif  // WIFI_IFACE_UTIL_H_
78