[MAC80211]: remove HW_KEY_IDX_INVALID
This patch makes the mac80211/driver interface rely only on the IEEE80211_TXCTL_DO_NOT_ENCRYPT flag to signal to the driver whether a frame should be encrypted or not, since mac80211 internally no longer relies on HW_KEY_IDX_INVALID either this removes it, changes the key index to be a u8 in all places and makes the full range of the value available to drivers. Signed-off-by: Johannes Berg <johannes@sipsolutions.net> Acked-by: Michael Wu <flamingice@sourmilk.net> Signed-off-by: John W. Linville <linville@tuxdriver.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
7ac1bd6aec
commit
6a7664d451
@@ -164,7 +164,6 @@ struct ieee80211_low_level_stats {
|
|||||||
/* Transmit control fields. This data structure is passed to low-level driver
|
/* Transmit control fields. This data structure is passed to low-level driver
|
||||||
* with each TX frame. The low-level driver is responsible for configuring
|
* with each TX frame. The low-level driver is responsible for configuring
|
||||||
* the hardware to use given values (depending on what is supported). */
|
* the hardware to use given values (depending on what is supported). */
|
||||||
#define HW_KEY_IDX_INVALID -1
|
|
||||||
|
|
||||||
struct ieee80211_tx_control {
|
struct ieee80211_tx_control {
|
||||||
int tx_rate; /* Transmit rate, given as the hw specific value for the
|
int tx_rate; /* Transmit rate, given as the hw specific value for the
|
||||||
@@ -197,13 +196,13 @@ struct ieee80211_tx_control {
|
|||||||
* long retry value */
|
* long retry value */
|
||||||
u32 flags; /* tx control flags defined
|
u32 flags; /* tx control flags defined
|
||||||
* above */
|
* above */
|
||||||
|
u8 key_idx; /* keyidx from hw->set_key(), undefined if
|
||||||
|
* IEEE80211_TXCTL_DO_NOT_ENCRYPT is set */
|
||||||
u8 retry_limit; /* 1 = only first attempt, 2 = one retry, ..
|
u8 retry_limit; /* 1 = only first attempt, 2 = one retry, ..
|
||||||
* This could be used when set_retry_limit
|
* This could be used when set_retry_limit
|
||||||
* is not implemented by the driver */
|
* is not implemented by the driver */
|
||||||
u8 power_level; /* per-packet transmit power level, in dBm */
|
u8 power_level; /* per-packet transmit power level, in dBm */
|
||||||
u8 antenna_sel_tx; /* 0 = default/diversity, 1 = Ant0, 2 = Ant1 */
|
u8 antenna_sel_tx; /* 0 = default/diversity, 1 = Ant0, 2 = Ant1 */
|
||||||
s8 key_idx; /* HW_KEY_IDX_INVALID = do not encrypt,
|
|
||||||
* other values: keyidx from hw->set_key() */
|
|
||||||
u8 icv_len; /* length of the ICV/MIC field in octets */
|
u8 icv_len; /* length of the ICV/MIC field in octets */
|
||||||
u8 iv_len; /* length of the IV field in octets */
|
u8 iv_len; /* length of the IV field in octets */
|
||||||
u8 tkip_key[16]; /* generated phase2/phase1 key for hw TKIP */
|
u8 tkip_key[16]; /* generated phase2/phase1 key for hw TKIP */
|
||||||
@@ -467,8 +466,7 @@ enum ieee80211_key_flags {
|
|||||||
*
|
*
|
||||||
* @hw_key_idx: To be set by the driver, this is the key index the driver
|
* @hw_key_idx: To be set by the driver, this is the key index the driver
|
||||||
* wants to be given when a frame is transmitted and needs to be
|
* wants to be given when a frame is transmitted and needs to be
|
||||||
* encrypted in hardware. It defaults to %HW_KEY_IDX_INVALID which
|
* encrypted in hardware.
|
||||||
* the driver may not use.
|
|
||||||
* @alg: The key algorithm.
|
* @alg: The key algorithm.
|
||||||
* @flags: key flags, see &enum ieee80211_key_flags.
|
* @flags: key flags, see &enum ieee80211_key_flags.
|
||||||
* @keyidx: the key index (0-3)
|
* @keyidx: the key index (0-3)
|
||||||
@@ -476,8 +474,8 @@ enum ieee80211_key_flags {
|
|||||||
* @key: key material
|
* @key: key material
|
||||||
*/
|
*/
|
||||||
struct ieee80211_key_conf {
|
struct ieee80211_key_conf {
|
||||||
int hw_key_idx;
|
|
||||||
ieee80211_key_alg alg;
|
ieee80211_key_alg alg;
|
||||||
|
u8 hw_key_idx;
|
||||||
u8 flags;
|
u8 flags;
|
||||||
s8 keyidx;
|
s8 keyidx;
|
||||||
u8 keylen;
|
u8 keylen;
|
||||||
@@ -686,9 +684,10 @@ struct ieee80211_ops {
|
|||||||
* selected by the low-level driver.
|
* selected by the low-level driver.
|
||||||
*
|
*
|
||||||
* Return 0 if the key is now in use, -EOPNOTSUPP or -ENOSPC if it
|
* Return 0 if the key is now in use, -EOPNOTSUPP or -ENOSPC if it
|
||||||
* couldn't be added; if you return 0 then hw_key_idx must be
|
* couldn't be added; if you return 0 then hw_key_idx must be assigned
|
||||||
* assigned to something other than HW_KEY_IDX_INVALID. When the cmd
|
* to the hardware key index, you are free to use the full u8 range.
|
||||||
* is DISABLE_KEY then it must succeed.
|
*
|
||||||
|
* When the cmd is DISABLE_KEY then it must succeed.
|
||||||
*
|
*
|
||||||
* Note that it is permissible to not decrypt a frame even if a key
|
* Note that it is permissible to not decrypt a frame even if a key
|
||||||
* for it has been uploaded to hardware, the stack will not make any
|
* for it has been uploaded to hardware, the stack will not make any
|
||||||
|
@@ -73,8 +73,6 @@ static void ieee80211_key_enable_hw_accel(struct ieee80211_key *key)
|
|||||||
key->sdata->dev->dev_addr, addr,
|
key->sdata->dev->dev_addr, addr,
|
||||||
&key->conf);
|
&key->conf);
|
||||||
|
|
||||||
WARN_ON(!ret && (key->conf.hw_key_idx == HW_KEY_IDX_INVALID));
|
|
||||||
|
|
||||||
if (!ret)
|
if (!ret)
|
||||||
key->flags |= KEY_FLAG_UPLOADED_TO_HARDWARE;
|
key->flags |= KEY_FLAG_UPLOADED_TO_HARDWARE;
|
||||||
|
|
||||||
@@ -109,7 +107,6 @@ static void ieee80211_key_disable_hw_accel(struct ieee80211_key *key)
|
|||||||
key->conf.keyidx, MAC_ARG(addr), ret);
|
key->conf.keyidx, MAC_ARG(addr), ret);
|
||||||
|
|
||||||
key->flags &= ~KEY_FLAG_UPLOADED_TO_HARDWARE;
|
key->flags &= ~KEY_FLAG_UPLOADED_TO_HARDWARE;
|
||||||
key->conf.hw_key_idx = HW_KEY_IDX_INVALID;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct ieee80211_key *ieee80211_key_alloc(struct ieee80211_sub_if_data *sdata,
|
struct ieee80211_key *ieee80211_key_alloc(struct ieee80211_sub_if_data *sdata,
|
||||||
@@ -132,7 +129,6 @@ struct ieee80211_key *ieee80211_key_alloc(struct ieee80211_sub_if_data *sdata,
|
|||||||
* Default to software encryption; we'll later upload the
|
* Default to software encryption; we'll later upload the
|
||||||
* key to the hardware if possible.
|
* key to the hardware if possible.
|
||||||
*/
|
*/
|
||||||
key->conf.hw_key_idx = HW_KEY_IDX_INVALID;
|
|
||||||
key->conf.flags = 0;
|
key->conf.flags = 0;
|
||||||
key->flags = 0;
|
key->flags = 0;
|
||||||
|
|
||||||
|
@@ -430,8 +430,6 @@ ieee80211_tx_h_select_key(struct ieee80211_txrx_data *tx)
|
|||||||
{
|
{
|
||||||
struct ieee80211_key *key;
|
struct ieee80211_key *key;
|
||||||
|
|
||||||
tx->u.tx.control->key_idx = HW_KEY_IDX_INVALID;
|
|
||||||
|
|
||||||
if (unlikely(tx->u.tx.control->flags & IEEE80211_TXCTL_DO_NOT_ENCRYPT))
|
if (unlikely(tx->u.tx.control->flags & IEEE80211_TXCTL_DO_NOT_ENCRYPT))
|
||||||
tx->key = NULL;
|
tx->key = NULL;
|
||||||
else if (tx->sta && (key = rcu_dereference(tx->sta->key)))
|
else if (tx->sta && (key = rcu_dereference(tx->sta->key)))
|
||||||
@@ -442,8 +440,10 @@ ieee80211_tx_h_select_key(struct ieee80211_txrx_data *tx)
|
|||||||
!(tx->sdata->eapol && ieee80211_is_eapol(tx->skb))) {
|
!(tx->sdata->eapol && ieee80211_is_eapol(tx->skb))) {
|
||||||
I802_DEBUG_INC(tx->local->tx_handlers_drop_unencrypted);
|
I802_DEBUG_INC(tx->local->tx_handlers_drop_unencrypted);
|
||||||
return TXRX_DROP;
|
return TXRX_DROP;
|
||||||
} else
|
} else {
|
||||||
tx->key = NULL;
|
tx->key = NULL;
|
||||||
|
tx->u.tx.control->flags |= IEEE80211_TXCTL_DO_NOT_ENCRYPT;
|
||||||
|
}
|
||||||
|
|
||||||
if (tx->key) {
|
if (tx->key) {
|
||||||
tx->key->tx_rx_count++;
|
tx->key->tx_rx_count++;
|
||||||
@@ -724,6 +724,15 @@ ieee80211_tx_h_misc(struct ieee80211_txrx_data *tx)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Tell hardware to not encrypt when we had sw crypto.
|
||||||
|
* Because we use the same flag to internally indicate that
|
||||||
|
* no (software) encryption should be done, we have to set it
|
||||||
|
* after all crypto handlers.
|
||||||
|
*/
|
||||||
|
if (tx->key && !(tx->key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE))
|
||||||
|
tx->u.tx.control->flags |= IEEE80211_TXCTL_DO_NOT_ENCRYPT;
|
||||||
|
|
||||||
return TXRX_CONTINUE;
|
return TXRX_CONTINUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -833,7 +842,6 @@ __ieee80211_parse_tx_radiotap(
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
control->retry_limit = 1; /* no retry */
|
control->retry_limit = 1; /* no retry */
|
||||||
control->key_idx = HW_KEY_IDX_INVALID;
|
|
||||||
control->flags &= ~(IEEE80211_TXCTL_USE_RTS_CTS |
|
control->flags &= ~(IEEE80211_TXCTL_USE_RTS_CTS |
|
||||||
IEEE80211_TXCTL_USE_CTS_PROTECT);
|
IEEE80211_TXCTL_USE_CTS_PROTECT);
|
||||||
control->flags |= IEEE80211_TXCTL_DO_NOT_ENCRYPT |
|
control->flags |= IEEE80211_TXCTL_DO_NOT_ENCRYPT |
|
||||||
|
Reference in New Issue
Block a user