diff options
Diffstat (limited to 'include/net/mac80211.h')
| -rw-r--r-- | include/net/mac80211.h | 460 | 
1 files changed, 375 insertions, 85 deletions
diff --git a/include/net/mac80211.h b/include/net/mac80211.h index cc6035f1a2f..421b6ecb4b2 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h @@ -66,10 +66,6 @@   *   * Secondly, when the hardware handles fragmentation, the frame handed to   * the driver from mac80211 is the MSDU, not the MPDU. - * - * Finally, for received frames, the driver is able to indicate that it has - * filled a radiotap header and put that in front of the frame; if it does - * not do so then mac80211 may add this under certain circumstances.   */  /** @@ -154,12 +150,14 @@ struct ieee80211_low_level_stats {   * @IEEE80211_CHANCTX_CHANGE_RADAR: radar detection flag changed   * @IEEE80211_CHANCTX_CHANGE_CHANNEL: switched to another operating channel,   *	this is used only with channel switching with CSA + * @IEEE80211_CHANCTX_CHANGE_MIN_WIDTH: The min required channel width changed   */  enum ieee80211_chanctx_change {  	IEEE80211_CHANCTX_CHANGE_WIDTH		= BIT(0),  	IEEE80211_CHANCTX_CHANGE_RX_CHAINS	= BIT(1),  	IEEE80211_CHANCTX_CHANGE_RADAR		= BIT(2),  	IEEE80211_CHANCTX_CHANGE_CHANNEL	= BIT(3), +	IEEE80211_CHANCTX_CHANGE_MIN_WIDTH	= BIT(4),  };  /** @@ -169,6 +167,7 @@ enum ieee80211_chanctx_change {   * that contains it is visible in mac80211 only.   *   * @def: the channel definition + * @min_def: the minimum channel definition currently required.   * @rx_chains_static: The number of RX chains that must always be   *	active on the channel to receive MIMO transmissions   * @rx_chains_dynamic: The number of RX chains that must be enabled @@ -180,6 +179,7 @@ enum ieee80211_chanctx_change {   */  struct ieee80211_chanctx_conf {  	struct cfg80211_chan_def def; +	struct cfg80211_chan_def min_def;  	u8 rx_chains_static, rx_chains_dynamic; @@ -189,6 +189,43 @@ struct ieee80211_chanctx_conf {  };  /** + * enum ieee80211_chanctx_switch_mode - channel context switch mode + * @CHANCTX_SWMODE_REASSIGN_VIF: Both old and new contexts already + *	exist (and will continue to exist), but the virtual interface + *	needs to be switched from one to the other. + * @CHANCTX_SWMODE_SWAP_CONTEXTS: The old context exists but will stop + *      to exist with this call, the new context doesn't exist but + *      will be active after this call, the virtual interface switches + *      from the old to the new (note that the driver may of course + *      implement this as an on-the-fly chandef switch of the existing + *      hardware context, but the mac80211 pointer for the old context + *      will cease to exist and only the new one will later be used + *      for changes/removal.) + */ +enum ieee80211_chanctx_switch_mode { +	CHANCTX_SWMODE_REASSIGN_VIF, +	CHANCTX_SWMODE_SWAP_CONTEXTS, +}; + +/** + * struct ieee80211_vif_chanctx_switch - vif chanctx switch information + * + * This is structure is used to pass information about a vif that + * needs to switch from one chanctx to another.  The + * &ieee80211_chanctx_switch_mode defines how the switch should be + * done. + * + * @vif: the vif that should be switched from old_ctx to new_ctx + * @old_ctx: the old context to which the vif was assigned + * @new_ctx: the new context to which the vif must be assigned + */ +struct ieee80211_vif_chanctx_switch { +	struct ieee80211_vif *vif; +	struct ieee80211_chanctx_conf *old_ctx; +	struct ieee80211_chanctx_conf *new_ctx; +}; + +/**   * enum ieee80211_bss_change - BSS change notification flags   *   * These flags are used with the bss_info_changed() callback @@ -697,11 +734,11 @@ struct ieee80211_tx_info {  		} control;  		struct {  			struct ieee80211_tx_rate rates[IEEE80211_TX_MAX_RATES]; -			int ack_signal; +			s32 ack_signal;  			u8 ampdu_ack_len;  			u8 ampdu_len;  			u8 antenna; -			/* 21 bytes free */ +			void *status_driver_data[21 / sizeof(void *)];  		} status;  		struct {  			struct ieee80211_tx_rate driver_rates[ @@ -804,9 +841,6 @@ ieee80211_tx_info_clear_status(struct ieee80211_tx_info *info)   * @RX_FLAG_HT: HT MCS was used and rate_idx is MCS index   * @RX_FLAG_VHT: VHT MCS was used and rate_index is MCS index   * @RX_FLAG_40MHZ: HT40 (40 MHz) was used - * @RX_FLAG_80MHZ: 80 MHz was used - * @RX_FLAG_80P80MHZ: 80+80 MHz was used - * @RX_FLAG_160MHZ: 160 MHz was used   * @RX_FLAG_SHORT_GI: Short guard interval was used   * @RX_FLAG_NO_SIGNAL_VAL: The signal strength value is not present.   *	Valid only for data frames (mainly A-MPDU) @@ -826,9 +860,19 @@ ieee80211_tx_info_clear_status(struct ieee80211_tx_info *info)   *	on this subframe   * @RX_FLAG_AMPDU_DELIM_CRC_KNOWN: The delimiter CRC field is known (the CRC   *	is stored in the @ampdu_delimiter_crc field) + * @RX_FLAG_LDPC: LDPC was used   * @RX_FLAG_STBC_MASK: STBC 2 bit bitmask. 1 - Nss=1, 2 - Nss=2, 3 - Nss=3   * @RX_FLAG_10MHZ: 10 MHz (half channel) was used   * @RX_FLAG_5MHZ: 5 MHz (quarter channel) was used + * @RX_FLAG_AMSDU_MORE: Some drivers may prefer to report separate A-MSDU + *	subframes instead of a one huge frame for performance reasons. + *	All, but the last MSDU from an A-MSDU should have this flag set. E.g. + *	if an A-MSDU has 3 frames, the first 2 must have the flag set, while + *	the 3rd (last) one must not have this flag set. The flag is used to + *	deal with retransmission/duplication recovery properly since A-MSDU + *	subframes share the same sequence number. Reported subframes can be + *	either regular MSDU or singly A-MSDUs. Subframes must not be + *	interleaved with other frames.   */  enum mac80211_rx_flags {  	RX_FLAG_MMIC_ERROR		= BIT(0), @@ -853,17 +897,33 @@ enum mac80211_rx_flags {  	RX_FLAG_AMPDU_DELIM_CRC_KNOWN	= BIT(20),  	RX_FLAG_MACTIME_END		= BIT(21),  	RX_FLAG_VHT			= BIT(22), -	RX_FLAG_80MHZ			= BIT(23), -	RX_FLAG_80P80MHZ		= BIT(24), -	RX_FLAG_160MHZ			= BIT(25), +	RX_FLAG_LDPC			= BIT(23),  	RX_FLAG_STBC_MASK		= BIT(26) | BIT(27),  	RX_FLAG_10MHZ			= BIT(28),  	RX_FLAG_5MHZ			= BIT(29), +	RX_FLAG_AMSDU_MORE		= BIT(30),  };  #define RX_FLAG_STBC_SHIFT		26  /** + * enum mac80211_rx_vht_flags - receive VHT flags + * + * These flags are used with the @vht_flag member of + *	&struct ieee80211_rx_status. + * @RX_VHT_FLAG_80MHZ: 80 MHz was used + * @RX_VHT_FLAG_80P80MHZ: 80+80 MHz was used + * @RX_VHT_FLAG_160MHZ: 160 MHz was used + * @RX_VHT_FLAG_BF: packet was beamformed + */ +enum mac80211_rx_vht_flags { +	RX_VHT_FLAG_80MHZ		= BIT(0), +	RX_VHT_FLAG_80P80MHZ		= BIT(1), +	RX_VHT_FLAG_160MHZ		= BIT(2), +	RX_VHT_FLAG_BF			= BIT(3), +}; + +/**   * struct ieee80211_rx_status - receive status   *   * The low-level driver should provide this information (the subset @@ -888,26 +948,19 @@ enum mac80211_rx_flags {   *	HT or VHT is used (%RX_FLAG_HT/%RX_FLAG_VHT)   * @vht_nss: number of streams (VHT only)   * @flag: %RX_FLAG_* + * @vht_flag: %RX_VHT_FLAG_*   * @rx_flags: internal RX flags for mac80211   * @ampdu_reference: A-MPDU reference number, must be a different value for   *	each A-MPDU but the same for each subframe within one A-MPDU   * @ampdu_delimiter_crc: A-MPDU delimiter CRC - * @vendor_radiotap_bitmap: radiotap vendor namespace presence bitmap - * @vendor_radiotap_len: radiotap vendor namespace length - * @vendor_radiotap_align: radiotap vendor namespace alignment. Note - *	that the actual data must be at the start of the SKB data - *	already. - * @vendor_radiotap_oui: radiotap vendor namespace OUI - * @vendor_radiotap_subns: radiotap vendor sub namespace   */  struct ieee80211_rx_status {  	u64 mactime;  	u32 device_timestamp;  	u32 ampdu_reference;  	u32 flag; -	u32 vendor_radiotap_bitmap; -	u16 vendor_radiotap_len;  	u16 freq; +	u8 vht_flag;  	u8 rate_idx;  	u8 vht_nss;  	u8 rx_flags; @@ -917,9 +970,6 @@ struct ieee80211_rx_status {  	u8 chains;  	s8 chain_signal[IEEE80211_MAX_CHAINS];  	u8 ampdu_delimiter_crc; -	u8 vendor_radiotap_align; -	u8 vendor_radiotap_oui[3]; -	u8 vendor_radiotap_subns;  };  /** @@ -1100,7 +1150,9 @@ enum ieee80211_vif_flags {   * @addr: address of this interface   * @p2p: indicates whether this AP or STA interface is a p2p   *	interface, i.e. a GO or p2p-sta respectively - * @csa_active: marks whether a channel switch is going on + * @csa_active: marks whether a channel switch is going on. Internally it is + *	write-protected by sdata_lock and local->mtx so holding either is fine + *	for read access.   * @driver_flags: flags/capabilities the driver has for this interface,   *	these need to be set (or cleared) when the interface is added   *	or, if supported by the driver, the interface type is changed @@ -1149,6 +1201,19 @@ static inline bool ieee80211_vif_is_mesh(struct ieee80211_vif *vif)  }  /** + * wdev_to_ieee80211_vif - return a vif struct from a wdev + * @wdev: the wdev to get the vif for + * + * This can be used by mac80211 drivers with direct cfg80211 APIs + * (like the vendor commands) that get a wdev. + * + * Note that this function may return %NULL if the given wdev isn't + * associated with a vif that the driver knows about (e.g. monitor + * or AP_VLAN interfaces.) + */ +struct ieee80211_vif *wdev_to_ieee80211_vif(struct wireless_dev *wdev); + +/**   * enum ieee80211_key_flags - key flags   *   * These flags are used for communication about keys between the driver @@ -1176,14 +1241,18 @@ static inline bool ieee80211_vif_is_mesh(struct ieee80211_vif *vif)   *	fall back to software crypto. Note that this flag deals only with   *	RX, if your crypto engine can't deal with TX you can also set the   *	%IEEE80211_KEY_FLAG_SW_MGMT_TX flag to encrypt such frames in SW. + * @IEEE80211_KEY_FLAG_GENERATE_IV_MGMT: This flag should be set by the + *	driver for a CCMP key to indicate that is requires IV generation + *	only for managment frames (MFP).   */  enum ieee80211_key_flags { -	IEEE80211_KEY_FLAG_GENERATE_IV	= 1<<1, -	IEEE80211_KEY_FLAG_GENERATE_MMIC= 1<<2, -	IEEE80211_KEY_FLAG_PAIRWISE	= 1<<3, -	IEEE80211_KEY_FLAG_SW_MGMT_TX	= 1<<4, -	IEEE80211_KEY_FLAG_PUT_IV_SPACE = 1<<5, -	IEEE80211_KEY_FLAG_RX_MGMT	= 1<<6, +	IEEE80211_KEY_FLAG_GENERATE_IV_MGMT	= BIT(0), +	IEEE80211_KEY_FLAG_GENERATE_IV		= BIT(1), +	IEEE80211_KEY_FLAG_GENERATE_MMIC	= BIT(2), +	IEEE80211_KEY_FLAG_PAIRWISE		= BIT(3), +	IEEE80211_KEY_FLAG_SW_MGMT_TX		= BIT(4), +	IEEE80211_KEY_FLAG_PUT_IV_SPACE		= BIT(5), +	IEEE80211_KEY_FLAG_RX_MGMT		= BIT(6),  };  /** @@ -1219,6 +1288,36 @@ struct ieee80211_key_conf {  };  /** + * struct ieee80211_cipher_scheme - cipher scheme + * + * This structure contains a cipher scheme information defining + * the secure packet crypto handling. + * + * @cipher: a cipher suite selector + * @iftype: a cipher iftype bit mask indicating an allowed cipher usage + * @hdr_len: a length of a security header used the cipher + * @pn_len: a length of a packet number in the security header + * @pn_off: an offset of pn from the beginning of the security header + * @key_idx_off: an offset of key index byte in the security header + * @key_idx_mask: a bit mask of key_idx bits + * @key_idx_shift: a bit shift needed to get key_idx + *     key_idx value calculation: + *      (sec_header_base[key_idx_off] & key_idx_mask) >> key_idx_shift + * @mic_len: a mic length in bytes + */ +struct ieee80211_cipher_scheme { +	u32 cipher; +	u16 iftype; +	u8 hdr_len; +	u8 pn_len; +	u8 pn_off; +	u8 key_idx_off; +	u8 key_idx_mask; +	u8 key_idx_shift; +	u8 mic_len; +}; + +/**   * enum set_key_cmd - key command   *   * Used with the set_key() callback in &struct ieee80211_ops, this @@ -1314,6 +1413,7 @@ struct ieee80211_sta_rates {   *	the station moves to associated state.   * @smps_mode: current SMPS mode (off, static or dynamic)   * @rates: rate control selection table + * @tdls: indicates whether the STA is a TDLS peer   */  struct ieee80211_sta {  	u32 supp_rates[IEEE80211_NUM_BANDS]; @@ -1328,6 +1428,7 @@ struct ieee80211_sta {  	enum ieee80211_sta_rx_bandwidth bandwidth;  	enum ieee80211_smps_mode smps_mode;  	struct ieee80211_sta_rates __rcu *rates; +	bool tdls;  	/* must be last */  	u8 drv_priv[0] __aligned(sizeof(void *)); @@ -1449,8 +1550,6 @@ struct ieee80211_tx_control {   * @IEEE80211_HW_CONNECTION_MONITOR:   *	The hardware performs its own connection monitoring, including   *	periodic keep-alives to the AP and probing the AP on beacon loss. - *	When this flag is set, signaling beacon-loss will cause an immediate - *	change to disassociated state.   *   * @IEEE80211_HW_NEED_DTIM_BEFORE_ASSOC:   *	This device needs to get data from beacon before association (i.e. @@ -1492,6 +1591,21 @@ struct ieee80211_tx_control {   *   * @IEEE80211_HW_TIMING_BEACON_ONLY: Use sync timing from beacon frames   *	only, to allow getting TBTT of a DTIM beacon. + * + * @IEEE80211_HW_SUPPORTS_HT_CCK_RATES: Hardware supports mixing HT/CCK rates + *	and can cope with CCK rates in an aggregation session (e.g. by not + *	using aggregation for such frames.) + * + * @IEEE80211_HW_CHANCTX_STA_CSA: Support 802.11h based channel-switch (CSA) + *	for a single active channel while using channel contexts. When support + *	is not enabled the default action is to disconnect when getting the + *	CSA frame. + * + * @IEEE80211_HW_CHANGE_RUNNING_CHANCTX: The hardware can change a + *	channel context on-the-fly.  This is needed for channel switch + *	on single-channel hardware.  It can also be used as an + *	optimization in certain channel switch cases with + *	multi-channel.   */  enum ieee80211_hw_flags {  	IEEE80211_HW_HAS_RATE_CONTROL			= 1<<0, @@ -1522,6 +1636,8 @@ enum ieee80211_hw_flags {  	IEEE80211_HW_P2P_DEV_ADDR_FOR_INTF		= 1<<25,  	IEEE80211_HW_TIMING_BEACON_ONLY			= 1<<26,  	IEEE80211_HW_SUPPORTS_HT_CCK_RATES		= 1<<27, +	IEEE80211_HW_CHANCTX_STA_CSA			= 1<<28, +	IEEE80211_HW_CHANGE_RUNNING_CHANCTX		= 1<<29,  };  /** @@ -1546,7 +1662,8 @@ enum ieee80211_hw_flags {   * @extra_tx_headroom: headroom to reserve in each transmit skb   *	for use by the driver (e.g. for transmit headers.)   * - * @channel_change_time: time (in microseconds) it takes to change channels. + * @extra_beacon_tailroom: tailroom to reserve in each beacon tx skb. + *	Can be used by drivers to add extra IEs.   *   * @max_signal: Maximum value for signal (rssi) in RX information, used   *	only when @IEEE80211_HW_SIGNAL_UNSPEC or @IEEE80211_HW_SIGNAL_DB @@ -1575,10 +1692,6 @@ enum ieee80211_hw_flags {   *	the hw can report back.   * @max_rate_tries: maximum number of tries for each stage   * - * @napi_weight: weight used for NAPI polling.  You must specify an - *	appropriate value here if a napi_poll operation is provided - *	by your driver. - *   * @max_rx_aggregation_subframes: maximum buffer size (number of   *	sub-frames) to be used for A-MPDU block ack receiver   *	aggregation. @@ -1616,6 +1729,10 @@ enum ieee80211_hw_flags {   * @uapsd_max_sp_len: maximum number of total buffered frames the WMM AP may   *	deliver to a WMM STA during any Service Period triggered by the WMM STA.   *	Use IEEE80211_WMM_IE_STA_QOSINFO_SP_* for correct values. + * + * @n_cipher_schemes: a size of an array of cipher schemes definitions. + * @cipher_schemes: a pointer to an array of cipher scheme definitions + *	supported by HW.   */  struct ieee80211_hw {  	struct ieee80211_conf conf; @@ -1624,11 +1741,10 @@ struct ieee80211_hw {  	void *priv;  	u32 flags;  	unsigned int extra_tx_headroom; -	int channel_change_time; +	unsigned int extra_beacon_tailroom;  	int vif_data_size;  	int sta_data_size;  	int chanctx_data_size; -	int napi_weight;  	u16 queues;  	u16 max_listen_interval;  	s8 max_signal; @@ -1643,6 +1759,8 @@ struct ieee80211_hw {  	netdev_features_t netdev_features;  	u8 uapsd_queues;  	u8 uapsd_max_sp_len; +	u8 n_cipher_schemes; +	const struct ieee80211_cipher_scheme *cipher_schemes;  };  /** @@ -1821,7 +1939,7 @@ void ieee80211_free_txskb(struct ieee80211_hw *hw, struct sk_buff *skb);   *   * Driver informs U-APSD client support by enabling   * %IEEE80211_HW_SUPPORTS_UAPSD flag. The mode is configured through the - * uapsd paramater in conf_tx() operation. Hardware needs to send the QoS + * uapsd parameter in conf_tx() operation. Hardware needs to send the QoS   * Nullfunc frames and stay awake until the service period has ended. To   * utilize U-APSD, dynamic powersave is disabled for voip AC and all frames   * from that AC are transmitted with powersave enabled. @@ -2027,7 +2145,7 @@ void ieee80211_free_txskb(struct ieee80211_hw *hw, struct sk_buff *skb);   * with the number of frames to be released and which TIDs they are   * to come from. In this case, the driver is responsible for setting   * the EOSP (for uAPSD) and MORE_DATA bits in the released frames, - * to help the @more_data paramter is passed to tell the driver if + * to help the @more_data parameter is passed to tell the driver if   * there is more data on other TIDs -- the TIDs to release frames   * from are ignored since mac80211 doesn't know how many frames the   * buffers for those TIDs contain. @@ -2045,6 +2163,11 @@ void ieee80211_free_txskb(struct ieee80211_hw *hw, struct sk_buff *skb);   * appropriately (only the last frame may have %IEEE80211_TX_STATUS_EOSP)   * and also take care of the EOSP and MORE_DATA bits in the frame.   * The driver may also use ieee80211_sta_eosp() in this case. + * + * Note that if the driver ever buffers frames other than QoS-data + * frames, it must take care to never send a non-QoS-data frame as + * the last frame in a service period, adding a QoS-nulldata frame + * after a non-QoS-data frame if needed.   */  /** @@ -2338,9 +2461,6 @@ enum ieee80211_roc_type {   *	See the section "Frame filtering" for more information.   *	This callback must be implemented and can sleep.   * - * @set_multicast_list: Configure the device's interface specific RX multicast - *	filter. This callback is optional. This callback must be atomic. - *   * @set_tim: Set TIM bit. mac80211 calls this function when a TIM bit   * 	must be set or cleared for a given STA. Must be atomic.   * @@ -2394,6 +2514,7 @@ enum ieee80211_roc_type {   *	This process will continue until sched_scan_stop is called.   *   * @sched_scan_stop: Tell the hardware to stop an ongoing scheduled scan. + *	In this case, ieee80211_sched_scan_stopped() must not be called.   *   * @sw_scan_start: Notifier function that is called just before a software scan   *	is started. Can be NULL, if the driver doesn't need this notification. @@ -2425,7 +2546,11 @@ enum ieee80211_roc_type {   *	AP, IBSS/WDS/mesh peer etc. This callback can sleep.   *   * @sta_remove: Notifies low level driver about removal of an associated - *	station, AP, IBSS/WDS/mesh peer etc. This callback can sleep. + *	station, AP, IBSS/WDS/mesh peer etc. Note that after the callback + *	returns it isn't safe to use the pointer, not even RCU protected; + *	no RCU grace period is guaranteed between returning here and freeing + *	the station. See @sta_pre_rcu_remove if needed. + *	This callback can sleep.   *   * @sta_add_debugfs: Drivers can use this callback to add debugfs files   *	when a station is added to mac80211's station list. This callback @@ -2444,7 +2569,17 @@ enum ieee80211_roc_type {   *	station (which can be the AP, a client, IBSS/WDS/mesh peer etc.)   *	This callback is mutually exclusive with @sta_add/@sta_remove.   *	It must not fail for down transitions but may fail for transitions - *	up the list of states. + *	up the list of states. Also note that after the callback returns it + *	isn't safe to use the pointer, not even RCU protected - no RCU grace + *	period is guaranteed between returning here and freeing the station. + *	See @sta_pre_rcu_remove if needed. + *	The callback can sleep. + * + * @sta_pre_rcu_remove: Notify driver about station removal before RCU + *	synchronisation. This is useful if a driver needs to have station + *	pointers protected using RCU, it can then use this call to clear + *	the pointers instead of waiting for an RCU grace period to elapse + *	in @sta_state.   *	The callback can sleep.   *   * @sta_rc_update: Notifies the driver of changes to the bitrates that can be @@ -2526,6 +2661,7 @@ enum ieee80211_roc_type {   *	of queues to flush, which is useful if different virtual interfaces   *	use different hardware queues; it may also indicate all queues.   *	If the parameter @drop is set to %true, pending frames may be dropped. + *	Note that vif can be NULL.   *	The callback can sleep.   *   * @channel_switch: Drivers that need (or want) to offload the channel @@ -2533,8 +2669,6 @@ enum ieee80211_roc_type {   *	callback. They must then call ieee80211_chswitch_done() to indicate   *	completion of the channel switch.   * - * @napi_poll: Poll Rx queue for incoming data frames. - *   * @set_antenna: Set antenna configuration (tx_ant, rx_ant) on the device.   *	Parameters are bitmaps of allowed antennas to use for TX/RX. Drivers may   *	reject TX/RX mask combinations they cannot support by returning -EINVAL @@ -2572,7 +2706,7 @@ enum ieee80211_roc_type {   *	parameters. In the case where the driver buffers some frames for   *	sleeping stations mac80211 will use this callback to tell the driver   *	to release some frames, either for PS-poll or uAPSD. - *	Note that if the @more_data paramter is %false the driver must check + *	Note that if the @more_data parameter is %false the driver must check   *	if there are more frames on the given TIDs, and if there are more than   *	the frames being released then it must still set the more-data bit in   *	the frame. If the @more_data parameter is %true, then of course the @@ -2639,6 +2773,11 @@ enum ieee80211_roc_type {   *	to vif. Possible use is for hw queue remapping.   * @unassign_vif_chanctx: Notifies device driver about channel context being   *	unbound from vif. + * @switch_vif_chanctx: switch a number of vifs from one chanctx to + *	another, as specified in the list of + *	@ieee80211_vif_chanctx_switch passed to the driver, according + *	to the mode defined in &ieee80211_chanctx_switch_mode. + *   * @start_ap: Start operation on the AP interface, this is called after all the   *	information in bss_conf is set and beacon can be retrieved. A channel   *	context is bound before this is called. Note that if the driver uses @@ -2660,12 +2799,22 @@ enum ieee80211_roc_type {   * @channel_switch_beacon: Starts a channel switch to a new channel.   *	Beacons are modified to include CSA or ECSA IEs before calling this   *	function. The corresponding count fields in these IEs must be - *	decremented, and when they reach zero the driver must call + *	decremented, and when they reach 1 the driver must call   *	ieee80211_csa_finish(). Drivers which use ieee80211_beacon_get()   *	get the csa counter decremented by mac80211, but must check if it is - *	zero using ieee80211_csa_is_complete() after the beacon has been + *	1 using ieee80211_csa_is_complete() after the beacon has been   *	transmitted and then call ieee80211_csa_finish(). + *	If the CSA count starts as zero or 1, this function will not be called, + *	since there won't be any time to beacon before the switch anyway.   * + * @join_ibss: Join an IBSS (on an IBSS interface); this is called after all + *	information in bss_conf is set up and the beacon can be retrieved. A + *	channel context is bound before this is called. + * @leave_ibss: Leave the IBSS again. + * + * @get_expected_throughput: extract the expected throughput towards the + *	specified station. The returned value is expressed in Kbps. It returns 0 + *	if the RC algorithm does not have proper data to provide.   */  struct ieee80211_ops {  	void (*tx)(struct ieee80211_hw *hw, @@ -2700,10 +2849,6 @@ struct ieee80211_ops {  				 unsigned int changed_flags,  				 unsigned int *total_flags,  				 u64 multicast); -	void (*set_multicast_list)(struct ieee80211_hw *hw, -				   struct ieee80211_vif *vif, bool allmulti, -				   struct netdev_hw_addr_list *mc_list); -  	int (*set_tim)(struct ieee80211_hw *hw, struct ieee80211_sta *sta,  		       bool set);  	int (*set_key)(struct ieee80211_hw *hw, enum set_key_cmd cmd, @@ -2727,7 +2872,7 @@ struct ieee80211_ops {  				struct ieee80211_vif *vif,  				struct cfg80211_sched_scan_request *req,  				struct ieee80211_sched_scan_ies *ies); -	void (*sched_scan_stop)(struct ieee80211_hw *hw, +	int (*sched_scan_stop)(struct ieee80211_hw *hw,  			       struct ieee80211_vif *vif);  	void (*sw_scan_start)(struct ieee80211_hw *hw);  	void (*sw_scan_complete)(struct ieee80211_hw *hw); @@ -2757,6 +2902,9 @@ struct ieee80211_ops {  			 struct ieee80211_sta *sta,  			 enum ieee80211_sta_state old_state,  			 enum ieee80211_sta_state new_state); +	void (*sta_pre_rcu_remove)(struct ieee80211_hw *hw, +				   struct ieee80211_vif *vif, +				   struct ieee80211_sta *sta);  	void (*sta_rc_update)(struct ieee80211_hw *hw,  			      struct ieee80211_vif *vif,  			      struct ieee80211_sta *sta, @@ -2785,10 +2933,10 @@ struct ieee80211_ops {  			     struct netlink_callback *cb,  			     void *data, int len);  #endif -	void (*flush)(struct ieee80211_hw *hw, u32 queues, bool drop); +	void (*flush)(struct ieee80211_hw *hw, struct ieee80211_vif *vif, +		      u32 queues, bool drop);  	void (*channel_switch)(struct ieee80211_hw *hw,  			       struct ieee80211_channel_switch *ch_switch); -	int (*napi_poll)(struct ieee80211_hw *hw, int budget);  	int (*set_antenna)(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant);  	int (*get_antenna)(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant); @@ -2846,6 +2994,10 @@ struct ieee80211_ops {  	void (*unassign_vif_chanctx)(struct ieee80211_hw *hw,  				     struct ieee80211_vif *vif,  				     struct ieee80211_chanctx_conf *ctx); +	int (*switch_vif_chanctx)(struct ieee80211_hw *hw, +				  struct ieee80211_vif_chanctx_switch *vifs, +				  int n_vifs, +				  enum ieee80211_chanctx_switch_mode mode);  	void (*restart_complete)(struct ieee80211_hw *hw); @@ -2857,6 +3009,10 @@ struct ieee80211_ops {  	void (*channel_switch_beacon)(struct ieee80211_hw *hw,  				      struct ieee80211_vif *vif,  				      struct cfg80211_chan_def *chandef); + +	int (*join_ibss)(struct ieee80211_hw *hw, struct ieee80211_vif *vif); +	void (*leave_ibss)(struct ieee80211_hw *hw, struct ieee80211_vif *vif); +	u32 (*get_expected_throughput)(struct ieee80211_sta *sta);  };  /** @@ -3067,21 +3223,21 @@ void ieee80211_free_hw(struct ieee80211_hw *hw);   */  void ieee80211_restart_hw(struct ieee80211_hw *hw); -/** ieee80211_napi_schedule - schedule NAPI poll - * - * Use this function to schedule NAPI polling on a device. - * - * @hw: the hardware to start polling - */ -void ieee80211_napi_schedule(struct ieee80211_hw *hw); - -/** ieee80211_napi_complete - complete NAPI polling - * - * Use this function to finish NAPI polling on a device. +/** + * ieee80211_napi_add - initialize mac80211 NAPI context + * @hw: the hardware to initialize the NAPI context on + * @napi: the NAPI context to initialize + * @napi_dev: dummy NAPI netdevice, here to not waste the space if the + *	driver doesn't use NAPI + * @poll: poll function + * @weight: default weight   * - * @hw: the hardware to stop polling + * See also netif_napi_add().   */ -void ieee80211_napi_complete(struct ieee80211_hw *hw); +void ieee80211_napi_add(struct ieee80211_hw *hw, struct napi_struct *napi, +			struct net_device *napi_dev, +			int (*poll)(struct napi_struct *, int), +			int weight);  /**   * ieee80211_rx - receive frame @@ -3306,6 +3462,47 @@ void ieee80211_tx_status_irqsafe(struct ieee80211_hw *hw,   */  void ieee80211_report_low_ack(struct ieee80211_sta *sta, u32 num_packets); +#define IEEE80211_MAX_CSA_COUNTERS_NUM 2 + +/** + * struct ieee80211_mutable_offsets - mutable beacon offsets + * @tim_offset: position of TIM element + * @tim_length: size of TIM element + * @csa_counter_offs: array of IEEE80211_MAX_CSA_COUNTERS_NUM offsets + *	to CSA counters.  This array can contain zero values which + *	should be ignored. + */ +struct ieee80211_mutable_offsets { +	u16 tim_offset; +	u16 tim_length; + +	u16 csa_counter_offs[IEEE80211_MAX_CSA_COUNTERS_NUM]; +}; + +/** + * ieee80211_beacon_get_template - beacon template generation function + * @hw: pointer obtained from ieee80211_alloc_hw(). + * @vif: &struct ieee80211_vif pointer from the add_interface callback. + * @offs: &struct ieee80211_mutable_offsets pointer to struct that will + *	receive the offsets that may be updated by the driver. + * + * If the driver implements beaconing modes, it must use this function to + * obtain the beacon template. + * + * This function should be used if the beacon frames are generated by the + * device, and then the driver must use the returned beacon as the template + * The driver or the device are responsible to update the DTIM and, when + * applicable, the CSA count. + * + * The driver is responsible for freeing the returned skb. + * + * Return: The beacon template. %NULL on error. + */ +struct sk_buff * +ieee80211_beacon_get_template(struct ieee80211_hw *hw, +			      struct ieee80211_vif *vif, +			      struct ieee80211_mutable_offsets *offs); +  /**   * ieee80211_beacon_get_tim - beacon generation function   * @hw: pointer obtained from ieee80211_alloc_hw(). @@ -3317,16 +3514,12 @@ void ieee80211_report_low_ack(struct ieee80211_sta *sta, u32 num_packets);   *	Set to 0 if invalid (in non-AP modes).   *   * If the driver implements beaconing modes, it must use this function to - * obtain the beacon frame/template. + * obtain the beacon frame.   *   * If the beacon frames are generated by the host system (i.e., not in   * hardware/firmware), the driver uses this function to get each beacon - * frame from mac80211 -- it is responsible for calling this function - * before the beacon is needed (e.g. based on hardware interrupt). - * - * If the beacon frames are generated by the device, then the driver - * must use the returned beacon as the template and change the TIM IE - * according to the current DTIM parameters/TIM bitmap. + * frame from mac80211 -- it is responsible for calling this function exactly + * once before the beacon is needed (e.g. based on hardware interrupt).   *   * The driver is responsible for freeing the returned skb.   * @@ -3352,17 +3545,31 @@ static inline struct sk_buff *ieee80211_beacon_get(struct ieee80211_hw *hw,  }  /** + * ieee80211_csa_update_counter - request mac80211 to decrement the csa counter + * @vif: &struct ieee80211_vif pointer from the add_interface callback. + * + * The csa counter should be updated after each beacon transmission. + * This function is called implicitly when + * ieee80211_beacon_get/ieee80211_beacon_get_tim are called, however if the + * beacon frames are generated by the device, the driver should call this + * function after each beacon transmission to sync mac80211's csa counters. + * + * Return: new csa counter value + */ +u8 ieee80211_csa_update_counter(struct ieee80211_vif *vif); + +/**   * ieee80211_csa_finish - notify mac80211 about channel switch   * @vif: &struct ieee80211_vif pointer from the add_interface callback.   *   * After a channel switch announcement was scheduled and the counter in this - * announcement hit zero, this function must be called by the driver to + * announcement hits 1, this function must be called by the driver to   * notify mac80211 that the channel can be changed.   */  void ieee80211_csa_finish(struct ieee80211_vif *vif);  /** - * ieee80211_csa_is_complete - find out if counters reached zero + * ieee80211_csa_is_complete - find out if counters reached 1   * @vif: &struct ieee80211_vif pointer from the add_interface callback.   *   * This function returns whether the channel switch counters reached zero. @@ -3920,6 +4127,25 @@ void ieee80211_iterate_active_interfaces_atomic(struct ieee80211_hw *hw,  						void *data);  /** + * ieee80211_iterate_active_interfaces_rtnl - iterate active interfaces + * + * This function iterates over the interfaces associated with a given + * hardware that are currently active and calls the callback for them. + * This version can only be used while holding the RTNL. + * + * @hw: the hardware struct of which the interfaces should be iterated over + * @iter_flags: iteration flags, see &enum ieee80211_interface_iteration_flags + * @iterator: the iterator function to call, cannot sleep + * @data: first argument of the iterator function + */ +void ieee80211_iterate_active_interfaces_rtnl(struct ieee80211_hw *hw, +					      u32 iter_flags, +					      void (*iterator)(void *data, +						u8 *mac, +						struct ieee80211_vif *vif), +					      void *data); + +/**   * ieee80211_queue_work - add work onto the mac80211 workqueue   *   * Drivers and mac80211 use this to add work onto the mac80211 workqueue. @@ -4336,7 +4562,6 @@ struct ieee80211_tx_rate_control {  };  struct rate_control_ops { -	struct module *module;  	const char *name;  	void *(*alloc)(struct ieee80211_hw *hw, struct dentry *debugfsdir);  	void (*free)(void *priv); @@ -4361,6 +4586,8 @@ struct rate_control_ops {  	void (*add_sta_debugfs)(void *priv, void *priv_sta,  				struct dentry *dir);  	void (*remove_sta_debugfs)(void *priv, void *priv_sta); + +	u32 (*get_expected_throughput)(void *priv_sta);  };  static inline int rate_supported(struct ieee80211_sta *sta, @@ -4438,8 +4665,8 @@ int rate_control_set_rates(struct ieee80211_hw *hw,  			   struct ieee80211_sta *pubsta,  			   struct ieee80211_sta_rates *rates); -int ieee80211_rate_control_register(struct rate_control_ops *ops); -void ieee80211_rate_control_unregister(struct rate_control_ops *ops); +int ieee80211_rate_control_register(const struct rate_control_ops *ops); +void ieee80211_rate_control_unregister(const struct rate_control_ops *ops);  static inline bool  conf_is_ht20(struct ieee80211_conf *conf) @@ -4470,7 +4697,9 @@ conf_is_ht40(struct ieee80211_conf *conf)  static inline bool  conf_is_ht(struct ieee80211_conf *conf)  { -	return conf->chandef.width != NL80211_CHAN_WIDTH_20_NOHT; +	return (conf->chandef.width != NL80211_CHAN_WIDTH_5) && +		(conf->chandef.width != NL80211_CHAN_WIDTH_10) && +		(conf->chandef.width != NL80211_CHAN_WIDTH_20_NOHT);  }  static inline enum nl80211_iftype @@ -4525,4 +4754,65 @@ void ieee80211_report_wowlan_wakeup(struct ieee80211_vif *vif,  				    struct cfg80211_wowlan_wakeup *wakeup,  				    gfp_t gfp); +/** + * ieee80211_tx_prepare_skb - prepare an 802.11 skb for transmission + * @hw: pointer as obtained from ieee80211_alloc_hw() + * @vif: virtual interface + * @skb: frame to be sent from within the driver + * @band: the band to transmit on + * @sta: optional pointer to get the station to send the frame to + * + * Note: must be called under RCU lock + */ +bool ieee80211_tx_prepare_skb(struct ieee80211_hw *hw, +			      struct ieee80211_vif *vif, struct sk_buff *skb, +			      int band, struct ieee80211_sta **sta); + +/** + * struct ieee80211_noa_data - holds temporary data for tracking P2P NoA state + * + * @next_tsf: TSF timestamp of the next absent state change + * @has_next_tsf: next absent state change event pending + * + * @absent: descriptor bitmask, set if GO is currently absent + * + * private: + * + * @count: count fields from the NoA descriptors + * @desc: adjusted data from the NoA + */ +struct ieee80211_noa_data { +	u32 next_tsf; +	bool has_next_tsf; + +	u8 absent; + +	u8 count[IEEE80211_P2P_NOA_DESC_MAX]; +	struct { +		u32 start; +		u32 duration; +		u32 interval; +	} desc[IEEE80211_P2P_NOA_DESC_MAX]; +}; + +/** + * ieee80211_parse_p2p_noa - initialize NoA tracking data from P2P IE + * + * @attr: P2P NoA IE + * @data: NoA tracking data + * @tsf: current TSF timestamp + * + * Return: number of successfully parsed descriptors + */ +int ieee80211_parse_p2p_noa(const struct ieee80211_p2p_noa_attr *attr, +			    struct ieee80211_noa_data *data, u32 tsf); + +/** + * ieee80211_update_p2p_noa - get next pending P2P GO absent state change + * + * @data: NoA tracking data + * @tsf: current TSF timestamp + */ +void ieee80211_update_p2p_noa(struct ieee80211_noa_data *data, u32 tsf); +  #endif /* MAC80211_H */  | 
