[9610] wlbt: Fix warnings for ERD 9610 Android P Project.
[GitHub/LineageOS/android_hardware_samsung_slsi_scsc_wifibt_wifi_hal.git] / roam.cpp
1 #include <stdint.h>
2 #include <stddef.h>
3 #include <fcntl.h>
4 #include <sys/socket.h>
5 #include <netlink/genl/genl.h>
6 #include <netlink/genl/family.h>
7 #include <netlink/genl/ctrl.h>
8 #include <linux/rtnetlink.h>
9 #include <netpacket/packet.h>
10 #include <linux/filter.h>
11 #include <linux/errqueue.h>
12
13 #include <linux/pkt_sched.h>
14 #include <netlink/object-api.h>
15 #include <netlink/netlink.h>
16 #include <netlink/socket.h>
17 #include <netlink/handlers.h>
18
19 #include "sync.h"
20
21 #define LOG_TAG "WifiHAL"
22
23 #include <utils/Log.h>
24
25 #include "wifi_hal.h"
26 #include "common.h"
27 #include "cpp_bindings.h"
28
29 #define REQUEST_ID_MAX 1000
30 #define get_requestid() ((arc4random()%REQUEST_ID_MAX) + 1)
31
32 class BssidBlacklistCommand : public WifiCommand
33 {
34 private:
35 wifi_bssid_params *mParams;
36 public:
37 BssidBlacklistCommand(wifi_interface_handle handle, int id,
38 wifi_bssid_params *params)
39 : WifiCommand(handle, id), mParams(params)
40 { }
41 int createRequest(WifiRequest& request) {
42 int result = request.create(GOOGLE_OUI, SLSI_NL80211_VENDOR_SUBCMD_SET_BSSID_BLACKLIST);
43 if (result < 0) {
44 return result;
45 }
46
47 nlattr *data = request.attr_start(NL80211_ATTR_VENDOR_DATA);
48 result = request.put_u32(GSCAN_ATTRIBUTE_NUM_BSSID, mParams->num_bssid);
49 if (result < 0) {
50 return result;
51 }
52
53 for (int i = 0; i < mParams->num_bssid; i++) {
54 result = request.put_addr(GSCAN_ATTRIBUTE_BLACKLIST_BSSID, mParams->bssids[i]);
55 if (result < 0) {
56 return result;
57 }
58 }
59 request.attr_end(data);
60 return result;
61 }
62
63 int start() {
64 WifiRequest request(familyId(), ifaceId());
65 int result = createRequest(request);
66 if (result < 0) {
67 return result;
68 }
69
70 result = requestResponse(request);
71 if (result < 0) {
72 ALOGE("Failed to execute bssid blacklist request, result = %d", result);
73 return result;
74 }
75
76 return result;
77 }
78
79
80 virtual int handleResponse(WifiEvent& reply) {
81 /* Nothing to do on response! */
82 return NL_SKIP;
83 }
84 };
85
86 wifi_error wifi_set_bssid_blacklist(wifi_request_id id, wifi_interface_handle iface,
87 wifi_bssid_params params)
88 {
89 BssidBlacklistCommand *cmd = new BssidBlacklistCommand(iface, id, &params);
90 wifi_error result = (wifi_error)cmd->start();
91 //release the reference of command as well
92 cmd->releaseRef();
93 return result;
94 }
95
96 /*to be implemented*/
97 wifi_error wifi_get_roaming_capabilities(wifi_interface_handle iface,
98 wifi_roaming_capabilities *caps);
99
100 /*to be implemented*/
101 wifi_error wifi_enable_firmware_roaming(wifi_interface_handle handle,
102 fw_roaming_state_t state);
103
104 wifi_error wifi_configure_roaming(wifi_interface_handle iface, wifi_roaming_config *roaming_config)
105 {
106 wifi_error ret;
107 int requestId;
108 wifi_bssid_params bssid_params;
109
110 if (!roaming_config) {
111 ALOGE("%s: Invalid Buffer provided. Exit", __FUNCTION__);
112 return WIFI_ERROR_INVALID_ARGS;
113 }
114
115 /* Generate request id randomly*/
116 requestId = get_requestid();
117 bssid_params.num_bssid = roaming_config->num_blacklist_bssid;
118
119 memcpy(bssid_params.bssids, roaming_config->blacklist_bssid,
120 (bssid_params.num_bssid * sizeof(mac_addr)));
121
122 ret = wifi_set_bssid_blacklist(requestId, iface, bssid_params);
123 if (ret != WIFI_SUCCESS) {
124 ALOGE("%s: Failed to configure blacklist bssids", __FUNCTION__);
125 return WIFI_ERROR_UNKNOWN;
126 }
127
128 return ret;
129 }