b2737ea7 |
1 | \r |
2 | #include <stdint.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 | #include <stdarg.h>\r |
19 | \r |
20 | #include <ctype.h>\r |
21 | \r |
22 | #include "wifi_hal.h"\r |
23 | #include "common.h"\r |
24 | #include "cpp_bindings.h"\r |
25 | \r |
26 | void appendFmt(char *buf, int &offset, const char *fmt, ...)\r |
27 | {\r |
28 | va_list params;\r |
29 | va_start(params, fmt);\r |
30 | offset += vsprintf(buf + offset, fmt, params);\r |
31 | va_end(params);\r |
32 | }\r |
33 | \r |
34 | #define C2S(x) case x: return #x;\r |
35 | \r |
36 | static const char *cmdToString(int cmd)\r |
37 | {\r |
38 | switch (cmd) {\r |
39 | C2S(NL80211_CMD_UNSPEC)\r |
40 | C2S(NL80211_CMD_GET_WIPHY)\r |
41 | C2S(NL80211_CMD_SET_WIPHY)\r |
42 | C2S(NL80211_CMD_NEW_WIPHY)\r |
43 | C2S(NL80211_CMD_DEL_WIPHY)\r |
44 | C2S(NL80211_CMD_GET_INTERFACE)\r |
45 | C2S(NL80211_CMD_SET_INTERFACE)\r |
46 | C2S(NL80211_CMD_NEW_INTERFACE)\r |
47 | C2S(NL80211_CMD_DEL_INTERFACE)\r |
48 | C2S(NL80211_CMD_GET_KEY)\r |
49 | C2S(NL80211_CMD_SET_KEY)\r |
50 | C2S(NL80211_CMD_NEW_KEY)\r |
51 | C2S(NL80211_CMD_DEL_KEY)\r |
52 | C2S(NL80211_CMD_GET_BEACON)\r |
53 | C2S(NL80211_CMD_SET_BEACON)\r |
54 | C2S(NL80211_CMD_START_AP)\r |
55 | C2S(NL80211_CMD_STOP_AP)\r |
56 | C2S(NL80211_CMD_GET_STATION)\r |
57 | C2S(NL80211_CMD_SET_STATION)\r |
58 | C2S(NL80211_CMD_NEW_STATION)\r |
59 | C2S(NL80211_CMD_DEL_STATION)\r |
60 | C2S(NL80211_CMD_GET_MPATH)\r |
61 | C2S(NL80211_CMD_SET_MPATH)\r |
62 | C2S(NL80211_CMD_NEW_MPATH)\r |
63 | C2S(NL80211_CMD_DEL_MPATH)\r |
64 | C2S(NL80211_CMD_SET_BSS)\r |
65 | C2S(NL80211_CMD_SET_REG)\r |
66 | C2S(NL80211_CMD_REQ_SET_REG)\r |
67 | C2S(NL80211_CMD_GET_MESH_CONFIG)\r |
68 | C2S(NL80211_CMD_SET_MESH_CONFIG)\r |
69 | C2S(NL80211_CMD_SET_MGMT_EXTRA_IE)\r |
70 | C2S(NL80211_CMD_GET_REG)\r |
71 | C2S(NL80211_CMD_GET_SCAN)\r |
72 | C2S(NL80211_CMD_TRIGGER_SCAN)\r |
73 | C2S(NL80211_CMD_NEW_SCAN_RESULTS)\r |
74 | C2S(NL80211_CMD_SCAN_ABORTED)\r |
75 | C2S(NL80211_CMD_REG_CHANGE)\r |
76 | C2S(NL80211_CMD_AUTHENTICATE)\r |
77 | C2S(NL80211_CMD_ASSOCIATE)\r |
78 | C2S(NL80211_CMD_DEAUTHENTICATE)\r |
79 | C2S(NL80211_CMD_DISASSOCIATE)\r |
80 | C2S(NL80211_CMD_MICHAEL_MIC_FAILURE)\r |
81 | C2S(NL80211_CMD_REG_BEACON_HINT)\r |
82 | C2S(NL80211_CMD_JOIN_IBSS)\r |
83 | C2S(NL80211_CMD_LEAVE_IBSS)\r |
84 | C2S(NL80211_CMD_TESTMODE)\r |
85 | C2S(NL80211_CMD_CONNECT)\r |
86 | C2S(NL80211_CMD_ROAM)\r |
87 | C2S(NL80211_CMD_DISCONNECT)\r |
88 | C2S(NL80211_CMD_SET_WIPHY_NETNS)\r |
89 | C2S(NL80211_CMD_GET_SURVEY)\r |
90 | C2S(NL80211_CMD_NEW_SURVEY_RESULTS)\r |
91 | C2S(NL80211_CMD_SET_PMKSA)\r |
92 | C2S(NL80211_CMD_DEL_PMKSA)\r |
93 | C2S(NL80211_CMD_FLUSH_PMKSA)\r |
94 | C2S(NL80211_CMD_REMAIN_ON_CHANNEL)\r |
95 | C2S(NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL)\r |
96 | C2S(NL80211_CMD_SET_TX_BITRATE_MASK)\r |
97 | C2S(NL80211_CMD_REGISTER_FRAME)\r |
98 | C2S(NL80211_CMD_FRAME)\r |
99 | C2S(NL80211_CMD_FRAME_TX_STATUS)\r |
100 | C2S(NL80211_CMD_SET_POWER_SAVE)\r |
101 | C2S(NL80211_CMD_GET_POWER_SAVE)\r |
102 | C2S(NL80211_CMD_SET_CQM)\r |
103 | C2S(NL80211_CMD_NOTIFY_CQM)\r |
104 | C2S(NL80211_CMD_SET_CHANNEL)\r |
105 | C2S(NL80211_CMD_SET_WDS_PEER)\r |
106 | C2S(NL80211_CMD_FRAME_WAIT_CANCEL)\r |
107 | C2S(NL80211_CMD_JOIN_MESH)\r |
108 | C2S(NL80211_CMD_LEAVE_MESH)\r |
109 | C2S(NL80211_CMD_UNPROT_DEAUTHENTICATE)\r |
110 | C2S(NL80211_CMD_UNPROT_DISASSOCIATE)\r |
111 | C2S(NL80211_CMD_NEW_PEER_CANDIDATE)\r |
112 | C2S(NL80211_CMD_GET_WOWLAN)\r |
113 | C2S(NL80211_CMD_SET_WOWLAN)\r |
114 | C2S(NL80211_CMD_START_SCHED_SCAN)\r |
115 | C2S(NL80211_CMD_STOP_SCHED_SCAN)\r |
116 | C2S(NL80211_CMD_SCHED_SCAN_RESULTS)\r |
117 | C2S(NL80211_CMD_SCHED_SCAN_STOPPED)\r |
118 | C2S(NL80211_CMD_SET_REKEY_OFFLOAD)\r |
119 | C2S(NL80211_CMD_PMKSA_CANDIDATE)\r |
120 | C2S(NL80211_CMD_TDLS_OPER)\r |
121 | C2S(NL80211_CMD_TDLS_MGMT)\r |
122 | C2S(NL80211_CMD_UNEXPECTED_FRAME)\r |
123 | C2S(NL80211_CMD_PROBE_CLIENT)\r |
124 | C2S(NL80211_CMD_REGISTER_BEACONS)\r |
125 | C2S(NL80211_CMD_UNEXPECTED_4ADDR_FRAME)\r |
126 | C2S(NL80211_CMD_SET_NOACK_MAP)\r |
127 | C2S(NL80211_CMD_CH_SWITCH_NOTIFY)\r |
128 | C2S(NL80211_CMD_START_P2P_DEVICE)\r |
129 | C2S(NL80211_CMD_STOP_P2P_DEVICE)\r |
130 | C2S(NL80211_CMD_CONN_FAILED)\r |
131 | C2S(NL80211_CMD_SET_MCAST_RATE)\r |
132 | C2S(NL80211_CMD_SET_MAC_ACL)\r |
133 | C2S(NL80211_CMD_RADAR_DETECT)\r |
134 | C2S(NL80211_CMD_GET_PROTOCOL_FEATURES)\r |
135 | C2S(NL80211_CMD_UPDATE_FT_IES)\r |
136 | C2S(NL80211_CMD_FT_EVENT)\r |
137 | C2S(NL80211_CMD_CRIT_PROTOCOL_START)\r |
138 | C2S(NL80211_CMD_CRIT_PROTOCOL_STOP)\r |
139 | C2S(NL80211_CMD_VENDOR)\r |
140 | default:\r |
141 | return "NL80211_CMD_UNKNOWN";\r |
142 | }\r |
143 | }\r |
144 | \r |
145 | const char *attributeToString(int attribute)\r |
146 | {\r |
147 | switch (attribute) {\r |
148 | C2S(NL80211_ATTR_UNSPEC)\r |
149 | \r |
150 | C2S(NL80211_ATTR_WIPHY)\r |
151 | C2S(NL80211_ATTR_WIPHY_NAME)\r |
152 | \r |
153 | C2S(NL80211_ATTR_IFINDEX)\r |
154 | C2S(NL80211_ATTR_IFNAME)\r |
155 | C2S(NL80211_ATTR_IFTYPE)\r |
156 | \r |
157 | C2S(NL80211_ATTR_MAC)\r |
158 | \r |
159 | C2S(NL80211_ATTR_KEY_DATA)\r |
160 | C2S(NL80211_ATTR_KEY_IDX)\r |
161 | C2S(NL80211_ATTR_KEY_CIPHER)\r |
162 | C2S(NL80211_ATTR_KEY_SEQ)\r |
163 | C2S(NL80211_ATTR_KEY_DEFAULT)\r |
164 | \r |
165 | C2S(NL80211_ATTR_BEACON_INTERVAL)\r |
166 | C2S(NL80211_ATTR_DTIM_PERIOD)\r |
167 | C2S(NL80211_ATTR_BEACON_HEAD)\r |
168 | C2S(NL80211_ATTR_BEACON_TAIL)\r |
169 | \r |
170 | C2S(NL80211_ATTR_STA_AID)\r |
171 | C2S(NL80211_ATTR_STA_FLAGS)\r |
172 | C2S(NL80211_ATTR_STA_LISTEN_INTERVAL)\r |
173 | C2S(NL80211_ATTR_STA_SUPPORTED_RATES)\r |
174 | C2S(NL80211_ATTR_STA_VLAN)\r |
175 | C2S(NL80211_ATTR_STA_INFO)\r |
176 | \r |
177 | C2S(NL80211_ATTR_WIPHY_BANDS)\r |
178 | \r |
179 | C2S(NL80211_ATTR_MNTR_FLAGS)\r |
180 | \r |
181 | C2S(NL80211_ATTR_MESH_ID)\r |
182 | C2S(NL80211_ATTR_STA_PLINK_ACTION)\r |
183 | C2S(NL80211_ATTR_MPATH_NEXT_HOP)\r |
184 | C2S(NL80211_ATTR_MPATH_INFO)\r |
185 | \r |
186 | C2S(NL80211_ATTR_BSS_CTS_PROT)\r |
187 | C2S(NL80211_ATTR_BSS_SHORT_PREAMBLE)\r |
188 | C2S(NL80211_ATTR_BSS_SHORT_SLOT_TIME)\r |
189 | \r |
190 | C2S(NL80211_ATTR_HT_CAPABILITY)\r |
191 | \r |
192 | C2S(NL80211_ATTR_SUPPORTED_IFTYPES)\r |
193 | \r |
194 | C2S(NL80211_ATTR_REG_ALPHA2)\r |
195 | C2S(NL80211_ATTR_REG_RULES)\r |
196 | \r |
197 | C2S(NL80211_ATTR_MESH_CONFIG)\r |
198 | \r |
199 | C2S(NL80211_ATTR_BSS_BASIC_RATES)\r |
200 | \r |
201 | C2S(NL80211_ATTR_WIPHY_TXQ_PARAMS)\r |
202 | C2S(NL80211_ATTR_WIPHY_FREQ)\r |
203 | C2S(NL80211_ATTR_WIPHY_CHANNEL_TYPE)\r |
204 | \r |
205 | C2S(NL80211_ATTR_KEY_DEFAULT_MGMT)\r |
206 | \r |
207 | C2S(NL80211_ATTR_MGMT_SUBTYPE)\r |
208 | C2S(NL80211_ATTR_IE)\r |
209 | \r |
210 | C2S(NL80211_ATTR_MAX_NUM_SCAN_SSIDS)\r |
211 | \r |
212 | C2S(NL80211_ATTR_SCAN_FREQUENCIES)\r |
213 | C2S(NL80211_ATTR_SCAN_SSIDS)\r |
214 | C2S(NL80211_ATTR_GENERATION) /* replaces old SCAN_GENERATION */\r |
215 | C2S(NL80211_ATTR_BSS)\r |
216 | \r |
217 | C2S(NL80211_ATTR_REG_INITIATOR)\r |
218 | C2S(NL80211_ATTR_REG_TYPE)\r |
219 | \r |
220 | C2S(NL80211_ATTR_SUPPORTED_COMMANDS)\r |
221 | \r |
222 | C2S(NL80211_ATTR_FRAME)\r |
223 | C2S(NL80211_ATTR_SSID)\r |
224 | C2S(NL80211_ATTR_AUTH_TYPE)\r |
225 | C2S(NL80211_ATTR_REASON_CODE)\r |
226 | \r |
227 | C2S(NL80211_ATTR_KEY_TYPE)\r |
228 | \r |
229 | C2S(NL80211_ATTR_MAX_SCAN_IE_LEN)\r |
230 | C2S(NL80211_ATTR_CIPHER_SUITES)\r |
231 | \r |
232 | C2S(NL80211_ATTR_FREQ_BEFORE)\r |
233 | C2S(NL80211_ATTR_FREQ_AFTER)\r |
234 | \r |
235 | C2S(NL80211_ATTR_FREQ_FIXED)\r |
236 | \r |
237 | \r |
238 | C2S(NL80211_ATTR_WIPHY_RETRY_SHORT)\r |
239 | C2S(NL80211_ATTR_WIPHY_RETRY_LONG)\r |
240 | C2S(NL80211_ATTR_WIPHY_FRAG_THRESHOLD)\r |
241 | C2S(NL80211_ATTR_WIPHY_RTS_THRESHOLD)\r |
242 | \r |
243 | C2S(NL80211_ATTR_TIMED_OUT)\r |
244 | \r |
245 | C2S(NL80211_ATTR_USE_MFP)\r |
246 | \r |
247 | C2S(NL80211_ATTR_STA_FLAGS2)\r |
248 | \r |
249 | C2S(NL80211_ATTR_CONTROL_PORT)\r |
250 | \r |
251 | C2S(NL80211_ATTR_TESTDATA)\r |
252 | \r |
253 | C2S(NL80211_ATTR_PRIVACY)\r |
254 | \r |
255 | C2S(NL80211_ATTR_DISCONNECTED_BY_AP)\r |
256 | C2S(NL80211_ATTR_STATUS_CODE)\r |
257 | \r |
258 | C2S(NL80211_ATTR_CIPHER_SUITES_PAIRWISE)\r |
259 | C2S(NL80211_ATTR_CIPHER_SUITE_GROUP)\r |
260 | C2S(NL80211_ATTR_WPA_VERSIONS)\r |
261 | C2S(NL80211_ATTR_AKM_SUITES)\r |
262 | \r |
263 | C2S(NL80211_ATTR_REQ_IE)\r |
264 | C2S(NL80211_ATTR_RESP_IE)\r |
265 | \r |
266 | C2S(NL80211_ATTR_PREV_BSSID)\r |
267 | \r |
268 | C2S(NL80211_ATTR_KEY)\r |
269 | C2S(NL80211_ATTR_KEYS)\r |
270 | \r |
271 | C2S(NL80211_ATTR_PID)\r |
272 | \r |
273 | C2S(NL80211_ATTR_4ADDR)\r |
274 | \r |
275 | C2S(NL80211_ATTR_SURVEY_INFO)\r |
276 | \r |
277 | C2S(NL80211_ATTR_PMKID)\r |
278 | C2S(NL80211_ATTR_MAX_NUM_PMKIDS)\r |
279 | \r |
280 | C2S(NL80211_ATTR_DURATION)\r |
281 | \r |
282 | C2S(NL80211_ATTR_COOKIE)\r |
283 | \r |
284 | C2S(NL80211_ATTR_WIPHY_COVERAGE_CLASS)\r |
285 | \r |
286 | C2S(NL80211_ATTR_TX_RATES)\r |
287 | \r |
288 | C2S(NL80211_ATTR_FRAME_MATCH)\r |
289 | \r |
290 | C2S(NL80211_ATTR_ACK)\r |
291 | \r |
292 | C2S(NL80211_ATTR_PS_STATE)\r |
293 | \r |
294 | C2S(NL80211_ATTR_CQM)\r |
295 | \r |
296 | C2S(NL80211_ATTR_LOCAL_STATE_CHANGE)\r |
297 | \r |
298 | C2S(NL80211_ATTR_AP_ISOLATE)\r |
299 | \r |
300 | C2S(NL80211_ATTR_WIPHY_TX_POWER_SETTING)\r |
301 | C2S(NL80211_ATTR_WIPHY_TX_POWER_LEVEL)\r |
302 | \r |
303 | C2S(NL80211_ATTR_TX_FRAME_TYPES)\r |
304 | C2S(NL80211_ATTR_RX_FRAME_TYPES)\r |
305 | C2S(NL80211_ATTR_FRAME_TYPE)\r |
306 | \r |
307 | C2S(NL80211_ATTR_CONTROL_PORT_ETHERTYPE)\r |
308 | C2S(NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT)\r |
309 | \r |
310 | C2S(NL80211_ATTR_SUPPORT_IBSS_RSN)\r |
311 | \r |
312 | C2S(NL80211_ATTR_WIPHY_ANTENNA_TX)\r |
313 | C2S(NL80211_ATTR_WIPHY_ANTENNA_RX)\r |
314 | \r |
315 | C2S(NL80211_ATTR_MCAST_RATE)\r |
316 | \r |
317 | C2S(NL80211_ATTR_OFFCHANNEL_TX_OK)\r |
318 | \r |
319 | C2S(NL80211_ATTR_BSS_HT_OPMODE)\r |
320 | \r |
321 | C2S(NL80211_ATTR_KEY_DEFAULT_TYPES)\r |
322 | \r |
323 | C2S(NL80211_ATTR_MAX_REMAIN_ON_CHANNEL_DURATION)\r |
324 | \r |
325 | C2S(NL80211_ATTR_MESH_SETUP)\r |
326 | \r |
327 | C2S(NL80211_ATTR_WIPHY_ANTENNA_AVAIL_TX)\r |
328 | C2S(NL80211_ATTR_WIPHY_ANTENNA_AVAIL_RX)\r |
329 | \r |
330 | C2S(NL80211_ATTR_SUPPORT_MESH_AUTH)\r |
331 | C2S(NL80211_ATTR_STA_PLINK_STATE)\r |
332 | \r |
333 | C2S(NL80211_ATTR_WOWLAN_TRIGGERS)\r |
334 | C2S(NL80211_ATTR_WOWLAN_TRIGGERS_SUPPORTED)\r |
335 | \r |
336 | C2S(NL80211_ATTR_SCHED_SCAN_INTERVAL)\r |
337 | \r |
338 | C2S(NL80211_ATTR_INTERFACE_COMBINATIONS)\r |
339 | C2S(NL80211_ATTR_SOFTWARE_IFTYPES)\r |
340 | \r |
341 | C2S(NL80211_ATTR_REKEY_DATA)\r |
342 | \r |
343 | C2S(NL80211_ATTR_MAX_NUM_SCHED_SCAN_SSIDS)\r |
344 | C2S(NL80211_ATTR_MAX_SCHED_SCAN_IE_LEN)\r |
345 | \r |
346 | C2S(NL80211_ATTR_SCAN_SUPP_RATES)\r |
347 | \r |
348 | C2S(NL80211_ATTR_HIDDEN_SSID)\r |
349 | \r |
350 | C2S(NL80211_ATTR_IE_PROBE_RESP)\r |
351 | C2S(NL80211_ATTR_IE_ASSOC_RESP)\r |
352 | \r |
353 | C2S(NL80211_ATTR_STA_WME)\r |
354 | C2S(NL80211_ATTR_SUPPORT_AP_UAPSD)\r |
355 | \r |
356 | C2S(NL80211_ATTR_ROAM_SUPPORT)\r |
357 | \r |
358 | C2S(NL80211_ATTR_SCHED_SCAN_MATCH)\r |
359 | C2S(NL80211_ATTR_MAX_MATCH_SETS)\r |
360 | \r |
361 | C2S(NL80211_ATTR_PMKSA_CANDIDATE)\r |
362 | \r |
363 | C2S(NL80211_ATTR_TX_NO_CCK_RATE)\r |
364 | \r |
365 | C2S(NL80211_ATTR_TDLS_ACTION)\r |
366 | C2S(NL80211_ATTR_TDLS_DIALOG_TOKEN)\r |
367 | C2S(NL80211_ATTR_TDLS_OPERATION)\r |
368 | C2S(NL80211_ATTR_TDLS_SUPPORT)\r |
369 | C2S(NL80211_ATTR_TDLS_EXTERNAL_SETUP)\r |
370 | \r |
371 | C2S(NL80211_ATTR_DEVICE_AP_SME)\r |
372 | \r |
373 | C2S(NL80211_ATTR_DONT_WAIT_FOR_ACK)\r |
374 | \r |
375 | C2S(NL80211_ATTR_FEATURE_FLAGS)\r |
376 | \r |
377 | C2S(NL80211_ATTR_PROBE_RESP_OFFLOAD)\r |
378 | \r |
379 | C2S(NL80211_ATTR_PROBE_RESP)\r |
380 | \r |
381 | C2S(NL80211_ATTR_DFS_REGION)\r |
382 | \r |
383 | C2S(NL80211_ATTR_DISABLE_HT)\r |
384 | C2S(NL80211_ATTR_HT_CAPABILITY_MASK)\r |
385 | \r |
386 | C2S(NL80211_ATTR_NOACK_MAP)\r |
387 | \r |
388 | C2S(NL80211_ATTR_INACTIVITY_TIMEOUT)\r |
389 | \r |
390 | C2S(NL80211_ATTR_RX_SIGNAL_DBM)\r |
391 | \r |
392 | C2S(NL80211_ATTR_BG_SCAN_PERIOD)\r |
393 | \r |
394 | C2S(NL80211_ATTR_WDEV)\r |
395 | \r |
396 | C2S(NL80211_ATTR_USER_REG_HINT_TYPE)\r |
397 | \r |
398 | C2S(NL80211_ATTR_CONN_FAILED_REASON)\r |
399 | \r |
400 | C2S(NL80211_ATTR_SAE_DATA)\r |
401 | \r |
402 | C2S(NL80211_ATTR_VHT_CAPABILITY)\r |
403 | \r |
404 | C2S(NL80211_ATTR_SCAN_FLAGS)\r |
405 | \r |
406 | C2S(NL80211_ATTR_CHANNEL_WIDTH)\r |
407 | C2S(NL80211_ATTR_CENTER_FREQ1)\r |
408 | C2S(NL80211_ATTR_CENTER_FREQ2)\r |
409 | \r |
410 | C2S(NL80211_ATTR_P2P_CTWINDOW)\r |
411 | C2S(NL80211_ATTR_P2P_OPPPS)\r |
412 | \r |
413 | C2S(NL80211_ATTR_LOCAL_MESH_POWER_MODE)\r |
414 | \r |
415 | C2S(NL80211_ATTR_ACL_POLICY)\r |
416 | \r |
417 | C2S(NL80211_ATTR_MAC_ADDRS)\r |
418 | \r |
419 | C2S(NL80211_ATTR_MAC_ACL_MAX)\r |
420 | \r |
421 | C2S(NL80211_ATTR_RADAR_EVENT)\r |
422 | \r |
423 | C2S(NL80211_ATTR_EXT_CAPA)\r |
424 | C2S(NL80211_ATTR_EXT_CAPA_MASK)\r |
425 | \r |
426 | C2S(NL80211_ATTR_STA_CAPABILITY)\r |
427 | C2S(NL80211_ATTR_STA_EXT_CAPABILITY)\r |
428 | \r |
429 | C2S(NL80211_ATTR_PROTOCOL_FEATURES)\r |
430 | C2S(NL80211_ATTR_SPLIT_WIPHY_DUMP)\r |
431 | \r |
432 | C2S(NL80211_ATTR_DISABLE_VHT)\r |
433 | C2S(NL80211_ATTR_VHT_CAPABILITY_MASK)\r |
434 | \r |
435 | C2S(NL80211_ATTR_MDID)\r |
436 | C2S(NL80211_ATTR_IE_RIC)\r |
437 | \r |
438 | C2S(NL80211_ATTR_CRIT_PROT_ID)\r |
439 | C2S(NL80211_ATTR_MAX_CRIT_PROT_DURATION)\r |
440 | \r |
441 | C2S(NL80211_ATTR_PEER_AID)\r |
442 | \r |
443 | \r |
444 | //S(NL80211_ATTR_VENDOR_ID)\r |
445 | C2S(NL80211_ATTR_VENDOR_SUBCMD)\r |
446 | C2S(NL80211_ATTR_VENDOR_DATA)\r |
447 | C2S(NL80211_ATTR_VENDOR_EVENTS)\r |
448 | \r |
449 | default:\r |
450 | return "NL80211_ATTR_UNKNOWN";\r |
451 | }\r |
452 | }\r |
453 | \r |
454 | void WifiEvent::log() {\r |
455 | parse();\r |
456 | \r |
457 | byte *data = (byte *)genlmsg_attrdata(mHeader, 0);\r |
458 | int len = genlmsg_attrlen(mHeader, 0);\r |
459 | ALOGD("cmd = %s, len = %d", get_cmdString(), len);\r |
460 | ALOGD("vendor_id = %04x, vendor_subcmd = %d", get_vendor_id(), get_vendor_subcmd());\r |
461 | \r |
462 | for (int i = 0; i < len; i += 16) {\r |
463 | char line[81];\r |
464 | int linelen = min(16, len - i);\r |
465 | int offset = 0;\r |
466 | appendFmt(line, offset, "%02x", data[i]);\r |
467 | for (int j = 1; j < linelen; j++) {\r |
468 | appendFmt(line, offset, " %02x", data[i+j]);\r |
469 | }\r |
470 | \r |
471 | for (int j = linelen; j < 16; j++) {\r |
472 | appendFmt(line, offset, " ");\r |
473 | }\r |
474 | \r |
475 | line[23] = '-';\r |
476 | \r |
477 | appendFmt(line, offset, " ");\r |
478 | \r |
479 | for (int j = 0; j < linelen; j++) {\r |
480 | if (isprint(data[i+j])) {\r |
481 | appendFmt(line, offset, "%c", data[i+j]);\r |
482 | } else {\r |
483 | appendFmt(line, offset, "-");\r |
484 | }\r |
485 | }\r |
486 | \r |
487 | ALOGD("%s", line);\r |
488 | }\r |
489 | \r |
490 | for (unsigned i = 0; i < NL80211_ATTR_MAX_INTERNAL; i++) {\r |
491 | if (mAttributes[i] != NULL) {\r |
492 | ALOGD("found attribute %s", attributeToString(i));\r |
493 | }\r |
494 | }\r |
495 | \r |
496 | ALOGD("-- End of message --");\r |
497 | }\r |
498 | \r |
499 | const char *WifiEvent::get_cmdString() {\r |
500 | return cmdToString(get_cmd());\r |
501 | }\r |
502 | \r |
503 | \r |
504 | int WifiEvent::parse() {\r |
505 | if (mHeader != NULL) {\r |
506 | return WIFI_SUCCESS;\r |
507 | }\r |
508 | mHeader = (genlmsghdr *)nlmsg_data(nlmsg_hdr(mMsg));\r |
509 | int result = nla_parse(mAttributes, NL80211_ATTR_MAX_INTERNAL, genlmsg_attrdata(mHeader, 0),\r |
510 | genlmsg_attrlen(mHeader, 0), NULL);\r |
511 | \r |
512 | ALOGD("event len = %d", nlmsg_hdr(mMsg)->nlmsg_len);\r |
513 | return result;\r |
514 | }\r |
515 | \r |
516 | int WifiRequest::create(int family, uint8_t cmd, int flags, int hdrlen) {\r |
517 | mMsg = nlmsg_alloc();\r |
518 | if (mMsg != NULL) {\r |
519 | genlmsg_put(mMsg, /* pid = */ 0, /* seq = */ 0, family,\r |
520 | hdrlen, flags, cmd, /* version = */ 0);\r |
521 | return WIFI_SUCCESS;\r |
522 | } else {\r |
523 | return WIFI_ERROR_OUT_OF_MEMORY;\r |
524 | }\r |
525 | }\r |
526 | \r |
527 | int WifiRequest::create(uint32_t id, int subcmd) {\r |
528 | int res = create(NL80211_CMD_VENDOR);\r |
529 | if (res < 0) {\r |
530 | return res;\r |
531 | }\r |
532 | \r |
533 | res = put_u32(NL80211_ATTR_VENDOR_ID, id);\r |
534 | if (res < 0) {\r |
535 | return res;\r |
536 | }\r |
537 | \r |
538 | res = put_u32(NL80211_ATTR_VENDOR_SUBCMD, subcmd);\r |
539 | if (res < 0) {\r |
540 | return res;\r |
541 | }\r |
542 | \r |
543 | if (mIface != -1) {\r |
544 | res = set_iface_id(mIface);\r |
545 | }\r |
546 | \r |
547 | return res;\r |
548 | }\r |
549 | \r |
550 | \r |
551 | static int no_seq_check(struct nl_msg *msg, void *arg)\r |
552 | {\r |
553 | return NL_OK;\r |
554 | }\r |
555 | \r |
556 | int WifiCommand::requestResponse() {\r |
557 | int err = create(); /* create the message */\r |
558 | if (err < 0) {\r |
559 | return err;\r |
560 | }\r |
561 | \r |
562 | return requestResponse(mMsg);\r |
563 | }\r |
564 | \r |
565 | int WifiCommand::requestResponse(WifiRequest& request) {\r |
566 | int err = 0;\r |
567 | \r |
568 | struct nl_cb *cb = nl_cb_alloc(NL_CB_DEFAULT);\r |
569 | if (!cb)\r |
570 | goto out;\r |
571 | \r |
572 | err = nl_send_auto_complete(mInfo->cmd_sock, request.getMessage()); /* send message */\r |
573 | if (err < 0)\r |
574 | goto out;\r |
575 | \r |
576 | err = 1;\r |
577 | \r |
578 | nl_cb_set(cb, NL_CB_SEQ_CHECK, NL_CB_CUSTOM, no_seq_check, NULL);\r |
579 | nl_cb_err(cb, NL_CB_CUSTOM, error_handler, &err);\r |
580 | nl_cb_set(cb, NL_CB_FINISH, NL_CB_CUSTOM, finish_handler, &err);\r |
581 | nl_cb_set(cb, NL_CB_ACK, NL_CB_CUSTOM, ack_handler, &err);\r |
582 | nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, response_handler, this);\r |
583 | \r |
584 | while (err > 0) { /* wait for reply */\r |
585 | int res = nl_recvmsgs(mInfo->cmd_sock, cb);\r |
586 | if (res) {\r |
587 | ALOGE("nl80211: %s->nl_recvmsgs failed: %d", __func__, res);\r |
588 | }\r |
589 | }\r |
590 | out:\r |
591 | nl_cb_put(cb);\r |
592 | return err;\r |
593 | }\r |
594 | \r |
595 | int WifiCommand::requestEvent(int cmd) {\r |
596 | \r |
597 | ALOGD("requesting event %d", cmd);\r |
598 | \r |
599 | int res = wifi_register_handler(wifiHandle(), cmd, event_handler, this);\r |
600 | if (res < 0) {\r |
601 | return res;\r |
602 | }\r |
603 | \r |
604 | res = create(); /* create the message */\r |
605 | if (res < 0)\r |
606 | goto out;\r |
607 | \r |
608 | ALOGD("waiting for response %d", cmd);\r |
609 | \r |
610 | res = nl_send_auto_complete(mInfo->cmd_sock, mMsg.getMessage()); /* send message */\r |
611 | if (res < 0)\r |
612 | goto out;\r |
613 | \r |
614 | ALOGD("waiting for event %d", cmd);\r |
615 | res = mCondition.wait();\r |
616 | if (res < 0)\r |
617 | goto out;\r |
618 | \r |
619 | out:\r |
620 | wifi_unregister_handler(wifiHandle(), cmd);\r |
621 | return res;\r |
622 | }\r |
623 | \r |
624 | int WifiCommand::requestVendorEvent(uint32_t id, int subcmd) {\r |
625 | \r |
626 | int res = wifi_register_vendor_handler(wifiHandle(), id, subcmd, event_handler, this);\r |
627 | if (res < 0) {\r |
628 | return res;\r |
629 | }\r |
630 | \r |
631 | res = create(); /* create the message */\r |
632 | if (res < 0)\r |
633 | goto out;\r |
634 | \r |
635 | res = nl_send_auto_complete(mInfo->cmd_sock, mMsg.getMessage()); /* send message */\r |
636 | if (res < 0)\r |
637 | goto out;\r |
638 | \r |
639 | res = mCondition.wait();\r |
640 | if (res < 0)\r |
641 | goto out;\r |
642 | \r |
643 | out:\r |
644 | wifi_unregister_vendor_handler(wifiHandle(), id, subcmd);\r |
645 | return res;\r |
646 | }\r |
647 | \r |
648 | /* Event handlers */\r |
649 | int WifiCommand::response_handler(struct nl_msg *msg, void *arg) {\r |
650 | ALOGD("response_handler called");\r |
651 | WifiCommand *cmd = (WifiCommand *)arg;\r |
652 | WifiEvent reply(msg);\r |
653 | int res = reply.parse();\r |
654 | if (res < 0) {\r |
655 | ALOGE("Failed to parse reply message = %d", res);\r |
656 | return NL_SKIP;\r |
657 | } else {\r |
658 | // reply.log();\r |
659 | return cmd->handleResponse(reply);\r |
660 | }\r |
661 | }\r |
662 | \r |
663 | int WifiCommand::event_handler(struct nl_msg *msg, void *arg) {\r |
664 | WifiCommand *cmd = (WifiCommand *)arg;\r |
665 | WifiEvent event(msg);\r |
666 | int res = event.parse();\r |
667 | if (res < 0) {\r |
668 | ALOGE("Failed to parse event = %d", res);\r |
669 | res = NL_SKIP;\r |
670 | } else {\r |
671 | res = cmd->handleEvent(event);\r |
672 | }\r |
673 | \r |
674 | cmd->mCondition.signal();\r |
675 | return res;\r |
676 | }\r |
677 | \r |
678 | /* Other event handlers */\r |
679 | int WifiCommand::valid_handler(struct nl_msg *msg, void *arg) {\r |
680 | ALOGD("valid_handler called");\r |
681 | int *err = (int *)arg;\r |
682 | *err = 0;\r |
683 | return NL_SKIP;\r |
684 | }\r |
685 | \r |
686 | int WifiCommand::ack_handler(struct nl_msg *msg, void *arg) {\r |
687 | ALOGD("ack_handler called");\r |
688 | int *err = (int *)arg;\r |
689 | *err = 0;\r |
690 | return NL_STOP;\r |
691 | }\r |
692 | \r |
693 | int WifiCommand::finish_handler(struct nl_msg *msg, void *arg) {\r |
694 | ALOGD("finish_handler called");\r |
695 | int *ret = (int *)arg;\r |
696 | *ret = 0;\r |
697 | return NL_SKIP;\r |
698 | }\r |
699 | \r |
700 | int WifiCommand::error_handler(struct sockaddr_nl *nla, struct nlmsgerr *err, void *arg) {\r |
701 | int *ret = (int *)arg;\r |
702 | *ret = err->error;\r |
703 | \r |
704 | ALOGD("error_handler received : %d", err->error);\r |
705 | return NL_SKIP;\r |
706 | }\r |