blob: fefd20a06bd9cbd8c543fd69a3b5e9fe498c18da [file] [log] [blame]
/*
* Copyright 2019 The Fuchsia Authors.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
// TODO(29700): Consolidate to one ieee80211.h
#ifndef SRC_CONNECTIVITY_WLAN_DRIVERS_THIRD_PARTY_INTEL_IWLWIFI_PLATFORM_IEEE80211_H_
#define SRC_CONNECTIVITY_WLAN_DRIVERS_THIRD_PARTY_INTEL_IWLWIFI_PLATFORM_IEEE80211_H_
#include <fuchsia/hardware/wlan/phyinfo/c/banjo.h>
#include <fuchsia/hardware/wlan/softmac/c/banjo.h>
#include <netinet/if_ether.h>
#include <stddef.h>
#include <stdint.h>
#include "third_party/iwlwifi/platform/ieee80211_include.h"
#include "third_party/iwlwifi/platform/compiler.h"
#if defined(__cplusplus)
extern "C" {
#endif // defined(__cplusplus)
// The below constants are not defined in the 802.11-2016 Std.
#define IEEE80211_MAX_CHAINS 4
#define IEEE80211_MAX_RTS_THRESHOLD 2353
#define IEEE80211_MAC_PACKET_HEADROOM_SIZE 8
// Used as the default value in the data structure to indicate the queue is not set yet.
#define IEEE80211_INVAL_HW_QUEUE 0xff
// Convert the TID sequence number into the SSN (start sequence number) in the BAR (Block Ack
// Request).
#define IEEE80211_SCTL_SEQ_MASK 0xfff
#define IEEE80211_SCTL_SEQ_OFFSET 4
#define IEEE80211_SEQ_TO_SN(seq) (((seq) >> IEEE80211_SCTL_SEQ_OFFSET) & IEEE80211_SCTL_SEQ_MASK)
/* 802.11n HT capabilities masks (for cap_info) */
#define IEEE80211_HT_CAP_LDPC_CODING 0x0001
#define IEEE80211_HT_CAP_SUP_WIDTH_20_40 0x0002
#define IEEE80211_HT_CAP_SM_PS 0x000C
#define IEEE80211_HT_CAP_SM_PS_SHIFT 2
#define IEEE80211_HT_CAP_GRN_FLD 0x0010
#define IEEE80211_HT_CAP_SGI_20 0x0020
#define IEEE80211_HT_CAP_SGI_40 0x0040
#define IEEE80211_HT_CAP_TX_STBC 0x0080
#define IEEE80211_HT_CAP_RX_STBC 0x0300
#define IEEE80211_HT_CAP_RX_STBC_SHIFT 8
#define IEEE80211_HT_CAP_DELAY_BA 0x0400
#define IEEE80211_HT_CAP_MAX_AMSDU 0x0800
#define IEEE80211_HT_CAP_DSSSCCK40 0x1000
#define IEEE80211_HT_CAP_RESERVED 0x2000
#define IEEE80211_HT_CAP_40MHZ_INTOLERANT 0x4000
#define IEEE80211_HT_CAP_LSIG_TXOP_PROT 0x8000
/* 802.11n HT capability MSC set */
#define IEEE80211_HT_MCS_RX_HIGHEST_MASK 0x3ff
#define IEEE80211_HT_MCS_TX_DEFINED 0x01
#define IEEE80211_HT_MCS_TX_RX_DIFF 0x02
#define IEEE80211_HT_MCS_TX_MAX_STREAMS_MASK 0x0C
#define IEEE80211_HT_MCS_TX_MAX_STREAMS_SHIFT 2
#define IEEE80211_HT_MCS_TX_MAX_STREAMS 4
#define IEEE80211_HT_MCS_TX_UNEQUAL_MODULATION 0x10
// The order of access categories is not clearly specified in 802.11-2016 Std.
// Therefore it cannot be moved into ieee80211 banjo file.
enum ieee80211_ac_numbers {
IEEE80211_AC_VO = 0,
IEEE80211_AC_VI = 1,
IEEE80211_AC_BE = 2,
IEEE80211_AC_BK = 3,
IEEE80211_AC_MAX = 4,
};
enum ieee80211_frame_release_type {
IEEE80211_FRAME_RELEASE_PSPOLL,
IEEE80211_FRAME_RELEASE_UAPSD,
};
// IEEE Std 802.11-2016, 9.4.2.56.3, Table 9-163
enum ieee80211_max_ampdu_length_exp {
IEEE80211_HT_MAX_AMPDU_8K = 0,
IEEE80211_HT_MAX_AMPDU_16K = 1,
IEEE80211_HT_MAX_AMPDU_32K = 2,
IEEE80211_HT_MAX_AMPDU_64K = 3
};
/* Minimum MPDU start spacing */
enum ieee80211_min_mpdu_spacing {
IEEE80211_HT_MPDU_DENSITY_NONE = 0, /* No restriction */
IEEE80211_HT_MPDU_DENSITY_0_25 = 1, /* 1/4 usec */
IEEE80211_HT_MPDU_DENSITY_0_5 = 2, /* 1/2 usec */
IEEE80211_HT_MPDU_DENSITY_1 = 3, /* 1 usec */
IEEE80211_HT_MPDU_DENSITY_2 = 4, /* 2 usec */
IEEE80211_HT_MPDU_DENSITY_4 = 5, /* 4 usec */
IEEE80211_HT_MPDU_DENSITY_8 = 6, /* 8 usec */
IEEE80211_HT_MPDU_DENSITY_16 = 7 /* 16 usec */
};
enum ieee80211_roc_type {
IEEE80211_ROC_TYPE_NORMAL = 0,
IEEE80211_ROC_TYPE_MGMT_TX,
};
enum ieee80211_rssi_event_data {
RSSI_EVENT_HIGH,
RSSI_EVENT_LOW,
};
enum ieee80211_smps_mode {
IEEE80211_SMPS_AUTOMATIC,
IEEE80211_SMPS_OFF,
IEEE80211_SMPS_STATIC,
IEEE80211_SMPS_DYNAMIC,
IEEE80211_SMPS_NUM_MODES,
};
// NEEDS_PORTING: Below structures are only referenced in function prototype.
// Doesn't need a dummy byte.
struct cfg80211_gtk_rekey_data;
struct cfg80211_nan_conf;
struct cfg80211_nan_func;
struct cfg80211_scan_request;
struct cfg80211_sched_scan_request;
struct cfg80211_wowlan;
struct ieee80211_key_conf;
struct ieee80211_sta_ht_cap;
struct ieee80211_scan_ies;
struct ieee80211_tdls_ch_sw_params;
// NEEDS_PORTING: Below structures are used in code but not ported yet.
// A dummy byte is required to suppress the C++ warning message for empty
// struct.
struct cfg80211_chan_def {
char dummy;
};
struct ieee80211_hdr {
char dummy;
};
struct ieee80211_ops {
char dummy;
};
struct ieee80211_p2p_noa_desc {
char dummy;
};
// Channel info. Attributes of a channel.
struct ieee80211_channel {
wlan_info_band_t band;
uint32_t center_freq; // unit: MHz.
uint16_t ch_num; // channel number (starts from 1).
uint32_t flags;
int max_power;
};
struct ieee80211_mcs_info {
uint8_t rx_mask[IEEE80211_HT_MCS_MASK_LEN];
__le16 rx_highest_le;
uint8_t tx_params;
uint8_t reserved[3];
} __packed;
struct ieee80211_sta_ht_cap {
uint16_t cap; /* use IEEE80211_HT_CAP_ */
bool ht_supported;
uint8_t ampdu_factor;
uint8_t ampdu_density;
struct ieee80211_mcs_info mcs;
};
struct ieee80211_supported_band {
wlan_info_band_t band;
struct ieee80211_channel* channels;
int n_channels;
uint16_t* bitrates;
int n_bitrates;
struct ieee80211_sta_ht_cap ht_cap;
};
struct ieee80211_tx_queue_params {
uint16_t txop;
uint16_t cw_min;
uint16_t cw_max;
uint8_t aifs;
};
struct ieee80211_tx_rate {
char dummy;
};
struct ieee80211_txq;
struct ieee80211_sta {
void* drv_priv;
struct ieee80211_txq* txq[IEEE80211_TIDS_MAX + 1];
};
struct ieee80211_txq {
void* drv_priv;
};
// TODO(43559): completely remove this structure from code.
struct ieee80211_vif {
uint8_t dummy;
};
/**
* struct ieee80211_key_conf - HW key configuration data
* @tx_pn - TX packet number, in host byte order
* @rx_seq - RX sequence number, in host byte order
*/
struct ieee80211_key_conf {
atomic64_t tx_pn;
uint64_t rx_seq;
uint32_t cipher;
uint8_t hw_key_idx;
uint8_t keyidx;
uint8_t key_type;
size_t keylen;
uint8_t key[0];
};
struct ieee80211_tx_info {
struct {
struct ieee80211_key_conf* hw_key;
} control;
};
// Struct for transferring an IEEE 802.11 MAC-framed packet around the driver.
struct ieee80211_mac_packet {
// The common portion of the MAC header.
const struct ieee80211_frame_header* common_header;
// The size of the entire MAC header (starting at common_header), including variable fields.
size_t header_size;
// Statically allocated headroom space between the MAC header and frame body, for adding
// additional headers to the packet.
uint8_t headroom[IEEE80211_MAC_PACKET_HEADROOM_SIZE];
// Size of the headroom used.
size_t headroom_used_size;
// MAC frame body.
const uint8_t* body;
// MAC frame body size.
size_t body_size;
// Control information for this packet.
struct ieee80211_tx_info info;
};
// Flags for the ieee80211_rx_status.flag
enum ieee80211_rx_status_flags {
RX_FLAG_DECRYPTED = 0x1,
RX_FLAG_PN_VALIDATED = 0x2,
RX_FLAG_ALLOW_SAME_PN = 0x4,
};
struct ieee80211_rx_status {
// RX flags, as in Linux.
uint64_t flag;
// The encryption IV, copied here since the encryption header is removed for Fuchsia.
uint8_t extiv[8];
// RX info struct to pass to wlanstack.
struct wlan_rx_info rx_info;
};
size_t ieee80211_get_header_len(const struct ieee80211_frame_header* fh);
struct ieee80211_hw* ieee80211_alloc_hw(size_t priv_data_len, const struct ieee80211_ops* ops);
bool ieee80211_is_valid_chan(uint8_t primary);
uint16_t ieee80211_get_center_freq(uint8_t channel_num);
bool ieee80211_has_protected(const struct ieee80211_frame_header* fh);
bool ieee80211_is_data(const struct ieee80211_frame_header* fh);
bool ieee80211_is_data_qos(const struct ieee80211_frame_header* fh);
uint8_t ieee80211_get_tid(const struct ieee80211_frame_header* fh);
#if defined(__cplusplus)
} // extern "C"
#endif // defined(__cplusplus)
#endif // SRC_CONNECTIVITY_WLAN_DRIVERS_THIRD_PARTY_INTEL_IWLWIFI_PLATFORM_IEEE80211_H_