[APR-2053]wlbt: NAN R2 integration fxes
[GitHub/MotorolaMobilityLLC/hardware-samsung_slsi-scsc_wifibt-wifi_hal.git] / wifi_hal.cpp
index d48e81466b8e96e3c659127dce261706a35b2cbf..11d32f0a4738afdf6381e36b843c525f2cd26a9d 100755 (executable)
@@ -40,6 +40,7 @@
 #define FEATURE_SET_MATRIX           1
 #define ATTR_NODFS_VALUE             3
 #define ATTR_COUNTRY_CODE            4
+#define ATTR_LOW_LATENCY_MODE        5
 
 static int internal_no_seq_check(nl_msg *msg, void *arg);
 static int internal_valid_message_handler(nl_msg *msg, void *arg);
@@ -86,14 +87,14 @@ void wifi_socket_set_local_port(struct nl_sock *sock, uint32_t port)
 
 class AndroidPktFilterCommand : public WifiCommand {
     private:
-        const u8* mProgram;
-        u32 mProgramLen;
-        u32* mVersion;
-        u32* mMaxLen;
-        u32 mSourceOffset;
-        u8 *mHostDestination;
-        u32 mLength;
-        int mReqType;
+        const u8* mProgram = NULL;
+        u32 mProgramLen = 0;
+        u32* mVersion = NULL;
+        u32* mMaxLen = 0;
+        u32 mSourceOffset = 0;
+        u8 *mHostDestination = NULL;
+        u32 mLength = 0;
+        int mReqType = 0;
     public:
         AndroidPktFilterCommand(wifi_interface_handle handle,
                 u32* version, u32* max_len)
@@ -138,23 +139,24 @@ class AndroidPktFilterCommand : public WifiCommand {
 
     int createSetPktFilterRequest(WifiRequest& request) {
         u8 *program = new u8[mProgramLen];
+        nlattr *data = NULL;
         NULL_CHECK_RETURN(program, "memory allocation failure", WIFI_ERROR_OUT_OF_MEMORY);
         int result = request.create(GOOGLE_OUI, SLSI_NL80211_VENDOR_SUBCMD_APF_SET_FILTER);
-        if (result < 0) {
-            return result;
-        }
+        if (result < 0)
+            goto exit;
 
-        nlattr *data = request.attr_start(NL80211_ATTR_VENDOR_DATA);
+        data = request.attr_start(NL80211_ATTR_VENDOR_DATA);
         result = request.put_u32(APF_ATTRIBUTE_PROGRAM_LEN, mProgramLen);
-        if (result < 0) {
-            return result;
-        }
+        if (result < 0)
+            goto exit;
+
         memcpy(program, mProgram, mProgramLen);
         result = request.put(APF_ATTRIBUTE_PROGRAM, program, mProgramLen);
-        if (result < 0) {
-            return result;
-        }
+        if (result < 0)
+            goto exit;
         request.attr_end(data);
+
+exit:
         delete[] program;
         return result;
     }
@@ -403,11 +405,17 @@ wifi_error init_wifi_vendor_hal_func_table(wifi_hal_fn *fn)
     fn->wifi_nan_register_handler = nan_register_handler;
     fn->wifi_nan_get_version = nan_get_version;
     fn->wifi_nan_get_capabilities = nan_get_capabilities;
+    fn->wifi_nan_data_interface_create = nan_data_interface_create;
+    fn->wifi_nan_data_interface_delete = nan_data_interface_delete;
+    fn->wifi_nan_data_request_initiator = nan_data_request_initiator;
+    fn->wifi_nan_data_indication_response = nan_data_indication_response;
+    fn->wifi_nan_data_end = nan_data_end;
     fn->wifi_get_roaming_capabilities = wifi_get_roaming_capabilities;
     fn->wifi_enable_firmware_roaming = wifi_enable_firmware_roaming;
     fn->wifi_get_packet_filter_capabilities = wifi_get_packet_filter_capabilities;
     fn->wifi_set_packet_filter = wifi_set_packet_filter;
     fn->wifi_read_packet_filter = wifi_read_packet_filter;
+    fn->wifi_set_latency_mode = wifi_set_latency_mode;
 
     return WIFI_SUCCESS;
 }
@@ -1059,7 +1067,33 @@ protected:
 
 };
 
+class SetLatencyLockCommand : public WifiCommand {
+private:
+    wifi_latency_mode mMode;
+public:
+    SetLatencyLockCommand(wifi_interface_handle handle, wifi_latency_mode mode)
+        : WifiCommand(handle, 0) {
+        mMode = mode;
+    }
+    virtual int create() {
+        int ret;
+
+        ret = mMsg.create(GOOGLE_OUI, SLSI_NL80211_VENDOR_SUBCMD_SET_LATENCY_MODE);
+        if (ret < 0) {
+             ALOGE("Can't create message to send to driver - %d", ret);
+             return ret;
+        }
 
+        nlattr *data = mMsg.attr_start(NL80211_ATTR_VENDOR_DATA);
+        ret = mMsg.put_u8(ATTR_LOW_LATENCY_MODE, mMode);
+        if (ret < 0) {
+            return ret;
+        }
+
+        mMsg.attr_end(data);
+        return WIFI_SUCCESS;
+    }
+};
 
 static int wifi_get_multicast_id(wifi_handle handle, const char *name, const char *group)
 {
@@ -1218,6 +1252,9 @@ wifi_error wifi_set_country_code(wifi_interface_handle handle, const char *count
     return (wifi_error) command.requestResponse();
 }
 
-
+wifi_error wifi_set_latency_mode(wifi_interface_handle handle, wifi_latency_mode mode) {
+    SetLatencyLockCommand cmd(handle, mode);
+    return (wifi_error) cmd.requestResponse();
+}
 /////////////////////////////////////////////////////////////////////////////