/*
 * Copyright (c) 2022 Huawei Device Co., Ltd.
 * 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 "wpa_common_fuzzer.h"

#define WLAN_FREQ_MAX_NUM 35
#define ETH_ADDR_LEN 6
#define BITS_NUM_24 24
#define BITS_NUM_16 16
#define BITS_NUM_8 8
#define REPLY_SIZE 1024

static uint32_t g_wpaTestSize = 0;
struct IWpaCallback *g_wpaCallbackObj = nullptr;

uint32_t SetWpaDataSize(const uint32_t *dataSize)
{
    if (dataSize != nullptr) {
        g_wpaTestSize = *dataSize;
        return HDF_SUCCESS;
    }
    HDF_LOGE("%{public}s: set data size failed!", __FUNCTION__);
    return HDF_FAILURE;
}

uint32_t GetWpaDataSize(uint32_t *dataSize)
{
    if (dataSize != nullptr) {
        *dataSize = g_wpaTestSize;
        return HDF_SUCCESS;
    }
    HDF_LOGE("%{public}s: get data size failed!", __FUNCTION__);
    return HDF_FAILURE;
}

uint32_t Convert2Uint32(const uint8_t *ptr)
{
    if (ptr == nullptr) {
        return 0;
    }
    /*
     * Move the 0th digit 24 to the left, the first digit 16 to the left, the second digit 8 to the left,
     * and the third digit no left
     */
    return (ptr[0] << BITS_NUM_24) | (ptr[1] << BITS_NUM_16) | (ptr[2] << BITS_NUM_8) | (ptr[3]);
}

bool PreProcessRawData(const uint8_t *rawData, size_t size, uint8_t *tmpRawData, size_t tmpRawDataSize)
{
    if (rawData == nullptr || tmpRawData == nullptr) {
        HDF_LOGE("%{public}s: rawData or tmpRawData is nullptr!", __FUNCTION__);
        return false;
    }
    uint32_t dataSize = size - OFFSET;
    if (memcpy_s(tmpRawData, tmpRawDataSize, rawData + OFFSET, dataSize) != EOK) {
        HDF_LOGE("%{public}s: memcpy_s failed!", __FUNCTION__);
        return false;
    }
    if (SetWpaDataSize(&dataSize) != HDF_SUCCESS) {
        HDF_LOGE("%{public}s: set data size failed!", __FUNCTION__);
        return false;
    }
    return true;
}

/* **********Wpa Interface********** */
void FuzzWpaInterfaceStart(struct IWpaInterface *interface, const uint8_t *rawData)
{
    interface->Start(interface);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceStop(struct IWpaInterface *interface, const uint8_t *rawData)
{
    interface->Stop(interface);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceScan(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);

    interface->Scan(interface, ifName);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceScanResult(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);
    unsigned char buf[ETH_ADDR_LEN] = {0x12, 0x34, 0x56, 0x78, 0xab, 0xcd};
    uint32_t bufLen = ETH_ADDR_LEN;
    interface->ScanResult(interface, ifName, buf, &bufLen);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceAddNetwork(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);
    int32_t networkId = *const_cast<int32_t *>(reinterpret_cast<const int32_t *>(rawData));

    interface->AddNetwork(interface, ifName, &networkId);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceRemoveNetwork(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);
    int32_t networkId = *const_cast<int32_t *>(reinterpret_cast<const int32_t *>(rawData));
    
    interface->RemoveNetwork(interface, ifName, networkId);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceDisableNetwork(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);
    int32_t networkId = *const_cast<int32_t *>(reinterpret_cast<const int32_t *>(rawData));

    interface->DisableNetwork(interface, ifName, networkId);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceSetNetwork(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);
    const char *name = reinterpret_cast<const char *>(rawData);
    const char *value = reinterpret_cast<const char *>(rawData);
    int32_t networkId = *const_cast<int32_t *>(reinterpret_cast<const int32_t *>(rawData));

    interface->SetNetwork(interface, ifName, networkId, name, value);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceReconnect(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);

    interface->Reconnect(interface, ifName);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceDisconnect(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);

    interface->Disconnect(interface, ifName);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceSelectNetwork(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);
    int32_t networkId = *const_cast<int32_t *>(reinterpret_cast<const int32_t *>(rawData));

    interface->SelectNetwork(interface, ifName, networkId);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceEnableNetwork(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);
    int32_t networkId = *const_cast<int32_t *>(reinterpret_cast<const int32_t *>(rawData));

    interface->EnableNetwork(interface, ifName, networkId);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceSetPowerSave(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);
    int32_t enable = *const_cast<int32_t *>(reinterpret_cast<const int32_t *>(rawData));

    interface->SetPowerSave(interface, ifName, enable);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceAutoConnect(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);
    int32_t enable = *const_cast<int32_t *>(reinterpret_cast<const int32_t *>(rawData));

    interface->AutoConnect(interface, ifName, enable);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceSaveConfig(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);

    interface->SaveConfig(interface, ifName);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceWpsCancel(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);

    interface->WpsCancel(interface, ifName);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceGetCountryCode(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);
    char countryCode[3] = {0};

    interface->GetCountryCode(interface, ifName, countryCode, 3);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceGetNetwork(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);
    int networkId = 0;
    char value[32] = {0};

    interface->GetNetwork(interface, ifName, networkId, "ssid", value, 32);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceBlocklistClear(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);

    interface->BlocklistClear(interface, ifName);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceSetSuspendMode(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);
    int32_t mode = *const_cast<int32_t *>(reinterpret_cast<const int32_t *>(rawData));

    interface->SetSuspendMode(interface, ifName, mode);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceGetScanSsid(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);
    int32_t enable = *const_cast<int32_t *>(reinterpret_cast<const int32_t *>(rawData));

    interface->GetScanSsid(interface, ifName, &enable);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceGetPskPassphrase(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);
    char psk[32] = {0};

    interface->GetPskPassphrase(interface, ifName, psk, 32);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceGetPsk(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);
    uint8_t psk[32] = {0};
    uint32_t pskLen = 32;

    interface->GetPsk(interface, ifName, psk, &pskLen);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceGetWepKey(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);
    uint8_t wepKey[16] = {0};
    uint32_t wepKeyLen = 16;

    interface->GetWepKey(interface, ifName, 1, wepKey, &wepKeyLen);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceGetWepTxKeyIdx(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);
    int keyIdx = *const_cast<int *>(reinterpret_cast<const int *>(rawData));

    interface->GetWepTxKeyIdx(interface, ifName, &keyIdx);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceGetRequirePmf(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);
    int enable = *const_cast<int *>(reinterpret_cast<const int *>(rawData));

    interface->GetRequirePmf(interface, ifName, &enable);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceSetCountryCode(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);
    const char countryCode[3] = {0};

    interface->SetCountryCode(interface, ifName, countryCode);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceListNetworks(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);
    struct HdiWifiWpaNetworkInfo networkInfo;
    (void)memset_s(&networkInfo, sizeof(struct HdiWifiWpaNetworkInfo), 0, sizeof(struct HdiWifiWpaNetworkInfo));
    uint32_t networkInfoLen = 0;

    interface->ListNetworks(interface, ifName, (struct HdiWifiWpaNetworkInfo *)&networkInfo, &networkInfoLen);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceWifiStatus(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);
    struct HdiWpaCmdStatus wifiStatus;
    (void)memset_s(&wifiStatus, sizeof(struct HdiWpaCmdStatus), 0, sizeof(struct HdiWpaCmdStatus));

    interface->WifiStatus(interface, ifName, &wifiStatus);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceWpsPbcMode(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);
    struct HdiWifiWpsParam wpsParam;
    (void)memset_s(&wpsParam, sizeof(struct HdiWifiWpsParam), 0, sizeof(struct HdiWifiWpsParam));
    wpsParam.anyFlag = 1;
    wpsParam.multiAp = 1;
    wpsParam.bssidLen = 6;
    wpsParam.bssid = static_cast<uint8_t *>(OsalMemCalloc(sizeof(uint8_t) * (wpsParam.bssidLen)));
    if (wpsParam.bssid == nullptr) {
        return;
    }
    wpsParam.bssid[0] = 0x12;
    wpsParam.bssid[1] = 0x34;
    wpsParam.bssid[2] = 0x56;
    wpsParam.bssid[3] = 0x78;
    wpsParam.bssid[4] = 0xab;
    wpsParam.bssid[5] = 0xcd;

    interface->WpsPbcMode(interface, ifName, &wpsParam);
    OsalMemFree(wpsParam.bssid);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceWpsPinMode(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);
    struct HdiWifiWpsParam wpsParam;
    (void)memset_s(&wpsParam, sizeof(struct HdiWifiWpsParam), 0, sizeof(struct HdiWifiWpsParam));
    wpsParam.anyFlag = 1;
    wpsParam.multiAp = 1;
    wpsParam.bssidLen = 6;
    wpsParam.bssid = static_cast<uint8_t *>(OsalMemCalloc(sizeof(uint8_t) * (wpsParam.bssidLen)));
    if (wpsParam.bssid == nullptr) {
        return;
    }
    wpsParam.bssid[0] = 0x12;
    wpsParam.bssid[1] = 0x34;
    wpsParam.bssid[2] = 0x56;
    wpsParam.bssid[3] = 0x78;
    wpsParam.bssid[4] = 0xab;
    wpsParam.bssid[5] = 0xcd;
    int pinCode = 0;

    interface->WpsPinMode(interface, ifName, &wpsParam, &pinCode);
    OsalMemFree(wpsParam.bssid);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceRegisterEventCallback(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);

    interface->RegisterEventCallback(interface, g_wpaCallbackObj, ifName);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceUnregisterEventCallback(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);

    interface->UnregisterEventCallback(interface, g_wpaCallbackObj, ifName);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceGetConnectionCapabilities(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);
    struct ConnectionCapabilities connectionCap;
    (void)memset_s(&connectionCap, sizeof(struct ConnectionCapabilities), 0, sizeof(struct ConnectionCapabilities));

    interface->GetConnectionCapabilities(interface, ifName, &connectionCap);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceAddWpaIface(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);
    const char *configname = "/data/service/el1/public/wifi/wpa_supplicant/wpa_supplicant.conf";
    interface->AddWpaIface(interface, ifName, configname);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceRemoveWpaIface(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);

    interface->RemoveWpaIface(interface, ifName);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceReassociate(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);

    interface->Reassociate(interface, ifName);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceStaShellCmd(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);
    const char *cmd = reinterpret_cast<const char *>(rawData);
    
    interface->StaShellCmd(interface, ifName, cmd);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}


/* **********P2p Interface********** */
void FuzzWpaInterfaceP2pSetSsidPostfixName(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);
    const char *name = reinterpret_cast<const char *>(rawData);

    interface->P2pSetSsidPostfixName(interface, ifName, name);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceP2pSetWpsDeviceType(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);
    const char *type = reinterpret_cast<const char *>(rawData);

    interface->P2pSetWpsDeviceType(interface, ifName, type);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceP2pSetWpsConfigMethods(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);
    const char *methods = reinterpret_cast<const char *>(rawData);

    interface->P2pSetWpsConfigMethods(interface, ifName, methods);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceP2pSetGroupMaxIdle(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);
    int32_t time = *const_cast<int32_t *>(reinterpret_cast<const int32_t *>(rawData));

    interface->P2pSetGroupMaxIdle(interface, ifName, time);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceP2pSetWfdEnable(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);
    int32_t enable = *const_cast<int32_t *>(reinterpret_cast<const int32_t *>(rawData));

    interface->P2pSetWfdEnable(interface, ifName, enable);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceP2pSetPersistentReconnect(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);
    int32_t status = *const_cast<int32_t *>(reinterpret_cast<const int32_t *>(rawData));

    interface->P2pSetPersistentReconnect(interface, ifName, status);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceP2pSetWpsSecondaryDeviceType(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);
    const char *type = reinterpret_cast<const char *>(rawData);

    interface->P2pSetWpsSecondaryDeviceType(interface, ifName, type);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceP2pSetupWpsPbc(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);
    const char *address = reinterpret_cast<const char *>(rawData);

    interface->P2pSetupWpsPbc(interface, ifName, address);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceP2pSetupWpsPin(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);
    const char *address = reinterpret_cast<const char *>(rawData);
    const char *pin = reinterpret_cast<const char *>(rawData);
    char result[32] = {0};
    uint32_t resultLen = *const_cast<uint32_t *>(reinterpret_cast<const uint32_t *>(rawData));


    interface->P2pSetupWpsPin(interface, ifName, address, pin, result, resultLen);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceP2pSetPowerSave(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);
    int32_t enable = *const_cast<int32_t *>(reinterpret_cast<const int32_t *>(rawData));

    interface->P2pSetPowerSave(interface, ifName, enable);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceP2pSetDeviceName(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);
    const char *name = reinterpret_cast<const char *>(rawData);

    interface->P2pSetDeviceName(interface, ifName, name);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceP2pSetWfdDeviceConfig(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);
    const char *config = reinterpret_cast<const char *>(rawData);

    interface->P2pSetWfdDeviceConfig(interface, ifName, config);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceP2pSetRandomMac(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);
    int32_t networkId = *const_cast<int32_t *>(reinterpret_cast<const int32_t *>(rawData));

    interface->P2pSetRandomMac(interface, ifName, networkId);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceP2pStartFind(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);
    int32_t timeout = *const_cast<int32_t *>(reinterpret_cast<const int32_t *>(rawData));

    interface->P2pStartFind(interface, ifName, timeout);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceP2pSetExtListen(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);
    int32_t enable = *const_cast<int32_t *>(reinterpret_cast<const int32_t *>(rawData));
    int32_t period = *const_cast<int32_t *>(reinterpret_cast<const int32_t *>(rawData));
    int32_t interval = *const_cast<int32_t *>(reinterpret_cast<const int32_t *>(rawData));

    interface->P2pSetExtListen(interface, ifName, enable, period, interval);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceP2pSetListenChannel(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);
    int32_t channel = *const_cast<int32_t *>(reinterpret_cast<const int32_t *>(rawData));
    int32_t regClass = *const_cast<int32_t *>(reinterpret_cast<const int32_t *>(rawData));

    interface->P2pSetListenChannel(interface, ifName, channel, regClass);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceP2pProvisionDiscovery(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);
    const char *peerBssid = reinterpret_cast<const char *>(rawData);
    int32_t mode = *const_cast<int32_t *>(reinterpret_cast<const int32_t *>(rawData));

    interface->P2pProvisionDiscovery(interface, ifName, peerBssid, mode);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceP2pAddGroup(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);
    int32_t isPersistent = *const_cast<int32_t *>(reinterpret_cast<const int32_t *>(rawData));
    int32_t networkId = *const_cast<int32_t *>(reinterpret_cast<const int32_t *>(rawData));
    int32_t freq = *const_cast<int32_t *>(reinterpret_cast<const int32_t *>(rawData));

    interface->P2pAddGroup(interface, ifName, isPersistent, networkId, freq);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceP2pAddService(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);
    struct HdiP2pServiceInfo info = {0};
    (void)memset_s(&info, sizeof(struct HdiP2pServiceInfo), 0, sizeof(struct HdiP2pServiceInfo));
    info.mode = 0;
    info.version = 0;
    const int nameLen = 32;
    const int paramLen = 1;
    info.nameLen = nameLen;
    info.queryLen = paramLen;
    info.respLen = paramLen;
    info.name = static_cast<uint8_t *>(OsalMemCalloc(sizeof(uint8_t) * nameLen));
    info.query = static_cast<uint8_t *>(OsalMemCalloc(sizeof(uint8_t) * paramLen));
    info.resp = static_cast<uint8_t *>(OsalMemCalloc(sizeof(uint8_t) * paramLen));
    if (info.name == nullptr || info.query == nullptr || info.resp == nullptr) {
        HDF_LOGI("%{public}s: OsalMemCalloc fail", __FUNCTION__);
        return;
    }
    strcpy_s((char *)info.name, sizeof(info.name), "p2p0");

    interface->P2pAddService(interface, ifName, &info);
    OsalMemFree(info.name);
    OsalMemFree(info.query);
    OsalMemFree(info.resp);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceP2pRemoveService(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);
    struct HdiP2pServiceInfo info = {0};
    (void)memset_s(&info, sizeof(struct HdiP2pServiceInfo), 0, sizeof(struct HdiP2pServiceInfo));
    info.mode = 0;
    info.version = 0;
    const int nameLen = 32;
    const int paramLen = 1;
    info.nameLen = nameLen;
    info.queryLen = paramLen;
    info.respLen = paramLen;
    info.name = static_cast<uint8_t *>(OsalMemCalloc(sizeof(uint8_t) * nameLen));
    info.query = static_cast<uint8_t *>(OsalMemCalloc(sizeof(uint8_t) * paramLen));
    info.resp = static_cast<uint8_t *>(OsalMemCalloc(sizeof(uint8_t) * paramLen));
    if (info.name == nullptr || info.query == nullptr || info.resp == nullptr) {
        HDF_LOGI("%{public}s: OsalMemCalloc fail", __FUNCTION__);
        return;
    }
    strcpy_s((char *)info.name, sizeof(info.name), "p2p0");

    interface->P2pRemoveService(interface, ifName, &info);
    OsalMemFree(info.name);
    OsalMemFree(info.query);
    OsalMemFree(info.resp);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceP2pStopFind(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);

    interface->P2pStopFind(interface, ifName);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceP2pFlush(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);

    interface->P2pFlush(interface, ifName);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceP2pFlushService(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);

    interface->P2pFlushService(interface, ifName);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceP2pRemoveNetwork(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);
    int32_t networkId = *const_cast<int32_t *>(reinterpret_cast<const int32_t *>(rawData));

    interface->P2pRemoveNetwork(interface, ifName, networkId);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceP2pSetGroupConfig(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);
    int32_t networkId = *const_cast<int32_t *>(reinterpret_cast<const int32_t *>(rawData));
    const char *name = reinterpret_cast<const char *>(rawData);
    const char *value = reinterpret_cast<const char *>(rawData);

    interface->P2pSetGroupConfig(interface, ifName, networkId, name, value);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceP2pInvite(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);
    const char *peerBssid = reinterpret_cast<const char *>(rawData);
    const char *goBssid = reinterpret_cast<const char *>(rawData);

    interface->P2pInvite(interface, ifName, peerBssid, goBssid);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceP2pReinvoke(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);
    const char *bssid = reinterpret_cast<const char *>(rawData);
    int32_t networkId = *const_cast<int32_t *>(reinterpret_cast<const int32_t *>(rawData));

    interface->P2pReinvoke(interface, ifName, networkId, bssid);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceP2pGetDeviceAddress(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);
    char deviceAddress[32] = {0};
    uint32_t deviceAddressLen = *const_cast<uint32_t *>(reinterpret_cast<const uint32_t *>(rawData));

    interface->P2pGetDeviceAddress(interface, ifName, deviceAddress, deviceAddressLen);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceP2pReqServiceDiscovery(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);
    char *replyDisc = static_cast<char *>(calloc(REPLY_SIZE, sizeof(char)));
    if (replyDisc == nullptr) {
        return;
    }
    uint32_t replyDiscLen = REPLY_SIZE;
    struct HdiP2pReqService reqService;
    (void)memset_s(&reqService, sizeof(struct HdiP2pReqService), 0, sizeof(struct HdiP2pReqService));
    reqService.bssidLen = ETH_ADDR_LEN;
    reqService.bssid = static_cast<uint8_t *>(OsalMemCalloc(sizeof(uint8_t) * (reqService.bssidLen)));
    if (reqService.bssid == nullptr) {
        free(replyDisc);
        return;
    }
    reqService.bssid[0] = 0x12;
    reqService.bssid[1] = 0x34;
    reqService.bssid[2] = 0x56;
    reqService.bssid[3] = 0x78;
    reqService.bssid[4] = 0xab;
    reqService.bssid[5] = 0xcd;

    interface->P2pReqServiceDiscovery(interface, ifName, &reqService, replyDisc, replyDiscLen);
    free(replyDisc);
    OsalMemFree(reqService.bssid);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceP2pCancelServiceDiscovery(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);
    const char *id = reinterpret_cast<const char *>(rawData);

    interface->P2pCancelServiceDiscovery(interface, ifName, id);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceP2pRespServerDiscovery(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);
    struct HdiP2pServDiscReqInfo info;
    (void)memset_s(&info, sizeof(struct HdiP2pServDiscReqInfo), 0, sizeof(struct HdiP2pServDiscReqInfo));

    interface->P2pRespServerDiscovery(interface, ifName, &info);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceP2pConnect(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);
    struct HdiP2pConnectInfo info;
    (void)memset_s(&info, sizeof(struct HdiP2pConnectInfo), 0, sizeof(struct HdiP2pConnectInfo));
    char *replyPin = static_cast<char *>(calloc(REPLY_SIZE, sizeof(char)));
    if (replyPin == nullptr) {
        return;
    }
    uint32_t replyPinLen = REPLY_SIZE;

    interface->P2pConnect(interface, ifName, &info, replyPin, replyPinLen);
    free(replyPin);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceP2pHid2dConnect(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const int macAddrIndexOne = 0;
    const int macAddrIndexTwo = 1;
    const int macAddrIndexThree = 2;
    const int macAddrIndexFour = 3;
    const int macAddrIndexFive = 4;
    const int macAddrIndexSix = 5;
    const char *ifName = reinterpret_cast<const char *>(rawData);
    struct HdiHid2dConnectInfo info;
    (void)memset_s(&info, sizeof(struct HdiHid2dConnectInfo), 0, sizeof(struct HdiHid2dConnectInfo));
    info.bssidLen = ETH_ADDR_LEN;
    info.bssid = static_cast<uint8_t *>(OsalMemCalloc(sizeof(uint8_t) * (info.bssidLen)));
    if (info.bssid == nullptr) {
        return;
    }
    info.bssid[macAddrIndexOne] = 0x00;
    info.bssid[macAddrIndexTwo] = 0x00;
    info.bssid[macAddrIndexThree] = 0x00;
    info.bssid[macAddrIndexFour] = 0x00;
    info.bssid[macAddrIndexFive] = 0x00;
    info.bssid[macAddrIndexSix] = 0x00;
    interface->P2pHid2dConnect(interface, ifName, &info);
    OsalMemFree(info.bssid);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceP2pSetServDiscExternal(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);
    int32_t mode = *const_cast<int32_t *>(reinterpret_cast<const int32_t *>(rawData));

    interface->P2pSetServDiscExternal(interface, ifName, mode);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceP2pRemoveGroup(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);
    const char *groupName = reinterpret_cast<const char *>(rawData);

    interface->P2pRemoveGroup(interface, ifName, groupName);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceP2pCancelConnect(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);

    interface->P2pCancelConnect(interface, ifName);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceP2pGetGroupConfig(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);
    int32_t networkId = *const_cast<int32_t *>(reinterpret_cast<const int32_t *>(rawData));
    const char *param = reinterpret_cast<const char *>(rawData);
    char value[32] = {0};
    uint32_t valueLen = *const_cast<uint32_t *>(reinterpret_cast<const uint32_t *>(rawData));

    interface->P2pGetGroupConfig(interface, ifName, networkId, param, value, valueLen);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceP2pAddNetwork(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);
    int32_t networkId = *const_cast<int32_t *>(reinterpret_cast<const int32_t *>(rawData));

    interface->P2pAddNetwork(interface, ifName, &networkId);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceP2pGetPeer(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);
    const char *bssid = reinterpret_cast<const char *>(rawData);
    struct HdiP2pDeviceInfo info;
    (void)memset_s(&info, sizeof(struct HdiP2pDeviceInfo), 0, sizeof(struct HdiP2pDeviceInfo));

    interface->P2pGetPeer(interface, ifName, bssid, &info);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceP2pGetGroupCapability(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);
    const char *bssid = reinterpret_cast<const char *>(rawData);
    int32_t cap = *const_cast<int32_t *>(reinterpret_cast<const int32_t *>(rawData));

    interface->P2pGetGroupCapability(interface, ifName, bssid, &cap);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceP2pListNetworks(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);
    struct HdiP2pNetworkList infoList;
    (void)memset_s(&infoList, sizeof(struct HdiP2pNetworkList), 0, sizeof(struct HdiP2pNetworkList));

    interface->P2pListNetworks(interface, ifName, &infoList);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}

void FuzzWpaInterfaceP2pSaveConfig(struct IWpaInterface *interface, const uint8_t *rawData)
{
    const char *ifName = reinterpret_cast<const char *>(rawData);

    interface->P2pSaveConfig(interface, ifName);
    HDF_LOGI("%{public}s: success", __FUNCTION__);
}