/*
 * Copyright (C) 2017 The Android Open Source Project
 *
 * Portions copyright (C) 2017 Broadcom Limited
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include <stdint.h>
#include <fcntl.h>
#include <sys/socket.h>
#include <netlink/genl/genl.h>
#include <netlink/genl/family.h>
#include <netlink/genl/ctrl.h>
#include <linux/rtnetlink.h>
#include <netpacket/packet.h>
#include <linux/filter.h>
#include <linux/errqueue.h>

#include <linux/pkt_sched.h>
#include <netlink/object-api.h>
#include <netlink/netlink.h>
#include <netlink/socket.h>
#include <netlink/handlers.h>

#include <ctype.h>
#include <errno.h>

#include "wifi_hal.h"
#include "common.h"
#include "cpp_bindings.h"

pthread_mutex_t ResponseMutex;
void InitResponseLock() {
    pthread_mutex_init(&ResponseMutex, NULL);
}

void DestroyResponseLock()
{
    pthread_mutex_destroy(&ResponseMutex);
}

void appendFmt(char *buf, int &offset, const char *fmt, ...)
{
    va_list params;
    va_start(params, fmt);
    offset += vsprintf(buf + offset, fmt, params);
    va_end(params);
}

#define C2S(x)  case x: return #x;

static const char *cmdToString(int cmd)
{
	switch (cmd) {
	C2S(NL80211_CMD_UNSPEC)
	C2S(NL80211_CMD_GET_WIPHY)
	C2S(NL80211_CMD_SET_WIPHY)
	C2S(NL80211_CMD_NEW_WIPHY)
	C2S(NL80211_CMD_DEL_WIPHY)
	C2S(NL80211_CMD_GET_INTERFACE)
	C2S(NL80211_CMD_SET_INTERFACE)
	C2S(NL80211_CMD_NEW_INTERFACE)
	C2S(NL80211_CMD_DEL_INTERFACE)
	C2S(NL80211_CMD_GET_KEY)
	C2S(NL80211_CMD_SET_KEY)
	C2S(NL80211_CMD_NEW_KEY)
	C2S(NL80211_CMD_DEL_KEY)
	C2S(NL80211_CMD_GET_BEACON)
	C2S(NL80211_CMD_SET_BEACON)
	C2S(NL80211_CMD_START_AP)
	C2S(NL80211_CMD_STOP_AP)
	C2S(NL80211_CMD_GET_STATION)
	C2S(NL80211_CMD_SET_STATION)
	C2S(NL80211_CMD_NEW_STATION)
	C2S(NL80211_CMD_DEL_STATION)
	C2S(NL80211_CMD_GET_MPATH)
	C2S(NL80211_CMD_SET_MPATH)
	C2S(NL80211_CMD_NEW_MPATH)
	C2S(NL80211_CMD_DEL_MPATH)
	C2S(NL80211_CMD_SET_BSS)
	C2S(NL80211_CMD_SET_REG)
	C2S(NL80211_CMD_REQ_SET_REG)
	C2S(NL80211_CMD_GET_MESH_CONFIG)
	C2S(NL80211_CMD_SET_MESH_CONFIG)
	C2S(NL80211_CMD_SET_MGMT_EXTRA_IE)
	C2S(NL80211_CMD_GET_REG)
	C2S(NL80211_CMD_GET_SCAN)
	C2S(NL80211_CMD_TRIGGER_SCAN)
	C2S(NL80211_CMD_NEW_SCAN_RESULTS)
	C2S(NL80211_CMD_SCAN_ABORTED)
	C2S(NL80211_CMD_REG_CHANGE)
	C2S(NL80211_CMD_AUTHENTICATE)
	C2S(NL80211_CMD_ASSOCIATE)
	C2S(NL80211_CMD_DEAUTHENTICATE)
	C2S(NL80211_CMD_DISASSOCIATE)
	C2S(NL80211_CMD_MICHAEL_MIC_FAILURE)
	C2S(NL80211_CMD_REG_BEACON_HINT)
	C2S(NL80211_CMD_JOIN_IBSS)
	C2S(NL80211_CMD_LEAVE_IBSS)
	C2S(NL80211_CMD_TESTMODE)
	C2S(NL80211_CMD_CONNECT)
	C2S(NL80211_CMD_ROAM)
	C2S(NL80211_CMD_DISCONNECT)
	C2S(NL80211_CMD_SET_WIPHY_NETNS)
	C2S(NL80211_CMD_GET_SURVEY)
	C2S(NL80211_CMD_NEW_SURVEY_RESULTS)
	C2S(NL80211_CMD_SET_PMKSA)
	C2S(NL80211_CMD_DEL_PMKSA)
	C2S(NL80211_CMD_FLUSH_PMKSA)
	C2S(NL80211_CMD_REMAIN_ON_CHANNEL)
	C2S(NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL)
	C2S(NL80211_CMD_SET_TX_BITRATE_MASK)
	C2S(NL80211_CMD_REGISTER_FRAME)
	C2S(NL80211_CMD_FRAME)
	C2S(NL80211_CMD_FRAME_TX_STATUS)
	C2S(NL80211_CMD_SET_POWER_SAVE)
	C2S(NL80211_CMD_GET_POWER_SAVE)
	C2S(NL80211_CMD_SET_CQM)
	C2S(NL80211_CMD_NOTIFY_CQM)
	C2S(NL80211_CMD_SET_CHANNEL)
	C2S(NL80211_CMD_SET_WDS_PEER)
	C2S(NL80211_CMD_FRAME_WAIT_CANCEL)
	C2S(NL80211_CMD_JOIN_MESH)
	C2S(NL80211_CMD_LEAVE_MESH)
	C2S(NL80211_CMD_UNPROT_DEAUTHENTICATE)
	C2S(NL80211_CMD_UNPROT_DISASSOCIATE)
	C2S(NL80211_CMD_NEW_PEER_CANDIDATE)
	C2S(NL80211_CMD_GET_WOWLAN)
	C2S(NL80211_CMD_SET_WOWLAN)
	C2S(NL80211_CMD_START_SCHED_SCAN)
	C2S(NL80211_CMD_STOP_SCHED_SCAN)
	C2S(NL80211_CMD_SCHED_SCAN_RESULTS)
	C2S(NL80211_CMD_SCHED_SCAN_STOPPED)
	C2S(NL80211_CMD_SET_REKEY_OFFLOAD)
	C2S(NL80211_CMD_PMKSA_CANDIDATE)
	C2S(NL80211_CMD_TDLS_OPER)
	C2S(NL80211_CMD_TDLS_MGMT)
	C2S(NL80211_CMD_UNEXPECTED_FRAME)
	C2S(NL80211_CMD_PROBE_CLIENT)
	C2S(NL80211_CMD_REGISTER_BEACONS)
	C2S(NL80211_CMD_UNEXPECTED_4ADDR_FRAME)
	C2S(NL80211_CMD_SET_NOACK_MAP)
	C2S(NL80211_CMD_CH_SWITCH_NOTIFY)
	C2S(NL80211_CMD_START_P2P_DEVICE)
	C2S(NL80211_CMD_STOP_P2P_DEVICE)
	C2S(NL80211_CMD_CONN_FAILED)
	C2S(NL80211_CMD_SET_MCAST_RATE)
	C2S(NL80211_CMD_SET_MAC_ACL)
	C2S(NL80211_CMD_RADAR_DETECT)
	C2S(NL80211_CMD_GET_PROTOCOL_FEATURES)
	C2S(NL80211_CMD_UPDATE_FT_IES)
	C2S(NL80211_CMD_FT_EVENT)
	C2S(NL80211_CMD_CRIT_PROTOCOL_START)
	C2S(NL80211_CMD_CRIT_PROTOCOL_STOP)
	C2S(NL80211_CMD_GET_COALESCE)
	C2S(NL80211_CMD_SET_COALESCE)
	C2S(NL80211_CMD_CHANNEL_SWITCH)
	C2S(NL80211_CMD_VENDOR)
	C2S(NL80211_CMD_SET_QOS_MAP)
	default:
		return "NL80211_CMD_UNKNOWN";
	}
}

const char *attributeToString(int attribute)
{
    switch (attribute) {
	C2S(NL80211_ATTR_UNSPEC)

	C2S(NL80211_ATTR_WIPHY)
	C2S(NL80211_ATTR_WIPHY_NAME)

	C2S(NL80211_ATTR_IFINDEX)
	C2S(NL80211_ATTR_IFNAME)
	C2S(NL80211_ATTR_IFTYPE)

	C2S(NL80211_ATTR_MAC)

	C2S(NL80211_ATTR_KEY_DATA)
	C2S(NL80211_ATTR_KEY_IDX)
	C2S(NL80211_ATTR_KEY_CIPHER)
	C2S(NL80211_ATTR_KEY_SEQ)
	C2S(NL80211_ATTR_KEY_DEFAULT)

	C2S(NL80211_ATTR_BEACON_INTERVAL)
	C2S(NL80211_ATTR_DTIM_PERIOD)
	C2S(NL80211_ATTR_BEACON_HEAD)
	C2S(NL80211_ATTR_BEACON_TAIL)

	C2S(NL80211_ATTR_STA_AID)
	C2S(NL80211_ATTR_STA_FLAGS)
	C2S(NL80211_ATTR_STA_LISTEN_INTERVAL)
	C2S(NL80211_ATTR_STA_SUPPORTED_RATES)
	C2S(NL80211_ATTR_STA_VLAN)
	C2S(NL80211_ATTR_STA_INFO)

	C2S(NL80211_ATTR_WIPHY_BANDS)

	C2S(NL80211_ATTR_MNTR_FLAGS)

	C2S(NL80211_ATTR_MESH_ID)
	C2S(NL80211_ATTR_STA_PLINK_ACTION)
	C2S(NL80211_ATTR_MPATH_NEXT_HOP)
	C2S(NL80211_ATTR_MPATH_INFO)

	C2S(NL80211_ATTR_BSS_CTS_PROT)
	C2S(NL80211_ATTR_BSS_SHORT_PREAMBLE)
	C2S(NL80211_ATTR_BSS_SHORT_SLOT_TIME)

	C2S(NL80211_ATTR_HT_CAPABILITY)

	C2S(NL80211_ATTR_SUPPORTED_IFTYPES)

	C2S(NL80211_ATTR_REG_ALPHA2)
	C2S(NL80211_ATTR_REG_RULES)

	C2S(NL80211_ATTR_MESH_CONFIG)

	C2S(NL80211_ATTR_BSS_BASIC_RATES)

	C2S(NL80211_ATTR_WIPHY_TXQ_PARAMS)
	C2S(NL80211_ATTR_WIPHY_FREQ)
	C2S(NL80211_ATTR_WIPHY_CHANNEL_TYPE)

	C2S(NL80211_ATTR_KEY_DEFAULT_MGMT)

	C2S(NL80211_ATTR_MGMT_SUBTYPE)
	C2S(NL80211_ATTR_IE)

	C2S(NL80211_ATTR_MAX_NUM_SCAN_SSIDS)

	C2S(NL80211_ATTR_SCAN_FREQUENCIES)
	C2S(NL80211_ATTR_SCAN_SSIDS)
	C2S(NL80211_ATTR_GENERATION) /* replaces old SCAN_GENERATION */
	C2S(NL80211_ATTR_BSS)

	C2S(NL80211_ATTR_REG_INITIATOR)
	C2S(NL80211_ATTR_REG_TYPE)

	C2S(NL80211_ATTR_SUPPORTED_COMMANDS)

	C2S(NL80211_ATTR_FRAME)
	C2S(NL80211_ATTR_SSID)
	C2S(NL80211_ATTR_AUTH_TYPE)
	C2S(NL80211_ATTR_REASON_CODE)

	C2S(NL80211_ATTR_KEY_TYPE)

	C2S(NL80211_ATTR_MAX_SCAN_IE_LEN)
	C2S(NL80211_ATTR_CIPHER_SUITES)

	C2S(NL80211_ATTR_FREQ_BEFORE)
	C2S(NL80211_ATTR_FREQ_AFTER)

	C2S(NL80211_ATTR_FREQ_FIXED)


	C2S(NL80211_ATTR_WIPHY_RETRY_SHORT)
	C2S(NL80211_ATTR_WIPHY_RETRY_LONG)
	C2S(NL80211_ATTR_WIPHY_FRAG_THRESHOLD)
	C2S(NL80211_ATTR_WIPHY_RTS_THRESHOLD)

	C2S(NL80211_ATTR_TIMED_OUT)

	C2S(NL80211_ATTR_USE_MFP)

	C2S(NL80211_ATTR_STA_FLAGS2)

	C2S(NL80211_ATTR_CONTROL_PORT)

	C2S(NL80211_ATTR_TESTDATA)

	C2S(NL80211_ATTR_PRIVACY)

	C2S(NL80211_ATTR_DISCONNECTED_BY_AP)
	C2S(NL80211_ATTR_STATUS_CODE)

	C2S(NL80211_ATTR_CIPHER_SUITES_PAIRWISE)
	C2S(NL80211_ATTR_CIPHER_SUITE_GROUP)
	C2S(NL80211_ATTR_WPA_VERSIONS)
	C2S(NL80211_ATTR_AKM_SUITES)

	C2S(NL80211_ATTR_REQ_IE)
	C2S(NL80211_ATTR_RESP_IE)

	C2S(NL80211_ATTR_PREV_BSSID)

	C2S(NL80211_ATTR_KEY)
	C2S(NL80211_ATTR_KEYS)

	C2S(NL80211_ATTR_PID)

	C2S(NL80211_ATTR_4ADDR)

	C2S(NL80211_ATTR_SURVEY_INFO)

	C2S(NL80211_ATTR_PMKID)
	C2S(NL80211_ATTR_MAX_NUM_PMKIDS)

	C2S(NL80211_ATTR_DURATION)

	C2S(NL80211_ATTR_COOKIE)

	C2S(NL80211_ATTR_WIPHY_COVERAGE_CLASS)

	C2S(NL80211_ATTR_TX_RATES)

	C2S(NL80211_ATTR_FRAME_MATCH)

	C2S(NL80211_ATTR_ACK)

	C2S(NL80211_ATTR_PS_STATE)

	C2S(NL80211_ATTR_CQM)

	C2S(NL80211_ATTR_LOCAL_STATE_CHANGE)

	C2S(NL80211_ATTR_AP_ISOLATE)

	C2S(NL80211_ATTR_WIPHY_TX_POWER_SETTING)
	C2S(NL80211_ATTR_WIPHY_TX_POWER_LEVEL)

	C2S(NL80211_ATTR_TX_FRAME_TYPES)
	C2S(NL80211_ATTR_RX_FRAME_TYPES)
	C2S(NL80211_ATTR_FRAME_TYPE)

	C2S(NL80211_ATTR_CONTROL_PORT_ETHERTYPE)
	C2S(NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT)

	C2S(NL80211_ATTR_SUPPORT_IBSS_RSN)

	C2S(NL80211_ATTR_WIPHY_ANTENNA_TX)
	C2S(NL80211_ATTR_WIPHY_ANTENNA_RX)

	C2S(NL80211_ATTR_MCAST_RATE)

	C2S(NL80211_ATTR_OFFCHANNEL_TX_OK)

	C2S(NL80211_ATTR_BSS_HT_OPMODE)

	C2S(NL80211_ATTR_KEY_DEFAULT_TYPES)

	C2S(NL80211_ATTR_MAX_REMAIN_ON_CHANNEL_DURATION)

	C2S(NL80211_ATTR_MESH_SETUP)

	C2S(NL80211_ATTR_WIPHY_ANTENNA_AVAIL_TX)
	C2S(NL80211_ATTR_WIPHY_ANTENNA_AVAIL_RX)

	C2S(NL80211_ATTR_SUPPORT_MESH_AUTH)
	C2S(NL80211_ATTR_STA_PLINK_STATE)

	C2S(NL80211_ATTR_WOWLAN_TRIGGERS)
	C2S(NL80211_ATTR_WOWLAN_TRIGGERS_SUPPORTED)

	C2S(NL80211_ATTR_SCHED_SCAN_INTERVAL)

	C2S(NL80211_ATTR_INTERFACE_COMBINATIONS)
	C2S(NL80211_ATTR_SOFTWARE_IFTYPES)

	C2S(NL80211_ATTR_REKEY_DATA)

	C2S(NL80211_ATTR_MAX_NUM_SCHED_SCAN_SSIDS)
	C2S(NL80211_ATTR_MAX_SCHED_SCAN_IE_LEN)

	C2S(NL80211_ATTR_SCAN_SUPP_RATES)

	C2S(NL80211_ATTR_HIDDEN_SSID)

	C2S(NL80211_ATTR_IE_PROBE_RESP)
	C2S(NL80211_ATTR_IE_ASSOC_RESP)

	C2S(NL80211_ATTR_STA_WME)
	C2S(NL80211_ATTR_SUPPORT_AP_UAPSD)

	C2S(NL80211_ATTR_ROAM_SUPPORT)

	C2S(NL80211_ATTR_SCHED_SCAN_MATCH)
	C2S(NL80211_ATTR_MAX_MATCH_SETS)

	C2S(NL80211_ATTR_PMKSA_CANDIDATE)

	C2S(NL80211_ATTR_TX_NO_CCK_RATE)

	C2S(NL80211_ATTR_TDLS_ACTION)
	C2S(NL80211_ATTR_TDLS_DIALOG_TOKEN)
	C2S(NL80211_ATTR_TDLS_OPERATION)
	C2S(NL80211_ATTR_TDLS_SUPPORT)
	C2S(NL80211_ATTR_TDLS_EXTERNAL_SETUP)

	C2S(NL80211_ATTR_DEVICE_AP_SME)

	C2S(NL80211_ATTR_DONT_WAIT_FOR_ACK)

	C2S(NL80211_ATTR_FEATURE_FLAGS)

	C2S(NL80211_ATTR_PROBE_RESP_OFFLOAD)

	C2S(NL80211_ATTR_PROBE_RESP)

	C2S(NL80211_ATTR_DFS_REGION)

	C2S(NL80211_ATTR_DISABLE_HT)
	C2S(NL80211_ATTR_HT_CAPABILITY_MASK)

	C2S(NL80211_ATTR_NOACK_MAP)

	C2S(NL80211_ATTR_INACTIVITY_TIMEOUT)

	C2S(NL80211_ATTR_RX_SIGNAL_DBM)

	C2S(NL80211_ATTR_BG_SCAN_PERIOD)

	C2S(NL80211_ATTR_WDEV)

	C2S(NL80211_ATTR_USER_REG_HINT_TYPE)

	C2S(NL80211_ATTR_CONN_FAILED_REASON)

	C2S(NL80211_ATTR_SAE_DATA)

	C2S(NL80211_ATTR_VHT_CAPABILITY)

	C2S(NL80211_ATTR_SCAN_FLAGS)

	C2S(NL80211_ATTR_CHANNEL_WIDTH)
	C2S(NL80211_ATTR_CENTER_FREQ1)
	C2S(NL80211_ATTR_CENTER_FREQ2)

	C2S(NL80211_ATTR_P2P_CTWINDOW)
	C2S(NL80211_ATTR_P2P_OPPPS)

	C2S(NL80211_ATTR_LOCAL_MESH_POWER_MODE)

	C2S(NL80211_ATTR_ACL_POLICY)

	C2S(NL80211_ATTR_MAC_ADDRS)

	C2S(NL80211_ATTR_MAC_ACL_MAX)

	C2S(NL80211_ATTR_RADAR_EVENT)

	C2S(NL80211_ATTR_EXT_CAPA)
	C2S(NL80211_ATTR_EXT_CAPA_MASK)

	C2S(NL80211_ATTR_STA_CAPABILITY)
	C2S(NL80211_ATTR_STA_EXT_CAPABILITY)

	C2S(NL80211_ATTR_PROTOCOL_FEATURES)
	C2S(NL80211_ATTR_SPLIT_WIPHY_DUMP)

	C2S(NL80211_ATTR_DISABLE_VHT)
	C2S(NL80211_ATTR_VHT_CAPABILITY_MASK)

	C2S(NL80211_ATTR_MDID)
	C2S(NL80211_ATTR_IE_RIC)

	C2S(NL80211_ATTR_CRIT_PROT_ID)
	C2S(NL80211_ATTR_MAX_CRIT_PROT_DURATION)

	C2S(NL80211_ATTR_PEER_AID)

	C2S(NL80211_ATTR_COALESCE_RULE)

	C2S(NL80211_ATTR_CH_SWITCH_COUNT)
	C2S(NL80211_ATTR_CH_SWITCH_BLOCK_TX)
	C2S(NL80211_ATTR_CSA_IES)
	C2S(NL80211_ATTR_CSA_C_OFF_BEACON)
	C2S(NL80211_ATTR_CSA_C_OFF_PRESP)

	C2S(NL80211_ATTR_RXMGMT_FLAGS)

	C2S(NL80211_ATTR_STA_SUPPORTED_CHANNELS)

	C2S(NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES)

	C2S(NL80211_ATTR_HANDLE_DFS)

	C2S(NL80211_ATTR_SUPPORT_5_MHZ)
	C2S(NL80211_ATTR_SUPPORT_10_MHZ)

	C2S(NL80211_ATTR_OPMODE_NOTIF)

	C2S(NL80211_ATTR_VENDOR_ID)
	C2S(NL80211_ATTR_VENDOR_SUBCMD)
	C2S(NL80211_ATTR_VENDOR_DATA)
	C2S(NL80211_ATTR_VENDOR_EVENTS)

	C2S(NL80211_ATTR_QOS_MAP)
    default:
        return "NL80211_ATTR_UNKNOWN";
    }
}

void WifiEvent::log() {
    parse();

    byte *data = (byte *)genlmsg_attrdata(mHeader, 0);
    int len = genlmsg_attrlen(mHeader, 0);
    ALOGD("cmd = %s, len = %d", get_cmdString(), len);
    ALOGD("vendor_id = %04x, vendor_subcmd = %d", get_vendor_id(), get_vendor_subcmd());

    for (int i = 0; i < len; i += 16) {
        char line[81];
        int linelen = min(16, len - i);
        int offset = 0;
        appendFmt(line, offset, "%02x", data[i]);
        for (int j = 1; j < linelen; j++) {
            appendFmt(line, offset, " %02x", data[i+j]);
        }

        for (int j = linelen; j < 16; j++) {
            appendFmt(line, offset, "   ");
        }

        line[23] = '-';

        appendFmt(line, offset, "  ");

        for (int j = 0; j < linelen; j++) {
            if (isprint(data[i+j])) {
                appendFmt(line, offset, "%c", data[i+j]);
            } else {
                appendFmt(line, offset, "-");
            }
        }

        ALOGD("%s", line);
    }

    for (unsigned i = 0; i < NL80211_ATTR_MAX_INTERNAL; i++) {
        if (mAttributes[i] != NULL) {
            ALOGD("found attribute %s", attributeToString(i));
        }
    }

    ALOGD("-- End of message --");
}

const char *WifiEvent::get_cmdString() {
    return cmdToString(get_cmd());
}


int WifiEvent::parse() {
    if (mHeader != NULL) {
        return WIFI_SUCCESS;
    }
    mHeader = (genlmsghdr *)nlmsg_data(nlmsg_hdr(mMsg));
    int result = nla_parse(mAttributes, NL80211_ATTR_MAX_INTERNAL, genlmsg_attrdata(mHeader, 0),
          genlmsg_attrlen(mHeader, 0), NULL);

    // ALOGD("event len = %d", nlmsg_hdr(mMsg)->nlmsg_len);
    return result;
}

int WifiRequest::create(int family, uint8_t cmd, int flags, int hdrlen) {

    destroy();

    mMsg = nlmsg_alloc();
    if (mMsg != NULL) {
        genlmsg_put(mMsg, /* pid = */ 0, /* seq = */ 0, family,
                hdrlen, flags, cmd, /* version = */ 0);
        return WIFI_SUCCESS;
    } else {
        return WIFI_ERROR_OUT_OF_MEMORY;
    }
}

static int mapErrorCodes(int err)
{
    int ret;
    if (!err) {
        return WIFI_SUCCESS;
    }
    switch (err) {
        case -EOPNOTSUPP:
            ret = WIFI_ERROR_NOT_SUPPORTED;
            break;
        case -ETIMEDOUT:
            ret = WIFI_ERROR_TIMED_OUT;
            break;
        case -EINVAL:
            ret = WIFI_ERROR_INVALID_ARGS;
            break;
        case -ENOMEM:
            ret = WIFI_ERROR_OUT_OF_MEMORY;
            break;
        case -EBUSY:
            ret = WIFI_ERROR_BUSY;
            break;
        default:
            ret = WIFI_ERROR_UNKNOWN;
    }
    ALOGD("error code %d mapped to %d", err, ret);
    return ret;
}

int WifiRequest::create(uint32_t id, int subcmd) {
    int res = create(NL80211_CMD_VENDOR);
    if (res < 0) {
        return mapErrorCodes(res);
    }

    res = put_u32(NL80211_ATTR_VENDOR_ID, id);
    if (res < 0) {
        return mapErrorCodes(res);
    }

    res = put_u32(NL80211_ATTR_VENDOR_SUBCMD, subcmd);
    if (res < 0) {
        return mapErrorCodes(res);
    }

    if (mIface != -1) {
        res = set_iface_id(mIface);
    }

    return mapErrorCodes(res);
}


static int no_seq_check(struct nl_msg *msg, void *arg)
{
	return NL_OK;
}

int WifiCommand::requestResponse() {
    int err = create();                 /* create the message */
    if (err < 0) {
        return err;
    }

    return requestResponse(mMsg);
}

int WifiCommand::requestResponse(WifiRequest& request) {
    int err = 0;

    struct nl_cb *cb = nl_cb_alloc(NL_CB_DEFAULT);
    if (!cb)
        goto out;

    err = nl_send_auto_complete(mInfo->cmd_sock, request.getMessage());    /* send message */
    if (err < 0)
        goto out;

    err = 1;

    nl_cb_set(cb, NL_CB_SEQ_CHECK, NL_CB_CUSTOM, no_seq_check, NULL);
    nl_cb_err(cb, NL_CB_CUSTOM, error_handler, &err);
    nl_cb_set(cb, NL_CB_FINISH, NL_CB_CUSTOM, finish_handler, &err);
    nl_cb_set(cb, NL_CB_ACK, NL_CB_CUSTOM, ack_handler, &err);
    nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, response_handler, this);

    while (err > 0) {                   /* wait for reply */
        int res = nl_recvmsgs(mInfo->cmd_sock, cb);
        if (res) {
            ALOGE("nl80211: %s->nl_recvmsgs failed: %d", __func__, res);
        }
    }
out:
    nl_cb_put(cb);
    return mapErrorCodes(err);
}

int WifiCommand::requestEvent(int cmd) {

    ALOGD("requesting event %d", cmd);

    int res = wifi_register_handler(wifiHandle(), cmd, event_handler, this);
    if (res < 0) {
        return res;
    }

    res = create();                                                 /* create the message */
    if (res < 0)
        goto out;

    ALOGD("waiting for response %d", cmd);

    res = nl_send_auto_complete(mInfo->cmd_sock, mMsg.getMessage());    /* send message */
    if (res < 0)
        goto out;

    ALOGD("waiting for event %d", cmd);
    res = mCondition.wait();
    if (res < 0)
        goto out;

out:
    wifi_unregister_handler(wifiHandle(), cmd);
    return mapErrorCodes(res);
}

int WifiCommand::requestVendorEvent(uint32_t id, int subcmd) {

    int res = wifi_register_vendor_handler(wifiHandle(), id, subcmd, event_handler, this);
    if (res < 0) {
        return res;
    }

    res = create();                                                 /* create the message */
    if (res < 0)
        goto out;

    res = nl_send_auto_complete(mInfo->cmd_sock, mMsg.getMessage());    /* send message */
    if (res < 0)
        goto out;

    res = mCondition.wait();
    if (res < 0)
        goto out;

out:
    wifi_unregister_vendor_handler(wifiHandle(), id, subcmd);
    return mapErrorCodes(res);
}

/* Event handlers */
int WifiCommand::response_handler(struct nl_msg *msg, void *arg) {
    // ALOGD("response_handler called");
    WifiCommand *cmd = (WifiCommand *)arg;
    WifiEvent reply(msg);
    int res = reply.parse();
    if (res < 0) {
        ALOGE("Failed to parse reply message = %d", res);
        return NL_SKIP;
    } else {
        // reply.log();
        return cmd->handleResponse(reply);
    }
}

int WifiCommand::event_handler(struct nl_msg *msg, void *arg) {
    WifiCommand *cmd = (WifiCommand *)arg;
    WifiEvent event(msg);
    int res = event.parse();
    if (res < 0) {
        ALOGE("Failed to parse event = %d", res);
        res = NL_SKIP;
    } else {
        res = cmd->handleEvent(event);
    }

    cmd->mCondition.signal();
    return res;
}

/* Other event handlers */
int WifiCommand::valid_handler(struct nl_msg *msg, void *arg) {
    // ALOGD("valid_handler called");
    int *err = (int *)arg;
    *err = 0;
    return NL_SKIP;
}

int WifiCommand::ack_handler(struct nl_msg *msg, void *arg) {
    // ALOGD("ack_handler called");
    int *err = (int *)arg;
    *err = 0;
    return NL_STOP;
}

int WifiCommand::finish_handler(struct nl_msg *msg, void *arg) {
    // ALOGD("finish_handler called");
    int *ret = (int *)arg;
    *ret = 0;
    return NL_SKIP;
}

int WifiCommand::error_handler(struct sockaddr_nl *nla, struct nlmsgerr *err, void *arg) {
    int *ret = (int *)arg;
    *ret = err->error;

    // ALOGD("error_handler received : %d", err->error);
    return NL_SKIP;
}
