|
@@ -280,6 +280,7 @@ struct ieee80211_low_level_stats {
|
|
|
* the hardware to use given values (depending on what is supported). */
|
|
|
|
|
|
struct ieee80211_tx_control {
|
|
|
+ struct ieee80211_vif *vif;
|
|
|
int tx_rate; /* Transmit rate, given as the hw specific value for the
|
|
|
* rate (from struct ieee80211_rate) */
|
|
|
int rts_cts_rate; /* Transmit rate for RTS/CTS frame, given as the hw
|
|
@@ -332,7 +333,6 @@ struct ieee80211_tx_control {
|
|
|
* packet dropping when probing higher rates, if hw
|
|
|
* supports multiple retry rates. -1 = not used */
|
|
|
int type; /* internal */
|
|
|
- int ifindex; /* internal */
|
|
|
};
|
|
|
|
|
|
|
|
@@ -529,14 +529,26 @@ enum ieee80211_if_types {
|
|
|
IEEE80211_IF_TYPE_VLAN,
|
|
|
};
|
|
|
|
|
|
+/**
|
|
|
+ * struct ieee80211_vif - per-interface data
|
|
|
+ *
|
|
|
+ * Data in this structure is continually present for driver
|
|
|
+ * use during the life of a virtual interface.
|
|
|
+ *
|
|
|
+ * @drv_priv: data area for driver use, will always be aligned to
|
|
|
+ * sizeof(void *).
|
|
|
+ */
|
|
|
+struct ieee80211_vif {
|
|
|
+ /* must be last */
|
|
|
+ u8 drv_priv[0] __attribute__((__aligned__(sizeof(void *))));
|
|
|
+};
|
|
|
+
|
|
|
/**
|
|
|
* struct ieee80211_if_init_conf - initial configuration of an interface
|
|
|
*
|
|
|
- * @if_id: internal interface ID. This number has no particular meaning to
|
|
|
- * drivers and the only allowed usage is to pass it to
|
|
|
- * ieee80211_beacon_get() and ieee80211_get_buffered_bc() functions.
|
|
|
- * This field is not valid for monitor interfaces
|
|
|
- * (interfaces of %IEEE80211_IF_TYPE_MNTR type).
|
|
|
+ * @vif: pointer to a driver-use per-interface structure. The pointer
|
|
|
+ * itself is also used for various functions including
|
|
|
+ * ieee80211_beacon_get() and ieee80211_get_buffered_bc().
|
|
|
* @type: one of &enum ieee80211_if_types constants. Determines the type of
|
|
|
* added/removed interface.
|
|
|
* @mac_addr: pointer to MAC address of the interface. This pointer is valid
|
|
@@ -553,8 +565,8 @@ enum ieee80211_if_types {
|
|
|
* in pure monitor mode.
|
|
|
*/
|
|
|
struct ieee80211_if_init_conf {
|
|
|
- int if_id;
|
|
|
enum ieee80211_if_types type;
|
|
|
+ struct ieee80211_vif *vif;
|
|
|
void *mac_addr;
|
|
|
};
|
|
|
|
|
@@ -757,6 +769,9 @@ enum ieee80211_hw_flags {
|
|
|
* @rate_control_algorithm: rate control algorithm for this hardware.
|
|
|
* If unset (NULL), the default algorithm will be used. Must be
|
|
|
* set before calling ieee80211_register_hw().
|
|
|
+ *
|
|
|
+ * @vif_data_size: size (in bytes) of the drv_priv data area
|
|
|
+ * within &struct ieee80211_vif.
|
|
|
*/
|
|
|
struct ieee80211_hw {
|
|
|
struct ieee80211_conf conf;
|
|
@@ -767,6 +782,7 @@ struct ieee80211_hw {
|
|
|
u32 flags;
|
|
|
unsigned int extra_tx_headroom;
|
|
|
int channel_change_time;
|
|
|
+ int vif_data_size;
|
|
|
u8 queues;
|
|
|
s8 max_rssi;
|
|
|
s8 max_signal;
|
|
@@ -1076,7 +1092,8 @@ struct ieee80211_ops {
|
|
|
struct ieee80211_if_init_conf *conf);
|
|
|
int (*config)(struct ieee80211_hw *hw, struct ieee80211_conf *conf);
|
|
|
int (*config_interface)(struct ieee80211_hw *hw,
|
|
|
- int if_id, struct ieee80211_if_conf *conf);
|
|
|
+ struct ieee80211_vif *vif,
|
|
|
+ struct ieee80211_if_conf *conf);
|
|
|
void (*configure_filter)(struct ieee80211_hw *hw,
|
|
|
unsigned int changed_flags,
|
|
|
unsigned int *total_flags,
|
|
@@ -1094,7 +1111,7 @@ struct ieee80211_ops {
|
|
|
int (*set_frag_threshold)(struct ieee80211_hw *hw, u32 value);
|
|
|
int (*set_retry_limit)(struct ieee80211_hw *hw,
|
|
|
u32 short_retry, u32 long_retr);
|
|
|
- void (*sta_notify)(struct ieee80211_hw *hw, int if_id,
|
|
|
+ void (*sta_notify)(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
|
|
enum sta_notify_cmd, const u8 *addr);
|
|
|
void (*erp_ie_changed)(struct ieee80211_hw *hw, u8 changes,
|
|
|
int cts_protection, int preamble);
|
|
@@ -1309,7 +1326,7 @@ void ieee80211_tx_status_irqsafe(struct ieee80211_hw *hw,
|
|
|
/**
|
|
|
* ieee80211_beacon_get - beacon generation function
|
|
|
* @hw: pointer obtained from ieee80211_alloc_hw().
|
|
|
- * @if_id: interface ID from &struct ieee80211_if_init_conf.
|
|
|
+ * @vif: &struct ieee80211_vif pointer from &struct ieee80211_if_init_conf.
|
|
|
* @control: will be filled with information needed to send this beacon.
|
|
|
*
|
|
|
* If the beacon frames are generated by the host system (i.e., not in
|
|
@@ -1320,13 +1337,13 @@ void ieee80211_tx_status_irqsafe(struct ieee80211_hw *hw,
|
|
|
* is responsible of freeing it.
|
|
|
*/
|
|
|
struct sk_buff *ieee80211_beacon_get(struct ieee80211_hw *hw,
|
|
|
- int if_id,
|
|
|
+ struct ieee80211_vif *vif,
|
|
|
struct ieee80211_tx_control *control);
|
|
|
|
|
|
/**
|
|
|
* ieee80211_rts_get - RTS frame generation function
|
|
|
* @hw: pointer obtained from ieee80211_alloc_hw().
|
|
|
- * @if_id: interface ID from &struct ieee80211_if_init_conf.
|
|
|
+ * @vif: &struct ieee80211_vif pointer from &struct ieee80211_if_init_conf.
|
|
|
* @frame: pointer to the frame that is going to be protected by the RTS.
|
|
|
* @frame_len: the frame length (in octets).
|
|
|
* @frame_txctl: &struct ieee80211_tx_control of the frame.
|
|
@@ -1337,7 +1354,7 @@ struct sk_buff *ieee80211_beacon_get(struct ieee80211_hw *hw,
|
|
|
* the next RTS frame from the 802.11 code. The low-level is responsible
|
|
|
* for calling this function before and RTS frame is needed.
|
|
|
*/
|
|
|
-void ieee80211_rts_get(struct ieee80211_hw *hw, int if_id,
|
|
|
+void ieee80211_rts_get(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
|
|
const void *frame, size_t frame_len,
|
|
|
const struct ieee80211_tx_control *frame_txctl,
|
|
|
struct ieee80211_rts *rts);
|
|
@@ -1345,7 +1362,7 @@ void ieee80211_rts_get(struct ieee80211_hw *hw, int if_id,
|
|
|
/**
|
|
|
* ieee80211_rts_duration - Get the duration field for an RTS frame
|
|
|
* @hw: pointer obtained from ieee80211_alloc_hw().
|
|
|
- * @if_id: interface ID from &struct ieee80211_if_init_conf.
|
|
|
+ * @vif: &struct ieee80211_vif pointer from &struct ieee80211_if_init_conf.
|
|
|
* @frame_len: the length of the frame that is going to be protected by the RTS.
|
|
|
* @frame_txctl: &struct ieee80211_tx_control of the frame.
|
|
|
*
|
|
@@ -1353,14 +1370,14 @@ void ieee80211_rts_get(struct ieee80211_hw *hw, int if_id,
|
|
|
* the duration field, the low-level driver uses this function to receive
|
|
|
* the duration field value in little-endian byteorder.
|
|
|
*/
|
|
|
-__le16 ieee80211_rts_duration(struct ieee80211_hw *hw, int if_id,
|
|
|
- size_t frame_len,
|
|
|
+__le16 ieee80211_rts_duration(struct ieee80211_hw *hw,
|
|
|
+ struct ieee80211_vif *vif, size_t frame_len,
|
|
|
const struct ieee80211_tx_control *frame_txctl);
|
|
|
|
|
|
/**
|
|
|
* ieee80211_ctstoself_get - CTS-to-self frame generation function
|
|
|
* @hw: pointer obtained from ieee80211_alloc_hw().
|
|
|
- * @if_id: interface ID from &struct ieee80211_if_init_conf.
|
|
|
+ * @vif: &struct ieee80211_vif pointer from &struct ieee80211_if_init_conf.
|
|
|
* @frame: pointer to the frame that is going to be protected by the CTS-to-self.
|
|
|
* @frame_len: the frame length (in octets).
|
|
|
* @frame_txctl: &struct ieee80211_tx_control of the frame.
|
|
@@ -1371,7 +1388,8 @@ __le16 ieee80211_rts_duration(struct ieee80211_hw *hw, int if_id,
|
|
|
* the next CTS-to-self frame from the 802.11 code. The low-level is responsible
|
|
|
* for calling this function before and CTS-to-self frame is needed.
|
|
|
*/
|
|
|
-void ieee80211_ctstoself_get(struct ieee80211_hw *hw, int if_id,
|
|
|
+void ieee80211_ctstoself_get(struct ieee80211_hw *hw,
|
|
|
+ struct ieee80211_vif *vif,
|
|
|
const void *frame, size_t frame_len,
|
|
|
const struct ieee80211_tx_control *frame_txctl,
|
|
|
struct ieee80211_cts *cts);
|
|
@@ -1379,7 +1397,7 @@ void ieee80211_ctstoself_get(struct ieee80211_hw *hw, int if_id,
|
|
|
/**
|
|
|
* ieee80211_ctstoself_duration - Get the duration field for a CTS-to-self frame
|
|
|
* @hw: pointer obtained from ieee80211_alloc_hw().
|
|
|
- * @if_id: interface ID from &struct ieee80211_if_init_conf.
|
|
|
+ * @vif: &struct ieee80211_vif pointer from &struct ieee80211_if_init_conf.
|
|
|
* @frame_len: the length of the frame that is going to be protected by the CTS-to-self.
|
|
|
* @frame_txctl: &struct ieee80211_tx_control of the frame.
|
|
|
*
|
|
@@ -1387,28 +1405,30 @@ void ieee80211_ctstoself_get(struct ieee80211_hw *hw, int if_id,
|
|
|
* the duration field, the low-level driver uses this function to receive
|
|
|
* the duration field value in little-endian byteorder.
|
|
|
*/
|
|
|
-__le16 ieee80211_ctstoself_duration(struct ieee80211_hw *hw, int if_id,
|
|
|
+__le16 ieee80211_ctstoself_duration(struct ieee80211_hw *hw,
|
|
|
+ struct ieee80211_vif *vif,
|
|
|
size_t frame_len,
|
|
|
const struct ieee80211_tx_control *frame_txctl);
|
|
|
|
|
|
/**
|
|
|
* ieee80211_generic_frame_duration - Calculate the duration field for a frame
|
|
|
* @hw: pointer obtained from ieee80211_alloc_hw().
|
|
|
- * @if_id: interface ID from &struct ieee80211_if_init_conf.
|
|
|
+ * @vif: &struct ieee80211_vif pointer from &struct ieee80211_if_init_conf.
|
|
|
* @frame_len: the length of the frame.
|
|
|
* @rate: the rate (in 100kbps) at which the frame is going to be transmitted.
|
|
|
*
|
|
|
* Calculate the duration field of some generic frame, given its
|
|
|
* length and transmission rate (in 100kbps).
|
|
|
*/
|
|
|
-__le16 ieee80211_generic_frame_duration(struct ieee80211_hw *hw, int if_id,
|
|
|
+__le16 ieee80211_generic_frame_duration(struct ieee80211_hw *hw,
|
|
|
+ struct ieee80211_vif *vif,
|
|
|
size_t frame_len,
|
|
|
int rate);
|
|
|
|
|
|
/**
|
|
|
* ieee80211_get_buffered_bc - accessing buffered broadcast and multicast frames
|
|
|
* @hw: pointer as obtained from ieee80211_alloc_hw().
|
|
|
- * @if_id: interface ID from &struct ieee80211_if_init_conf.
|
|
|
+ * @vif: &struct ieee80211_vif pointer from &struct ieee80211_if_init_conf.
|
|
|
* @control: will be filled with information needed to send returned frame.
|
|
|
*
|
|
|
* Function for accessing buffered broadcast and multicast frames. If
|
|
@@ -1427,7 +1447,7 @@ __le16 ieee80211_generic_frame_duration(struct ieee80211_hw *hw, int if_id,
|
|
|
* use common code for all beacons.
|
|
|
*/
|
|
|
struct sk_buff *
|
|
|
-ieee80211_get_buffered_bc(struct ieee80211_hw *hw, int if_id,
|
|
|
+ieee80211_get_buffered_bc(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
|
|
struct ieee80211_tx_control *control);
|
|
|
|
|
|
/**
|
|
@@ -1517,7 +1537,7 @@ void ieee80211_scan_completed(struct ieee80211_hw *hw);
|
|
|
*/
|
|
|
void ieee80211_iterate_active_interfaces(struct ieee80211_hw *hw,
|
|
|
void (*iterator)(void *data, u8 *mac,
|
|
|
- int if_id),
|
|
|
+ struct ieee80211_vif *vif),
|
|
|
void *data);
|
|
|
|
|
|
#endif /* MAC80211_H */
|