SLSI_NL80211_VENDOR_SUBCMD_RESET_SIGNIFICANT_CHANGE,
SLSI_NL80211_VENDOR_SUBCMD_SET_GSCAN_OUI,
SLSI_NL80211_VENDOR_SUBCMD_SET_NODFS,
+ SLSI_NL80211_VENDOR_SUBCMD_SET_BSSID_BLACKLIST,
+ /*Add any GSCAN subcmds before this*/
SLSI_NL80211_VENDOR_SUBCMD_START_KEEP_ALIVE_OFFLOAD,
- SLSI_NL80211_VENDOR_SUBCMD_STOP_KEEP_ALIVE_OFFLOAD
+ SLSI_NL80211_VENDOR_SUBCMD_STOP_KEEP_ALIVE_OFFLOAD,
+
} WIFI_SUB_COMMAND;
typedef enum {
GSCAN_ATTRIBUTE_BUCKET_EXPONENT,
GSCAN_ATTRIBUTE_BUCKET_MAX_PERIOD,
+ GSCAN_ATTRIBUTE_NUM_BSSID,
+ GSCAN_ATTRIBUTE_BLACKLIST_BSSID,
+
GSCAN_ATTRIBUTE_MAX
} GSCAN_ATTRIBUTE;
return result;
}
-
+
return result;
}
return WIFI_ERROR_INVALID_ARGS;
}
+
+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() {
+ ALOGD("Executing bssid blacklist request, num = %d", mParams->num_bssid);
+ 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;
+ }
+
+ ALOGI("Successfully added %d blacklist bssids", mParams->num_bssid);
+ 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;
+}
+