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 class BssidBlacklistCommand
: public WifiCommand
35 wifi_bssid_params
*mParams
;
37 BssidBlacklistCommand(wifi_interface_handle handle
, int id
,
38 wifi_bssid_params
*params
)
39 : WifiCommand(handle
, id
), mParams(params
)
41 int createRequest(WifiRequest
& request
) {
42 int result
= request
.create(GOOGLE_OUI
, SLSI_NL80211_VENDOR_SUBCMD_SET_BSSID_BLACKLIST
);
47 nlattr
*data
= request
.attr_start(NL80211_ATTR_VENDOR_DATA
);
48 result
= request
.put_u32(GSCAN_ATTRIBUTE_NUM_BSSID
, mParams
->num_bssid
);
53 for (int i
= 0; i
< mParams
->num_bssid
; i
++) {
54 result
= request
.put_addr(GSCAN_ATTRIBUTE_BLACKLIST_BSSID
, mParams
->bssids
[i
]);
59 request
.attr_end(data
);
64 WifiRequest
request(familyId(), ifaceId());
65 int result
= createRequest(request
);
70 result
= requestResponse(request
);
72 ALOGE("Failed to execute bssid blacklist request, result = %d", result
);
80 virtual int handleResponse(WifiEvent
& reply
) {
81 /* Nothing to do on response! */
86 wifi_error
wifi_set_bssid_blacklist(wifi_request_id id
, wifi_interface_handle iface
,
87 wifi_bssid_params params
)
89 BssidBlacklistCommand
*cmd
= new BssidBlacklistCommand(iface
, id
, ¶ms
);
90 wifi_error result
= (wifi_error
)cmd
->start();
91 //release the reference of command as well
97 wifi_error
wifi_get_roaming_capabilities(wifi_interface_handle iface
,
98 wifi_roaming_capabilities
*caps
);
100 /*to be implemented*/
101 wifi_error
wifi_enable_firmware_roaming(wifi_interface_handle handle
,
102 fw_roaming_state_t state
);
104 wifi_error
wifi_configure_roaming(wifi_interface_handle iface
, wifi_roaming_config
*roaming_config
)
108 wifi_bssid_params bssid_params
;
110 if (!roaming_config
) {
111 ALOGE("%s: Invalid Buffer provided. Exit", __FUNCTION__
);
112 return WIFI_ERROR_INVALID_ARGS
;
115 /* Generate request id randomly*/
116 requestId
= get_requestid();
117 bssid_params
.num_bssid
= roaming_config
->num_blacklist_bssid
;
119 memcpy(bssid_params
.bssids
, roaming_config
->blacklist_bssid
,
120 (bssid_params
.num_bssid
* sizeof(mac_addr
)));
122 ret
= wifi_set_bssid_blacklist(requestId
, iface
, bssid_params
);
123 if (ret
!= WIFI_SUCCESS
) {
124 ALOGE("%s: Failed to configure blacklist bssids", __FUNCTION__
);
125 return WIFI_ERROR_UNKNOWN
;