[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, &params);
-    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, &params);

+    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;
 }