/*
* Copyright (c) 2020-2021 Huawei Device Co., Ltd.
*
* HDF is dual licensed: you can use it either under the terms of
* the GPL, or the BSD license, at your option.
* See the LICENSE file in the root of this repository for complete details.
*/
/**
* @addtogroup WLAN
* @{
*
* @brief Provides cross-OS migration, component adaptation, and modular assembly and compilation.
*
* Based on the unified APIs provided by the WLAN module, developers of the Hardware Driver Interface
* (HDI) are capable of creating, disabling, scanning for, and connecting to WLAN hotspots, managing WLAN chips,
* network devices, and power, and applying for, releasing, and moving network data buffers.
*
* @since 1.0
* @version 1.0
*/
/**
* @file hdf_wifi_event.h
*
* @brief Declares WLAN driver events.
*
* The functions in this file are used to report events such as scanning results, scanning completion, and station
* disconnection to the WPA interface.
*
* @since 1.0
* @version 1.0
*/
#ifndef HDF_WIFI_EVENT_H
#define HDF_WIFI_EVENT_H
#include "hdf_wifi_cmd.h"
#include "wifi_mac80211_ops.h"
#include "net_device.h"
#ifdef __cplusplus
#if __cplusplus
extern "C" {
#endif
#endif
/**
* @brief Defines the rate information received or sent over WLAN.
*
* @since 1.0
* @version 1.0
*/
struct RateInfo {
uint8_t flags; /**< Flag, used to indicate a specific rate transmission type of 802.11n */
uint8_t mcs; /**< Modulation and Coding Scheme (MCS) index of the HT/VHT/HE rate */
uint16_t legacy; /**< 100 kbit/s bit rate defined in 802.11a/b/g */
uint8_t nss; /**< Number of streams (for VHT and HE only) */
uint8_t resv; /**< Reserved */
};
/**
* @brief Defines parameters related to the WLAN module that works in station mode.
*
* @since 1.0
* @version 1.0
*/
struct StaBssParameters {
uint8_t flags; /**< Flag, used to indicate a specific rate transmission type of 802.11n */
uint8_t dtimPeriod; /**< Delivery Traffic Indication Message (DTIM) period of BSS */
uint16_t beaconInterval; /**< Beacon interval */
};
/**
* @brief Defines the update of the Sta flag.
*
* @since 1.0
* @version 1.0
*/
struct StaFlagUpdate {
uint32_t mask; /**< Flag mask */
uint32_t set; /**< Flag value */
};
/**
* @brief Defines station information.
*
* @since 1.0
* @version 1.0
*/
struct StationInfo {
uint32_t filled; /**< Flag values of relevant structures */
uint32_t connectedTime; /**< Duration (in seconds) since the last station connection */
uint32_t inactiveTime; /**< Duration (in milliseconds) since the last station
* activity
*/
uint16_t llid; /**< Local mesh ID */
uint16_t plid; /**< Peer mesh ID */
uint64_t rxBytes; /**< Received bytes */
uint64_t txBytes; /**< Transmitted bytes */
struct RateInfo txRate; /**< Transmission rate */
struct RateInfo rxRate; /**< Receive rate */
uint32_t rxPackets; /**< Received data packets */
uint32_t txPackets; /**< Transmitted data packets */
uint32_t txPetries; /**< Number of retransmissions */
uint32_t txFailed; /**< Number of failed transmissions */
uint32_t rxDroppedMisc; /**< Number of receive failures */
int32_t generation; /**< Generation number */
struct StaBssParameters bssParam; /**< Current BSS parameters */
struct StaFlagUpdate staFlags; /**< Station flag masks and values */
int64_t offset; /**< Time offset of station */
const uint8_t *assocReqIes; /**< Information Elements (IEs) in Association Request */
uint32_t assocReqIesLen; /**< IE length in Association Request */
uint32_t beaconLossCount; /**< Number of beacon loss events triggered */
uint8_t plinkState; /**< Mesh peer state */
int8_t signal; /**< Signal strength */
int8_t signalAvg; /**< Average signal strength */
uint8_t resv1; /**< Reserved */
};
/**
* @brief Defines authentication information.
*
* @since 1.0
* @version 1.0
*/
struct Auth {
uint16_t authAlg; /**< Authentication algorithm */
uint16_t authTransaction; /**< Authentication transaction */
uint16_t statusCode; /**< Authentication status code */
uint8_t variable[0]; /**< Algorithm challenge information stored in a flexible array */
};
/**
* @brief Defines deauthentication information.
*
* @since 1.0
* @version 1.0
*/
struct Deauth {
uint16_t reasonCode; /**< Deauthentication cause code */
};
/**
* @brief Defines station association request.
*
* @since 1.0
* @version 1.0
*/
struct AssocReq {
uint16_t capabInfo; /**< WLAN capability information */
uint16_t listenInterval; /**< Scan interval */
uint8_t variable[0]; /**< SSID and rate information stored in a flexible array */
};
/**
* @brief Defines station association response.
*
* @since 1.0
* @version 1.0
*/
struct AssocResp {
uint16_t capabInfo; /**< WLAN capability information */
uint16_t statusCode; /**< Status code */
uint16_t aid; /**< Authentication ID */
uint8_t variable[0]; /**< Rate information stored in a flexible array */
};
/**
* @brief Defines station reassociation request.
*
* @since 1.0
* @version 1.0
*/
struct ReassocReq {
uint16_t capabInfo; /**< WLAN capability information */
uint16_t listenInterval; /**< Scan interval */
uint8_t currentAp[6]; /**< Current AP */
uint8_t variable[0]; /**< SSID and rate information stored in a flexible array */
};
/**
* @brief Defines station reassociation response.
*
* @since 1.0
* @version 1.0
*/
struct ReassocResp {
uint16_t capabInfo; /**< WLAN capability information */
uint16_t statusCode; /**< Status code */
uint16_t aid; /**< Authentication ID */
uint8_t variable[0]; /**< Rate information stored in a flexible array */
};
/**
* @brief Defines station disconnection.
*
* @since 1.0
* @version 1.0
*/
struct Disassoc {
uint16_t reasonCode; /**< Cause code */
};
/**
* @brief Defines the update of the Sta flag.
*
* @since 1.0
* @version 1.0
*/
struct Beacon {
uint64_t timestamp; /**< Timestamp */
uint16_t beaconInt; /**< Beacon interval */
uint16_t capabInfo; /**< WLAN capability information */
uint8_t variable[0]; /**< SSID and rate information */
};
/**
* @brief Defines scanning response.
*
* @since 1.0
* @version 1.0
*/
struct ProbeResp {
uint64_t timestamp; /**< Timestamp */
uint16_t beaconInt; /**< Beacon interval */
uint16_t capabInfo; /**< WLAN capability information */
uint8_t variable[0]; /**< SSID and rate information */
};
/**
* @brief Defines management frame information.
*
* @since 1.0
* @version 1.0
*/
struct Ieee80211Mgmt {
uint16_t frameControl; /**< Frame control field */
uint16_t duration; /**< Duration */
uint8_t dstAddr[6]; /**< Destination MAC address */
uint8_t srcAddr[6]; /**< Source MAC address */
uint8_t bssid[6]; /**< BSS ID */
uint16_t seqCtrl; /**< Sequence control */
union {
struct Auth auth; /**< Authentication Information */
struct Deauth deauth; /**< Deauthentication Information */
struct AssocReq assocReq; /**< Association request */
struct AssocResp assocResp; /**< Association response */
struct ReassocReq reassocReq; /**< Re-authentication */
struct ReassocResp reassocResp; /**< Re-authentication response */
struct Disassoc disassoc; /**< Disconnected */
struct Beacon beacon; /**< Beacon frame */
struct ProbeResp probeResp; /**< Probe response frame */
} u;
};
/**
* @brief Represents the scanned BSS information.
*
* @since 1.0
* @version 1.0
*/
struct ScannedBssInfo {
int32_t signal; /**< Signal strength */
int16_t freq; /**< Center frequency of the channel where the BSS is located */
uint8_t array[2]; /**< Reserved */
uint32_t mgmtLen; /**< Management frame length */
struct Ieee80211Mgmt *mgmt; /**< Start address of the management frame */
};
/**
* @brief Defines association results.
*
* @since 1.0
* @version 1.0
*/
struct ConnetResult {
uint8_t bssid[ETH_ADDR_LEN]; /**< MAC address of the AP associated with the station */
uint16_t statusCode; /**< 16-bit status code defined in the IEEE protocol */
uint8_t *rspIe; /**< Association response IE */
uint8_t *reqIe; /**< Association request IE */
uint32_t reqIeLen; /**< Length of the association request IE */
uint32_t rspIeLen; /**< Length of the association response IE */
uint16_t connectStatus; /**< Connection status */
uint16_t freq; /**< Frequency of the AP */
};
/**
* @brief Enumerates MLME management statuses, indicating whether a device is successfully associated or
* fails to be associated.
*
* @since 1.0
* @version 1.0
*/
enum WifiHmacMgmtStatus {
WIFI_HMAC_MGMT_SUCCESS = 0, /**< Association succeeds */
WIFI_HMAC_MGMT_INVALID = 1, /**< Association fails */
WIFI_HMAC_MGMT_TIMEOUT = 2, /**< Association timeout */
WIFI_HMAC_MGMT_REFUSED = 3, /**< Association refused */
WIFI_HMAC_MGMT_TOMANY_REQ = 4, /**< Repeated association request */
WIFI_HMAC_MGMT_ALREADY_BSS = 5 /**< Associated with the BSS */
};
/**
* @brief Reports a new STA event.
*
* @param netDev Indicates the pointer to the network device. This parameter cannot be null.
* @param macAddr Indicates the pointer to the MAC address of the station. This parameter cannot be null.
* @param addrLen Indicates the length of the MAC address of the station. The length is fixed to six bytes.
* @param info Indicates the pointer to the station information.
*
* @return Returns 0 if the event is reported successfully; returns -1 otherwise.
*
* @since 1.0
* @version 1.0
*/
int32_t HdfWifiEventNewSta(const struct NetDevice *netDev, const uint8_t *macAddr, uint8_t addrLen,
const struct StationInfo *info);
/**
* @brief Reports a station deletion event.
*
* @param netDev Indicates the pointer to the network device. This parameter cannot be null.
* @param macAddr Indicates the pointer to the MAC address of the station. This parameter cannot be null.
* @param addrLen Indicates the length of the MAC address of the station. The length is fixed to six bytes.
*
* @return Returns 0 if the event is reported successfully; returns -1 otherwise.
*
* @since 1.0
* @version 1.0
*/
int32_t HdfWifiEventDelSta(struct NetDevice *netDev, const uint8_t *macAddr, uint8_t addrLen);
/**
* @brief Reports a scanned BSS event.
*
* @param netDev Indicates the pointer to the network device. This parameter cannot be null.
* @param channel Indicates the pointer to the channel information. This parameter cannot be null.
* @param bssInfo Indicates the pointer to the BSS information. This parameter cannot be null.
*
* @return Returns 0 if the event is reported successfully; returns -1 otherwise.
*
* @since 1.0
* @version 1.0
*/
int32_t HdfWifiEventInformBssFrame(const struct NetDevice *netDev, const struct WlanChannel *channel,
const struct ScannedBssInfo *bssInfo);
/**
* @brief Reports a scanning completion event.
*
* @param netDev Indicates the pointer to the network device. This parameter cannot be null.
* @param status Indicates the scanning completion status. Value 0 indicates that the scanning is successful,
* and other values indicate that the scanning fails.
*
* @return Returns 0 if the event is reported successfully; returns -1 otherwise.
*
* @since 1.0
* @version 1.0
*/
int32_t HdfWifiEventScanDone(const struct NetDevice *netDev, WifiScanStatus status);
/**
* @brief Reports a connection result event.
*
* @param netDev Indicates the pointer to the network device. This parameter cannot be null.
* @param result Indicates the pointer to the connection result. This parameter cannot be null.
*
* @return Returns 0 if the event is reported successfully; returns -1 otherwise.
*
* @since 1.0
* @version 1.0
*/
int32_t HdfWifiEventConnectResult(const struct NetDevice *netDev, const struct ConnetResult *result);
/**
* @brief Reports a disconnection event.
*
* @param netDev Indicates the pointer to the network device. This parameter cannot be null.
* @param reason Indicates the reason for disconnection.
* @param ie Indicates the pointer to the deauth/disassoc frame IE.
* @param len Indicates the length of the deauth/disassoc IE.
*
* @return Returns 0 if the event is reported successfully; returns -1 otherwise.
*
* @since 1.0
* @version 1.0
*/
int32_t HdfWifiEventDisconnected(const struct NetDevice *netDev, uint16_t reason, const uint8_t *ie, uint32_t len);
/**
* @brief Reports a transmission management status event.
*
* @param netDev Indicates the pointer to the network device. This parameter cannot be null.
* @param buf Indicates the pointer to the transmission management frame. This parameter cannot be null.
* @param len Indicates the length of the transmission management frame.
* @param ack Indicates whether the transmission management frame is acknowledged.
*
* @return Returns 0 if the event is reported successfully; returns -1 otherwise.
*
* @since 1.0
* @version 1.0
*/
int32_t HdfWifiEventMgmtTxStatus(const struct NetDevice *netDev, const uint8_t *buf, size_t len, uint8_t ack);
/**
* @brief Reports a receive management status event.
*
* @param netDev Indicates the pointer to the network device. This parameter cannot be null.
* @param freq Indicates the frequency of receiving management frame.
* @param sigMbm Indicates the signal strength (in dBm).
* @param buf Indicates the pointer to the receive management frame. This parameter cannot be null.
* @param len Indicates the length of the receive management frame.
*
* @return Returns 0 if the event is reported successfully; returns -1 otherwise.
*
* @since 1.0
* @version 1.0
*/
int32_t HdfWifiEventRxMgmt(const struct NetDevice *netDev, int32_t freq, int32_t sigMbm,
const uint8_t *buf, size_t len);
/**
* @brief Reports a CSA channel switching event.
*
* @param netDev Indicates the pointer to the network device. This parameter cannot be null.
* @param freq Indicates the frequency of the channel.
*
* @return Returns 0 if the event is reported successfully; returns -1 otherwise.
*
* @since 1.0
* @version 1.0
*/
int32_t HdfWifiEventCsaChannelSwitch(const struct NetDevice *netDev, int32_t freq);
/**
* @brief Reports a timeout disconnection event.
*
* @param netDev Indicates the pointer to the network device. This parameter cannot be null.
*
* @return Returns 0 if the event is reported successfully; returns -1 otherwise.
*
* @since 1.0
* @version 1.0
*/
int32_t HdfWifiEventTimeoutDisconnected(const struct NetDevice *netDev);
/**
* @brief Reports the event of receiving the EAPOL frame and notifies WPA to read the EAPOL frame.
*
* @param name Indicates the pointer to the network port name, for example, wlan0.
* @param context Indicates the pointer to the context. This parameter is reserved.
*
* @return Returns 0 if the operation is successful; returns -1 otherwise.
*
* @since 1.0
* @version 1.0
*/
int32_t HdfWifiEventEapolRecv(const char *name, void *context);
/**
* @brief Reports the WLAN driver reset result.
*
* @param chipId Indicates the chip ID. This parameter cannot be null.
* @param resetStatus Indicates the WLAN driver reset result.
*
* @return Returns 0 if the result is reported successfully; returns -1 otherwise.
*
* @since 1.0
* @version 1.0
*/
int32_t HdfWifiEventResetResult(const uint8_t chipId, int32_t resetStatus, const char *ifName);
int32_t HdfWifiEventRemainOnChannel(const struct NetDevice *netDev, uint32_t freq, uint32_t duration);
int32_t HdfWifiEventCancelRemainOnChannel(const struct NetDevice *netDev, uint32_t freq);
#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif
#endif /* HDF_WIFI_EVENT_H */
/** @} */