#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
return result;\r
}\r
\r
-/*to be implemented*/\r
-wifi_error wifi_get_roaming_capabilities(wifi_interface_handle iface,\r
- wifi_roaming_capabilities *caps);\r
\r
-/*to be implemented*/\r
-wifi_error wifi_enable_firmware_roaming(wifi_interface_handle handle,\r
- fw_roaming_state_t state);\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