Commit | Line | Data |
---|---|---|
02b2b8ab S |
1 | #include <stdint.h>\r |
2 | #include <stddef.h>\r | |
3 | #include <fcntl.h>\r | |
4 | #include <sys/socket.h>\r | |
5 | #include <netlink/genl/genl.h>\r | |
6 | #include <netlink/genl/family.h>\r | |
7 | #include <netlink/genl/ctrl.h>\r | |
8 | #include <linux/rtnetlink.h>\r | |
9 | #include <netpacket/packet.h>\r | |
10 | #include <linux/filter.h>\r | |
11 | #include <linux/errqueue.h>\r | |
12 | \r | |
13 | #include <linux/pkt_sched.h>\r | |
14 | #include <netlink/object-api.h>\r | |
15 | #include <netlink/netlink.h>\r | |
16 | #include <netlink/socket.h>\r | |
17 | #include <netlink/handlers.h>\r | |
18 | \r | |
19 | #include "sync.h"\r | |
20 | \r | |
21 | #define LOG_TAG "WifiHAL"\r | |
22 | \r | |
23 | #include <utils/Log.h>\r | |
24 | \r | |
25 | #include "wifi_hal.h"\r | |
26 | #include "common.h"\r | |
27 | #include "cpp_bindings.h"\r | |
28 | \r | |
29 | #define REQUEST_ID_MAX 1000\r | |
30 | #define get_requestid() ((arc4random()%REQUEST_ID_MAX) + 1)\r | |
31 | \r | |
32 | class BssidBlacklistCommand : public WifiCommand\r | |
33 | {\r | |
34 | private:\r | |
35 | wifi_bssid_params *mParams;\r | |
36 | public:\r | |
37 | BssidBlacklistCommand(wifi_interface_handle handle, int id,\r | |
38 | wifi_bssid_params *params)\r | |
39 | : WifiCommand(handle, id), mParams(params)\r | |
40 | { }\r | |
41 | int createRequest(WifiRequest& request) {\r | |
42 | int result = request.create(GOOGLE_OUI, SLSI_NL80211_VENDOR_SUBCMD_SET_BSSID_BLACKLIST);\r | |
43 | if (result < 0) {\r | |
44 | return result;\r | |
45 | }\r | |
46 | \r | |
47 | nlattr *data = request.attr_start(NL80211_ATTR_VENDOR_DATA);\r | |
48 | result = request.put_u32(GSCAN_ATTRIBUTE_NUM_BSSID, mParams->num_bssid);\r | |
49 | if (result < 0) {\r | |
50 | return result;\r | |
51 | }\r | |
52 | \r | |
53 | for (int i = 0; i < mParams->num_bssid; i++) {\r | |
54 | result = request.put_addr(GSCAN_ATTRIBUTE_BLACKLIST_BSSID, mParams->bssids[i]);\r | |
55 | if (result < 0) {\r | |
56 | return result;\r | |
57 | }\r | |
58 | }\r | |
59 | request.attr_end(data);\r | |
60 | return result;\r | |
61 | }\r | |
62 | \r | |
63 | int start() {\r | |
64 | WifiRequest request(familyId(), ifaceId());\r | |
65 | int result = createRequest(request);\r | |
66 | if (result < 0) {\r | |
67 | return result;\r | |
68 | }\r | |
69 | \r | |
70 | result = requestResponse(request);\r | |
71 | if (result < 0) {\r | |
72 | ALOGE("Failed to execute bssid blacklist request, result = %d", result);\r | |
73 | return result;\r | |
74 | }\r | |
75 | \r | |
76 | return result;\r | |
77 | }\r | |
78 | \r | |
79 | \r | |
80 | virtual int handleResponse(WifiEvent& reply) {\r | |
81 | /* Nothing to do on response! */\r | |
82 | return NL_SKIP;\r | |
83 | }\r | |
84 | };\r | |
85 | \r | |
86 | wifi_error wifi_set_bssid_blacklist(wifi_request_id id, wifi_interface_handle iface,\r | |
87 | wifi_bssid_params params)\r | |
88 | {\r | |
89 | BssidBlacklistCommand *cmd = new BssidBlacklistCommand(iface, id, ¶ms);\r | |
90 | wifi_error result = (wifi_error)cmd->start();\r | |
91 | //release the reference of command as well\r | |
92 | cmd->releaseRef();\r | |
93 | return result;\r | |
94 | }\r | |
95 | \r | |
96 | /*to be implemented*/\r | |
97 | wifi_error wifi_get_roaming_capabilities(wifi_interface_handle iface,\r | |
98 | wifi_roaming_capabilities *caps);\r | |
99 | \r | |
100 | /*to be implemented*/\r | |
101 | wifi_error wifi_enable_firmware_roaming(wifi_interface_handle handle,\r | |
102 | fw_roaming_state_t state);\r | |
103 | \r | |
104 | wifi_error wifi_configure_roaming(wifi_interface_handle iface, wifi_roaming_config *roaming_config)\r | |
105 | {\r | |
106 | wifi_error ret;\r | |
107 | int requestId;\r | |
108 | wifi_bssid_params bssid_params;\r | |
02b2b8ab S |
109 | \r |
110 | if (!roaming_config) {\r | |
111 | ALOGE("%s: Invalid Buffer provided. Exit", __FUNCTION__);\r | |
112 | return WIFI_ERROR_INVALID_ARGS;\r | |
113 | }\r | |
114 | \r | |
115 | /* Generate request id randomly*/\r | |
116 | requestId = get_requestid();\r | |
117 | bssid_params.num_bssid = roaming_config->num_blacklist_bssid;\r | |
118 | \r | |
119 | memcpy(bssid_params.bssids, roaming_config->blacklist_bssid,\r | |
120 | (bssid_params.num_bssid * sizeof(mac_addr)));\r | |
121 | \r | |
122 | ret = wifi_set_bssid_blacklist(requestId, iface, bssid_params);\r | |
123 | if (ret != WIFI_SUCCESS) {\r | |
124 | ALOGE("%s: Failed to configure blacklist bssids", __FUNCTION__);\r | |
125 | return WIFI_ERROR_UNKNOWN;\r | |
126 | }\r | |
127 | \r | |
128 | return ret;\r | |
129 | }\r |