Merge KeystoneQ-ww-20190522
[GitHub/MotorolaMobilityLLC/hardware-samsung_slsi-scsc_wifibt-wifi_hal.git] / roam.cpp
diff --git a/roam.cpp b/roam.cpp
new file mode 100755 (executable)
index 0000000..0993ec7
--- /dev/null
+++ b/roam.cpp
@@ -0,0 +1,224 @@
+#include <stdint.h>\r
+#include <stddef.h>\r
+#include <fcntl.h>\r
+#include <sys/socket.h>\r
+#include <netlink/genl/genl.h>\r
+#include <netlink/genl/family.h>\r
+#include <netlink/genl/ctrl.h>\r
+#include <linux/rtnetlink.h>\r
+#include <netpacket/packet.h>\r
+#include <linux/filter.h>\r
+#include <linux/errqueue.h>\r
+\r
+#include <linux/pkt_sched.h>\r
+#include <netlink/object-api.h>\r
+#include <netlink/netlink.h>\r
+#include <netlink/socket.h>\r
+#include <netlink/handlers.h>\r
+\r
+#include "sync.h"\r
+\r
+#define LOG_TAG  "WifiHAL"\r
+\r
+#include <utils/Log.h>\r
+\r
+#include "wifi_hal.h"\r
+#include "common.h"\r
+#include "cpp_bindings.h"\r
+\r
+#define REQUEST_ID_MAX 1000\r
+#define get_requestid() ((arc4random()%REQUEST_ID_MAX) + 1)\r
+\r
+enum roam_attributes {\r
+    SLSI_ATTR_ROAM_CAPABILITY_BLACKLIST_SIZE,\r
+    SLSI_ATTR_ROAM_CAPABILITY_WHITELIST_SIZE,\r
+    SLSI_ATTR_ROAM_STATE\r
+};\r
+\r
+class BssidBlacklistCommand : public WifiCommand\r
+{\r
+private:\r
+    wifi_bssid_params *mParams;\r
+public:\r
+    BssidBlacklistCommand(wifi_interface_handle handle, int id,\r
+            wifi_bssid_params *params)\r
+        : WifiCommand(handle, id), mParams(params)\r
+    { }\r
+     int createRequest(WifiRequest& request) {\r
+        int result = request.create(GOOGLE_OUI, SLSI_NL80211_VENDOR_SUBCMD_SET_BSSID_BLACKLIST);\r
+        if (result < 0) {\r
+            return result;\r
+        }\r
+\r
+        nlattr *data = request.attr_start(NL80211_ATTR_VENDOR_DATA);\r
+        result = request.put_u32(GSCAN_ATTRIBUTE_NUM_BSSID, mParams->num_bssid);\r
+        if (result < 0) {\r
+            return result;\r
+        }\r
+\r
+        for (int i = 0; i < mParams->num_bssid; i++) {\r
+            result = request.put_addr(GSCAN_ATTRIBUTE_BLACKLIST_BSSID, mParams->bssids[i]);\r
+            if (result < 0) {\r
+                return result;\r
+            }\r
+        }\r
+        request.attr_end(data);\r
+        return result;\r
+    }\r
+\r
+    int start() {\r
+        WifiRequest request(familyId(), ifaceId());\r
+        int result = createRequest(request);\r
+        if (result < 0) {\r
+            return result;\r
+        }\r
+\r
+        result = requestResponse(request);\r
+        if (result < 0) {\r
+            ALOGE("Failed to execute bssid blacklist request, result = %d", result);\r
+            return result;\r
+        }\r
+\r
+        return result;\r
+    }\r
+\r
+\r
+    virtual int handleResponse(WifiEvent& reply) {\r
+        /* Nothing to do on response! */\r
+        return NL_SKIP;\r
+    }\r
+};\r
+\r
+wifi_error wifi_set_bssid_blacklist(wifi_request_id id, wifi_interface_handle iface,\r
+        wifi_bssid_params params)\r
+{\r
+    BssidBlacklistCommand *cmd = new BssidBlacklistCommand(iface, id, &params);\r
+    wifi_error result = (wifi_error)cmd->start();\r
+    //release the reference of command as well\r
+    cmd->releaseRef();\r
+    return result;\r
+}\r
+\r
+\r
+class RoamingCapabilitiesCommand : public WifiCommand\r
+{\r
+private:\r
+    wifi_roaming_capabilities *mCaps;\r
+\r
+public:\r
+    RoamingCapabilitiesCommand(wifi_interface_handle handle, wifi_roaming_capabilities *caps)\r
+        : WifiCommand(handle, 0) {\r
+        mCaps = caps;\r
+    }\r
+\r
+    virtual int create() {\r
+        int ret;\r
+\r
+        ret = mMsg.create(GOOGLE_OUI, SLSI_NL80211_VENDOR_SUBCMD_GET_ROAMING_CAPABILITIES);\r
+        if (ret < 0) {\r
+             ALOGE("Can't create message to send to driver - %d", ret);\r
+             return ret;\r
+        }\r
+        return WIFI_SUCCESS;\r
+\r
+    }\r
+\r
+    virtual int handleResponse(WifiEvent& reply) {\r
+\r
+        if (reply.get_cmd() != NL80211_CMD_VENDOR) {\r
+            ALOGD("Ignore reply; cmd = %d", reply.get_cmd());\r
+            return NL_SKIP;\r
+        }\r
+\r
+        nlattr *vendor_data = reply.get_attribute(NL80211_ATTR_VENDOR_DATA);\r
+        int len = reply.get_vendor_data_len();\r
+\r
+        if (vendor_data == NULL || len == 0) {\r
+            ALOGE("vendor data in GetFeatureSetCommand missing!!");\r
+            return NL_SKIP;\r
+        }\r
+\r
+        for (nl_iterator it(vendor_data); it.has_next(); it.next()) {\r
+            switch(it.get_type()) {\r
+                case SLSI_ATTR_ROAM_CAPABILITY_BLACKLIST_SIZE:\r
+                    mCaps->max_blacklist_size = it.get_u32();\r
+                    break;\r
+                case SLSI_ATTR_ROAM_CAPABILITY_WHITELIST_SIZE:\r
+                    mCaps->max_whitelist_size = it.get_u32();\r
+                    break;\r
+                default :\r
+                    break;\r
+            }\r
+        }\r
+        return NL_OK;\r
+    }\r
+};\r
+\r
+wifi_error wifi_get_roaming_capabilities(wifi_interface_handle handle,\r
+                                         wifi_roaming_capabilities *caps)\r
+{\r
+    RoamingCapabilitiesCommand cmd(handle, caps);\r
+    return (wifi_error) cmd.requestResponse();\r
+}\r
+\r
+class RoamingStateCommand : public WifiCommand\r
+{\r
+private:\r
+    fw_roaming_state_t mRoamingState;\r
+\r
+public:\r
+    RoamingStateCommand(wifi_interface_handle handle, fw_roaming_state_t roaming_state)\r
+        : WifiCommand(handle, 0) {\r
+        mRoamingState = roaming_state;\r
+    }\r
+\r
+    virtual int create() {\r
+        int ret;\r
+        ret = mMsg.create(GOOGLE_OUI, SLSI_NL80211_VENDOR_SUBCMD_SET_ROAMING_STATE);\r
+        if (ret < 0) {\r
+             ALOGE("Can't create message to send to driver - %d", ret);\r
+             return ret;\r
+        }\r
+\r
+        nlattr *data = mMsg.attr_start(NL80211_ATTR_VENDOR_DATA);\r
+        ret = mMsg.put_u8(SLSI_ATTR_ROAM_STATE, mRoamingState);\r
+        if (ret < 0) {\r
+            return ret;\r
+        }\r
+        mMsg.attr_end(data);\r
+        return WIFI_SUCCESS;\r
+    }\r
+};\r
+\r
+wifi_error wifi_enable_firmware_roaming(wifi_interface_handle handle, fw_roaming_state_t state) {\r
+    RoamingStateCommand cmd(handle, state);\r
+    wifi_error ret = (wifi_error) cmd.requestResponse();\r
+    return ret;\r
+}\r
+\r
+wifi_error wifi_configure_roaming(wifi_interface_handle iface, wifi_roaming_config *roaming_config)\r
+{\r
+    wifi_error ret;\r
+    int requestId;\r
+    wifi_bssid_params bssid_params;\r
+\r
+    if (!roaming_config) {\r
+        ALOGE("%s: Invalid Buffer provided. Exit", __FUNCTION__);\r
+        return WIFI_ERROR_INVALID_ARGS;\r
+   }\r
+\r
+    /* Generate request id randomly*/\r
+   requestId = get_requestid();\r
+   bssid_params.num_bssid = roaming_config->num_blacklist_bssid;\r
+\r
+   memcpy(bssid_params.bssids, roaming_config->blacklist_bssid,\r
+           (bssid_params.num_bssid * sizeof(mac_addr)));\r
+\r
+    ret = wifi_set_bssid_blacklist(requestId, iface, bssid_params);\r
+    if (ret != WIFI_SUCCESS) {\r
+        ALOGE("%s: Failed to configure blacklist bssids", __FUNCTION__);\r
+        return WIFI_ERROR_UNKNOWN;\r
+    }\r
+\r
+    return ret;\r
+}\r