1a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam/*
2a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam * Copyright (C) 2014 The Android Open Source Project
3a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam *
4a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam * Licensed under the Apache License, Version 2.0 (the "License");
5a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam * you may not use this file except in compliance with the License.
6a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam * You may obtain a copy of the License at
7a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam *
8a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam *     http://www.apache.org/licenses/LICENSE-2.0
9a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam *
10a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam * Unless required by applicable law or agreed to in writing, software
11a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam * distributed under the License is distributed on an "AS IS" BASIS,
12a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam * See the License for the specific language governing permissions and
14a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam * limitations under the License.
15a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam */
16b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
17b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde#include <stdint.h>
18b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde#include <fcntl.h>
19b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde#include <sys/socket.h>
20b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde#include <netlink/genl/genl.h>
21b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde#include <netlink/genl/family.h>
22b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde#include <netlink/genl/ctrl.h>
23b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde#include <linux/rtnetlink.h>
24b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde#include <netpacket/packet.h>
25b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde#include <linux/filter.h>
26b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde#include <linux/errqueue.h>
27b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
28b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde#include <linux/pkt_sched.h>
29b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde#include <netlink/object-api.h>
30b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde#include <netlink/netlink.h>
31b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde#include <netlink/socket.h>
32a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam#include <net/if.h>
33b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
34b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde#include "nl80211_copy.h"
35b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde#include <ctype.h>
36b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
37b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde#include "wifi_hal.h"
38b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde#include "common.h"
39b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde#include "cpp_bindings.h"
40f5f75323a871f475ce62d2c002e600f59cc67134Steve Pfetsch#include "vendor_definitions.h"
41b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
424af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyamvoid appendFmt(char *buf, size_t buf_len, int &offset, const char *fmt, ...)
43b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde{
44b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    va_list params;
45b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    va_start(params, fmt);
464af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    offset += vsnprintf(buf + offset, buf_len - offset, fmt, params);
47b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    va_end(params);
48b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde}
49b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
50b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde#define C2S(x)  case x: return #x;
51b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
52b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapndestatic const char *cmdToString(int cmd)
53b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde{
548abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    switch (cmd) {
558abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_UNSPEC)
568abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_GET_WIPHY)
578abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_SET_WIPHY)
588abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_NEW_WIPHY)
598abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_DEL_WIPHY)
608abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_GET_INTERFACE)
618abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_SET_INTERFACE)
628abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_NEW_INTERFACE)
638abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_DEL_INTERFACE)
648abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_GET_KEY)
658abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_SET_KEY)
668abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_NEW_KEY)
678abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_DEL_KEY)
688abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_GET_BEACON)
698abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_SET_BEACON)
708abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_START_AP)
718abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_STOP_AP)
728abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_GET_STATION)
738abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_SET_STATION)
748abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_NEW_STATION)
758abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_DEL_STATION)
768abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_GET_MPATH)
778abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_SET_MPATH)
788abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_NEW_MPATH)
798abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_DEL_MPATH)
808abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_SET_BSS)
818abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_SET_REG)
828abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_REQ_SET_REG)
838abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_GET_MESH_CONFIG)
848abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_SET_MESH_CONFIG)
858abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_SET_MGMT_EXTRA_IE)
868abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_GET_REG)
878abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_GET_SCAN)
888abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_TRIGGER_SCAN)
898abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_NEW_SCAN_RESULTS)
908abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_SCAN_ABORTED)
918abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_REG_CHANGE)
928abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_AUTHENTICATE)
938abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_ASSOCIATE)
948abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_DEAUTHENTICATE)
958abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_DISASSOCIATE)
968abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_MICHAEL_MIC_FAILURE)
978abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_REG_BEACON_HINT)
988abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_JOIN_IBSS)
998abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_LEAVE_IBSS)
1008abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_TESTMODE)
1018abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_CONNECT)
1028abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_ROAM)
1038abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_DISCONNECT)
1048abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_SET_WIPHY_NETNS)
1058abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_GET_SURVEY)
1068abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_NEW_SURVEY_RESULTS)
1078abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_SET_PMKSA)
1088abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_DEL_PMKSA)
1098abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_FLUSH_PMKSA)
1108abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_REMAIN_ON_CHANNEL)
1118abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL)
1128abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_SET_TX_BITRATE_MASK)
1138abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_REGISTER_FRAME)
1148abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_FRAME)
1158abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_FRAME_TX_STATUS)
1168abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_SET_POWER_SAVE)
1178abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_GET_POWER_SAVE)
1188abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_SET_CQM)
1198abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_NOTIFY_CQM)
1208abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_SET_CHANNEL)
1218abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_SET_WDS_PEER)
1228abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_FRAME_WAIT_CANCEL)
1238abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_JOIN_MESH)
1248abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_LEAVE_MESH)
1258abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_UNPROT_DEAUTHENTICATE)
1268abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_UNPROT_DISASSOCIATE)
1278abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_NEW_PEER_CANDIDATE)
1288abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_GET_WOWLAN)
1298abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_SET_WOWLAN)
1308abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_START_SCHED_SCAN)
1318abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_STOP_SCHED_SCAN)
1328abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_SCHED_SCAN_RESULTS)
1338abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_SCHED_SCAN_STOPPED)
1348abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_SET_REKEY_OFFLOAD)
1358abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_PMKSA_CANDIDATE)
1368abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_TDLS_OPER)
1378abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_TDLS_MGMT)
1388abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_UNEXPECTED_FRAME)
1398abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_PROBE_CLIENT)
1408abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_REGISTER_BEACONS)
1418abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_UNEXPECTED_4ADDR_FRAME)
1428abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_SET_NOACK_MAP)
1438abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_CH_SWITCH_NOTIFY)
1448abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_START_P2P_DEVICE)
1458abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_STOP_P2P_DEVICE)
1468abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_CONN_FAILED)
1478abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_SET_MCAST_RATE)
1488abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_SET_MAC_ACL)
1498abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_RADAR_DETECT)
1508abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_GET_PROTOCOL_FEATURES)
1518abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_UPDATE_FT_IES)
1528abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_FT_EVENT)
1538abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_CRIT_PROTOCOL_START)
1548abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_CRIT_PROTOCOL_STOP)
1558abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_GET_COALESCE)
1568abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_SET_COALESCE)
1578abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_CHANNEL_SWITCH)
1588abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_VENDOR)
1598abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_CMD_SET_QOS_MAP)
1608abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    default:
1618abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        return "NL80211_CMD_UNKNOWN";
1628abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    }
163b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde}
164b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
165b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapndeconst char *attributeToString(int attribute)
166b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde{
167b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    switch (attribute) {
1688abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_UNSPEC)
169b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
1708abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_WIPHY)
1718abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_WIPHY_NAME)
172b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
1738abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_IFINDEX)
1748abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_IFNAME)
1758abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_IFTYPE)
176b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
1778abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_MAC)
178b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
1798abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_KEY_DATA)
1808abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_KEY_IDX)
1818abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_KEY_CIPHER)
1828abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_KEY_SEQ)
1838abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_KEY_DEFAULT)
184b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
1858abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_BEACON_INTERVAL)
1868abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_DTIM_PERIOD)
1878abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_BEACON_HEAD)
1888abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_BEACON_TAIL)
189b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
1908abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_STA_AID)
1918abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_STA_FLAGS)
1928abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_STA_LISTEN_INTERVAL)
1938abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_STA_SUPPORTED_RATES)
1948abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_STA_VLAN)
1958abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_STA_INFO)
196b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
1978abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_WIPHY_BANDS)
198b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
1998abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_MNTR_FLAGS)
200b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
2018abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_MESH_ID)
2028abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_STA_PLINK_ACTION)
2038abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_MPATH_NEXT_HOP)
2048abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_MPATH_INFO)
205b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
2068abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_BSS_CTS_PROT)
2078abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_BSS_SHORT_PREAMBLE)
2088abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_BSS_SHORT_SLOT_TIME)
209b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
2108abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_HT_CAPABILITY)
211b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
2128abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_SUPPORTED_IFTYPES)
213b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
2148abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_REG_ALPHA2)
2158abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_REG_RULES)
216b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
2178abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_MESH_CONFIG)
218b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
2198abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_BSS_BASIC_RATES)
220b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
2218abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_WIPHY_TXQ_PARAMS)
2228abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_WIPHY_FREQ)
2238abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_WIPHY_CHANNEL_TYPE)
224b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
2258abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_KEY_DEFAULT_MGMT)
226b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
2278abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_MGMT_SUBTYPE)
2288abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_IE)
229b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
2308abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_MAX_NUM_SCAN_SSIDS)
231b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
2328abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_SCAN_FREQUENCIES)
2338abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_SCAN_SSIDS)
2348abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_GENERATION) /* replaces old SCAN_GENERATION */
2358abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_BSS)
236b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
2378abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_REG_INITIATOR)
2388abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_REG_TYPE)
239b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
2408abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_SUPPORTED_COMMANDS)
241b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
2428abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_FRAME)
2438abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_SSID)
2448abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_AUTH_TYPE)
2458abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_REASON_CODE)
246b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
2478abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_KEY_TYPE)
248b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
2498abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_MAX_SCAN_IE_LEN)
2508abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_CIPHER_SUITES)
251b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
2528abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_FREQ_BEFORE)
2538abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_FREQ_AFTER)
254b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
2558abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_FREQ_FIXED)
256b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
257b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
2588abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_WIPHY_RETRY_SHORT)
2598abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_WIPHY_RETRY_LONG)
2608abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_WIPHY_FRAG_THRESHOLD)
2618abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_WIPHY_RTS_THRESHOLD)
262b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
2638abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_TIMED_OUT)
264b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
2658abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_USE_MFP)
266b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
2678abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_STA_FLAGS2)
268b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
2698abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_CONTROL_PORT)
270b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
2718abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_TESTDATA)
272b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
2738abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_PRIVACY)
274b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
2758abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_DISCONNECTED_BY_AP)
2768abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_STATUS_CODE)
277b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
2788abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_CIPHER_SUITES_PAIRWISE)
2798abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_CIPHER_SUITE_GROUP)
2808abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_WPA_VERSIONS)
2818abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_AKM_SUITES)
282b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
2838abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_REQ_IE)
2848abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_RESP_IE)
285b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
2868abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_PREV_BSSID)
287b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
2888abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_KEY)
2898abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_KEYS)
290b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
2918abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_PID)
292b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
2938abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_4ADDR)
294b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
2958abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_SURVEY_INFO)
296b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
2978abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_PMKID)
2988abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_MAX_NUM_PMKIDS)
299b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
3008abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_DURATION)
301b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
3028abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_COOKIE)
303b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
3048abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_WIPHY_COVERAGE_CLASS)
305b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
3068abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_TX_RATES)
307b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
3088abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_FRAME_MATCH)
309b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
3108abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_ACK)
311b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
3128abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_PS_STATE)
313b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
3148abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_CQM)
315b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
3168abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_LOCAL_STATE_CHANGE)
317b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
3188abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_AP_ISOLATE)
319b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
3208abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_WIPHY_TX_POWER_SETTING)
3218abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_WIPHY_TX_POWER_LEVEL)
322b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
3238abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_TX_FRAME_TYPES)
3248abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_RX_FRAME_TYPES)
3258abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_FRAME_TYPE)
326b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
3278abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_CONTROL_PORT_ETHERTYPE)
3288abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT)
329b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
3308abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_SUPPORT_IBSS_RSN)
331b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
3328abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_WIPHY_ANTENNA_TX)
3338abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_WIPHY_ANTENNA_RX)
334b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
3358abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_MCAST_RATE)
336b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
3378abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_OFFCHANNEL_TX_OK)
338b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
3398abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_BSS_HT_OPMODE)
340b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
3418abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_KEY_DEFAULT_TYPES)
342b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
3438abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_MAX_REMAIN_ON_CHANNEL_DURATION)
344b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
3458abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_MESH_SETUP)
346b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
3478abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_WIPHY_ANTENNA_AVAIL_TX)
3488abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_WIPHY_ANTENNA_AVAIL_RX)
349b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
3508abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_SUPPORT_MESH_AUTH)
3518abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_STA_PLINK_STATE)
352b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
3538abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_WOWLAN_TRIGGERS)
3548abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_WOWLAN_TRIGGERS_SUPPORTED)
355b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
3568abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_SCHED_SCAN_INTERVAL)
357b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
3588abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_INTERFACE_COMBINATIONS)
3598abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_SOFTWARE_IFTYPES)
360b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
3618abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_REKEY_DATA)
362b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
3638abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_MAX_NUM_SCHED_SCAN_SSIDS)
3648abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_MAX_SCHED_SCAN_IE_LEN)
365b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
3668abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_SCAN_SUPP_RATES)
367b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
3688abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_HIDDEN_SSID)
369b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
3708abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_IE_PROBE_RESP)
3718abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_IE_ASSOC_RESP)
372b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
3738abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_STA_WME)
3748abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_SUPPORT_AP_UAPSD)
375b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
3768abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_ROAM_SUPPORT)
377b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
3788abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_SCHED_SCAN_MATCH)
3798abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_MAX_MATCH_SETS)
380b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
3818abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_PMKSA_CANDIDATE)
382b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
3838abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_TX_NO_CCK_RATE)
384b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
3858abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_TDLS_ACTION)
3868abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_TDLS_DIALOG_TOKEN)
3878abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_TDLS_OPERATION)
3888abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_TDLS_SUPPORT)
3898abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_TDLS_EXTERNAL_SETUP)
390b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
3918abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_DEVICE_AP_SME)
392b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
3938abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_DONT_WAIT_FOR_ACK)
394b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
3958abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_FEATURE_FLAGS)
396b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
3978abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_PROBE_RESP_OFFLOAD)
398b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
3998abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_PROBE_RESP)
400b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
4018abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_DFS_REGION)
402b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
4038abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_DISABLE_HT)
4048abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_HT_CAPABILITY_MASK)
405b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
4068abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_NOACK_MAP)
407b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
4088abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_INACTIVITY_TIMEOUT)
409b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
4108abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_RX_SIGNAL_DBM)
411b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
4128abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_BG_SCAN_PERIOD)
413b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
4148abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_WDEV)
415b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
4168abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_USER_REG_HINT_TYPE)
417b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
4188abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_CONN_FAILED_REASON)
419b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
4208abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_SAE_DATA)
421b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
4228abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_VHT_CAPABILITY)
423b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
4248abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_SCAN_FLAGS)
425b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
4268abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_CHANNEL_WIDTH)
4278abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_CENTER_FREQ1)
4288abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_CENTER_FREQ2)
429b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
4308abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_P2P_CTWINDOW)
4318abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_P2P_OPPPS)
432b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
4338abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_LOCAL_MESH_POWER_MODE)
434b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
4358abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_ACL_POLICY)
436b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
4378abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_MAC_ADDRS)
438b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
4398abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_MAC_ACL_MAX)
440b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
4418abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_RADAR_EVENT)
442b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
4438abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_EXT_CAPA)
4448abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_EXT_CAPA_MASK)
445b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
4468abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_STA_CAPABILITY)
4478abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_STA_EXT_CAPABILITY)
448b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
4498abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_PROTOCOL_FEATURES)
4508abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_SPLIT_WIPHY_DUMP)
451b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
4528abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_DISABLE_VHT)
4538abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_VHT_CAPABILITY_MASK)
454b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
4558abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_MDID)
4568abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_IE_RIC)
457b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
4588abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_CRIT_PROT_ID)
4598abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_MAX_CRIT_PROT_DURATION)
460b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
4618abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_PEER_AID)
462b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
4638abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_COALESCE_RULE)
464b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
4658abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_CH_SWITCH_COUNT)
4668abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_CH_SWITCH_BLOCK_TX)
4678abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_CSA_IES)
4688abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_CSA_C_OFF_BEACON)
4698abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_CSA_C_OFF_PRESP)
470b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
4718abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_RXMGMT_FLAGS)
472b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
4738abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_STA_SUPPORTED_CHANNELS)
474b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
4758abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES)
476b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
4778abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_HANDLE_DFS)
478b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
4798abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_SUPPORT_5_MHZ)
4808abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_SUPPORT_10_MHZ)
481b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
4828abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_OPMODE_NOTIF)
483b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
4848abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_VENDOR_ID)
4858abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_VENDOR_SUBCMD)
4868abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_VENDOR_DATA)
4878abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_VENDOR_EVENTS)
488b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
4898abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    C2S(NL80211_ATTR_QOS_MAP)
490b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    default:
491b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        return "NL80211_ATTR_UNKNOWN";
492b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
493b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde}
494b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
495b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapndevoid WifiEvent::log() {
496b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    parse();
497b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
498b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    byte *data = (byte *)genlmsg_attrdata(mHeader, 0);
499b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    int len = genlmsg_attrlen(mHeader, 0);
500b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
501b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    for (int i = 0; i < len; i += 16) {
502b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        char line[81];
503b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        int linelen = min(16, len - i);
504b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        int offset = 0;
5054af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam        appendFmt(line, sizeof(line), offset, "%02x", data[i]);
506b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        for (int j = 1; j < linelen; j++) {
5074af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam            appendFmt(line, sizeof(line), offset, " %02x", data[i+j]);
508b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        }
509b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
510b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        for (int j = linelen; j < 16; j++) {
5114af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam            appendFmt(line, sizeof(line), offset, "   ");
512b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        }
513b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
514b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        line[23] = '-';
515b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
5164af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam        appendFmt(line, sizeof(line), offset, "  ");
517b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
518b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        for (int j = 0; j < linelen; j++) {
519b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde            if (isprint(data[i+j])) {
5204af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam                appendFmt(line, sizeof(line), offset, "%c", data[i+j]);
521b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde            } else {
5224af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam                appendFmt(line, sizeof(line), offset, "-");
523b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde            }
524b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        }
525b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
526b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
527b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
528b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde}
529b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
530b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapndeconst char *WifiEvent::get_cmdString() {
531b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    return cmdToString(get_cmd());
532b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde}
533b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
534b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
535b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapndeint WifiEvent::parse() {
536b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    if (mHeader != NULL) {
537b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        return WIFI_SUCCESS;
538b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
539b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    mHeader = (genlmsghdr *)nlmsg_data(nlmsg_hdr(mMsg));
540b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    int result = nla_parse(mAttributes, NL80211_ATTR_MAX_INTERNAL, genlmsg_attrdata(mHeader, 0),
541b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde          genlmsg_attrlen(mHeader, 0), NULL);
542b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
543b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    return result;
544b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde}
545b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
546b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapndeint WifiRequest::create(int family, uint8_t cmd, int flags, int hdrlen) {
547f0c9628714bda31e58149bdc1d229a55df063121Vinit Deshpande
548f0c9628714bda31e58149bdc1d229a55df063121Vinit Deshpande    destroy();
549f0c9628714bda31e58149bdc1d229a55df063121Vinit Deshpande
550b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    mMsg = nlmsg_alloc();
551b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    if (mMsg != NULL) {
552b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        genlmsg_put(mMsg, /* pid = */ 0, /* seq = */ 0, family,
553b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde                hdrlen, flags, cmd, /* version = */ 0);
554b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        return WIFI_SUCCESS;
555b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    } else {
556b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        return WIFI_ERROR_OUT_OF_MEMORY;
557b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
558b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde}
559b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
560b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapndeint WifiRequest::create(uint32_t id, int subcmd) {
561b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    int res = create(NL80211_CMD_VENDOR);
562b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    if (res < 0) {
563b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        return res;
564b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
565b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
566b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    res = put_u32(NL80211_ATTR_VENDOR_ID, id);
567b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    if (res < 0) {
568b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        return res;
569b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
570b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
571b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    res = put_u32(NL80211_ATTR_VENDOR_SUBCMD, subcmd);
572b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    if (res < 0) {
573b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        return res;
574b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
575b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
576b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    if (mIface != -1) {
577b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        res = set_iface_id(mIface);
578b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
579b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
580b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    return res;
581b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde}
582b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
583b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
584b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapndestatic int no_seq_check(struct nl_msg *msg, void *arg)
585b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde{
5868abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    return NL_OK;
587b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde}
588b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
589b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapndeint WifiCommand::requestResponse() {
590b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    int err = create();                 /* create the message */
591b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    if (err < 0) {
592b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        return err;
593b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
594b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
595b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    return requestResponse(mMsg);
596b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde}
597b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
598b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapndeint WifiCommand::requestResponse(WifiRequest& request) {
599b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    int err = 0;
600b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
601b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    struct nl_cb *cb = nl_cb_alloc(NL_CB_DEFAULT);
602b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    if (!cb)
603b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        goto out;
604b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
605b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    err = nl_send_auto_complete(mInfo->cmd_sock, request.getMessage());    /* send message */
606b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    if (err < 0)
607b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        goto out;
608b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
609b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    err = 1;
610b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
611b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    nl_cb_set(cb, NL_CB_SEQ_CHECK, NL_CB_CUSTOM, no_seq_check, NULL);
612b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    nl_cb_err(cb, NL_CB_CUSTOM, error_handler, &err);
613b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    nl_cb_set(cb, NL_CB_FINISH, NL_CB_CUSTOM, finish_handler, &err);
614b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    nl_cb_set(cb, NL_CB_ACK, NL_CB_CUSTOM, ack_handler, &err);
615b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, response_handler, this);
616b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
617b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    while (err > 0) {                   /* wait for reply */
618b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        int res = nl_recvmsgs(mInfo->cmd_sock, cb);
619b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        if (res) {
6205ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik            ALOGE("nl80211: %s->nl_recvmsgs failed: %d", __FUNCTION__, res);
621b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        }
622b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
623b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapndeout:
624b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    nl_cb_put(cb);
625c19f715ece840e705749d2dfd1857210d7e31897Srinivas Dasari    mMsg.destroy();
626b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    return err;
627b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde}
628b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
629b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapndeint WifiCommand::requestEvent(int cmd) {
630b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
631b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    int res = wifi_register_handler(wifiHandle(), cmd, event_handler, this);
632b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    if (res < 0) {
633b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        return res;
634b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
635b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
636b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    res = create();                                                 /* create the message */
637b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    if (res < 0)
638b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        goto out;
639b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
640b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    res = nl_send_auto_complete(mInfo->cmd_sock, mMsg.getMessage());    /* send message */
641b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    if (res < 0)
642b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        goto out;
643b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
644b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    res = mCondition.wait();
645b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    if (res < 0)
646b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        goto out;
647b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
648b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapndeout:
649b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    wifi_unregister_handler(wifiHandle(), cmd);
650b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    return res;
651b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde}
652b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
653b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapndeint WifiCommand::requestVendorEvent(uint32_t id, int subcmd) {
654b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
655b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    int res = wifi_register_vendor_handler(wifiHandle(), id, subcmd, event_handler, this);
656b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    if (res < 0) {
657b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        return res;
658b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
659b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
660b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    res = create();                                                 /* create the message */
661b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    if (res < 0)
662b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        goto out;
663b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
664b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    res = nl_send_auto_complete(mInfo->cmd_sock, mMsg.getMessage());    /* send message */
665b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    if (res < 0)
666b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        goto out;
667b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
668b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    res = mCondition.wait();
669b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    if (res < 0)
670b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        goto out;
671b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
672b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapndeout:
673b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    wifi_unregister_vendor_handler(wifiHandle(), id, subcmd);
674b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    return res;
675b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde}
676b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
677b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde/* Event handlers */
678b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapndeint WifiCommand::response_handler(struct nl_msg *msg, void *arg) {
679b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    WifiCommand *cmd = (WifiCommand *)arg;
680b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    WifiEvent reply(msg);
681b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    int res = reply.parse();
682b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    if (res < 0) {
683b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        ALOGE("Failed to parse reply message = %d", res);
684b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        return NL_SKIP;
685b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    } else {
6864af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam        // reply.log(); /* Don't call log() to avoid excess WiFi HAL logging */
687b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        return cmd->handleResponse(reply);
688b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
689b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde}
690b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
691b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapndeint WifiCommand::event_handler(struct nl_msg *msg, void *arg) {
692b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    WifiCommand *cmd = (WifiCommand *)arg;
693b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    WifiEvent event(msg);
694b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    int res = event.parse();
695b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    if (res < 0) {
696b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        ALOGE("Failed to parse event = %d", res);
697b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        res = NL_SKIP;
698b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    } else {
699b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        res = cmd->handleEvent(event);
700b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
701b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
702b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    cmd->mCondition.signal();
703b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    return res;
704b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde}
705b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
706b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde/* Other event handlers */
707b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapndeint WifiCommand::valid_handler(struct nl_msg *msg, void *arg) {
7088abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam     int *err = (int *)arg;
709b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    *err = 0;
710b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    return NL_SKIP;
711b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde}
712b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
713b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapndeint WifiCommand::ack_handler(struct nl_msg *msg, void *arg) {
714b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    int *err = (int *)arg;
715b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    *err = 0;
716b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    return NL_STOP;
717b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde}
718b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
719b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapndeint WifiCommand::finish_handler(struct nl_msg *msg, void *arg) {
720b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    int *ret = (int *)arg;
721b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    *ret = 0;
722b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    return NL_SKIP;
723b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde}
724b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
725b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapndeint WifiCommand::error_handler(struct sockaddr_nl *nla, struct nlmsgerr *err, void *arg) {
726b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    int *ret = (int *)arg;
727b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    *ret = err->error;
728b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
729b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    return NL_SKIP;
730b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde}
731a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam
732a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam
733a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur SubramanyamWifiVendorCommand::WifiVendorCommand(wifi_handle handle,
734a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam                                     wifi_request_id id,
735a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam                                     u32 vendor_id,
736a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam                                     u32 subcmd)
737a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam        : WifiCommand(handle, id), mVendor_id(vendor_id), mSubcmd(subcmd),
738a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam        mVendorData(NULL), mDataLen(0)
739a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam{
740a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam    ALOGV("WifiVendorCommand %p created vendor_id:0x%x subcmd:%u",
741a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam          this, mVendor_id, mSubcmd);
742a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam}
743a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam
744a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur SubramanyamWifiVendorCommand::~WifiVendorCommand()
745a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam{
746e060f85e8b3ff335ce2d2e87adb389f46d0e0a09mukesh agrawal    //ALOGV("~WifiVendorCommand %p destroyed", this);
747a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam    //mVendorData is not destroyed here. Assumption
748a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam    //is that VendorData is specific to each Vendor and they
749a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam    //are responsible for owning the same.
750a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam}
751a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam
752a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam// Override this method to parse reply and dig out data; save it
753a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam// in the corresponding object
754a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyamint WifiVendorCommand::handleResponse(WifiEvent &reply)
755a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam{
756a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam    struct nlattr **tb = reply.attributes();
757a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam    struct genlmsghdr *gnlh = reply.header();
758a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam
759a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam    if (gnlh->cmd == NL80211_CMD_VENDOR) {
760a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam        if (tb[NL80211_ATTR_VENDOR_DATA]) {
761a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam            mVendorData = (char *)nla_data(tb[NL80211_ATTR_VENDOR_DATA]);
762a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam            mDataLen = nla_len(tb[NL80211_ATTR_VENDOR_DATA]);
763a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam        }
764a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam    }
765a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam    return NL_SKIP;
766a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam}
767a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam
768a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam// Override this method to parse event and dig out data;
769a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam// save it in the object
770a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyamint WifiVendorCommand::handleEvent(WifiEvent &event)
771a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam{
772a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam    struct nlattr **tb = event.attributes();
773a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam    struct genlmsghdr *gnlh = event.header();
774a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam
775a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam    if (gnlh->cmd == NL80211_CMD_VENDOR) {
776a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam        /* Vendor Event */
777a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam        if (!tb[NL80211_ATTR_VENDOR_ID] ||
778a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam            !tb[NL80211_ATTR_VENDOR_SUBCMD])
779a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam            return NL_SKIP;
780a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam
781a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam        mVendor_id = nla_get_u32(tb[NL80211_ATTR_VENDOR_ID]);
782a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam        mSubcmd = nla_get_u32(tb[NL80211_ATTR_VENDOR_SUBCMD]);
783a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam
784a17d2d4b21620c36ca81b7fde5cd511ca372d484mukesh agrawal        ALOGV("%s: Vendor event: vendor_id=0x%x subcmd=%u",
7855ce8c15e2d505392f9fa7933101fe3a89b129cfcSubhani Shaik              __FUNCTION__, mVendor_id, mSubcmd);
786a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam
787a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam        if (tb[NL80211_ATTR_VENDOR_DATA]) {
788a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam            mVendorData = (char *)nla_data(tb[NL80211_ATTR_VENDOR_DATA]);
789a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam            mDataLen = nla_len(tb[NL80211_ATTR_VENDOR_DATA]);
790a17d2d4b21620c36ca81b7fde5cd511ca372d484mukesh agrawal            ALOGV("%s: Vendor data len received:%d", __FUNCTION__, mDataLen);
791a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam            hexdump(mVendorData, mDataLen);
792a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam        }
793a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam    }
794a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam    return NL_SKIP;
795a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam}
796a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam
797a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyamint WifiVendorCommand::create() {
798a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam    int ifindex;
799a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam    int ret = mMsg.create(NL80211_CMD_VENDOR, 0, 0);
800a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam    if (ret < 0) {
801a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam        return ret;
802a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam    }
803a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam    // insert the oui in the msg
804a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam    ret = mMsg.put_u32(NL80211_ATTR_VENDOR_ID, mVendor_id);
805a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam    if (ret < 0)
806a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam        goto out;
807a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam
808a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam    // insert the subcmd in the msg
809a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam    ret = mMsg.put_u32(NL80211_ATTR_VENDOR_SUBCMD, mSubcmd);
810a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam    if (ret < 0)
811a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam        goto out;
812a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam
813a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam    //Insert the vendor specific data
814a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam    ret = mMsg.put_bytes(NL80211_ATTR_VENDOR_DATA, mVendorData, mDataLen);
815a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam    hexdump(mVendorData, mDataLen);
816a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam
817a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam    //insert the iface id to be "wlan0"
818a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam    ifindex = if_nametoindex("wlan0");
819a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam    mMsg.set_iface_id(ifindex);
820a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyamout:
821a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam    return ret;
822a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam
823a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam}
824a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam
8254af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyamint WifiVendorCommand::requestResponse()
8264af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam{
8274af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    return WifiCommand::requestResponse(mMsg);
8284af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam}
8294af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam
830a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyamint WifiVendorCommand::requestEvent()
831a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam{
832a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam    int res = requestVendorEvent(mVendor_id, mSubcmd);
833a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam    return res;
834a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam
835a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam}
836a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam
837a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyamint WifiVendorCommand::put_u8(int attribute, uint8_t value)
838a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam{
839a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam    return mMsg.put_u8(attribute, value);
840a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam}
841a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam
842a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyamint WifiVendorCommand::put_u16(int attribute, uint16_t value)
843a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam{
844a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam    return mMsg.put_u16(attribute, value);
845a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam}
846a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam
847a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyamint WifiVendorCommand::put_u32(int attribute, uint32_t value)
848a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam{
849a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam    return mMsg.put_u32(attribute, value);
850a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam}
851a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam
8524af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyamint WifiVendorCommand::put_u64(int attribute, uint64_t value)
8534af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam{
8544af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    return mMsg.put_u64(attribute, value);
8554af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam}
8564af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam
8574af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyamint WifiVendorCommand::put_s8(int attribute, s8 value)
8584af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam{
8594af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    return mMsg.put_s8(attribute, value);
8604af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam}
8614af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam
8624af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyamint WifiVendorCommand::put_s16(int attribute, s16 value)
8634af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam{
8644af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    return mMsg.put_s16(attribute, value);
8654af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam}
8664af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam
8674af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyamint WifiVendorCommand::put_s32(int attribute, s32 value) {
8688abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    return mMsg.put_s32(attribute, value);
8698abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam}
8708abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
8714af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyamint WifiVendorCommand::put_s64(int attribute, s64 value)
872a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam{
8734af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    return mMsg.put_s64(attribute, value);
8744af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam}
8754af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam
8764af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyamu8 WifiVendorCommand::get_u8(const struct nlattr *nla)
8774af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam{
8784af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    return mMsg.get_u8(nla);
8794af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam}
8804af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam
8814af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyamu16 WifiVendorCommand::get_u16(const struct nlattr *nla)
8824af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam{
8834af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    return mMsg.get_u16(nla);
8844af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam}
8854af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam
8864af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyamu32 WifiVendorCommand::get_u32(const struct nlattr *nla)
8874af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam{
8884af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    return mMsg.get_u32(nla);
8894af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam}
8904af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam
8914af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyamu64 WifiVendorCommand::get_u64(const struct nlattr *nla)
8924af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam{
8934af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    return mMsg.get_u64(nla);
8944af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam}
8954af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam
8964af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyams8 WifiVendorCommand::get_s8(const struct nlattr *nla)
8974af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam{
8984af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    return mMsg.get_s8(nla);
8994af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam}
9004af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam
9014af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyams16 WifiVendorCommand::get_s16(const struct nlattr *nla)
9024af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam{
9034af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    return mMsg.get_s16(nla);
9044af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam}
9054af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam
9064af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyams32 WifiVendorCommand::get_s32(const struct nlattr *nla)
9074af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam{
9084af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    return mMsg.get_s32(nla);
9094af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam}
9104af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam
9114af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyams64 WifiVendorCommand::get_s64(const struct nlattr *nla)
9124af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam{
9134af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    return mMsg.get_s64(nla);
914a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam}
915a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam
916a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyamint WifiVendorCommand::put_string(int attribute, const char *value)
917a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam{
918a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam    return mMsg.put_string(attribute, value);
919a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam}
920a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam
921a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyamint WifiVendorCommand::put_addr(int attribute, mac_addr value)
922a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam{
923a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam    return mMsg.put_addr(attribute, value);
924a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam}
925a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam
926a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyamstruct nlattr * WifiVendorCommand::attr_start(int attribute)
927a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam{
928a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam    return mMsg.attr_start(attribute);
929a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam}
930a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam
931a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyamvoid WifiVendorCommand::attr_end(struct nlattr *attribute)
932a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam{
933a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam    return mMsg.attr_end(attribute);
934a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam}
935a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam
936a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyamint WifiVendorCommand::set_iface_id(const char* name)
937a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam{
938a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam    unsigned ifindex = if_nametoindex(name);
939a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam    return mMsg.set_iface_id(ifindex);
940a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam}
941a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam
942a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyamint WifiVendorCommand::put_bytes(int attribute, const char *data, int len)
943a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam{
944a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam    return mMsg.put_bytes(attribute, data, len);
945a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam}
946ddae66e0dd0f0b30e8f8a7c8dc84a205f8a98f98Amarnath Hullur Subramanyam
947ddae66e0dd0f0b30e8f8a7c8dc84a205f8a98f98Amarnath Hullur Subramanyamwifi_error WifiVendorCommand::get_mac_addr(struct nlattr **tb_vendor,
948ddae66e0dd0f0b30e8f8a7c8dc84a205f8a98f98Amarnath Hullur Subramanyam                                       int attribute,
949ddae66e0dd0f0b30e8f8a7c8dc84a205f8a98f98Amarnath Hullur Subramanyam                                       mac_addr addr)
950ddae66e0dd0f0b30e8f8a7c8dc84a205f8a98f98Amarnath Hullur Subramanyam{
951ddae66e0dd0f0b30e8f8a7c8dc84a205f8a98f98Amarnath Hullur Subramanyam    if (!tb_vendor[attribute]) {
952ddae66e0dd0f0b30e8f8a7c8dc84a205f8a98f98Amarnath Hullur Subramanyam        ALOGE("Failed to get attribute : %d", attribute);
953ddae66e0dd0f0b30e8f8a7c8dc84a205f8a98f98Amarnath Hullur Subramanyam        return WIFI_ERROR_INVALID_ARGS;
954ddae66e0dd0f0b30e8f8a7c8dc84a205f8a98f98Amarnath Hullur Subramanyam    }
955ddae66e0dd0f0b30e8f8a7c8dc84a205f8a98f98Amarnath Hullur Subramanyam    if (!addr) {
956ddae66e0dd0f0b30e8f8a7c8dc84a205f8a98f98Amarnath Hullur Subramanyam        ALOGE("addr is NULL");
957ddae66e0dd0f0b30e8f8a7c8dc84a205f8a98f98Amarnath Hullur Subramanyam        return WIFI_ERROR_INVALID_ARGS;
958ddae66e0dd0f0b30e8f8a7c8dc84a205f8a98f98Amarnath Hullur Subramanyam    }
959ddae66e0dd0f0b30e8f8a7c8dc84a205f8a98f98Amarnath Hullur Subramanyam
960c19f715ece840e705749d2dfd1857210d7e31897Srinivas Dasari    if (nla_len(tb_vendor[attribute]) != sizeof(mac_addr)) {
961c19f715ece840e705749d2dfd1857210d7e31897Srinivas Dasari        ALOGE("Invalid mac addr lenght\n");
962c19f715ece840e705749d2dfd1857210d7e31897Srinivas Dasari        return WIFI_ERROR_INVALID_ARGS;
963c19f715ece840e705749d2dfd1857210d7e31897Srinivas Dasari    }
964c19f715ece840e705749d2dfd1857210d7e31897Srinivas Dasari
965ddae66e0dd0f0b30e8f8a7c8dc84a205f8a98f98Amarnath Hullur Subramanyam    memcpy(addr, (u8 *)nla_data(tb_vendor[attribute]),
966f5f75323a871f475ce62d2c002e600f59cc67134Steve Pfetsch                 nla_len(tb_vendor[attribute]));
967f5f75323a871f475ce62d2c002e600f59cc67134Steve Pfetsch
968ddae66e0dd0f0b30e8f8a7c8dc84a205f8a98f98Amarnath Hullur Subramanyam    return WIFI_SUCCESS;
969ddae66e0dd0f0b30e8f8a7c8dc84a205f8a98f98Amarnath Hullur Subramanyam}
970ddae66e0dd0f0b30e8f8a7c8dc84a205f8a98f98Amarnath Hullur Subramanyam
971ddae66e0dd0f0b30e8f8a7c8dc84a205f8a98f98Amarnath Hullur Subramanyamwifi_error initialize_vendor_cmd(wifi_interface_handle iface,
972d0d336f8cfaa370fc8f9ff7426ffba0036063c61Amarnath Hullur Subramanyam                                 wifi_request_id id,
973ddae66e0dd0f0b30e8f8a7c8dc84a205f8a98f98Amarnath Hullur Subramanyam                                 u32 subcmd,
974ddae66e0dd0f0b30e8f8a7c8dc84a205f8a98f98Amarnath Hullur Subramanyam                                 WifiVendorCommand **vCommand)
975ddae66e0dd0f0b30e8f8a7c8dc84a205f8a98f98Amarnath Hullur Subramanyam{
976ddae66e0dd0f0b30e8f8a7c8dc84a205f8a98f98Amarnath Hullur Subramanyam    int ret = 0;
977ddae66e0dd0f0b30e8f8a7c8dc84a205f8a98f98Amarnath Hullur Subramanyam    interface_info *ifaceInfo = getIfaceInfo(iface);
978ddae66e0dd0f0b30e8f8a7c8dc84a205f8a98f98Amarnath Hullur Subramanyam    wifi_handle wifiHandle = getWifiHandle(iface);
979ddae66e0dd0f0b30e8f8a7c8dc84a205f8a98f98Amarnath Hullur Subramanyam
980ddae66e0dd0f0b30e8f8a7c8dc84a205f8a98f98Amarnath Hullur Subramanyam    if (vCommand == NULL) {
981ddae66e0dd0f0b30e8f8a7c8dc84a205f8a98f98Amarnath Hullur Subramanyam        ALOGE("%s: Error vCommand NULL", __FUNCTION__);
982ddae66e0dd0f0b30e8f8a7c8dc84a205f8a98f98Amarnath Hullur Subramanyam        return WIFI_ERROR_INVALID_ARGS;
983ddae66e0dd0f0b30e8f8a7c8dc84a205f8a98f98Amarnath Hullur Subramanyam    }
984ddae66e0dd0f0b30e8f8a7c8dc84a205f8a98f98Amarnath Hullur Subramanyam
985d0d336f8cfaa370fc8f9ff7426ffba0036063c61Amarnath Hullur Subramanyam    *vCommand = new WifiVendorCommand(wifiHandle, id,
986ddae66e0dd0f0b30e8f8a7c8dc84a205f8a98f98Amarnath Hullur Subramanyam                                      OUI_QCA,
987ddae66e0dd0f0b30e8f8a7c8dc84a205f8a98f98Amarnath Hullur Subramanyam                                      subcmd);
988ddae66e0dd0f0b30e8f8a7c8dc84a205f8a98f98Amarnath Hullur Subramanyam    if (*vCommand == NULL) {
989ddae66e0dd0f0b30e8f8a7c8dc84a205f8a98f98Amarnath Hullur Subramanyam        ALOGE("%s: Object creation failed", __FUNCTION__);
990ddae66e0dd0f0b30e8f8a7c8dc84a205f8a98f98Amarnath Hullur Subramanyam        return WIFI_ERROR_OUT_OF_MEMORY;
991ddae66e0dd0f0b30e8f8a7c8dc84a205f8a98f98Amarnath Hullur Subramanyam    }
992ddae66e0dd0f0b30e8f8a7c8dc84a205f8a98f98Amarnath Hullur Subramanyam
993ddae66e0dd0f0b30e8f8a7c8dc84a205f8a98f98Amarnath Hullur Subramanyam    /* Create the message */
994ddae66e0dd0f0b30e8f8a7c8dc84a205f8a98f98Amarnath Hullur Subramanyam    ret = (*vCommand)->create();
995ddae66e0dd0f0b30e8f8a7c8dc84a205f8a98f98Amarnath Hullur Subramanyam    if (ret < 0)
996ddae66e0dd0f0b30e8f8a7c8dc84a205f8a98f98Amarnath Hullur Subramanyam        goto cleanup;
997ddae66e0dd0f0b30e8f8a7c8dc84a205f8a98f98Amarnath Hullur Subramanyam
998ddae66e0dd0f0b30e8f8a7c8dc84a205f8a98f98Amarnath Hullur Subramanyam    ret = (*vCommand)->set_iface_id(ifaceInfo->name);
999ddae66e0dd0f0b30e8f8a7c8dc84a205f8a98f98Amarnath Hullur Subramanyam    if (ret < 0)
1000ddae66e0dd0f0b30e8f8a7c8dc84a205f8a98f98Amarnath Hullur Subramanyam        goto cleanup;
1001ddae66e0dd0f0b30e8f8a7c8dc84a205f8a98f98Amarnath Hullur Subramanyam
1002ddae66e0dd0f0b30e8f8a7c8dc84a205f8a98f98Amarnath Hullur Subramanyam    return WIFI_SUCCESS;
1003ddae66e0dd0f0b30e8f8a7c8dc84a205f8a98f98Amarnath Hullur Subramanyam
1004ddae66e0dd0f0b30e8f8a7c8dc84a205f8a98f98Amarnath Hullur Subramanyamcleanup:
1005ddae66e0dd0f0b30e8f8a7c8dc84a205f8a98f98Amarnath Hullur Subramanyam    delete *vCommand;
1006ddae66e0dd0f0b30e8f8a7c8dc84a205f8a98f98Amarnath Hullur Subramanyam    return (wifi_error)ret;
1007ddae66e0dd0f0b30e8f8a7c8dc84a205f8a98f98Amarnath Hullur Subramanyam}
1008