4 #include <sys/socket.h>
5 #include <netlink/genl/genl.h>
6 #include <netlink/genl/family.h>
7 #include <netlink/genl/ctrl.h>
8 #include <linux/rtnetlink.h>
9 #include <netpacket/packet.h>
10 #include <linux/filter.h>
11 #include <linux/errqueue.h>
13 #include <linux/pkt_sched.h>
14 #include <netlink/object-api.h>
15 #include <netlink/netlink.h>
16 #include <netlink/socket.h>
17 #include <netlink/handlers.h>
21 #define LOG_TAG "WifiHAL"
23 #include <utils/Log.h>
27 #include "cpp_bindings.h"
29 #define REQUEST_ID_MAX 1000
30 #define get_requestid() ((arc4random()%REQUEST_ID_MAX) + 1)
32 enum roam_attributes
{
33 SLSI_ATTR_ROAM_CAPABILITY_BLACKLIST_SIZE
,
34 SLSI_ATTR_ROAM_CAPABILITY_WHITELIST_SIZE
,
38 class BssidBlacklistCommand
: public WifiCommand
41 wifi_bssid_params
*mParams
;
43 BssidBlacklistCommand(wifi_interface_handle handle
, int id
,
44 wifi_bssid_params
*params
)
45 : WifiCommand(handle
, id
), mParams(params
)
47 int createRequest(WifiRequest
& request
) {
48 int result
= request
.create(GOOGLE_OUI
, SLSI_NL80211_VENDOR_SUBCMD_SET_BSSID_BLACKLIST
);
53 nlattr
*data
= request
.attr_start(NL80211_ATTR_VENDOR_DATA
);
54 result
= request
.put_u32(GSCAN_ATTRIBUTE_NUM_BSSID
, mParams
->num_bssid
);
59 for (int i
= 0; i
< mParams
->num_bssid
; i
++) {
60 result
= request
.put_addr(GSCAN_ATTRIBUTE_BLACKLIST_BSSID
, mParams
->bssids
[i
]);
65 request
.attr_end(data
);
70 WifiRequest
request(familyId(), ifaceId());
71 int result
= createRequest(request
);
76 result
= requestResponse(request
);
78 ALOGE("Failed to execute bssid blacklist request, result = %d", result
);
86 virtual int handleResponse(WifiEvent
& reply
) {
87 /* Nothing to do on response! */
92 wifi_error
wifi_set_bssid_blacklist(wifi_request_id id
, wifi_interface_handle iface
,
93 wifi_bssid_params params
)
95 BssidBlacklistCommand
*cmd
= new BssidBlacklistCommand(iface
, id
, ¶ms
);
96 wifi_error result
= (wifi_error
)cmd
->start();
97 //release the reference of command as well
103 class RoamingCapabilitiesCommand
: public WifiCommand
106 wifi_roaming_capabilities
*mCaps
;
109 RoamingCapabilitiesCommand(wifi_interface_handle handle
, wifi_roaming_capabilities
*caps
)
110 : WifiCommand(handle
, 0) {
114 virtual int create() {
117 ret
= mMsg
.create(GOOGLE_OUI
, SLSI_NL80211_VENDOR_SUBCMD_GET_ROAMING_CAPABILITIES
);
119 ALOGE("Can't create message to send to driver - %d", ret
);
126 virtual int handleResponse(WifiEvent
& reply
) {
128 if (reply
.get_cmd() != NL80211_CMD_VENDOR
) {
129 ALOGD("Ignore reply; cmd = %d", reply
.get_cmd());
133 nlattr
*vendor_data
= reply
.get_attribute(NL80211_ATTR_VENDOR_DATA
);
134 int len
= reply
.get_vendor_data_len();
136 if (vendor_data
== NULL
|| len
== 0) {
137 ALOGE("vendor data in GetFeatureSetCommand missing!!");
141 for (nl_iterator
it(vendor_data
); it
.has_next(); it
.next()) {
142 switch(it
.get_type()) {
143 case SLSI_ATTR_ROAM_CAPABILITY_BLACKLIST_SIZE
:
144 mCaps
->max_blacklist_size
= it
.get_u32();
146 case SLSI_ATTR_ROAM_CAPABILITY_WHITELIST_SIZE
:
147 mCaps
->max_whitelist_size
= it
.get_u32();
157 wifi_error
wifi_get_roaming_capabilities(wifi_interface_handle handle
,
158 wifi_roaming_capabilities
*caps
)
160 RoamingCapabilitiesCommand
cmd(handle
, caps
);
161 return (wifi_error
) cmd
.requestResponse();
164 class RoamingStateCommand
: public WifiCommand
167 fw_roaming_state_t mRoamingState
;
170 RoamingStateCommand(wifi_interface_handle handle
, fw_roaming_state_t roaming_state
)
171 : WifiCommand(handle
, 0) {
172 mRoamingState
= roaming_state
;
175 virtual int create() {
177 ret
= mMsg
.create(GOOGLE_OUI
, SLSI_NL80211_VENDOR_SUBCMD_SET_ROAMING_STATE
);
179 ALOGE("Can't create message to send to driver - %d", ret
);
183 nlattr
*data
= mMsg
.attr_start(NL80211_ATTR_VENDOR_DATA
);
184 ret
= mMsg
.put_u8(SLSI_ATTR_ROAM_STATE
, mRoamingState
);
193 wifi_error
wifi_enable_firmware_roaming(wifi_interface_handle handle
, fw_roaming_state_t state
) {
194 RoamingStateCommand
cmd(handle
, state
);
195 wifi_error ret
= (wifi_error
) cmd
.requestResponse();
199 wifi_error
wifi_configure_roaming(wifi_interface_handle iface
, wifi_roaming_config
*roaming_config
)
203 wifi_bssid_params bssid_params
;
205 if (!roaming_config
) {
206 ALOGE("%s: Invalid Buffer provided. Exit", __FUNCTION__
);
207 return WIFI_ERROR_INVALID_ARGS
;
210 /* Generate request id randomly*/
211 requestId
= get_requestid();
212 bssid_params
.num_bssid
= roaming_config
->num_blacklist_bssid
;
214 memcpy(bssid_params
.bssids
, roaming_config
->blacklist_bssid
,
215 (bssid_params
.num_bssid
* sizeof(mac_addr
)));
217 ret
= wifi_set_bssid_blacklist(requestId
, iface
, bssid_params
);
218 if (ret
!= WIFI_SUCCESS
) {
219 ALOGE("%s: Failed to configure blacklist bssids", __FUNCTION__
);
220 return WIFI_ERROR_UNKNOWN
;