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