[9610] wlbt: Proper fix for Android O Blacklist (wifihal)
Wifi Hal Changes for implementation of wifi_set_bssid_blacklist
which caused problem in building Android O.
Change-Id: I0ef9bd5d8fa9d1bf21f790d3f287ce646f5ea66c
SCSC-Bug-Id: SSB-33754
Signed-off-by: Srishti <srishti.p@samsung.com>
diff --git a/Android.mk b/Android.mk
index 0a8d325..bb391ce 100755
--- a/Android.mk
+++ b/Android.mk
@@ -26,7 +26,8 @@
cpp_bindings.cpp \
gscan.cpp \
link_layer_stats.cpp \
- wifi_offload.cpp
+ wifi_offload.cpp \
+ roam.cpp
LOCAL_MODULE := libwifi-hal-slsi
diff --git a/common.h b/common.h
index 6799196..ff3f32e 100755
--- a/common.h
+++ b/common.h
@@ -16,6 +16,11 @@
#define DEFAULT_CMD_SIZE (64)
#define DOT11_OUI_LEN 3
+typedef struct {
+ int num_bssid;
+ mac_addr bssids[MAX_BLACKLIST_BSSID];
+} wifi_bssid_params;
+
/*
Vendor OUI - This is a unique identifier that identifies organization. Lets
code Android specific functions with Google OUI; although vendors can do more
@@ -25,6 +30,69 @@
const uint32_t GOOGLE_OUI = 0x001A11;
/* TODO: define vendor OUI here */
+typedef enum {
+
+ GSCAN_ATTRIBUTE_NUM_BUCKETS = 10,
+ GSCAN_ATTRIBUTE_BASE_PERIOD,
+ GSCAN_ATTRIBUTE_BUCKETS_BAND,
+ GSCAN_ATTRIBUTE_BUCKET_ID,
+ GSCAN_ATTRIBUTE_BUCKET_PERIOD,
+ GSCAN_ATTRIBUTE_BUCKET_NUM_CHANNELS,
+ GSCAN_ATTRIBUTE_BUCKET_CHANNELS,
+ GSCAN_ATTRIBUTE_NUM_AP_PER_SCAN,
+ GSCAN_ATTRIBUTE_REPORT_THRESHOLD,
+ GSCAN_ATTRIBUTE_NUM_SCANS_TO_CACHE,
+ GSCAN_ATTRIBUTE_REPORT_THRESHOLD_NUM_SCANS,
+ GSCAN_ATTRIBUTE_BAND = GSCAN_ATTRIBUTE_BUCKETS_BAND,
+
+ GSCAN_ATTRIBUTE_ENABLE_FEATURE = 20,
+ GSCAN_ATTRIBUTE_SCAN_RESULTS_COMPLETE, /* indicates no more results */
+ GSCAN_ATTRIBUTE_REPORT_EVENTS,
+
+ /* remaining reserved for additional attributes */
+ GSCAN_ATTRIBUTE_NUM_OF_RESULTS = 30,
+ GSCAN_ATTRIBUTE_SCAN_RESULTS, /* flat array of wifi_scan_result */
+ GSCAN_ATTRIBUTE_NUM_CHANNELS,
+ GSCAN_ATTRIBUTE_CHANNEL_LIST,
+ GSCAN_ATTRIBUTE_SCAN_ID,
+ GSCAN_ATTRIBUTE_SCAN_FLAGS,
+ GSCAN_ATTRIBUTE_SCAN_BUCKET_BIT,
+
+ /* remaining reserved for additional attributes */
+
+ GSCAN_ATTRIBUTE_SSID = 40,
+ GSCAN_ATTRIBUTE_BSSID,
+ GSCAN_ATTRIBUTE_CHANNEL,
+ GSCAN_ATTRIBUTE_RSSI,
+ GSCAN_ATTRIBUTE_TIMESTAMP,
+ GSCAN_ATTRIBUTE_RTT,
+ GSCAN_ATTRIBUTE_RTTSD,
+
+ /* remaining reserved for additional attributes */
+
+ GSCAN_ATTRIBUTE_HOTLIST_BSSIDS = 50,
+ GSCAN_ATTRIBUTE_RSSI_LOW,
+ GSCAN_ATTRIBUTE_RSSI_HIGH,
+ GSCAN_ATTRIBUTE_HOTLIST_ELEM,
+ GSCAN_ATTRIBUTE_HOTLIST_FLUSH,
+ GSCAN_ATTRIBUTE_CHANNEL_NUMBER,
+
+ /* remaining reserved for additional attributes */
+ GSCAN_ATTRIBUTE_RSSI_SAMPLE_SIZE = 60,
+ GSCAN_ATTRIBUTE_LOST_AP_SAMPLE_SIZE,
+ GSCAN_ATTRIBUTE_MIN_BREACHING,
+ GSCAN_ATTRIBUTE_SIGNIFICANT_CHANGE_BSSIDS,
+
+ GSCAN_ATTRIBUTE_BUCKET_STEP_COUNT = 70,
+ GSCAN_ATTRIBUTE_BUCKET_EXPONENT,
+ GSCAN_ATTRIBUTE_BUCKET_MAX_PERIOD,
+
+ GSCAN_ATTRIBUTE_NUM_BSSID,
+ GSCAN_ATTRIBUTE_BLACKLIST_BSSID,
+
+ GSCAN_ATTRIBUTE_MAX
+
+} GSCAN_ATTRIBUTE;
/*
This enum defines ranges for various commands; commands themselves
diff --git a/gscan.cpp b/gscan.cpp
index 90989f9..3fb6e38 100755
--- a/gscan.cpp
+++ b/gscan.cpp
@@ -1423,72 +1423,3 @@
wifi_unregister_cmd(handle, id);
return result;
}
-
-#if 0 // TODO: (IP) removed to make it build
-
-class BssidBlacklistCommand : public WifiCommand
-{
-private:
- wifi_bssid_params *mParams;
-public:
- BssidBlacklistCommand(wifi_interface_handle handle, int id,
- wifi_bssid_params *params)
- : WifiCommand(handle, id), mParams(params)
- { }
- int createRequest(WifiRequest& request) {
- int result = request.create(GOOGLE_OUI, SLSI_NL80211_VENDOR_SUBCMD_SET_BSSID_BLACKLIST);
- if (result < 0) {
- return result;
- }
-
- nlattr *data = request.attr_start(NL80211_ATTR_VENDOR_DATA);
- result = request.put_u32(GSCAN_ATTRIBUTE_NUM_BSSID, mParams->num_bssid);
- if (result < 0) {
- return result;
- }
-
- for (int i = 0; i < mParams->num_bssid; i++) {
- result = request.put_addr(GSCAN_ATTRIBUTE_BLACKLIST_BSSID, mParams->bssids[i]);
- if (result < 0) {
- return result;
- }
- }
- request.attr_end(data);
- return result;
- }
-
- int start() {
- WifiRequest request(familyId(), ifaceId());
- int result = createRequest(request);
- if (result < 0) {
- return result;
- }
-
- result = requestResponse(request);
- if (result < 0) {
- ALOGE("Failed to execute bssid blacklist request, result = %d", result);
- return result;
- }
-
- return result;
- }
-
-
- virtual int handleResponse(WifiEvent& reply) {
- /* Nothing to do on response! */
- return NL_SKIP;
- }
-};
-
-wifi_error wifi_set_bssid_blacklist(wifi_request_id id, wifi_interface_handle iface,
- wifi_bssid_params params)
-{
- wifi_handle handle = getWifiHandle(iface);
-
- BssidBlacklistCommand *cmd = new BssidBlacklistCommand(iface, id, ¶ms);
- wifi_error result = (wifi_error)cmd->start();
- //release the reference of command as well
- cmd->releaseRef();
- return result;
-}
-#endif
diff --git a/roam.cpp b/roam.cpp
new file mode 100755
index 0000000..2f5e8a1
--- /dev/null
+++ b/roam.cpp
@@ -0,0 +1,130 @@
+#include <stdint.h>
+#include <stddef.h>
+#include <fcntl.h>
+#include <sys/socket.h>
+#include <netlink/genl/genl.h>
+#include <netlink/genl/family.h>
+#include <netlink/genl/ctrl.h>
+#include <linux/rtnetlink.h>
+#include <netpacket/packet.h>
+#include <linux/filter.h>
+#include <linux/errqueue.h>
+
+#include <linux/pkt_sched.h>
+#include <netlink/object-api.h>
+#include <netlink/netlink.h>
+#include <netlink/socket.h>
+#include <netlink/handlers.h>
+
+#include "sync.h"
+
+#define LOG_TAG "WifiHAL"
+
+#include <utils/Log.h>
+
+#include "wifi_hal.h"
+#include "common.h"
+#include "cpp_bindings.h"
+
+#define REQUEST_ID_MAX 1000
+#define get_requestid() ((arc4random()%REQUEST_ID_MAX) + 1)
+
+class BssidBlacklistCommand : public WifiCommand
+{
+private:
+ wifi_bssid_params *mParams;
+public:
+ BssidBlacklistCommand(wifi_interface_handle handle, int id,
+ wifi_bssid_params *params)
+ : WifiCommand(handle, id), mParams(params)
+ { }
+ int createRequest(WifiRequest& request) {
+ int result = request.create(GOOGLE_OUI, SLSI_NL80211_VENDOR_SUBCMD_SET_BSSID_BLACKLIST);
+ if (result < 0) {
+ return result;
+ }
+
+ nlattr *data = request.attr_start(NL80211_ATTR_VENDOR_DATA);
+ result = request.put_u32(GSCAN_ATTRIBUTE_NUM_BSSID, mParams->num_bssid);
+ if (result < 0) {
+ return result;
+ }
+
+ for (int i = 0; i < mParams->num_bssid; i++) {
+ result = request.put_addr(GSCAN_ATTRIBUTE_BLACKLIST_BSSID, mParams->bssids[i]);
+ if (result < 0) {
+ return result;
+ }
+ }
+ request.attr_end(data);
+ return result;
+ }
+
+ int start() {
+ WifiRequest request(familyId(), ifaceId());
+ int result = createRequest(request);
+ if (result < 0) {
+ return result;
+ }
+
+ result = requestResponse(request);
+ if (result < 0) {
+ ALOGE("Failed to execute bssid blacklist request, result = %d", result);
+ return result;
+ }
+
+ return result;
+ }
+
+
+ virtual int handleResponse(WifiEvent& reply) {
+ /* Nothing to do on response! */
+ return NL_SKIP;
+ }
+};
+
+wifi_error wifi_set_bssid_blacklist(wifi_request_id id, wifi_interface_handle iface,
+ wifi_bssid_params params)
+{
+ BssidBlacklistCommand *cmd = new BssidBlacklistCommand(iface, id, ¶ms);
+ wifi_error result = (wifi_error)cmd->start();
+ //release the reference of command as well
+ cmd->releaseRef();
+ return result;
+}
+
+/*to be implemented*/
+wifi_error wifi_get_roaming_capabilities(wifi_interface_handle iface,
+ wifi_roaming_capabilities *caps);
+
+/*to be implemented*/
+wifi_error wifi_enable_firmware_roaming(wifi_interface_handle handle,
+ fw_roaming_state_t state);
+
+wifi_error wifi_configure_roaming(wifi_interface_handle iface, wifi_roaming_config *roaming_config)
+{
+ wifi_error ret;
+ int requestId;
+ wifi_bssid_params bssid_params;
+ wifi_handle wifiHandle = getWifiHandle(iface);
+
+ if (!roaming_config) {
+ ALOGE("%s: Invalid Buffer provided. Exit", __FUNCTION__);
+ return WIFI_ERROR_INVALID_ARGS;
+ }
+
+ /* Generate request id randomly*/
+ requestId = get_requestid();
+ bssid_params.num_bssid = roaming_config->num_blacklist_bssid;
+
+ memcpy(bssid_params.bssids, roaming_config->blacklist_bssid,
+ (bssid_params.num_bssid * sizeof(mac_addr)));
+
+ ret = wifi_set_bssid_blacklist(requestId, iface, bssid_params);
+ if (ret != WIFI_SUCCESS) {
+ ALOGE("%s: Failed to configure blacklist bssids", __FUNCTION__);
+ return WIFI_ERROR_UNKNOWN;
+ }
+
+ return ret;
+}
diff --git a/wifi_hal.cpp b/wifi_hal.cpp
index 7a79286..04474d2 100755
--- a/wifi_hal.cpp
+++ b/wifi_hal.cpp
@@ -30,6 +30,7 @@
#include "wifi_hal.h"
#include "common.h"
#include "cpp_bindings.h"
+#include "roam.h"
#define WIFI_HAL_CMD_SOCK_PORT 644
@@ -123,13 +124,13 @@
fn->wifi_reset_epno_list = wifi_reset_epno_list;
fn->wifi_set_passpoint_list = wifi_set_passpoint_list;
fn->wifi_reset_passpoint_list = wifi_reset_passpoint_list;
-// fn->wifi_set_bssid_blacklist = wifi_set_bssid_blacklist; // TODO: (IP) make it build
fn->wifi_start_rssi_monitoring = wifi_start_rssi_monitoring;
fn->wifi_stop_rssi_monitoring = wifi_stop_rssi_monitoring;
fn->wifi_set_link_stats = wifi_set_link_stats;
fn->wifi_get_link_stats = wifi_get_link_stats;
fn->wifi_clear_link_stats = wifi_clear_link_stats;
fn->wifi_set_country_code = wifi_set_country_code;
+ fn->wifi_configure_roaming = wifi_configure_roaming;
return WIFI_SUCCESS;
}