SSB-15430: AP restarts automatically during connection
[GitHub/MotorolaMobilityLLC/hardware-samsung_slsi-scsc_wifibt-wifi_hal.git] / cpp_bindings.cpp
CommitLineData
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
26void 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
36static 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
145const 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
454void 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
499const char *WifiEvent::get_cmdString() {\r
500 return cmdToString(get_cmd());\r
501}\r
502\r
503\r
504int 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
516int 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
527int 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
551static int no_seq_check(struct nl_msg *msg, void *arg)\r
552{\r
553 return NL_OK;\r
554}\r
555\r
556int 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
565int 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
590out:\r
591 nl_cb_put(cb);\r
592 return err;\r
593}\r
594\r
595int 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
619out:\r
620 wifi_unregister_handler(wifiHandle(), cmd);\r
621 return res;\r
622}\r
623\r
624int 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
643out:\r
644 wifi_unregister_vendor_handler(wifiHandle(), id, subcmd);\r
645 return res;\r
646}\r
647\r
648/* Event handlers */\r
649int 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
663int 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
679int 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
686int 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
693int 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
700int 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