From 0318783ff42847f6f75494273902d636aa311770 Mon Sep 17 00:00:00 2001 From: Jaya Prakash Sangaru Date: Tue, 30 Aug 2016 16:15:26 +0530 Subject: [PATCH] [7570] wlbt: implement get supported features API implement get supported features API SCSC-Bug-Id: SSB-20850 Change-Id: Ib21fb83709efaaa81b5Montana9a69b2d47efe833961 Signed-off-by: Jaya Prakash Sangaru --- common.h | 3 ++- wifi_hal.cpp | 64 ++++++++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 61 insertions(+), 6 deletions(-) diff --git a/common.h b/common.h index ad6c96a..b978f43 100755 --- a/common.h +++ b/common.h @@ -86,7 +86,8 @@ typedef enum { SLSI_NL80211_VENDOR_SUBCMD_SET_RSSI_MONITOR, SLSI_NL80211_VENDOR_SUBCMD_LLS_SET_INFO, SLSI_NL80211_VENDOR_SUBCMD_LLS_GET_INFO, - SLSI_NL80211_VENDOR_SUBCMD_LLS_CLEAR_INFO + SLSI_NL80211_VENDOR_SUBCMD_LLS_CLEAR_INFO, + SLSI_NL80211_VENDOR_SUBCMD_GET_FEATURE_SET } WIFI_SUB_COMMAND; typedef enum { diff --git a/wifi_hal.cpp b/wifi_hal.cpp index 7c0a692..64b47ed 100755 --- a/wifi_hal.cpp +++ b/wifi_hal.cpp @@ -730,7 +730,60 @@ public: }; +class GetFeatureSetCommand : public WifiCommand { +private: + int feature_type; + feature_set *fset; + int *fm_size; + int set_size_max; +public: + GetFeatureSetCommand(wifi_interface_handle handle, feature_set *set) + : WifiCommand(handle, 0) + { + fset = set; + } + + virtual int create() { + int ret; + + ret = mMsg.create(GOOGLE_OUI, SLSI_NL80211_VENDOR_SUBCMD_GET_FEATURE_SET); + if (ret < 0) { + ALOGE("create failed - %d", ret); + } + + return ret; + } + +protected: + virtual int handleResponse(WifiEvent& reply) { + + int id = reply.get_vendor_id(); + int subcmd = reply.get_vendor_subcmd(); + + if (reply.get_cmd() != NL80211_CMD_VENDOR) { + ALOGD("Ignore reply; cmd = %d", reply.get_cmd()); + return NL_SKIP; + } + + nlattr *vendor_data = reply.get_attribute(NL80211_ATTR_VENDOR_DATA); + int len = reply.get_vendor_data_len(); + + if (vendor_data == NULL || len == 0) { + ALOGE("vendor data in GetFeatureSetCommand missing!!"); + return NL_SKIP; + } + + void *data = reply.get_vendor_data(); + if(!fset) { + ALOGE("feature_set Pointer not set"); + return NL_SKIP; + } + memcpy(fset, data, min(len, (int) sizeof(*fset))); + return NL_OK; + } + +}; static int wifi_get_multicast_id(wifi_handle handle, const char *name, const char *group) { @@ -829,11 +882,6 @@ wifi_error wifi_get_iface_name(wifi_interface_handle handle, char *name, size_t return WIFI_SUCCESS; } -wifi_error wifi_get_supported_feature_set(wifi_interface_handle handle, feature_set *set) -{ - return WIFI_ERROR_NOT_SUPPORTED; -} - wifi_error wifi_get_concurrency_matrix(wifi_interface_handle handle, int set_size_max, feature_set set[], int *set_size) { @@ -886,4 +934,10 @@ static wifi_error wifi_stop_rssi_monitoring(wifi_request_id id, wifi_interface_h return wifi_cancel_cmd(id, iface); } +wifi_error wifi_get_supported_feature_set(wifi_interface_handle handle, feature_set *set) +{ + GetFeatureSetCommand command(handle, set); + return (wifi_error) command.requestResponse(); +} + ///////////////////////////////////////////////////////////////////////////// -- 2.20.1