mirror of
https://github.com/linux-msm/laptops-kernel.git
synced 2026-08-13 14:19:53 -07:00
Merge tag 'mac80211-next-for-davem-2015-02-03' of git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211-next
Last round of updates for net-next: * revert a patch that caused a regression with mesh userspace (Bob) * fix a number of suspend/resume related races (from Emmanuel, Luca and myself - we'll look at backporting later) * add software implementations for new ciphers (Jouni) * add a new ACPI ID for Broadcom's rfkill (Mika) * allow using netns FD for wireless (Vadim) * some other cleanups (various) Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -434,7 +434,6 @@
|
||||
<section id="ps-client">
|
||||
<title>support for powersaving clients</title>
|
||||
!Pinclude/net/mac80211.h AP support for powersaving clients
|
||||
</section>
|
||||
!Finclude/net/mac80211.h ieee80211_get_buffered_bc
|
||||
!Finclude/net/mac80211.h ieee80211_beacon_get
|
||||
!Finclude/net/mac80211.h ieee80211_sta_eosp
|
||||
@@ -443,6 +442,7 @@
|
||||
!Finclude/net/mac80211.h ieee80211_sta_ps_transition_ni
|
||||
!Finclude/net/mac80211.h ieee80211_sta_set_buffered
|
||||
!Finclude/net/mac80211.h ieee80211_sta_block_awake
|
||||
</section>
|
||||
</chapter>
|
||||
|
||||
<chapter id="multi-iface">
|
||||
@@ -487,8 +487,8 @@
|
||||
<title>RX A-MPDU aggregation</title>
|
||||
!Pnet/mac80211/agg-rx.c RX A-MPDU aggregation
|
||||
!Cnet/mac80211/agg-rx.c
|
||||
</sect1>
|
||||
!Finclude/net/mac80211.h ieee80211_ampdu_mlme_action
|
||||
</sect1>
|
||||
</chapter>
|
||||
|
||||
<chapter id="smps">
|
||||
|
||||
@@ -76,6 +76,9 @@ static int ath10k_send_key(struct ath10k_vif *arvif,
|
||||
if (memcmp(macaddr, arvif->vif->addr, ETH_ALEN))
|
||||
arg.key_flags = WMI_KEY_PAIRWISE;
|
||||
break;
|
||||
case WLAN_CIPHER_SUITE_AES_CMAC:
|
||||
/* this one needs to be done in software */
|
||||
return 1;
|
||||
default:
|
||||
ath10k_warn(ar, "cipher %d is not supported\n", key->cipher);
|
||||
return -EOPNOTSUPP;
|
||||
@@ -5035,6 +5038,13 @@ struct ath10k_vif *ath10k_get_arvif(struct ath10k *ar, u32 vdev_id)
|
||||
|
||||
int ath10k_mac_register(struct ath10k *ar)
|
||||
{
|
||||
static const u32 cipher_suites[] = {
|
||||
WLAN_CIPHER_SUITE_WEP40,
|
||||
WLAN_CIPHER_SUITE_WEP104,
|
||||
WLAN_CIPHER_SUITE_TKIP,
|
||||
WLAN_CIPHER_SUITE_CCMP,
|
||||
WLAN_CIPHER_SUITE_AES_CMAC,
|
||||
};
|
||||
struct ieee80211_supported_band *band;
|
||||
struct ieee80211_sta_vht_cap vht_cap;
|
||||
struct ieee80211_sta_ht_cap ht_cap;
|
||||
@@ -5108,7 +5118,8 @@ int ath10k_mac_register(struct ath10k *ar)
|
||||
IEEE80211_HW_REPORTS_TX_ACK_STATUS |
|
||||
IEEE80211_HW_HAS_RATE_CONTROL |
|
||||
IEEE80211_HW_AP_LINK_PS |
|
||||
IEEE80211_HW_SPECTRUM_MGMT;
|
||||
IEEE80211_HW_SPECTRUM_MGMT |
|
||||
IEEE80211_HW_SW_CRYPTO_CONTROL;
|
||||
|
||||
ar->hw->wiphy->features |= NL80211_FEATURE_STATIC_SMPS;
|
||||
|
||||
@@ -5182,6 +5193,9 @@ int ath10k_mac_register(struct ath10k *ar)
|
||||
goto err_free;
|
||||
}
|
||||
|
||||
ar->hw->wiphy->cipher_suites = cipher_suites;
|
||||
ar->hw->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
|
||||
|
||||
ret = ieee80211_register_hw(ar->hw);
|
||||
if (ret) {
|
||||
ath10k_err(ar, "failed to register ieee80211: %d\n", ret);
|
||||
|
||||
@@ -1017,6 +1017,15 @@ struct ieee80211_mmie {
|
||||
u8 mic[8];
|
||||
} __packed;
|
||||
|
||||
/* Management MIC information element (IEEE 802.11w) for GMAC and CMAC-256 */
|
||||
struct ieee80211_mmie_16 {
|
||||
u8 element_id;
|
||||
u8 length;
|
||||
__le16 key_id;
|
||||
u8 sequence_number[6];
|
||||
u8 mic[16];
|
||||
} __packed;
|
||||
|
||||
struct ieee80211_vendor_ie {
|
||||
u8 element_id;
|
||||
u8 len;
|
||||
@@ -1994,9 +2003,15 @@ enum ieee80211_key_len {
|
||||
WLAN_KEY_LEN_WEP40 = 5,
|
||||
WLAN_KEY_LEN_WEP104 = 13,
|
||||
WLAN_KEY_LEN_CCMP = 16,
|
||||
WLAN_KEY_LEN_CCMP_256 = 32,
|
||||
WLAN_KEY_LEN_TKIP = 32,
|
||||
WLAN_KEY_LEN_AES_CMAC = 16,
|
||||
WLAN_KEY_LEN_SMS4 = 32,
|
||||
WLAN_KEY_LEN_GCMP = 16,
|
||||
WLAN_KEY_LEN_GCMP_256 = 32,
|
||||
WLAN_KEY_LEN_BIP_CMAC_256 = 32,
|
||||
WLAN_KEY_LEN_BIP_GMAC_128 = 16,
|
||||
WLAN_KEY_LEN_BIP_GMAC_256 = 32,
|
||||
};
|
||||
|
||||
#define IEEE80211_WEP_IV_LEN 4
|
||||
@@ -2004,9 +2019,16 @@ enum ieee80211_key_len {
|
||||
#define IEEE80211_CCMP_HDR_LEN 8
|
||||
#define IEEE80211_CCMP_MIC_LEN 8
|
||||
#define IEEE80211_CCMP_PN_LEN 6
|
||||
#define IEEE80211_CCMP_256_HDR_LEN 8
|
||||
#define IEEE80211_CCMP_256_MIC_LEN 16
|
||||
#define IEEE80211_CCMP_256_PN_LEN 6
|
||||
#define IEEE80211_TKIP_IV_LEN 8
|
||||
#define IEEE80211_TKIP_ICV_LEN 4
|
||||
#define IEEE80211_CMAC_PN_LEN 6
|
||||
#define IEEE80211_GMAC_PN_LEN 6
|
||||
#define IEEE80211_GCMP_HDR_LEN 8
|
||||
#define IEEE80211_GCMP_MIC_LEN 16
|
||||
#define IEEE80211_GCMP_PN_LEN 6
|
||||
|
||||
/* Public action codes */
|
||||
enum ieee80211_pub_actioncode {
|
||||
@@ -2230,6 +2252,11 @@ enum ieee80211_sa_query_action {
|
||||
#define WLAN_CIPHER_SUITE_WEP104 0x000FAC05
|
||||
#define WLAN_CIPHER_SUITE_AES_CMAC 0x000FAC06
|
||||
#define WLAN_CIPHER_SUITE_GCMP 0x000FAC08
|
||||
#define WLAN_CIPHER_SUITE_GCMP_256 0x000FAC09
|
||||
#define WLAN_CIPHER_SUITE_CCMP_256 0x000FAC0A
|
||||
#define WLAN_CIPHER_SUITE_BIP_GMAC_128 0x000FAC0B
|
||||
#define WLAN_CIPHER_SUITE_BIP_GMAC_256 0x000FAC0C
|
||||
#define WLAN_CIPHER_SUITE_BIP_CMAC_256 0x000FAC0D
|
||||
|
||||
#define WLAN_CIPHER_SUITE_SMS4 0x00147201
|
||||
|
||||
|
||||
@@ -1493,6 +1493,10 @@ struct cfg80211_match_set {
|
||||
* @rcu_head: RCU callback used to free the struct
|
||||
* @owner_nlportid: netlink portid of owner (if this should is a request
|
||||
* owned by a particular socket)
|
||||
* @delay: delay in seconds to use before starting the first scan
|
||||
* cycle. The driver may ignore this parameter and start
|
||||
* immediately (or at any other time), if this feature is not
|
||||
* supported.
|
||||
*/
|
||||
struct cfg80211_sched_scan_request {
|
||||
struct cfg80211_ssid *ssids;
|
||||
@@ -1506,6 +1510,7 @@ struct cfg80211_sched_scan_request {
|
||||
struct cfg80211_match_set *match_sets;
|
||||
int n_match_sets;
|
||||
s32 min_rssi_thold;
|
||||
u32 delay;
|
||||
|
||||
u8 mac_addr[ETH_ALEN] __aligned(2);
|
||||
u8 mac_addr_mask[ETH_ALEN] __aligned(2);
|
||||
|
||||
+34
-5
@@ -376,6 +376,12 @@ enum ieee80211_rssi_event {
|
||||
* @ssid_len: Length of SSID given in @ssid.
|
||||
* @hidden_ssid: The SSID of the current vif is hidden. Only valid in AP-mode.
|
||||
* @txpower: TX power in dBm
|
||||
* @txpower_type: TX power adjustment used to control per packet Transmit
|
||||
* Power Control (TPC) in lower driver for the current vif. In particular
|
||||
* TPC is enabled if value passed in %txpower_type is
|
||||
* NL80211_TX_POWER_LIMITED (allow using less than specified from
|
||||
* userspace), whereas TPC is disabled if %txpower_type is set to
|
||||
* NL80211_TX_POWER_FIXED (use value configured from userspace)
|
||||
* @p2p_noa_attr: P2P NoA attribute for P2P powersave
|
||||
*/
|
||||
struct ieee80211_bss_conf {
|
||||
@@ -411,6 +417,7 @@ struct ieee80211_bss_conf {
|
||||
size_t ssid_len;
|
||||
bool hidden_ssid;
|
||||
int txpower;
|
||||
enum nl80211_tx_power_setting txpower_type;
|
||||
struct ieee80211_p2p_noa_attr p2p_noa_attr;
|
||||
};
|
||||
|
||||
@@ -1287,8 +1294,8 @@ struct ieee80211_vif *wdev_to_ieee80211_vif(struct wireless_dev *wdev);
|
||||
* @IEEE80211_KEY_FLAG_PAIRWISE: Set by mac80211, this flag indicates
|
||||
* that the key is pairwise rather then a shared key.
|
||||
* @IEEE80211_KEY_FLAG_SW_MGMT_TX: This flag should be set by the driver for a
|
||||
* CCMP key if it requires CCMP encryption of management frames (MFP) to
|
||||
* be done in software.
|
||||
* CCMP/GCMP key if it requires CCMP/GCMP encryption of management frames
|
||||
* (MFP) to be done in software.
|
||||
* @IEEE80211_KEY_FLAG_PUT_IV_SPACE: This flag should be set by the driver
|
||||
* if space should be prepared for the IV, but the IV
|
||||
* itself should not be generated. Do not set together with
|
||||
@@ -1303,7 +1310,7 @@ struct ieee80211_vif *wdev_to_ieee80211_vif(struct wireless_dev *wdev);
|
||||
* 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
|
||||
* driver for a CCMP/GCMP key to indicate that is requires IV generation
|
||||
* only for managment frames (MFP).
|
||||
* @IEEE80211_KEY_FLAG_RESERVE_TAILROOM: This flag should be set by the
|
||||
* driver for a key to indicate that sufficient tailroom must always
|
||||
@@ -1634,6 +1641,12 @@ struct ieee80211_tx_control {
|
||||
* be created. It is expected user-space will create vifs as
|
||||
* desired (and thus have them named as desired).
|
||||
*
|
||||
* @IEEE80211_HW_SW_CRYPTO_CONTROL: The driver wants to control which of the
|
||||
* crypto algorithms can be done in software - so don't automatically
|
||||
* try to fall back to it if hardware crypto fails, but do so only if
|
||||
* the driver returns 1. This also forces the driver to advertise its
|
||||
* supported cipher suites.
|
||||
*
|
||||
* @IEEE80211_HW_QUEUE_CONTROL: The driver wants to control per-interface
|
||||
* queue mapping in order to use different queues (not just one per AC)
|
||||
* for different virtual interfaces. See the doc section on HW queue
|
||||
@@ -1681,6 +1694,7 @@ enum ieee80211_hw_flags {
|
||||
IEEE80211_HW_MFP_CAPABLE = 1<<13,
|
||||
IEEE80211_HW_WANT_MONITOR_VIF = 1<<14,
|
||||
IEEE80211_HW_NO_AUTO_VIF = 1<<15,
|
||||
IEEE80211_HW_SW_CRYPTO_CONTROL = 1<<16,
|
||||
/* free slots */
|
||||
IEEE80211_HW_REPORTS_TX_ACK_STATUS = 1<<18,
|
||||
IEEE80211_HW_CONNECTION_MONITOR = 1<<19,
|
||||
@@ -1955,6 +1969,11 @@ void ieee80211_free_txskb(struct ieee80211_hw *hw, struct sk_buff *skb);
|
||||
* added; if you return 0 then hw_key_idx must be assigned to the
|
||||
* hardware key index, you are free to use the full u8 range.
|
||||
*
|
||||
* Note that in the case that the @IEEE80211_HW_SW_CRYPTO_CONTROL flag is
|
||||
* set, mac80211 will not automatically fall back to software crypto if
|
||||
* enabling hardware crypto failed. The set_key() call may also return the
|
||||
* value 1 to permit this specific key/algorithm to be done in software.
|
||||
*
|
||||
* When the cmd is %DISABLE_KEY then it must succeed.
|
||||
*
|
||||
* Note that it is permissible to not decrypt a frame even if a key
|
||||
@@ -4079,6 +4098,10 @@ void ieee80211_aes_cmac_calculate_k1_k2(struct ieee80211_key_conf *keyconf,
|
||||
* reverse order than in packet)
|
||||
* @aes_cmac: PN data, most significant byte first (big endian,
|
||||
* reverse order than in packet)
|
||||
* @aes_gmac: PN data, most significant byte first (big endian,
|
||||
* reverse order than in packet)
|
||||
* @gcmp: PN data, most significant byte first (big endian,
|
||||
* reverse order than in packet)
|
||||
*/
|
||||
struct ieee80211_key_seq {
|
||||
union {
|
||||
@@ -4092,6 +4115,12 @@ struct ieee80211_key_seq {
|
||||
struct {
|
||||
u8 pn[6];
|
||||
} aes_cmac;
|
||||
struct {
|
||||
u8 pn[6];
|
||||
} aes_gmac;
|
||||
struct {
|
||||
u8 pn[6];
|
||||
} gcmp;
|
||||
};
|
||||
};
|
||||
|
||||
@@ -4116,7 +4145,7 @@ void ieee80211_get_key_tx_seq(struct ieee80211_key_conf *keyconf,
|
||||
* ieee80211_get_key_rx_seq - get key RX sequence counter
|
||||
*
|
||||
* @keyconf: the parameter passed with the set key
|
||||
* @tid: The TID, or -1 for the management frame value (CCMP only);
|
||||
* @tid: The TID, or -1 for the management frame value (CCMP/GCMP only);
|
||||
* the value on TID 0 is also used for non-QoS frames. For
|
||||
* CMAC, only TID 0 is valid.
|
||||
* @seq: buffer to receive the sequence data
|
||||
@@ -4152,7 +4181,7 @@ void ieee80211_set_key_tx_seq(struct ieee80211_key_conf *keyconf,
|
||||
* ieee80211_set_key_rx_seq - set key RX sequence counter
|
||||
*
|
||||
* @keyconf: the parameter passed with the set key
|
||||
* @tid: The TID, or -1 for the management frame value (CCMP only);
|
||||
* @tid: The TID, or -1 for the management frame value (CCMP/GCMP only);
|
||||
* the value on TID 0 is also used for non-QoS frames. For
|
||||
* CMAC, only TID 0 is valid.
|
||||
* @seq: new sequence data
|
||||
|
||||
@@ -180,8 +180,8 @@
|
||||
* %NL80211_ATTR_WIPHY and %NL80211_ATTR_WIPHY_NAME.
|
||||
*
|
||||
* @NL80211_CMD_GET_INTERFACE: Request an interface's configuration;
|
||||
* either a dump request on a %NL80211_ATTR_WIPHY or a specific get
|
||||
* on an %NL80211_ATTR_IFINDEX is supported.
|
||||
* either a dump request for all interfaces or a specific get with a
|
||||
* single %NL80211_ATTR_IFINDEX is supported.
|
||||
* @NL80211_CMD_SET_INTERFACE: Set type of a virtual interface, requires
|
||||
* %NL80211_ATTR_IFINDEX and %NL80211_ATTR_IFTYPE.
|
||||
* @NL80211_CMD_NEW_INTERFACE: Newly created virtual interface or response
|
||||
@@ -324,7 +324,9 @@
|
||||
* if passed, define which channels should be scanned; if not
|
||||
* passed, all channels allowed for the current regulatory domain
|
||||
* are used. Extra IEs can also be passed from the userspace by
|
||||
* using the %NL80211_ATTR_IE attribute.
|
||||
* using the %NL80211_ATTR_IE attribute. The first cycle of the
|
||||
* scheduled scan can be delayed by %NL80211_ATTR_SCHED_SCAN_DELAY
|
||||
* is supplied.
|
||||
* @NL80211_CMD_STOP_SCHED_SCAN: stop a scheduled scan. Returns -ENOENT if
|
||||
* scheduled scan is not running. The caller may assume that as soon
|
||||
* as the call returns, it is safe to start a new scheduled scan again.
|
||||
@@ -1735,6 +1737,9 @@ enum nl80211_commands {
|
||||
* should be contained in the result as the sum of the respective counters
|
||||
* over all channels.
|
||||
*
|
||||
* @NL80211_ATTR_SCHED_SCAN_DELAY: delay before a scheduled scan (or a
|
||||
* WoWLAN net-detect scan) is started, u32 in seconds.
|
||||
*
|
||||
* @NUM_NL80211_ATTR: total number of nl80211_attrs available
|
||||
* @NL80211_ATTR_MAX: highest attribute number currently defined
|
||||
* @__NL80211_ATTR_AFTER_LAST: internal use
|
||||
@@ -2098,6 +2103,10 @@ enum nl80211_attrs {
|
||||
|
||||
NL80211_ATTR_SURVEY_RADIO_STATS,
|
||||
|
||||
NL80211_ATTR_NETNS_FD,
|
||||
|
||||
NL80211_ATTR_SCHED_SCAN_DELAY,
|
||||
|
||||
/* add attributes here, update the policy in nl80211.c */
|
||||
|
||||
__NL80211_ATTR_AFTER_LAST,
|
||||
@@ -3741,11 +3750,12 @@ struct nl80211_pattern_support {
|
||||
* @NL80211_WOWLAN_TRIG_NET_DETECT: wake up when a configured network
|
||||
* is detected. This is a nested attribute that contains the
|
||||
* same attributes used with @NL80211_CMD_START_SCHED_SCAN. It
|
||||
* specifies how the scan is performed (e.g. the interval and the
|
||||
* channels to scan) as well as the scan results that will
|
||||
* trigger a wake (i.e. the matchsets). This attribute is also
|
||||
* sent in a response to @NL80211_CMD_GET_WIPHY, indicating the
|
||||
* number of match sets supported by the driver (u32).
|
||||
* specifies how the scan is performed (e.g. the interval, the
|
||||
* channels to scan and the initial delay) as well as the scan
|
||||
* results that will trigger a wake (i.e. the matchsets). This
|
||||
* attribute is also sent in a response to
|
||||
* @NL80211_CMD_GET_WIPHY, indicating the number of match sets
|
||||
* supported by the driver (u32).
|
||||
* @NL80211_WOWLAN_TRIG_NET_DETECT_RESULTS: nested attribute
|
||||
* containing an array with information about what triggered the
|
||||
* wake up. If no elements are present in the array, it means
|
||||
|
||||
@@ -446,6 +446,7 @@ struct net *get_net_ns_by_fd(int fd)
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
#endif
|
||||
EXPORT_SYMBOL_GPL(get_net_ns_by_fd);
|
||||
|
||||
struct net *get_net_ns_by_pid(pid_t pid)
|
||||
{
|
||||
|
||||
@@ -5,6 +5,7 @@ config MAC80211
|
||||
select CRYPTO_ARC4
|
||||
select CRYPTO_AES
|
||||
select CRYPTO_CCM
|
||||
select CRYPTO_GCM
|
||||
select CRC32
|
||||
select AVERAGE
|
||||
---help---
|
||||
|
||||
@@ -15,7 +15,9 @@ mac80211-y := \
|
||||
michael.o \
|
||||
tkip.o \
|
||||
aes_ccm.o \
|
||||
aes_gcm.o \
|
||||
aes_cmac.o \
|
||||
aes_gmac.o \
|
||||
cfg.o \
|
||||
ethtool.o \
|
||||
rx.o \
|
||||
|
||||
+12
-9
@@ -20,7 +20,8 @@
|
||||
#include "aes_ccm.h"
|
||||
|
||||
void ieee80211_aes_ccm_encrypt(struct crypto_aead *tfm, u8 *b_0, u8 *aad,
|
||||
u8 *data, size_t data_len, u8 *mic)
|
||||
u8 *data, size_t data_len, u8 *mic,
|
||||
size_t mic_len)
|
||||
{
|
||||
struct scatterlist assoc, pt, ct[2];
|
||||
|
||||
@@ -35,7 +36,7 @@ void ieee80211_aes_ccm_encrypt(struct crypto_aead *tfm, u8 *b_0, u8 *aad,
|
||||
sg_init_one(&assoc, &aad[2], be16_to_cpup((__be16 *)aad));
|
||||
sg_init_table(ct, 2);
|
||||
sg_set_buf(&ct[0], data, data_len);
|
||||
sg_set_buf(&ct[1], mic, IEEE80211_CCMP_MIC_LEN);
|
||||
sg_set_buf(&ct[1], mic, mic_len);
|
||||
|
||||
aead_request_set_tfm(aead_req, tfm);
|
||||
aead_request_set_assoc(aead_req, &assoc, assoc.length);
|
||||
@@ -45,7 +46,8 @@ void ieee80211_aes_ccm_encrypt(struct crypto_aead *tfm, u8 *b_0, u8 *aad,
|
||||
}
|
||||
|
||||
int ieee80211_aes_ccm_decrypt(struct crypto_aead *tfm, u8 *b_0, u8 *aad,
|
||||
u8 *data, size_t data_len, u8 *mic)
|
||||
u8 *data, size_t data_len, u8 *mic,
|
||||
size_t mic_len)
|
||||
{
|
||||
struct scatterlist assoc, pt, ct[2];
|
||||
char aead_req_data[sizeof(struct aead_request) +
|
||||
@@ -62,17 +64,18 @@ int ieee80211_aes_ccm_decrypt(struct crypto_aead *tfm, u8 *b_0, u8 *aad,
|
||||
sg_init_one(&assoc, &aad[2], be16_to_cpup((__be16 *)aad));
|
||||
sg_init_table(ct, 2);
|
||||
sg_set_buf(&ct[0], data, data_len);
|
||||
sg_set_buf(&ct[1], mic, IEEE80211_CCMP_MIC_LEN);
|
||||
sg_set_buf(&ct[1], mic, mic_len);
|
||||
|
||||
aead_request_set_tfm(aead_req, tfm);
|
||||
aead_request_set_assoc(aead_req, &assoc, assoc.length);
|
||||
aead_request_set_crypt(aead_req, ct, &pt,
|
||||
data_len + IEEE80211_CCMP_MIC_LEN, b_0);
|
||||
aead_request_set_crypt(aead_req, ct, &pt, data_len + mic_len, b_0);
|
||||
|
||||
return crypto_aead_decrypt(aead_req);
|
||||
}
|
||||
|
||||
struct crypto_aead *ieee80211_aes_key_setup_encrypt(const u8 key[])
|
||||
struct crypto_aead *ieee80211_aes_key_setup_encrypt(const u8 key[],
|
||||
size_t key_len,
|
||||
size_t mic_len)
|
||||
{
|
||||
struct crypto_aead *tfm;
|
||||
int err;
|
||||
@@ -81,9 +84,9 @@ struct crypto_aead *ieee80211_aes_key_setup_encrypt(const u8 key[])
|
||||
if (IS_ERR(tfm))
|
||||
return tfm;
|
||||
|
||||
err = crypto_aead_setkey(tfm, key, WLAN_KEY_LEN_CCMP);
|
||||
err = crypto_aead_setkey(tfm, key, key_len);
|
||||
if (!err)
|
||||
err = crypto_aead_setauthsize(tfm, IEEE80211_CCMP_MIC_LEN);
|
||||
err = crypto_aead_setauthsize(tfm, mic_len);
|
||||
if (!err)
|
||||
return tfm;
|
||||
|
||||
|
||||
@@ -12,11 +12,15 @@
|
||||
|
||||
#include <linux/crypto.h>
|
||||
|
||||
struct crypto_aead *ieee80211_aes_key_setup_encrypt(const u8 key[]);
|
||||
struct crypto_aead *ieee80211_aes_key_setup_encrypt(const u8 key[],
|
||||
size_t key_len,
|
||||
size_t mic_len);
|
||||
void ieee80211_aes_ccm_encrypt(struct crypto_aead *tfm, u8 *b_0, u8 *aad,
|
||||
u8 *data, size_t data_len, u8 *mic);
|
||||
u8 *data, size_t data_len, u8 *mic,
|
||||
size_t mic_len);
|
||||
int ieee80211_aes_ccm_decrypt(struct crypto_aead *tfm, u8 *b_0, u8 *aad,
|
||||
u8 *data, size_t data_len, u8 *mic);
|
||||
u8 *data, size_t data_len, u8 *mic,
|
||||
size_t mic_len);
|
||||
void ieee80211_aes_key_free(struct crypto_aead *tfm);
|
||||
|
||||
#endif /* AES_CCM_H */
|
||||
|
||||
+26
-8
@@ -18,8 +18,8 @@
|
||||
#include "key.h"
|
||||
#include "aes_cmac.h"
|
||||
|
||||
#define AES_CMAC_KEY_LEN 16
|
||||
#define CMAC_TLEN 8 /* CMAC TLen = 64 bits (8 octets) */
|
||||
#define CMAC_TLEN_256 16 /* CMAC TLen = 128 bits (16 octets) */
|
||||
#define AAD_LEN 20
|
||||
|
||||
|
||||
@@ -35,9 +35,9 @@ static void gf_mulx(u8 *pad)
|
||||
pad[AES_BLOCK_SIZE - 1] ^= 0x87;
|
||||
}
|
||||
|
||||
|
||||
static void aes_128_cmac_vector(struct crypto_cipher *tfm, size_t num_elem,
|
||||
const u8 *addr[], const size_t *len, u8 *mac)
|
||||
static void aes_cmac_vector(struct crypto_cipher *tfm, size_t num_elem,
|
||||
const u8 *addr[], const size_t *len, u8 *mac,
|
||||
size_t mac_len)
|
||||
{
|
||||
u8 cbc[AES_BLOCK_SIZE], pad[AES_BLOCK_SIZE];
|
||||
const u8 *pos, *end;
|
||||
@@ -88,7 +88,7 @@ static void aes_128_cmac_vector(struct crypto_cipher *tfm, size_t num_elem,
|
||||
for (i = 0; i < AES_BLOCK_SIZE; i++)
|
||||
pad[i] ^= cbc[i];
|
||||
crypto_cipher_encrypt_one(tfm, pad, pad);
|
||||
memcpy(mac, pad, CMAC_TLEN);
|
||||
memcpy(mac, pad, mac_len);
|
||||
}
|
||||
|
||||
|
||||
@@ -107,17 +107,35 @@ void ieee80211_aes_cmac(struct crypto_cipher *tfm, const u8 *aad,
|
||||
addr[2] = zero;
|
||||
len[2] = CMAC_TLEN;
|
||||
|
||||
aes_128_cmac_vector(tfm, 3, addr, len, mic);
|
||||
aes_cmac_vector(tfm, 3, addr, len, mic, CMAC_TLEN);
|
||||
}
|
||||
|
||||
void ieee80211_aes_cmac_256(struct crypto_cipher *tfm, const u8 *aad,
|
||||
const u8 *data, size_t data_len, u8 *mic)
|
||||
{
|
||||
const u8 *addr[3];
|
||||
size_t len[3];
|
||||
u8 zero[CMAC_TLEN_256];
|
||||
|
||||
struct crypto_cipher *ieee80211_aes_cmac_key_setup(const u8 key[])
|
||||
memset(zero, 0, CMAC_TLEN_256);
|
||||
addr[0] = aad;
|
||||
len[0] = AAD_LEN;
|
||||
addr[1] = data;
|
||||
len[1] = data_len - CMAC_TLEN_256;
|
||||
addr[2] = zero;
|
||||
len[2] = CMAC_TLEN_256;
|
||||
|
||||
aes_cmac_vector(tfm, 3, addr, len, mic, CMAC_TLEN_256);
|
||||
}
|
||||
|
||||
struct crypto_cipher *ieee80211_aes_cmac_key_setup(const u8 key[],
|
||||
size_t key_len)
|
||||
{
|
||||
struct crypto_cipher *tfm;
|
||||
|
||||
tfm = crypto_alloc_cipher("aes", 0, CRYPTO_ALG_ASYNC);
|
||||
if (!IS_ERR(tfm))
|
||||
crypto_cipher_setkey(tfm, key, AES_CMAC_KEY_LEN);
|
||||
crypto_cipher_setkey(tfm, key, key_len);
|
||||
|
||||
return tfm;
|
||||
}
|
||||
|
||||
@@ -11,9 +11,12 @@
|
||||
|
||||
#include <linux/crypto.h>
|
||||
|
||||
struct crypto_cipher *ieee80211_aes_cmac_key_setup(const u8 key[]);
|
||||
struct crypto_cipher *ieee80211_aes_cmac_key_setup(const u8 key[],
|
||||
size_t key_len);
|
||||
void ieee80211_aes_cmac(struct crypto_cipher *tfm, const u8 *aad,
|
||||
const u8 *data, size_t data_len, u8 *mic);
|
||||
void ieee80211_aes_cmac_256(struct crypto_cipher *tfm, const u8 *aad,
|
||||
const u8 *data, size_t data_len, u8 *mic);
|
||||
void ieee80211_aes_cmac_key_free(struct crypto_cipher *tfm);
|
||||
|
||||
#endif /* AES_CMAC_H */
|
||||
|
||||
@@ -0,0 +1,95 @@
|
||||
/*
|
||||
* Copyright 2014-2015, Qualcomm Atheros, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/crypto.h>
|
||||
#include <linux/err.h>
|
||||
#include <crypto/aes.h>
|
||||
|
||||
#include <net/mac80211.h>
|
||||
#include "key.h"
|
||||
#include "aes_gcm.h"
|
||||
|
||||
void ieee80211_aes_gcm_encrypt(struct crypto_aead *tfm, u8 *j_0, u8 *aad,
|
||||
u8 *data, size_t data_len, u8 *mic)
|
||||
{
|
||||
struct scatterlist assoc, pt, ct[2];
|
||||
|
||||
char aead_req_data[sizeof(struct aead_request) +
|
||||
crypto_aead_reqsize(tfm)]
|
||||
__aligned(__alignof__(struct aead_request));
|
||||
struct aead_request *aead_req = (void *)aead_req_data;
|
||||
|
||||
memset(aead_req, 0, sizeof(aead_req_data));
|
||||
|
||||
sg_init_one(&pt, data, data_len);
|
||||
sg_init_one(&assoc, &aad[2], be16_to_cpup((__be16 *)aad));
|
||||
sg_init_table(ct, 2);
|
||||
sg_set_buf(&ct[0], data, data_len);
|
||||
sg_set_buf(&ct[1], mic, IEEE80211_GCMP_MIC_LEN);
|
||||
|
||||
aead_request_set_tfm(aead_req, tfm);
|
||||
aead_request_set_assoc(aead_req, &assoc, assoc.length);
|
||||
aead_request_set_crypt(aead_req, &pt, ct, data_len, j_0);
|
||||
|
||||
crypto_aead_encrypt(aead_req);
|
||||
}
|
||||
|
||||
int ieee80211_aes_gcm_decrypt(struct crypto_aead *tfm, u8 *j_0, u8 *aad,
|
||||
u8 *data, size_t data_len, u8 *mic)
|
||||
{
|
||||
struct scatterlist assoc, pt, ct[2];
|
||||
char aead_req_data[sizeof(struct aead_request) +
|
||||
crypto_aead_reqsize(tfm)]
|
||||
__aligned(__alignof__(struct aead_request));
|
||||
struct aead_request *aead_req = (void *)aead_req_data;
|
||||
|
||||
if (data_len == 0)
|
||||
return -EINVAL;
|
||||
|
||||
memset(aead_req, 0, sizeof(aead_req_data));
|
||||
|
||||
sg_init_one(&pt, data, data_len);
|
||||
sg_init_one(&assoc, &aad[2], be16_to_cpup((__be16 *)aad));
|
||||
sg_init_table(ct, 2);
|
||||
sg_set_buf(&ct[0], data, data_len);
|
||||
sg_set_buf(&ct[1], mic, IEEE80211_GCMP_MIC_LEN);
|
||||
|
||||
aead_request_set_tfm(aead_req, tfm);
|
||||
aead_request_set_assoc(aead_req, &assoc, assoc.length);
|
||||
aead_request_set_crypt(aead_req, ct, &pt,
|
||||
data_len + IEEE80211_GCMP_MIC_LEN, j_0);
|
||||
|
||||
return crypto_aead_decrypt(aead_req);
|
||||
}
|
||||
|
||||
struct crypto_aead *ieee80211_aes_gcm_key_setup_encrypt(const u8 key[],
|
||||
size_t key_len)
|
||||
{
|
||||
struct crypto_aead *tfm;
|
||||
int err;
|
||||
|
||||
tfm = crypto_alloc_aead("gcm(aes)", 0, CRYPTO_ALG_ASYNC);
|
||||
if (IS_ERR(tfm))
|
||||
return tfm;
|
||||
|
||||
err = crypto_aead_setkey(tfm, key, key_len);
|
||||
if (!err)
|
||||
err = crypto_aead_setauthsize(tfm, IEEE80211_GCMP_MIC_LEN);
|
||||
if (!err)
|
||||
return tfm;
|
||||
|
||||
crypto_free_aead(tfm);
|
||||
return ERR_PTR(err);
|
||||
}
|
||||
|
||||
void ieee80211_aes_gcm_key_free(struct crypto_aead *tfm)
|
||||
{
|
||||
crypto_free_aead(tfm);
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
/*
|
||||
* Copyright 2014-2015, Qualcomm Atheros, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#ifndef AES_GCM_H
|
||||
#define AES_GCM_H
|
||||
|
||||
#include <linux/crypto.h>
|
||||
|
||||
void ieee80211_aes_gcm_encrypt(struct crypto_aead *tfm, u8 *j_0, u8 *aad,
|
||||
u8 *data, size_t data_len, u8 *mic);
|
||||
int ieee80211_aes_gcm_decrypt(struct crypto_aead *tfm, u8 *j_0, u8 *aad,
|
||||
u8 *data, size_t data_len, u8 *mic);
|
||||
struct crypto_aead *ieee80211_aes_gcm_key_setup_encrypt(const u8 key[],
|
||||
size_t key_len);
|
||||
void ieee80211_aes_gcm_key_free(struct crypto_aead *tfm);
|
||||
|
||||
#endif /* AES_GCM_H */
|
||||
@@ -0,0 +1,84 @@
|
||||
/*
|
||||
* AES-GMAC for IEEE 802.11 BIP-GMAC-128 and BIP-GMAC-256
|
||||
* Copyright 2015, Qualcomm Atheros, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/crypto.h>
|
||||
#include <linux/err.h>
|
||||
#include <crypto/aes.h>
|
||||
|
||||
#include <net/mac80211.h>
|
||||
#include "key.h"
|
||||
#include "aes_gmac.h"
|
||||
|
||||
#define GMAC_MIC_LEN 16
|
||||
#define GMAC_NONCE_LEN 12
|
||||
#define AAD_LEN 20
|
||||
|
||||
int ieee80211_aes_gmac(struct crypto_aead *tfm, const u8 *aad, u8 *nonce,
|
||||
const u8 *data, size_t data_len, u8 *mic)
|
||||
{
|
||||
struct scatterlist sg[3], ct[1];
|
||||
char aead_req_data[sizeof(struct aead_request) +
|
||||
crypto_aead_reqsize(tfm)]
|
||||
__aligned(__alignof__(struct aead_request));
|
||||
struct aead_request *aead_req = (void *)aead_req_data;
|
||||
u8 zero[GMAC_MIC_LEN], iv[AES_BLOCK_SIZE];
|
||||
|
||||
if (data_len < GMAC_MIC_LEN)
|
||||
return -EINVAL;
|
||||
|
||||
memset(aead_req, 0, sizeof(aead_req_data));
|
||||
|
||||
memset(zero, 0, GMAC_MIC_LEN);
|
||||
sg_init_table(sg, 3);
|
||||
sg_set_buf(&sg[0], aad, AAD_LEN);
|
||||
sg_set_buf(&sg[1], data, data_len - GMAC_MIC_LEN);
|
||||
sg_set_buf(&sg[2], zero, GMAC_MIC_LEN);
|
||||
|
||||
memcpy(iv, nonce, GMAC_NONCE_LEN);
|
||||
memset(iv + GMAC_NONCE_LEN, 0, sizeof(iv) - GMAC_NONCE_LEN);
|
||||
iv[AES_BLOCK_SIZE - 1] = 0x01;
|
||||
|
||||
sg_init_table(ct, 1);
|
||||
sg_set_buf(&ct[0], mic, GMAC_MIC_LEN);
|
||||
|
||||
aead_request_set_tfm(aead_req, tfm);
|
||||
aead_request_set_assoc(aead_req, sg, AAD_LEN + data_len);
|
||||
aead_request_set_crypt(aead_req, NULL, ct, 0, iv);
|
||||
|
||||
crypto_aead_encrypt(aead_req);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct crypto_aead *ieee80211_aes_gmac_key_setup(const u8 key[],
|
||||
size_t key_len)
|
||||
{
|
||||
struct crypto_aead *tfm;
|
||||
int err;
|
||||
|
||||
tfm = crypto_alloc_aead("gcm(aes)", 0, CRYPTO_ALG_ASYNC);
|
||||
if (IS_ERR(tfm))
|
||||
return tfm;
|
||||
|
||||
err = crypto_aead_setkey(tfm, key, key_len);
|
||||
if (!err)
|
||||
return tfm;
|
||||
if (!err)
|
||||
err = crypto_aead_setauthsize(tfm, GMAC_MIC_LEN);
|
||||
|
||||
crypto_free_aead(tfm);
|
||||
return ERR_PTR(err);
|
||||
}
|
||||
|
||||
void ieee80211_aes_gmac_key_free(struct crypto_aead *tfm)
|
||||
{
|
||||
crypto_free_aead(tfm);
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
/*
|
||||
* Copyright 2015, Qualcomm Atheros, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#ifndef AES_GMAC_H
|
||||
#define AES_GMAC_H
|
||||
|
||||
#include <linux/crypto.h>
|
||||
|
||||
struct crypto_aead *ieee80211_aes_gmac_key_setup(const u8 key[],
|
||||
size_t key_len);
|
||||
int ieee80211_aes_gmac(struct crypto_aead *tfm, const u8 *aad, u8 *nonce,
|
||||
const u8 *data, size_t data_len, u8 *mic);
|
||||
void ieee80211_aes_gmac_key_free(struct crypto_aead *tfm);
|
||||
|
||||
#endif /* AES_GMAC_H */
|
||||
+47
-3
@@ -162,8 +162,13 @@ static int ieee80211_add_key(struct wiphy *wiphy, struct net_device *dev,
|
||||
return -EINVAL;
|
||||
break;
|
||||
case WLAN_CIPHER_SUITE_CCMP:
|
||||
case WLAN_CIPHER_SUITE_CCMP_256:
|
||||
case WLAN_CIPHER_SUITE_AES_CMAC:
|
||||
case WLAN_CIPHER_SUITE_BIP_CMAC_256:
|
||||
case WLAN_CIPHER_SUITE_BIP_GMAC_128:
|
||||
case WLAN_CIPHER_SUITE_BIP_GMAC_256:
|
||||
case WLAN_CIPHER_SUITE_GCMP:
|
||||
case WLAN_CIPHER_SUITE_GCMP_256:
|
||||
break;
|
||||
default:
|
||||
cs = ieee80211_cs_get(local, params->cipher, sdata->vif.type);
|
||||
@@ -348,6 +353,7 @@ static int ieee80211_get_key(struct wiphy *wiphy, struct net_device *dev,
|
||||
params.seq_len = 6;
|
||||
break;
|
||||
case WLAN_CIPHER_SUITE_CCMP:
|
||||
case WLAN_CIPHER_SUITE_CCMP_256:
|
||||
pn64 = atomic64_read(&key->u.ccmp.tx_pn);
|
||||
seq[0] = pn64;
|
||||
seq[1] = pn64 >> 8;
|
||||
@@ -359,6 +365,7 @@ static int ieee80211_get_key(struct wiphy *wiphy, struct net_device *dev,
|
||||
params.seq_len = 6;
|
||||
break;
|
||||
case WLAN_CIPHER_SUITE_AES_CMAC:
|
||||
case WLAN_CIPHER_SUITE_BIP_CMAC_256:
|
||||
pn64 = atomic64_read(&key->u.aes_cmac.tx_pn);
|
||||
seq[0] = pn64;
|
||||
seq[1] = pn64 >> 8;
|
||||
@@ -369,6 +376,30 @@ static int ieee80211_get_key(struct wiphy *wiphy, struct net_device *dev,
|
||||
params.seq = seq;
|
||||
params.seq_len = 6;
|
||||
break;
|
||||
case WLAN_CIPHER_SUITE_BIP_GMAC_128:
|
||||
case WLAN_CIPHER_SUITE_BIP_GMAC_256:
|
||||
pn64 = atomic64_read(&key->u.aes_gmac.tx_pn);
|
||||
seq[0] = pn64;
|
||||
seq[1] = pn64 >> 8;
|
||||
seq[2] = pn64 >> 16;
|
||||
seq[3] = pn64 >> 24;
|
||||
seq[4] = pn64 >> 32;
|
||||
seq[5] = pn64 >> 40;
|
||||
params.seq = seq;
|
||||
params.seq_len = 6;
|
||||
break;
|
||||
case WLAN_CIPHER_SUITE_GCMP:
|
||||
case WLAN_CIPHER_SUITE_GCMP_256:
|
||||
pn64 = atomic64_read(&key->u.gcmp.tx_pn);
|
||||
seq[0] = pn64;
|
||||
seq[1] = pn64 >> 8;
|
||||
seq[2] = pn64 >> 16;
|
||||
seq[3] = pn64 >> 24;
|
||||
seq[4] = pn64 >> 32;
|
||||
seq[5] = pn64 >> 40;
|
||||
params.seq = seq;
|
||||
params.seq_len = 6;
|
||||
break;
|
||||
}
|
||||
|
||||
params.key = key->conf.key;
|
||||
@@ -2110,6 +2141,8 @@ static int ieee80211_set_tx_power(struct wiphy *wiphy,
|
||||
{
|
||||
struct ieee80211_local *local = wiphy_priv(wiphy);
|
||||
struct ieee80211_sub_if_data *sdata;
|
||||
enum nl80211_tx_power_setting txp_type = type;
|
||||
bool update_txp_type = false;
|
||||
|
||||
if (wdev) {
|
||||
sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
|
||||
@@ -2117,6 +2150,7 @@ static int ieee80211_set_tx_power(struct wiphy *wiphy,
|
||||
switch (type) {
|
||||
case NL80211_TX_POWER_AUTOMATIC:
|
||||
sdata->user_power_level = IEEE80211_UNSET_POWER_LEVEL;
|
||||
txp_type = NL80211_TX_POWER_LIMITED;
|
||||
break;
|
||||
case NL80211_TX_POWER_LIMITED:
|
||||
case NL80211_TX_POWER_FIXED:
|
||||
@@ -2126,7 +2160,12 @@ static int ieee80211_set_tx_power(struct wiphy *wiphy,
|
||||
break;
|
||||
}
|
||||
|
||||
ieee80211_recalc_txpower(sdata);
|
||||
if (txp_type != sdata->vif.bss_conf.txpower_type) {
|
||||
update_txp_type = true;
|
||||
sdata->vif.bss_conf.txpower_type = txp_type;
|
||||
}
|
||||
|
||||
ieee80211_recalc_txpower(sdata, update_txp_type);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -2134,6 +2173,7 @@ static int ieee80211_set_tx_power(struct wiphy *wiphy,
|
||||
switch (type) {
|
||||
case NL80211_TX_POWER_AUTOMATIC:
|
||||
local->user_power_level = IEEE80211_UNSET_POWER_LEVEL;
|
||||
txp_type = NL80211_TX_POWER_LIMITED;
|
||||
break;
|
||||
case NL80211_TX_POWER_LIMITED:
|
||||
case NL80211_TX_POWER_FIXED:
|
||||
@@ -2144,10 +2184,14 @@ static int ieee80211_set_tx_power(struct wiphy *wiphy,
|
||||
}
|
||||
|
||||
mutex_lock(&local->iflist_mtx);
|
||||
list_for_each_entry(sdata, &local->interfaces, list)
|
||||
list_for_each_entry(sdata, &local->interfaces, list) {
|
||||
sdata->user_power_level = local->user_power_level;
|
||||
if (txp_type != sdata->vif.bss_conf.txpower_type)
|
||||
update_txp_type = true;
|
||||
sdata->vif.bss_conf.txpower_type = txp_type;
|
||||
}
|
||||
list_for_each_entry(sdata, &local->interfaces, list)
|
||||
ieee80211_recalc_txpower(sdata);
|
||||
ieee80211_recalc_txpower(sdata, update_txp_type);
|
||||
mutex_unlock(&local->iflist_mtx);
|
||||
|
||||
return 0;
|
||||
|
||||
+2
-2
@@ -655,7 +655,7 @@ out:
|
||||
}
|
||||
|
||||
if (new_ctx && ieee80211_chanctx_num_assigned(local, new_ctx) > 0) {
|
||||
ieee80211_recalc_txpower(sdata);
|
||||
ieee80211_recalc_txpower(sdata, false);
|
||||
ieee80211_recalc_chanctx_min_def(local, new_ctx);
|
||||
}
|
||||
|
||||
@@ -1387,7 +1387,7 @@ static int ieee80211_vif_use_reserved_switch(struct ieee80211_local *local)
|
||||
ieee80211_bss_info_change_notify(sdata,
|
||||
changed);
|
||||
|
||||
ieee80211_recalc_txpower(sdata);
|
||||
ieee80211_recalc_txpower(sdata, false);
|
||||
}
|
||||
|
||||
ieee80211_recalc_chanctx_chantype(local, ctx);
|
||||
|
||||
@@ -94,17 +94,33 @@ static ssize_t key_tx_spec_read(struct file *file, char __user *userbuf,
|
||||
key->u.tkip.tx.iv16);
|
||||
break;
|
||||
case WLAN_CIPHER_SUITE_CCMP:
|
||||
case WLAN_CIPHER_SUITE_CCMP_256:
|
||||
pn = atomic64_read(&key->u.ccmp.tx_pn);
|
||||
len = scnprintf(buf, sizeof(buf), "%02x%02x%02x%02x%02x%02x\n",
|
||||
(u8)(pn >> 40), (u8)(pn >> 32), (u8)(pn >> 24),
|
||||
(u8)(pn >> 16), (u8)(pn >> 8), (u8)pn);
|
||||
break;
|
||||
case WLAN_CIPHER_SUITE_AES_CMAC:
|
||||
case WLAN_CIPHER_SUITE_BIP_CMAC_256:
|
||||
pn = atomic64_read(&key->u.aes_cmac.tx_pn);
|
||||
len = scnprintf(buf, sizeof(buf), "%02x%02x%02x%02x%02x%02x\n",
|
||||
(u8)(pn >> 40), (u8)(pn >> 32), (u8)(pn >> 24),
|
||||
(u8)(pn >> 16), (u8)(pn >> 8), (u8)pn);
|
||||
break;
|
||||
case WLAN_CIPHER_SUITE_BIP_GMAC_128:
|
||||
case WLAN_CIPHER_SUITE_BIP_GMAC_256:
|
||||
pn = atomic64_read(&key->u.aes_gmac.tx_pn);
|
||||
len = scnprintf(buf, sizeof(buf), "%02x%02x%02x%02x%02x%02x\n",
|
||||
(u8)(pn >> 40), (u8)(pn >> 32), (u8)(pn >> 24),
|
||||
(u8)(pn >> 16), (u8)(pn >> 8), (u8)pn);
|
||||
break;
|
||||
case WLAN_CIPHER_SUITE_GCMP:
|
||||
case WLAN_CIPHER_SUITE_GCMP_256:
|
||||
pn = atomic64_read(&key->u.gcmp.tx_pn);
|
||||
len = scnprintf(buf, sizeof(buf), "%02x%02x%02x%02x%02x%02x\n",
|
||||
(u8)(pn >> 40), (u8)(pn >> 32), (u8)(pn >> 24),
|
||||
(u8)(pn >> 16), (u8)(pn >> 8), (u8)pn);
|
||||
break;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
@@ -134,6 +150,7 @@ static ssize_t key_rx_spec_read(struct file *file, char __user *userbuf,
|
||||
len = p - buf;
|
||||
break;
|
||||
case WLAN_CIPHER_SUITE_CCMP:
|
||||
case WLAN_CIPHER_SUITE_CCMP_256:
|
||||
for (i = 0; i < IEEE80211_NUM_TIDS + 1; i++) {
|
||||
rpn = key->u.ccmp.rx_pn[i];
|
||||
p += scnprintf(p, sizeof(buf)+buf-p,
|
||||
@@ -144,6 +161,7 @@ static ssize_t key_rx_spec_read(struct file *file, char __user *userbuf,
|
||||
len = p - buf;
|
||||
break;
|
||||
case WLAN_CIPHER_SUITE_AES_CMAC:
|
||||
case WLAN_CIPHER_SUITE_BIP_CMAC_256:
|
||||
rpn = key->u.aes_cmac.rx_pn;
|
||||
p += scnprintf(p, sizeof(buf)+buf-p,
|
||||
"%02x%02x%02x%02x%02x%02x\n",
|
||||
@@ -151,6 +169,26 @@ static ssize_t key_rx_spec_read(struct file *file, char __user *userbuf,
|
||||
rpn[3], rpn[4], rpn[5]);
|
||||
len = p - buf;
|
||||
break;
|
||||
case WLAN_CIPHER_SUITE_BIP_GMAC_128:
|
||||
case WLAN_CIPHER_SUITE_BIP_GMAC_256:
|
||||
rpn = key->u.aes_gmac.rx_pn;
|
||||
p += scnprintf(p, sizeof(buf)+buf-p,
|
||||
"%02x%02x%02x%02x%02x%02x\n",
|
||||
rpn[0], rpn[1], rpn[2],
|
||||
rpn[3], rpn[4], rpn[5]);
|
||||
len = p - buf;
|
||||
break;
|
||||
case WLAN_CIPHER_SUITE_GCMP:
|
||||
case WLAN_CIPHER_SUITE_GCMP_256:
|
||||
for (i = 0; i < IEEE80211_NUM_TIDS + 1; i++) {
|
||||
rpn = key->u.gcmp.rx_pn[i];
|
||||
p += scnprintf(p, sizeof(buf)+buf-p,
|
||||
"%02x%02x%02x%02x%02x%02x\n",
|
||||
rpn[0], rpn[1], rpn[2],
|
||||
rpn[3], rpn[4], rpn[5]);
|
||||
}
|
||||
len = p - buf;
|
||||
break;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
@@ -167,12 +205,23 @@ static ssize_t key_replays_read(struct file *file, char __user *userbuf,
|
||||
|
||||
switch (key->conf.cipher) {
|
||||
case WLAN_CIPHER_SUITE_CCMP:
|
||||
case WLAN_CIPHER_SUITE_CCMP_256:
|
||||
len = scnprintf(buf, sizeof(buf), "%u\n", key->u.ccmp.replays);
|
||||
break;
|
||||
case WLAN_CIPHER_SUITE_AES_CMAC:
|
||||
case WLAN_CIPHER_SUITE_BIP_CMAC_256:
|
||||
len = scnprintf(buf, sizeof(buf), "%u\n",
|
||||
key->u.aes_cmac.replays);
|
||||
break;
|
||||
case WLAN_CIPHER_SUITE_BIP_GMAC_128:
|
||||
case WLAN_CIPHER_SUITE_BIP_GMAC_256:
|
||||
len = scnprintf(buf, sizeof(buf), "%u\n",
|
||||
key->u.aes_gmac.replays);
|
||||
break;
|
||||
case WLAN_CIPHER_SUITE_GCMP:
|
||||
case WLAN_CIPHER_SUITE_GCMP_256:
|
||||
len = scnprintf(buf, sizeof(buf), "%u\n", key->u.gcmp.replays);
|
||||
break;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
@@ -189,9 +238,15 @@ static ssize_t key_icverrors_read(struct file *file, char __user *userbuf,
|
||||
|
||||
switch (key->conf.cipher) {
|
||||
case WLAN_CIPHER_SUITE_AES_CMAC:
|
||||
case WLAN_CIPHER_SUITE_BIP_CMAC_256:
|
||||
len = scnprintf(buf, sizeof(buf), "%u\n",
|
||||
key->u.aes_cmac.icverrors);
|
||||
break;
|
||||
case WLAN_CIPHER_SUITE_BIP_GMAC_128:
|
||||
case WLAN_CIPHER_SUITE_BIP_GMAC_256:
|
||||
len = scnprintf(buf, sizeof(buf), "%u\n",
|
||||
key->u.aes_gmac.icverrors);
|
||||
break;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user