mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 12:28:41 +08:00
Some updates:
* injection/radiotap updates for new test capabilities * remove WDS support - even years ago when we turned it off by default it was already basically unusable * support for HE (802.11ax) rates for beacons * support for some vendor-specific HE rates * many other small features/cleanups -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEH1e1rEeCd0AIMq6MB8qZga/fl8QFAl+uSqIACgkQB8qZga/f l8QBOw/6AwlcQWMjqdb6H/QRORA81E4tX2+alHbeBai7KSI+9E1Jtakmn5qKQ4iH IjpNWPsclj4zKhgbKaariIn/bZEk8OhzmDpssnHTMpuo3iuCmuzFaDdZd9Uun2Ad tr3bqfHaom1MhWRF/FuBSHcnk599qRnsk+RY7/6dhjiPlWOWJvsfpuo1KblVoFWU wYDX+W2oYDAx44O/6AGJ0Zctwf6m7Kyzb2aMIqv2fwacBoDvyVdTIT/4NroV9INI QvIY4Gi8hoCDQX39zwaxSWOq7uFLYHwUozzZxktS5c4N3eSVFs80jmdiQiMKmKRQ A+R+ZcuFBcC+6+Wt4x+20T2mF6pUvSaIDA4jegCbDL4jQlp+023XTMlV42cnpP0z hFZgBWJszLnLtj4KW/v3sXefZ1Pxl0WD4BHNqz8SMzMUaWalrXP4Gt2bnjB7Bx1N 2M/DjW570eNZeZ9ZFcvkwHysCWMzHKmh5sPXnOitrs4s2hweIrO7wnMlYVLAGF1J m8jUoqpI9Cc7dFEg0inaSIddcjobcx9i2eG14zaZnXj0t8WqAbQqI0Lw/mipWXFY 7DfdjFULI+Yru46TAFbiisFo/2dlijxrIr3d3QK21Cwklb3BPhpiDf83q6HYhNpB xPs38OCZaNdSL7TwNRcuZ2jmBCf+48SYgse85HQOgdD2QzJv6dU= =TGgF -----END PGP SIGNATURE----- Merge tag 'mac80211-next-for-net-next-2020-11-13' of git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211-next Johannes Berg says: ==================== Some updates: * injection/radiotap updates for new test capabilities * remove WDS support - even years ago when we turned it off by default it was already basically unusable * support for HE (802.11ax) rates for beacons * support for some vendor-specific HE rates * many other small features/cleanups * tag 'mac80211-next-for-net-next-2020-11-13' of git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211-next: (21 commits) nl80211: fix kernel-doc warning in the new SAE attribute cfg80211: remove WDS code mac80211: remove WDS-related code rt2x00: remove WDS code b43legacy: remove WDS code b43: remove WDS code carl9170: remove WDS code ath9k: remove WDS code wireless: remove CONFIG_WIRELESS_WDS mac80211: assure that certain drivers adhere to DONT_REORDER flag mac80211: don't overwrite QoS TID of injected frames mac80211: adhere to Tx control flag that prevents frame reordering mac80211: add radiotap flag to assure frames are not reordered mac80211: save HE oper info in BSS config for mesh cfg80211: add support to configure HE MCS for beacon rate nl80211: fix beacon tx rate mask validation nl80211/cfg80211: fix potential infinite loop cfg80211: Add support to calculate and report 4096-QAM HE rates cfg80211: Add support to configure SAE PWE value to drivers ieee80211: Add definition for WFA DPP ... ==================== Link: https://lore.kernel.org/r/20201113101148.25268-1-johannes@sipsolutions.net Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
commit
f8fd36b95e
@ -18,19 +18,6 @@ menuconfig WLAN
|
||||
|
||||
if WLAN
|
||||
|
||||
config WIRELESS_WDS
|
||||
bool "mac80211-based legacy WDS support" if EXPERT
|
||||
help
|
||||
This option enables the deprecated WDS support, the newer
|
||||
mac80211-based 4-addr AP/client support supersedes it with
|
||||
a much better feature set (HT, VHT, ...)
|
||||
|
||||
We plan to remove this option and code, so if you find
|
||||
that you have to enable it, please let us know on the
|
||||
linux-wireless@vger.kernel.org mailing list, so we can
|
||||
help you migrate to 4-addr AP/client (or, if it's really
|
||||
necessary, give up on our plan of removing it).
|
||||
|
||||
source "drivers/net/wireless/admtek/Kconfig"
|
||||
source "drivers/net/wireless/ath/Kconfig"
|
||||
source "drivers/net/wireless/atmel/Kconfig"
|
||||
|
@ -661,7 +661,6 @@ struct ath9k_vif_iter_data {
|
||||
int naps; /* number of AP vifs */
|
||||
int nmeshes; /* number of mesh vifs */
|
||||
int nstations; /* number of station vifs */
|
||||
int nwds; /* number of WDS vifs */
|
||||
int nadhocs; /* number of adhoc vifs */
|
||||
int nocbs; /* number of OCB vifs */
|
||||
int nbcnvifs; /* number of beaconing vifs */
|
||||
|
@ -735,10 +735,10 @@ static int read_file_misc(struct seq_file *file, void *data)
|
||||
ath9k_calculate_iter_data(sc, ctx, &iter_data);
|
||||
|
||||
seq_printf(file,
|
||||
"VIFS: CTX %i(%i) AP: %i STA: %i MESH: %i WDS: %i",
|
||||
"VIFS: CTX %i(%i) AP: %i STA: %i MESH: %i",
|
||||
i++, (int)(ctx->assigned), iter_data.naps,
|
||||
iter_data.nstations,
|
||||
iter_data.nmeshes, iter_data.nwds);
|
||||
iter_data.nmeshes);
|
||||
seq_printf(file, " ADHOC: %i OCB: %i TOTAL: %hi BEACON-VIF: %hi\n",
|
||||
iter_data.nadhocs, iter_data.nocbs, sc->cur_chan->nvifs,
|
||||
sc->nbcnvifs);
|
||||
|
@ -832,12 +832,6 @@ static const struct ieee80211_iface_limit if_limits[] = {
|
||||
BIT(NL80211_IFTYPE_P2P_GO) },
|
||||
};
|
||||
|
||||
#ifdef CONFIG_WIRELESS_WDS
|
||||
static const struct ieee80211_iface_limit wds_limits[] = {
|
||||
{ .max = 2048, .types = BIT(NL80211_IFTYPE_WDS) },
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_ATH9K_CHANNEL_CONTEXT
|
||||
|
||||
static const struct ieee80211_iface_limit if_limits_multi[] = {
|
||||
@ -874,15 +868,6 @@ static const struct ieee80211_iface_combination if_comb[] = {
|
||||
BIT(NL80211_CHAN_WIDTH_40),
|
||||
#endif
|
||||
},
|
||||
#ifdef CONFIG_WIRELESS_WDS
|
||||
{
|
||||
.limits = wds_limits,
|
||||
.n_limits = ARRAY_SIZE(wds_limits),
|
||||
.max_interfaces = 2048,
|
||||
.num_different_channels = 1,
|
||||
.beacon_int_infra_match = true,
|
||||
},
|
||||
#endif
|
||||
};
|
||||
|
||||
#ifdef CONFIG_ATH9K_CHANNEL_CONTEXT
|
||||
@ -897,7 +882,6 @@ static void ath9k_set_mcc_capab(struct ath_softc *sc, struct ieee80211_hw *hw)
|
||||
ieee80211_hw_set(hw, QUEUE_CONTROL);
|
||||
hw->queues = ATH9K_NUM_TX_QUEUES;
|
||||
hw->offchannel_tx_hw_queue = hw->queues - 1;
|
||||
hw->wiphy->interface_modes &= ~ BIT(NL80211_IFTYPE_WDS);
|
||||
hw->wiphy->iface_combinations = if_comb_multi;
|
||||
hw->wiphy->n_iface_combinations = ARRAY_SIZE(if_comb_multi);
|
||||
hw->wiphy->max_scan_ssids = 255;
|
||||
@ -953,9 +937,6 @@ static void ath9k_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw)
|
||||
BIT(NL80211_IFTYPE_STATION) |
|
||||
BIT(NL80211_IFTYPE_ADHOC) |
|
||||
BIT(NL80211_IFTYPE_MESH_POINT) |
|
||||
#ifdef CONFIG_WIRELESS_WDS
|
||||
BIT(NL80211_IFTYPE_WDS) |
|
||||
#endif
|
||||
BIT(NL80211_IFTYPE_OCB);
|
||||
|
||||
if (ath9k_is_chanctx_enabled())
|
||||
|
@ -973,9 +973,6 @@ static void ath9k_vif_iter(struct ath9k_vif_iter_data *iter_data,
|
||||
if (vif->bss_conf.enable_beacon)
|
||||
ath9k_vif_iter_set_beacon(iter_data, vif);
|
||||
break;
|
||||
case NL80211_IFTYPE_WDS:
|
||||
iter_data->nwds++;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@ -1136,8 +1133,6 @@ void ath9k_calculate_summary_state(struct ath_softc *sc,
|
||||
ah->opmode = NL80211_IFTYPE_MESH_POINT;
|
||||
else if (iter_data.nocbs)
|
||||
ah->opmode = NL80211_IFTYPE_OCB;
|
||||
else if (iter_data.nwds)
|
||||
ah->opmode = NL80211_IFTYPE_AP;
|
||||
else if (iter_data.nadhocs)
|
||||
ah->opmode = NL80211_IFTYPE_ADHOC;
|
||||
else
|
||||
|
@ -329,10 +329,6 @@ int carl9170_set_operating_mode(struct ar9170 *ar)
|
||||
/* iwlagn 802.11n STA Workaround */
|
||||
rx_ctrl |= AR9170_MAC_RX_CTRL_PASS_TO_HOST;
|
||||
break;
|
||||
case NL80211_IFTYPE_WDS:
|
||||
cam_mode |= AR9170_MAC_CAM_AP_WDS;
|
||||
rx_ctrl |= AR9170_MAC_RX_CTRL_PASS_TO_HOST;
|
||||
break;
|
||||
case NL80211_IFTYPE_STATION:
|
||||
cam_mode |= AR9170_MAC_CAM_STA;
|
||||
rx_ctrl |= AR9170_MAC_RX_CTRL_PASS_TO_HOST;
|
||||
|
@ -646,7 +646,6 @@ static int carl9170_op_add_interface(struct ieee80211_hw *hw,
|
||||
case NL80211_IFTYPE_MESH_POINT:
|
||||
case NL80211_IFTYPE_AP:
|
||||
if ((vif->type == NL80211_IFTYPE_STATION) ||
|
||||
(vif->type == NL80211_IFTYPE_WDS) ||
|
||||
(vif->type == NL80211_IFTYPE_AP) ||
|
||||
(vif->type == NL80211_IFTYPE_MESH_POINT))
|
||||
break;
|
||||
|
@ -4961,12 +4961,11 @@ static int b43_op_add_interface(struct ieee80211_hw *hw,
|
||||
struct b43_wldev *dev;
|
||||
int err = -EOPNOTSUPP;
|
||||
|
||||
/* TODO: allow WDS/AP devices to coexist */
|
||||
/* TODO: allow AP devices to coexist */
|
||||
|
||||
if (vif->type != NL80211_IFTYPE_AP &&
|
||||
vif->type != NL80211_IFTYPE_MESH_POINT &&
|
||||
vif->type != NL80211_IFTYPE_STATION &&
|
||||
vif->type != NL80211_IFTYPE_WDS &&
|
||||
vif->type != NL80211_IFTYPE_ADHOC)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
@ -5576,9 +5575,6 @@ static struct b43_wl *b43_wireless_init(struct b43_bus_dev *dev)
|
||||
BIT(NL80211_IFTYPE_AP) |
|
||||
BIT(NL80211_IFTYPE_MESH_POINT) |
|
||||
BIT(NL80211_IFTYPE_STATION) |
|
||||
#ifdef CONFIG_WIRELESS_WDS
|
||||
BIT(NL80211_IFTYPE_WDS) |
|
||||
#endif
|
||||
BIT(NL80211_IFTYPE_ADHOC);
|
||||
|
||||
hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
|
||||
|
@ -3381,11 +3381,10 @@ static int b43legacy_op_add_interface(struct ieee80211_hw *hw,
|
||||
unsigned long flags;
|
||||
int err = -EOPNOTSUPP;
|
||||
|
||||
/* TODO: allow WDS/AP devices to coexist */
|
||||
/* TODO: allow AP devices to coexist */
|
||||
|
||||
if (vif->type != NL80211_IFTYPE_AP &&
|
||||
vif->type != NL80211_IFTYPE_STATION &&
|
||||
vif->type != NL80211_IFTYPE_WDS &&
|
||||
vif->type != NL80211_IFTYPE_ADHOC)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
@ -3805,9 +3804,6 @@ static int b43legacy_wireless_init(struct ssb_device *dev)
|
||||
hw->wiphy->interface_modes =
|
||||
BIT(NL80211_IFTYPE_AP) |
|
||||
BIT(NL80211_IFTYPE_STATION) |
|
||||
#ifdef CONFIG_WIRELESS_WDS
|
||||
BIT(NL80211_IFTYPE_WDS) |
|
||||
#endif
|
||||
BIT(NL80211_IFTYPE_ADHOC);
|
||||
hw->queues = 1; /* FIXME: hardware has more queues */
|
||||
hw->max_rates = 2;
|
||||
|
@ -32,7 +32,6 @@ void rt2x00lib_config_intf(struct rt2x00_dev *rt2x00dev,
|
||||
break;
|
||||
case NL80211_IFTYPE_AP:
|
||||
case NL80211_IFTYPE_MESH_POINT:
|
||||
case NL80211_IFTYPE_WDS:
|
||||
conf.sync = TSF_SYNC_AP_NONE;
|
||||
break;
|
||||
case NL80211_IFTYPE_STATION:
|
||||
|
@ -194,8 +194,7 @@ static void rt2x00lib_beaconupdate_iter(void *data, u8 *mac,
|
||||
|
||||
if (vif->type != NL80211_IFTYPE_AP &&
|
||||
vif->type != NL80211_IFTYPE_ADHOC &&
|
||||
vif->type != NL80211_IFTYPE_MESH_POINT &&
|
||||
vif->type != NL80211_IFTYPE_WDS)
|
||||
vif->type != NL80211_IFTYPE_MESH_POINT)
|
||||
return;
|
||||
|
||||
/*
|
||||
@ -1436,9 +1435,6 @@ int rt2x00lib_probe_dev(struct rt2x00_dev *rt2x00dev)
|
||||
BIT(NL80211_IFTYPE_ADHOC) |
|
||||
#ifdef CONFIG_MAC80211_MESH
|
||||
BIT(NL80211_IFTYPE_MESH_POINT) |
|
||||
#endif
|
||||
#ifdef CONFIG_WIRELESS_WDS
|
||||
BIT(NL80211_IFTYPE_WDS) |
|
||||
#endif
|
||||
BIT(NL80211_IFTYPE_AP);
|
||||
|
||||
|
@ -408,8 +408,7 @@ static void rt2x00mac_set_tim_iter(void *data, u8 *mac,
|
||||
|
||||
if (vif->type != NL80211_IFTYPE_AP &&
|
||||
vif->type != NL80211_IFTYPE_ADHOC &&
|
||||
vif->type != NL80211_IFTYPE_MESH_POINT &&
|
||||
vif->type != NL80211_IFTYPE_WDS)
|
||||
vif->type != NL80211_IFTYPE_MESH_POINT)
|
||||
return;
|
||||
|
||||
set_bit(DELAYED_UPDATE_BEACON, &intf->delayed_flags);
|
||||
|
@ -3417,6 +3417,8 @@ struct ieee80211_multiple_bssid_configuration {
|
||||
#define WLAN_AKM_SUITE_FT_PSK_SHA384 SUITE(0x000FAC, 19)
|
||||
#define WLAN_AKM_SUITE_PSK_SHA384 SUITE(0x000FAC, 20)
|
||||
|
||||
#define WLAN_AKM_SUITE_WFA_DPP SUITE(WLAN_OUI_WFA, 2)
|
||||
|
||||
#define WLAN_MAX_KEY_LEN 32
|
||||
|
||||
#define WLAN_PMK_NAME_LEN 16
|
||||
@ -3427,6 +3429,7 @@ struct ieee80211_multiple_bssid_configuration {
|
||||
|
||||
#define WLAN_OUI_WFA 0x506f9a
|
||||
#define WLAN_OUI_TYPE_WFA_P2P 9
|
||||
#define WLAN_OUI_TYPE_WFA_DPP 0x1A
|
||||
#define WLAN_OUI_MICROSOFT 0x0050f2
|
||||
#define WLAN_OUI_TYPE_MICROSOFT_WPA 1
|
||||
#define WLAN_OUI_TYPE_MICROSOFT_WMM 2
|
||||
|
@ -1008,6 +1008,21 @@ struct survey_info {
|
||||
* @sae_pwd: password for SAE authentication (for devices supporting SAE
|
||||
* offload)
|
||||
* @sae_pwd_len: length of SAE password (for devices supporting SAE offload)
|
||||
* @sae_pwe: The mechanisms allowed for SAE PWE derivation:
|
||||
*
|
||||
* NL80211_SAE_PWE_UNSPECIFIED
|
||||
* Not-specified, used to indicate userspace did not specify any
|
||||
* preference. The driver should follow its internal policy in
|
||||
* such a scenario.
|
||||
*
|
||||
* NL80211_SAE_PWE_HUNT_AND_PECK
|
||||
* Allow hunting-and-pecking loop only
|
||||
*
|
||||
* NL80211_SAE_PWE_HASH_TO_ELEMENT
|
||||
* Allow hash-to-element only
|
||||
*
|
||||
* NL80211_SAE_PWE_BOTH
|
||||
* Allow either hunting-and-pecking loop or hash-to-element
|
||||
*/
|
||||
struct cfg80211_crypto_settings {
|
||||
u32 wpa_versions;
|
||||
@ -1026,6 +1041,7 @@ struct cfg80211_crypto_settings {
|
||||
const u8 *psk;
|
||||
const u8 *sae_pwd;
|
||||
u8 sae_pwd_len;
|
||||
enum nl80211_sae_pwe_mechanism sae_pwe;
|
||||
};
|
||||
|
||||
/**
|
||||
@ -3736,8 +3752,6 @@ struct mgmt_frame_regs {
|
||||
* @get_tx_power: store the current TX power into the dbm variable;
|
||||
* return 0 if successful
|
||||
*
|
||||
* @set_wds_peer: set the WDS peer for a WDS interface
|
||||
*
|
||||
* @rfkill_poll: polls the hw rfkill line, use cfg80211 reporting
|
||||
* functions to adjust rfkill hw state
|
||||
*
|
||||
@ -4058,9 +4072,6 @@ struct cfg80211_ops {
|
||||
int (*get_tx_power)(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
int *dbm);
|
||||
|
||||
int (*set_wds_peer)(struct wiphy *wiphy, struct net_device *dev,
|
||||
const u8 *addr);
|
||||
|
||||
void (*rfkill_poll)(struct wiphy *wiphy);
|
||||
|
||||
#ifdef CONFIG_NL80211_TESTMODE
|
||||
|
@ -118,6 +118,7 @@ enum ieee80211_radiotap_tx_flags {
|
||||
IEEE80211_RADIOTAP_F_TX_RTS = 0x0004,
|
||||
IEEE80211_RADIOTAP_F_TX_NOACK = 0x0008,
|
||||
IEEE80211_RADIOTAP_F_TX_NOSEQNO = 0x0010,
|
||||
IEEE80211_RADIOTAP_F_TX_ORDER = 0x0020,
|
||||
};
|
||||
|
||||
/* for IEEE80211_RADIOTAP_MCS "have" flags */
|
||||
|
@ -621,7 +621,8 @@ struct ieee80211_fils_discovery {
|
||||
* nontransmitted BSSIDs
|
||||
* @profile_periodicity: the least number of beacon frames need to be received
|
||||
* in order to discover all the nontransmitted BSSIDs in the set.
|
||||
* @he_oper: HE operation information of the AP we are connected to
|
||||
* @he_oper: HE operation information of the BSS (AP/Mesh) or of the AP we are
|
||||
* connected to (STA)
|
||||
* @he_obss_pd: OBSS Packet Detection parameters.
|
||||
* @he_bss_color: BSS coloring settings, if BSS supports HE
|
||||
* @fils_discovery: FILS discovery configuration
|
||||
@ -856,6 +857,9 @@ enum mac80211_tx_info_flags {
|
||||
* it can be sent out.
|
||||
* @IEEE80211_TX_CTRL_NO_SEQNO: Do not overwrite the sequence number that
|
||||
* has already been assigned to this frame.
|
||||
* @IEEE80211_TX_CTRL_DONT_REORDER: This frame should not be reordered
|
||||
* relative to other frames that have this flag set, independent
|
||||
* of their QoS TID or other priority field values.
|
||||
*
|
||||
* These flags are used in tx_info->control.flags.
|
||||
*/
|
||||
@ -868,6 +872,7 @@ enum mac80211_tx_control_flags {
|
||||
IEEE80211_TX_CTRL_SKIP_MPATH_LOOKUP = BIT(5),
|
||||
IEEE80211_TX_INTCFL_NEED_TXPROCESSING = BIT(6),
|
||||
IEEE80211_TX_CTRL_NO_SEQNO = BIT(7),
|
||||
IEEE80211_TX_CTRL_DONT_REORDER = BIT(8),
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -757,7 +757,8 @@
|
||||
* of any other interfaces, and other interfaces will again take
|
||||
* precedence when they are used.
|
||||
*
|
||||
* @NL80211_CMD_SET_WDS_PEER: Set the MAC address of the peer on a WDS interface.
|
||||
* @NL80211_CMD_SET_WDS_PEER: Set the MAC address of the peer on a WDS interface
|
||||
* (no longer supported).
|
||||
*
|
||||
* @NL80211_CMD_SET_MULTICAST_TO_UNICAST: Configure if this AP should perform
|
||||
* multicast to unicast conversion. When enabled, all multicast packets
|
||||
@ -1750,8 +1751,9 @@ enum nl80211_commands {
|
||||
* specify just a single bitrate, which is to be used for the beacon.
|
||||
* The driver must also specify support for this with the extended
|
||||
* features NL80211_EXT_FEATURE_BEACON_RATE_LEGACY,
|
||||
* NL80211_EXT_FEATURE_BEACON_RATE_HT and
|
||||
* NL80211_EXT_FEATURE_BEACON_RATE_VHT.
|
||||
* NL80211_EXT_FEATURE_BEACON_RATE_HT,
|
||||
* NL80211_EXT_FEATURE_BEACON_RATE_VHT and
|
||||
* NL80211_EXT_FEATURE_BEACON_RATE_HE.
|
||||
*
|
||||
* @NL80211_ATTR_FRAME_MATCH: A binary attribute which typically must contain
|
||||
* at least one byte, currently used with @NL80211_CMD_REGISTER_FRAME.
|
||||
@ -2527,6 +2529,11 @@ enum nl80211_commands {
|
||||
* override mask. Used with NL80211_ATTR_S1G_CAPABILITY in
|
||||
* NL80211_CMD_ASSOCIATE or NL80211_CMD_CONNECT.
|
||||
*
|
||||
* @NL80211_ATTR_SAE_PWE: Indicates the mechanism(s) allowed for SAE PWE
|
||||
* derivation in WPA3-Personal networks which are using SAE authentication.
|
||||
* This is a u8 attribute that encapsulates one of the values from
|
||||
* &enum nl80211_sae_pwe_mechanism.
|
||||
*
|
||||
* @NUM_NL80211_ATTR: total number of nl80211_attrs available
|
||||
* @NL80211_ATTR_MAX: highest attribute number currently defined
|
||||
* @__NL80211_ATTR_AFTER_LAST: internal use
|
||||
@ -3016,6 +3023,8 @@ enum nl80211_attrs {
|
||||
NL80211_ATTR_S1G_CAPABILITY,
|
||||
NL80211_ATTR_S1G_CAPABILITY_MASK,
|
||||
|
||||
NL80211_ATTR_SAE_PWE,
|
||||
|
||||
/* add attributes here, update the policy in nl80211.c */
|
||||
|
||||
__NL80211_ATTR_AFTER_LAST,
|
||||
@ -5896,6 +5905,9 @@ enum nl80211_feature_flags {
|
||||
* @NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP: Driver/device supports
|
||||
* unsolicited broadcast probe response transmission
|
||||
*
|
||||
* @NL80211_EXT_FEATURE_BEACON_RATE_HE: Driver supports beacon rate
|
||||
* configuration (AP/mesh) with HE rates.
|
||||
*
|
||||
* @NUM_NL80211_EXT_FEATURES: number of extended features.
|
||||
* @MAX_NL80211_EXT_FEATURES: highest extended feature index.
|
||||
*/
|
||||
@ -5956,6 +5968,7 @@ enum nl80211_ext_feature_index {
|
||||
NL80211_EXT_FEATURE_SAE_OFFLOAD_AP,
|
||||
NL80211_EXT_FEATURE_FILS_DISCOVERY,
|
||||
NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP,
|
||||
NL80211_EXT_FEATURE_BEACON_RATE_HE,
|
||||
|
||||
/* add new features before the definition below */
|
||||
NUM_NL80211_EXT_FEATURES,
|
||||
@ -7124,4 +7137,23 @@ enum nl80211_unsol_bcast_probe_resp_attributes {
|
||||
NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_MAX =
|
||||
__NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_LAST - 1
|
||||
};
|
||||
|
||||
/**
|
||||
* enum nl80211_sae_pwe_mechanism - The mechanism(s) allowed for SAE PWE
|
||||
* derivation. Applicable only when WPA3-Personal SAE authentication is
|
||||
* used.
|
||||
*
|
||||
* @NL80211_SAE_PWE_UNSPECIFIED: not specified, used internally to indicate that
|
||||
* attribute is not present from userspace.
|
||||
* @NL80211_SAE_PWE_HUNT_AND_PECK: hunting-and-pecking loop only
|
||||
* @NL80211_SAE_PWE_HASH_TO_ELEMENT: hash-to-element only
|
||||
* @NL80211_SAE_PWE_BOTH: both hunting-and-pecking loop and hash-to-element
|
||||
* can be used.
|
||||
*/
|
||||
enum nl80211_sae_pwe_mechanism {
|
||||
NL80211_SAE_PWE_UNSPECIFIED,
|
||||
NL80211_SAE_PWE_HUNT_AND_PECK,
|
||||
NL80211_SAE_PWE_HASH_TO_ELEMENT,
|
||||
NL80211_SAE_PWE_BOTH,
|
||||
};
|
||||
#endif /* __LINUX_NL80211_H */
|
||||
|
@ -2708,16 +2708,6 @@ static int ieee80211_get_tx_power(struct wiphy *wiphy,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ieee80211_set_wds_peer(struct wiphy *wiphy, struct net_device *dev,
|
||||
const u8 *addr)
|
||||
{
|
||||
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
|
||||
|
||||
memcpy(&sdata->u.wds.remote_addr, addr, ETH_ALEN);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void ieee80211_rfkill_poll(struct wiphy *wiphy)
|
||||
{
|
||||
struct ieee80211_local *local = wiphy_priv(wiphy);
|
||||
@ -4138,7 +4128,6 @@ const struct cfg80211_ops mac80211_config_ops = {
|
||||
.set_wiphy_params = ieee80211_set_wiphy_params,
|
||||
.set_tx_power = ieee80211_set_tx_power,
|
||||
.get_tx_power = ieee80211_get_tx_power,
|
||||
.set_wds_peer = ieee80211_set_wds_peer,
|
||||
.rfkill_poll = ieee80211_rfkill_poll,
|
||||
CFG80211_TESTMODE_CMD(ieee80211_testmode_cmd)
|
||||
CFG80211_TESTMODE_DUMP(ieee80211_testmode_dump)
|
||||
|
@ -275,11 +275,11 @@ ieee80211_get_chanctx_max_required_bw(struct ieee80211_local *local,
|
||||
case NL80211_IFTYPE_NAN:
|
||||
continue;
|
||||
case NL80211_IFTYPE_ADHOC:
|
||||
case NL80211_IFTYPE_WDS:
|
||||
case NL80211_IFTYPE_MESH_POINT:
|
||||
case NL80211_IFTYPE_OCB:
|
||||
width = vif->bss_conf.chandef.width;
|
||||
break;
|
||||
case NL80211_IFTYPE_WDS:
|
||||
case NL80211_IFTYPE_UNSPECIFIED:
|
||||
case NUM_NL80211_IFTYPES:
|
||||
case NL80211_IFTYPE_MONITOR:
|
||||
@ -743,7 +743,6 @@ void ieee80211_recalc_smps_chanctx(struct ieee80211_local *local,
|
||||
continue;
|
||||
case NL80211_IFTYPE_AP:
|
||||
case NL80211_IFTYPE_ADHOC:
|
||||
case NL80211_IFTYPE_WDS:
|
||||
case NL80211_IFTYPE_MESH_POINT:
|
||||
case NL80211_IFTYPE_OCB:
|
||||
break;
|
||||
|
@ -574,9 +574,6 @@ static ssize_t ieee80211_if_parse_tsf(
|
||||
IEEE80211_IF_FILE_RW(tsf);
|
||||
|
||||
|
||||
/* WDS attributes */
|
||||
IEEE80211_IF_FILE(peer, u.wds.remote_addr, MAC);
|
||||
|
||||
#ifdef CONFIG_MAC80211_MESH
|
||||
IEEE80211_IF_FILE(estab_plinks, u.mesh.estab_plinks, ATOMIC);
|
||||
|
||||
@ -701,11 +698,6 @@ static void add_ibss_files(struct ieee80211_sub_if_data *sdata)
|
||||
DEBUGFS_ADD_MODE(tsf, 0600);
|
||||
}
|
||||
|
||||
static void add_wds_files(struct ieee80211_sub_if_data *sdata)
|
||||
{
|
||||
DEBUGFS_ADD(peer);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_MAC80211_MESH
|
||||
|
||||
static void add_mesh_files(struct ieee80211_sub_if_data *sdata)
|
||||
@ -805,9 +797,6 @@ static void add_files(struct ieee80211_sub_if_data *sdata)
|
||||
case NL80211_IFTYPE_AP_VLAN:
|
||||
add_vlan_files(sdata);
|
||||
break;
|
||||
case NL80211_IFTYPE_WDS:
|
||||
add_wds_files(sdata);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -274,7 +274,7 @@ static ssize_t sta_aql_read(struct file *file, char __user *userbuf,
|
||||
"Q limit[low/high]: VO: %u/%u VI: %u/%u BE: %u/%u BK: %u/%u\n",
|
||||
q_depth[0], q_depth[1], q_depth[2], q_depth[3],
|
||||
q_limit_l[0], q_limit_h[0], q_limit_l[1], q_limit_h[1],
|
||||
q_limit_l[2], q_limit_h[2], q_limit_l[3], q_limit_h[3]),
|
||||
q_limit_l[2], q_limit_h[2], q_limit_l[3], q_limit_h[3]);
|
||||
|
||||
rv = simple_read_from_buffer(userbuf, count, ppos, buf, p - buf);
|
||||
kfree(buf);
|
||||
|
@ -311,11 +311,6 @@ struct ieee80211_if_ap {
|
||||
bool multicast_to_unicast;
|
||||
};
|
||||
|
||||
struct ieee80211_if_wds {
|
||||
struct sta_info *sta;
|
||||
u8 remote_addr[ETH_ALEN];
|
||||
};
|
||||
|
||||
struct ieee80211_if_vlan {
|
||||
struct list_head list; /* write-protected with RTNL and local->mtx */
|
||||
|
||||
@ -985,7 +980,6 @@ struct ieee80211_sub_if_data {
|
||||
|
||||
union {
|
||||
struct ieee80211_if_ap ap;
|
||||
struct ieee80211_if_wds wds;
|
||||
struct ieee80211_if_vlan vlan;
|
||||
struct ieee80211_if_managed mgd;
|
||||
struct ieee80211_if_ibss ibss;
|
||||
|
@ -230,10 +230,6 @@ static inline int identical_mac_addr_allowed(int type1, int type2)
|
||||
type2 == NL80211_IFTYPE_MONITOR ||
|
||||
type1 == NL80211_IFTYPE_P2P_DEVICE ||
|
||||
type2 == NL80211_IFTYPE_P2P_DEVICE ||
|
||||
(type1 == NL80211_IFTYPE_AP && type2 == NL80211_IFTYPE_WDS) ||
|
||||
(type1 == NL80211_IFTYPE_WDS &&
|
||||
(type2 == NL80211_IFTYPE_WDS ||
|
||||
type2 == NL80211_IFTYPE_AP)) ||
|
||||
(type1 == NL80211_IFTYPE_AP && type2 == NL80211_IFTYPE_AP_VLAN) ||
|
||||
(type1 == NL80211_IFTYPE_AP_VLAN &&
|
||||
(type2 == NL80211_IFTYPE_AP ||
|
||||
@ -417,15 +413,12 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata,
|
||||
* (because if we remove a STA after ops->remove_interface()
|
||||
* the driver will have removed the vif info already!)
|
||||
*
|
||||
* In WDS mode a station must exist here and be flushed, for
|
||||
* AP_VLANs stations may exist since there's nothing else that
|
||||
* For AP_VLANs stations may exist since there's nothing else that
|
||||
* would have removed them, but in other modes there shouldn't
|
||||
* be any stations.
|
||||
*/
|
||||
flushed = sta_info_flush(sdata);
|
||||
WARN_ON_ONCE(sdata->vif.type != NL80211_IFTYPE_AP_VLAN &&
|
||||
((sdata->vif.type != NL80211_IFTYPE_WDS && flushed > 0) ||
|
||||
(sdata->vif.type == NL80211_IFTYPE_WDS && flushed != 1)));
|
||||
WARN_ON_ONCE(sdata->vif.type != NL80211_IFTYPE_AP_VLAN && flushed > 0);
|
||||
|
||||
/* don't count this interface for allmulti while it is down */
|
||||
if (sdata->flags & IEEE80211_SDATA_ALLMULTI)
|
||||
@ -552,8 +545,7 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata,
|
||||
* When we get here, the interface is marked down.
|
||||
* Free the remaining keys, if there are any
|
||||
* (which can happen in AP mode if userspace sets
|
||||
* keys before the interface is operating, and maybe
|
||||
* also in WDS mode)
|
||||
* keys before the interface is operating)
|
||||
*
|
||||
* Force the key freeing to always synchronize_net()
|
||||
* to wait for the RX path in case it is using this
|
||||
@ -1020,16 +1012,11 @@ int ieee80211_do_open(struct wireless_dev *wdev, bool coming_up)
|
||||
struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
|
||||
struct net_device *dev = wdev->netdev;
|
||||
struct ieee80211_local *local = sdata->local;
|
||||
struct sta_info *sta;
|
||||
u32 changed = 0;
|
||||
int res;
|
||||
u32 hw_reconf_flags = 0;
|
||||
|
||||
switch (sdata->vif.type) {
|
||||
case NL80211_IFTYPE_WDS:
|
||||
if (!is_valid_ether_addr(sdata->u.wds.remote_addr))
|
||||
return -ENOLINK;
|
||||
break;
|
||||
case NL80211_IFTYPE_AP_VLAN: {
|
||||
struct ieee80211_sub_if_data *master;
|
||||
|
||||
@ -1078,6 +1065,7 @@ int ieee80211_do_open(struct wireless_dev *wdev, bool coming_up)
|
||||
case NUM_NL80211_IFTYPES:
|
||||
case NL80211_IFTYPE_P2P_CLIENT:
|
||||
case NL80211_IFTYPE_P2P_GO:
|
||||
case NL80211_IFTYPE_WDS:
|
||||
/* cannot happen */
|
||||
WARN_ON(1);
|
||||
break;
|
||||
@ -1196,7 +1184,6 @@ int ieee80211_do_open(struct wireless_dev *wdev, bool coming_up)
|
||||
case NL80211_IFTYPE_OCB:
|
||||
netif_carrier_off(dev);
|
||||
break;
|
||||
case NL80211_IFTYPE_WDS:
|
||||
case NL80211_IFTYPE_P2P_DEVICE:
|
||||
case NL80211_IFTYPE_NAN:
|
||||
break;
|
||||
@ -1218,28 +1205,6 @@ int ieee80211_do_open(struct wireless_dev *wdev, bool coming_up)
|
||||
set_bit(SDATA_STATE_RUNNING, &sdata->state);
|
||||
|
||||
switch (sdata->vif.type) {
|
||||
case NL80211_IFTYPE_WDS:
|
||||
/* Create STA entry for the WDS peer */
|
||||
sta = sta_info_alloc(sdata, sdata->u.wds.remote_addr,
|
||||
GFP_KERNEL);
|
||||
if (!sta) {
|
||||
res = -ENOMEM;
|
||||
goto err_del_interface;
|
||||
}
|
||||
|
||||
sta_info_pre_move_state(sta, IEEE80211_STA_AUTH);
|
||||
sta_info_pre_move_state(sta, IEEE80211_STA_ASSOC);
|
||||
sta_info_pre_move_state(sta, IEEE80211_STA_AUTHORIZED);
|
||||
|
||||
res = sta_info_insert(sta);
|
||||
if (res) {
|
||||
/* STA has been freed */
|
||||
goto err_del_interface;
|
||||
}
|
||||
|
||||
rate_control_rate_init(sta);
|
||||
netif_carrier_on(dev);
|
||||
break;
|
||||
case NL80211_IFTYPE_P2P_DEVICE:
|
||||
rcu_assign_pointer(local->p2p_sdata, sdata);
|
||||
break;
|
||||
@ -1576,9 +1541,6 @@ static void ieee80211_setup_sdata(struct ieee80211_sub_if_data *sdata,
|
||||
sdata->u.mntr.flags = MONITOR_FLAG_CONTROL |
|
||||
MONITOR_FLAG_OTHER_BSS;
|
||||
break;
|
||||
case NL80211_IFTYPE_WDS:
|
||||
sdata->vif.bss_conf.bssid = NULL;
|
||||
break;
|
||||
case NL80211_IFTYPE_NAN:
|
||||
idr_init(&sdata->u.nan.function_inst_ids);
|
||||
spin_lock_init(&sdata->u.nan.func_lock);
|
||||
@ -1589,6 +1551,7 @@ static void ieee80211_setup_sdata(struct ieee80211_sub_if_data *sdata,
|
||||
sdata->vif.bss_conf.bssid = sdata->vif.addr;
|
||||
break;
|
||||
case NL80211_IFTYPE_UNSPECIFIED:
|
||||
case NL80211_IFTYPE_WDS:
|
||||
case NUM_NL80211_IFTYPES:
|
||||
WARN_ON(1);
|
||||
break;
|
||||
@ -1633,9 +1596,7 @@ static int ieee80211_runtime_change_iftype(struct ieee80211_sub_if_data *sdata,
|
||||
case NL80211_IFTYPE_OCB:
|
||||
/*
|
||||
* Could probably support everything
|
||||
* but WDS here (WDS do_open can fail
|
||||
* under memory pressure, which this
|
||||
* code isn't prepared to handle).
|
||||
* but here.
|
||||
*/
|
||||
break;
|
||||
case NL80211_IFTYPE_P2P_CLIENT:
|
||||
@ -1728,7 +1689,6 @@ static void ieee80211_assign_perm_addr(struct ieee80211_local *local,
|
||||
case NL80211_IFTYPE_MONITOR:
|
||||
/* doesn't matter */
|
||||
break;
|
||||
case NL80211_IFTYPE_WDS:
|
||||
case NL80211_IFTYPE_AP_VLAN:
|
||||
/* match up with an AP interface */
|
||||
list_for_each_entry(sdata, &local->interfaces, list) {
|
||||
|
@ -931,14 +931,6 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
|
||||
return -EINVAL;
|
||||
}
|
||||
} else {
|
||||
/*
|
||||
* WDS is currently prohibited when channel contexts are used
|
||||
* because there's no clear definition of which channel WDS
|
||||
* type interfaces use
|
||||
*/
|
||||
if (local->hw.wiphy->interface_modes & BIT(NL80211_IFTYPE_WDS))
|
||||
return -EINVAL;
|
||||
|
||||
/* DFS is not supported with multi-channel combinations yet */
|
||||
for (i = 0; i < local->hw.wiphy->n_iface_combinations; i++) {
|
||||
const struct ieee80211_iface_combination *comb;
|
||||
|
@ -667,6 +667,35 @@ void ieee80211_mesh_root_setup(struct ieee80211_if_mesh *ifmsh)
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
ieee80211_mesh_update_bss_params(struct ieee80211_sub_if_data *sdata,
|
||||
u8 *ie, u8 ie_len)
|
||||
{
|
||||
struct ieee80211_supported_band *sband;
|
||||
const u8 *cap;
|
||||
const struct ieee80211_he_operation *he_oper = NULL;
|
||||
|
||||
sband = ieee80211_get_sband(sdata);
|
||||
if (!sband)
|
||||
return;
|
||||
|
||||
if (!ieee80211_get_he_iftype_cap(sband, NL80211_IFTYPE_MESH_POINT) ||
|
||||
sdata->vif.bss_conf.chandef.width == NL80211_CHAN_WIDTH_20_NOHT ||
|
||||
sdata->vif.bss_conf.chandef.width == NL80211_CHAN_WIDTH_5 ||
|
||||
sdata->vif.bss_conf.chandef.width == NL80211_CHAN_WIDTH_10)
|
||||
return;
|
||||
|
||||
sdata->vif.bss_conf.he_support = true;
|
||||
|
||||
cap = cfg80211_find_ext_ie(WLAN_EID_EXT_HE_OPERATION, ie, ie_len);
|
||||
if (cap && cap[1] >= ieee80211_he_oper_size(&cap[3]))
|
||||
he_oper = (void *)(cap + 3);
|
||||
|
||||
if (he_oper)
|
||||
sdata->vif.bss_conf.he_oper.params =
|
||||
__le32_to_cpu(he_oper->he_oper_params);
|
||||
}
|
||||
|
||||
/**
|
||||
* ieee80211_fill_mesh_addresses - fill addresses of a locally originated mesh frame
|
||||
* @hdr: 802.11 frame header
|
||||
@ -943,6 +972,7 @@ ieee80211_mesh_build_beacon(struct ieee80211_if_mesh *ifmsh)
|
||||
|
||||
bcn->tail_len = skb->len;
|
||||
memcpy(bcn->tail, skb->data, bcn->tail_len);
|
||||
ieee80211_mesh_update_bss_params(sdata, bcn->tail, bcn->tail_len);
|
||||
bcn->meshconf = (struct ieee80211_meshconf_ie *)
|
||||
(bcn->tail + ifmsh->meshconf_offset);
|
||||
|
||||
|
@ -150,21 +150,6 @@ int __ieee80211_suspend(struct ieee80211_hw *hw, struct cfg80211_wowlan *wowlan)
|
||||
case NL80211_IFTYPE_STATION:
|
||||
ieee80211_mgd_quiesce(sdata);
|
||||
break;
|
||||
case NL80211_IFTYPE_WDS:
|
||||
/* tear down aggregation sessions and remove STAs */
|
||||
mutex_lock(&local->sta_mtx);
|
||||
sta = sdata->u.wds.sta;
|
||||
if (sta && sta->uploaded) {
|
||||
enum ieee80211_sta_state state;
|
||||
|
||||
state = sta->sta_state;
|
||||
for (; state > IEEE80211_STA_NOTEXIST; state--)
|
||||
WARN_ON(drv_sta_state(local, sta->sdata,
|
||||
sta, state,
|
||||
state - 1));
|
||||
}
|
||||
mutex_unlock(&local->sta_mtx);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -1477,7 +1477,6 @@ ieee80211_rx_h_check(struct ieee80211_rx_data *rx)
|
||||
if (unlikely((ieee80211_is_data(hdr->frame_control) ||
|
||||
ieee80211_is_pspoll(hdr->frame_control)) &&
|
||||
rx->sdata->vif.type != NL80211_IFTYPE_ADHOC &&
|
||||
rx->sdata->vif.type != NL80211_IFTYPE_WDS &&
|
||||
rx->sdata->vif.type != NL80211_IFTYPE_OCB &&
|
||||
(!rx->sta || !test_sta_flag(rx->sta, WLAN_STA_ASSOC)))) {
|
||||
/*
|
||||
@ -4080,10 +4079,6 @@ static bool ieee80211_accept_frame(struct ieee80211_rx_data *rx)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
case NL80211_IFTYPE_WDS:
|
||||
if (bssid || !ieee80211_is_data(hdr->frame_control))
|
||||
return false;
|
||||
return ether_addr_equal(sdata->u.wds.remote_addr, hdr->addr2);
|
||||
case NL80211_IFTYPE_P2P_DEVICE:
|
||||
return ieee80211_is_public_action(hdr, skb->len) ||
|
||||
ieee80211_is_probe_req(hdr->frame_control) ||
|
||||
|
@ -319,9 +319,6 @@ ieee80211_tx_h_check_assoc(struct ieee80211_tx_data *tx)
|
||||
if (tx->sdata->vif.type == NL80211_IFTYPE_OCB)
|
||||
return TX_CONTINUE;
|
||||
|
||||
if (tx->sdata->vif.type == NL80211_IFTYPE_WDS)
|
||||
return TX_CONTINUE;
|
||||
|
||||
if (tx->flags & IEEE80211_TX_PS_BUFFERED)
|
||||
return TX_CONTINUE;
|
||||
|
||||
@ -2113,6 +2110,9 @@ bool ieee80211_parse_tx_radiotap(struct sk_buff *skb,
|
||||
info->flags |= IEEE80211_TX_CTL_NO_ACK;
|
||||
if (txflags & IEEE80211_RADIOTAP_F_TX_NOSEQNO)
|
||||
info->control.flags |= IEEE80211_TX_CTRL_NO_SEQNO;
|
||||
if (txflags & IEEE80211_RADIOTAP_F_TX_ORDER)
|
||||
info->control.flags |=
|
||||
IEEE80211_TX_CTRL_DONT_REORDER;
|
||||
break;
|
||||
|
||||
case IEEE80211_RADIOTAP_RATE:
|
||||
@ -2279,11 +2279,13 @@ netdev_tx_t ieee80211_monitor_start_xmit(struct sk_buff *skb,
|
||||
payload[7]);
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize skb->priority for QoS frames. This is put in the TID field
|
||||
* of the frame before passing it to the driver.
|
||||
/* Initialize skb->priority for QoS frames. If the DONT_REORDER flag
|
||||
* is set, stick to the default value for skb->priority to assure
|
||||
* frames injected with this flag are not reordered relative to each
|
||||
* other.
|
||||
*/
|
||||
if (ieee80211_is_data_qos(hdr->frame_control)) {
|
||||
if (ieee80211_is_data_qos(hdr->frame_control) &&
|
||||
!(info->control.flags & IEEE80211_TX_CTRL_DONT_REORDER)) {
|
||||
u8 *p = ieee80211_get_qos_ctl(hdr);
|
||||
skb->priority = *p & IEEE80211_QOS_CTL_TAG1D_MASK;
|
||||
}
|
||||
@ -2295,8 +2297,7 @@ netdev_tx_t ieee80211_monitor_start_xmit(struct sk_buff *skb,
|
||||
* we handle as though they are non-injected frames.
|
||||
* This code here isn't entirely correct, the local MAC address
|
||||
* isn't always enough to find the interface to use; for proper
|
||||
* VLAN/WDS support we will need a different mechanism (which
|
||||
* likely isn't going to be monitor interfaces).
|
||||
* VLAN support we have an nl80211-based mechanism.
|
||||
*
|
||||
* This is necessary, for example, for old hostapd versions that
|
||||
* don't use nl80211-based management TX/RX.
|
||||
@ -2307,8 +2308,7 @@ netdev_tx_t ieee80211_monitor_start_xmit(struct sk_buff *skb,
|
||||
if (!ieee80211_sdata_running(tmp_sdata))
|
||||
continue;
|
||||
if (tmp_sdata->vif.type == NL80211_IFTYPE_MONITOR ||
|
||||
tmp_sdata->vif.type == NL80211_IFTYPE_AP_VLAN ||
|
||||
tmp_sdata->vif.type == NL80211_IFTYPE_WDS)
|
||||
tmp_sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
|
||||
continue;
|
||||
if (ether_addr_equal(tmp_sdata->vif.addr, hdr->addr2)) {
|
||||
sdata = tmp_sdata;
|
||||
@ -2402,9 +2402,6 @@ int ieee80211_lookup_ra_sta(struct ieee80211_sub_if_data *sdata,
|
||||
}
|
||||
sta = sta_info_get_bss(sdata, skb->data);
|
||||
break;
|
||||
case NL80211_IFTYPE_WDS:
|
||||
sta = sta_info_get(sdata, sdata->u.wds.remote_addr);
|
||||
break;
|
||||
#ifdef CONFIG_MAC80211_MESH
|
||||
case NL80211_IFTYPE_MESH_POINT:
|
||||
/* determined much later */
|
||||
@ -2580,20 +2577,6 @@ static struct sk_buff *ieee80211_build_hdr(struct ieee80211_sub_if_data *sdata,
|
||||
hdrlen = 24;
|
||||
band = chanctx_conf->def.chan->band;
|
||||
break;
|
||||
case NL80211_IFTYPE_WDS:
|
||||
fc |= cpu_to_le16(IEEE80211_FCTL_FROMDS | IEEE80211_FCTL_TODS);
|
||||
/* RA TA DA SA */
|
||||
memcpy(hdr.addr1, sdata->u.wds.remote_addr, ETH_ALEN);
|
||||
memcpy(hdr.addr2, sdata->vif.addr, ETH_ALEN);
|
||||
memcpy(hdr.addr3, skb->data, ETH_ALEN);
|
||||
memcpy(hdr.addr4, skb->data + ETH_ALEN, ETH_ALEN);
|
||||
hdrlen = 30;
|
||||
/*
|
||||
* This is the exception! WDS style interfaces are prohibited
|
||||
* when channel contexts are in used so this must be valid
|
||||
*/
|
||||
band = local->hw.conf.chandef.chan->band;
|
||||
break;
|
||||
#ifdef CONFIG_MAC80211_MESH
|
||||
case NL80211_IFTYPE_MESH_POINT:
|
||||
if (!is_multicast_ether_addr(skb->data)) {
|
||||
|
@ -2514,7 +2514,6 @@ int ieee80211_reconfig(struct ieee80211_local *local)
|
||||
return res;
|
||||
}
|
||||
break;
|
||||
case NL80211_IFTYPE_WDS:
|
||||
case NL80211_IFTYPE_AP_VLAN:
|
||||
case NL80211_IFTYPE_MONITOR:
|
||||
case NL80211_IFTYPE_P2P_DEVICE:
|
||||
@ -2524,6 +2523,7 @@ int ieee80211_reconfig(struct ieee80211_local *local)
|
||||
case NUM_NL80211_IFTYPES:
|
||||
case NL80211_IFTYPE_P2P_CLIENT:
|
||||
case NL80211_IFTYPE_P2P_GO:
|
||||
case NL80211_IFTYPE_WDS:
|
||||
WARN_ON(1);
|
||||
break;
|
||||
}
|
||||
|
@ -118,9 +118,11 @@ u16 ieee80211_select_queue_80211(struct ieee80211_sub_if_data *sdata,
|
||||
struct ieee80211_hdr *hdr)
|
||||
{
|
||||
struct ieee80211_local *local = sdata->local;
|
||||
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
|
||||
u8 *p;
|
||||
|
||||
if (local->hw.queues < IEEE80211_NUM_ACS)
|
||||
if ((info->control.flags & IEEE80211_TX_CTRL_DONT_REORDER) ||
|
||||
local->hw.queues < IEEE80211_NUM_ACS)
|
||||
return 0;
|
||||
|
||||
if (!ieee80211_is_data(hdr->frame_control)) {
|
||||
@ -141,6 +143,7 @@ u16 ieee80211_select_queue_80211(struct ieee80211_sub_if_data *sdata,
|
||||
u16 __ieee80211_select_queue(struct ieee80211_sub_if_data *sdata,
|
||||
struct sta_info *sta, struct sk_buff *skb)
|
||||
{
|
||||
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
|
||||
struct mac80211_qos_map *qos_map;
|
||||
bool qos;
|
||||
|
||||
@ -153,7 +156,7 @@ u16 __ieee80211_select_queue(struct ieee80211_sub_if_data *sdata,
|
||||
else
|
||||
qos = false;
|
||||
|
||||
if (!qos) {
|
||||
if (!qos || (info->control.flags & IEEE80211_TX_CTRL_DONT_REORDER)) {
|
||||
skb->priority = 0; /* required for correct WPA/11i MIC */
|
||||
return IEEE80211_AC_BE;
|
||||
}
|
||||
@ -202,9 +205,6 @@ u16 ieee80211_select_queue(struct ieee80211_sub_if_data *sdata,
|
||||
case NL80211_IFTYPE_AP:
|
||||
ra = skb->data;
|
||||
break;
|
||||
case NL80211_IFTYPE_WDS:
|
||||
ra = sdata->u.wds.remote_addr;
|
||||
break;
|
||||
case NL80211_IFTYPE_STATION:
|
||||
/* might be a TDLS station */
|
||||
sta = sta_info_get(sdata, skb->data);
|
||||
@ -249,6 +249,14 @@ void ieee80211_set_qos_hdr(struct ieee80211_sub_if_data *sdata,
|
||||
|
||||
p = ieee80211_get_qos_ctl(hdr);
|
||||
|
||||
/* don't overwrite the QoS field of injected frames */
|
||||
if (info->flags & IEEE80211_TX_CTL_INJECTED) {
|
||||
/* do take into account Ack policy of injected frames */
|
||||
if (*p & IEEE80211_QOS_CTL_ACK_POLICY_NOACK)
|
||||
info->flags |= IEEE80211_TX_CTL_NO_ACK;
|
||||
return;
|
||||
}
|
||||
|
||||
/* set up the first byte */
|
||||
|
||||
/*
|
||||
|
@ -530,10 +530,10 @@ int cfg80211_chandef_dfs_required(struct wiphy *wiphy,
|
||||
case NL80211_IFTYPE_P2P_CLIENT:
|
||||
case NL80211_IFTYPE_MONITOR:
|
||||
case NL80211_IFTYPE_AP_VLAN:
|
||||
case NL80211_IFTYPE_WDS:
|
||||
case NL80211_IFTYPE_P2P_DEVICE:
|
||||
case NL80211_IFTYPE_NAN:
|
||||
break;
|
||||
case NL80211_IFTYPE_WDS:
|
||||
case NL80211_IFTYPE_UNSPECIFIED:
|
||||
case NUM_NL80211_IFTYPES:
|
||||
WARN_ON(1);
|
||||
@ -677,12 +677,12 @@ bool cfg80211_beaconing_iface_active(struct wireless_dev *wdev)
|
||||
case NL80211_IFTYPE_P2P_CLIENT:
|
||||
case NL80211_IFTYPE_MONITOR:
|
||||
case NL80211_IFTYPE_AP_VLAN:
|
||||
case NL80211_IFTYPE_WDS:
|
||||
case NL80211_IFTYPE_P2P_DEVICE:
|
||||
/* Can NAN type be considered as beaconing interface? */
|
||||
case NL80211_IFTYPE_NAN:
|
||||
break;
|
||||
case NL80211_IFTYPE_UNSPECIFIED:
|
||||
case NL80211_IFTYPE_WDS:
|
||||
case NUM_NL80211_IFTYPES:
|
||||
WARN_ON(1);
|
||||
}
|
||||
@ -1324,12 +1324,12 @@ cfg80211_get_chan_state(struct wireless_dev *wdev,
|
||||
break;
|
||||
case NL80211_IFTYPE_MONITOR:
|
||||
case NL80211_IFTYPE_AP_VLAN:
|
||||
case NL80211_IFTYPE_WDS:
|
||||
case NL80211_IFTYPE_P2P_DEVICE:
|
||||
case NL80211_IFTYPE_NAN:
|
||||
/* these interface types don't really have a channel */
|
||||
return;
|
||||
case NL80211_IFTYPE_UNSPECIFIED:
|
||||
case NL80211_IFTYPE_WDS:
|
||||
case NUM_NL80211_IFTYPES:
|
||||
WARN_ON(1);
|
||||
}
|
||||
|
@ -631,10 +631,8 @@ static int wiphy_verify_combinations(struct wiphy *wiphy)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
#ifndef CONFIG_WIRELESS_WDS
|
||||
if (WARN_ON(all_iftypes & BIT(NL80211_IFTYPE_WDS)))
|
||||
return -EINVAL;
|
||||
#endif
|
||||
|
||||
/* You can't even choose that many! */
|
||||
if (WARN_ON(cnt < c->max_interfaces))
|
||||
@ -675,10 +673,8 @@ int wiphy_register(struct wiphy *wiphy)
|
||||
!(wiphy->nan_supported_bands & BIT(NL80211_BAND_2GHZ)))))
|
||||
return -EINVAL;
|
||||
|
||||
#ifndef CONFIG_WIRELESS_WDS
|
||||
if (WARN_ON(wiphy->interface_modes & BIT(NL80211_IFTYPE_WDS)))
|
||||
return -EINVAL;
|
||||
#endif
|
||||
|
||||
if (WARN_ON(wiphy->pmsr_capa && !wiphy->pmsr_capa->ftm.supported))
|
||||
return -EINVAL;
|
||||
@ -1202,9 +1198,6 @@ void __cfg80211_leave(struct cfg80211_registered_device *rdev,
|
||||
case NL80211_IFTYPE_OCB:
|
||||
__cfg80211_leave_ocb(rdev, dev);
|
||||
break;
|
||||
case NL80211_IFTYPE_WDS:
|
||||
/* must be handled by mac80211/driver, has no APIs */
|
||||
break;
|
||||
case NL80211_IFTYPE_P2P_DEVICE:
|
||||
case NL80211_IFTYPE_NAN:
|
||||
/* cannot happen, has no netdev */
|
||||
@ -1214,6 +1207,7 @@ void __cfg80211_leave(struct cfg80211_registered_device *rdev,
|
||||
/* nothing to do */
|
||||
break;
|
||||
case NL80211_IFTYPE_UNSPECIFIED:
|
||||
case NL80211_IFTYPE_WDS:
|
||||
case NUM_NL80211_IFTYPES:
|
||||
/* invalid */
|
||||
break;
|
||||
|
@ -715,6 +715,9 @@ static const struct nla_policy nl80211_policy[NUM_NL80211_ATTR] = {
|
||||
NLA_POLICY_EXACT_LEN(IEEE80211_S1G_CAPABILITY_LEN),
|
||||
[NL80211_ATTR_S1G_CAPABILITY_MASK] =
|
||||
NLA_POLICY_EXACT_LEN(IEEE80211_S1G_CAPABILITY_LEN),
|
||||
[NL80211_ATTR_SAE_PWE] =
|
||||
NLA_POLICY_RANGE(NLA_U8, NL80211_SAE_PWE_HUNT_AND_PECK,
|
||||
NL80211_SAE_PWE_BOTH),
|
||||
};
|
||||
|
||||
/* policy for the key attributes */
|
||||
@ -1882,7 +1885,6 @@ static int nl80211_add_commands_unsplit(struct cfg80211_registered_device *rdev,
|
||||
if (nla_put_u32(msg, i, NL80211_CMD_SET_CHANNEL))
|
||||
goto nla_put_failure;
|
||||
}
|
||||
CMD(set_wds_peer, SET_WDS_PEER);
|
||||
if (rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) {
|
||||
CMD(tdls_mgmt, TDLS_MGMT);
|
||||
CMD(tdls_oper, TDLS_OPER);
|
||||
@ -2860,8 +2862,8 @@ static int parse_txq_params(struct nlattr *tb[],
|
||||
static bool nl80211_can_set_dev_channel(struct wireless_dev *wdev)
|
||||
{
|
||||
/*
|
||||
* You can only set the channel explicitly for WDS interfaces,
|
||||
* all others have their channel managed via their respective
|
||||
* You can only set the channel explicitly for some interfaces,
|
||||
* most have their channel managed via their respective
|
||||
* "establish a connection" command (connect, join, ...)
|
||||
*
|
||||
* For AP/GO and mesh mode, the channel can be set with the
|
||||
@ -3066,29 +3068,6 @@ static int nl80211_set_channel(struct sk_buff *skb, struct genl_info *info)
|
||||
return __nl80211_set_channel(rdev, netdev, info);
|
||||
}
|
||||
|
||||
static int nl80211_set_wds_peer(struct sk_buff *skb, struct genl_info *info)
|
||||
{
|
||||
struct cfg80211_registered_device *rdev = info->user_ptr[0];
|
||||
struct net_device *dev = info->user_ptr[1];
|
||||
struct wireless_dev *wdev = dev->ieee80211_ptr;
|
||||
const u8 *bssid;
|
||||
|
||||
if (!info->attrs[NL80211_ATTR_MAC])
|
||||
return -EINVAL;
|
||||
|
||||
if (netif_running(dev))
|
||||
return -EBUSY;
|
||||
|
||||
if (!rdev->ops->set_wds_peer)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (wdev->iftype != NL80211_IFTYPE_WDS)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
|
||||
return rdev_set_wds_peer(rdev, dev, bssid);
|
||||
}
|
||||
|
||||
static int nl80211_set_wiphy(struct sk_buff *skb, struct genl_info *info)
|
||||
{
|
||||
struct cfg80211_registered_device *rdev;
|
||||
@ -4595,7 +4574,8 @@ static int nl80211_parse_tx_bitrate_mask(struct genl_info *info,
|
||||
struct nlattr *attrs[],
|
||||
enum nl80211_attrs attr,
|
||||
struct cfg80211_bitrate_mask *mask,
|
||||
struct net_device *dev)
|
||||
struct net_device *dev,
|
||||
bool default_all_enabled)
|
||||
{
|
||||
struct nlattr *tb[NL80211_TXRATE_MAX + 1];
|
||||
struct cfg80211_registered_device *rdev = info->user_ptr[0];
|
||||
@ -4610,6 +4590,9 @@ static int nl80211_parse_tx_bitrate_mask(struct genl_info *info,
|
||||
for (i = 0; i < NUM_NL80211_BANDS; i++) {
|
||||
const struct ieee80211_sta_he_cap *he_cap;
|
||||
|
||||
if (!default_all_enabled)
|
||||
break;
|
||||
|
||||
sband = rdev->wiphy.bands[i];
|
||||
|
||||
if (!sband)
|
||||
@ -4677,6 +4660,7 @@ static int nl80211_parse_tx_bitrate_mask(struct genl_info *info,
|
||||
mask->control[band].ht_mcs))
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (tb[NL80211_TXRATE_VHT]) {
|
||||
if (!vht_set_mcs_mask(
|
||||
sband,
|
||||
@ -4684,6 +4668,7 @@ static int nl80211_parse_tx_bitrate_mask(struct genl_info *info,
|
||||
mask->control[band].vht_mcs))
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (tb[NL80211_TXRATE_GI]) {
|
||||
mask->control[band].gi =
|
||||
nla_get_u8(tb[NL80211_TXRATE_GI]);
|
||||
@ -4695,6 +4680,7 @@ static int nl80211_parse_tx_bitrate_mask(struct genl_info *info,
|
||||
nla_data(tb[NL80211_TXRATE_HE]),
|
||||
mask->control[band].he_mcs))
|
||||
return -EINVAL;
|
||||
|
||||
if (tb[NL80211_TXRATE_HE_GI])
|
||||
mask->control[band].he_gi =
|
||||
nla_get_u8(tb[NL80211_TXRATE_HE_GI]);
|
||||
@ -4736,7 +4722,7 @@ static int validate_beacon_tx_rate(struct cfg80211_registered_device *rdev,
|
||||
enum nl80211_band band,
|
||||
struct cfg80211_bitrate_mask *beacon_rate)
|
||||
{
|
||||
u32 count_ht, count_vht, i;
|
||||
u32 count_ht, count_vht, count_he, i;
|
||||
u32 rate = beacon_rate->control[band].legacy;
|
||||
|
||||
/* Allow only one rate */
|
||||
@ -4769,7 +4755,21 @@ static int validate_beacon_tx_rate(struct cfg80211_registered_device *rdev,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if ((count_ht && count_vht) || (!rate && !count_ht && !count_vht))
|
||||
count_he = 0;
|
||||
for (i = 0; i < NL80211_HE_NSS_MAX; i++) {
|
||||
if (hweight16(beacon_rate->control[band].he_mcs[i]) > 1) {
|
||||
return -EINVAL;
|
||||
} else if (beacon_rate->control[band].he_mcs[i]) {
|
||||
count_he++;
|
||||
if (count_he > 1)
|
||||
return -EINVAL;
|
||||
}
|
||||
if (count_he && rate)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if ((count_ht && count_vht && count_he) ||
|
||||
(!rate && !count_ht && !count_vht && !count_he))
|
||||
return -EINVAL;
|
||||
|
||||
if (rate &&
|
||||
@ -4784,6 +4784,10 @@ static int validate_beacon_tx_rate(struct cfg80211_registered_device *rdev,
|
||||
!wiphy_ext_feature_isset(&rdev->wiphy,
|
||||
NL80211_EXT_FEATURE_BEACON_RATE_VHT))
|
||||
return -EINVAL;
|
||||
if (count_he &&
|
||||
!wiphy_ext_feature_isset(&rdev->wiphy,
|
||||
NL80211_EXT_FEATURE_BEACON_RATE_HE))
|
||||
return -EINVAL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -5244,7 +5248,7 @@ static int nl80211_start_ap(struct sk_buff *skb, struct genl_info *info)
|
||||
err = nl80211_parse_tx_bitrate_mask(info, info->attrs,
|
||||
NL80211_ATTR_TX_RATES,
|
||||
¶ms.beacon_rate,
|
||||
dev);
|
||||
dev, false);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
@ -9732,6 +9736,12 @@ static int nl80211_crypto_settings(struct cfg80211_registered_device *rdev,
|
||||
nla_len(info->attrs[NL80211_ATTR_SAE_PASSWORD]);
|
||||
}
|
||||
|
||||
if (info->attrs[NL80211_ATTR_SAE_PWE])
|
||||
settings->sae_pwe =
|
||||
nla_get_u8(info->attrs[NL80211_ATTR_SAE_PWE]);
|
||||
else
|
||||
settings->sae_pwe = NL80211_SAE_PWE_UNSPECIFIED;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -11088,7 +11098,7 @@ static int nl80211_set_tx_bitrate_mask(struct sk_buff *skb,
|
||||
|
||||
err = nl80211_parse_tx_bitrate_mask(info, info->attrs,
|
||||
NL80211_ATTR_TX_RATES, &mask,
|
||||
dev);
|
||||
dev, true);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
@ -11697,7 +11707,7 @@ static int nl80211_join_mesh(struct sk_buff *skb, struct genl_info *info)
|
||||
err = nl80211_parse_tx_bitrate_mask(info, info->attrs,
|
||||
NL80211_ATTR_TX_RATES,
|
||||
&setup.beacon_rate,
|
||||
dev);
|
||||
dev, false);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
@ -14477,7 +14487,8 @@ static int parse_tid_conf(struct cfg80211_registered_device *rdev,
|
||||
if (tid_conf->txrate_type != NL80211_TX_RATE_AUTOMATIC) {
|
||||
attr = NL80211_TID_CONFIG_ATTR_TX_RATE;
|
||||
err = nl80211_parse_tx_bitrate_mask(info, attrs, attr,
|
||||
&tid_conf->txrate_mask, dev);
|
||||
&tid_conf->txrate_mask, dev,
|
||||
true);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
@ -15139,14 +15150,6 @@ static const struct genl_small_ops nl80211_small_ops[] = {
|
||||
.internal_flags = NL80211_FLAG_NEED_NETDEV |
|
||||
NL80211_FLAG_NEED_RTNL,
|
||||
},
|
||||
{
|
||||
.cmd = NL80211_CMD_SET_WDS_PEER,
|
||||
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
||||
.doit = nl80211_set_wds_peer,
|
||||
.flags = GENL_UNS_ADMIN_PERM,
|
||||
.internal_flags = NL80211_FLAG_NEED_NETDEV |
|
||||
NL80211_FLAG_NEED_RTNL,
|
||||
},
|
||||
{
|
||||
.cmd = NL80211_CMD_JOIN_MESH,
|
||||
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
||||
|
@ -582,16 +582,6 @@ static inline int rdev_get_tx_power(struct cfg80211_registered_device *rdev,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline int rdev_set_wds_peer(struct cfg80211_registered_device *rdev,
|
||||
struct net_device *dev, const u8 *addr)
|
||||
{
|
||||
int ret;
|
||||
trace_rdev_set_wds_peer(&rdev->wiphy, dev, addr);
|
||||
ret = rdev->ops->set_wds_peer(&rdev->wiphy, dev, addr);
|
||||
trace_rdev_return_int(&rdev->wiphy, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline int
|
||||
rdev_set_multicast_to_unicast(struct cfg80211_registered_device *rdev,
|
||||
struct net_device *dev,
|
||||
|
@ -694,7 +694,7 @@ static void cfg80211_scan_req_add_chan(struct cfg80211_scan_request *request,
|
||||
static bool cfg80211_find_ssid_match(struct cfg80211_colocated_ap *ap,
|
||||
struct cfg80211_scan_request *request)
|
||||
{
|
||||
u8 i;
|
||||
int i;
|
||||
u32 s_ssid;
|
||||
|
||||
for (i = 0; i < request->n_ssids; i++) {
|
||||
|
@ -838,11 +838,6 @@ DEFINE_EVENT(wiphy_netdev_mac_evt, rdev_del_mpath,
|
||||
TP_ARGS(wiphy, netdev, mac)
|
||||
);
|
||||
|
||||
DEFINE_EVENT(wiphy_netdev_mac_evt, rdev_set_wds_peer,
|
||||
TP_PROTO(struct wiphy *wiphy, struct net_device *netdev, const u8 *mac),
|
||||
TP_ARGS(wiphy, netdev, mac)
|
||||
);
|
||||
|
||||
TRACE_EVENT(rdev_dump_station,
|
||||
TP_PROTO(struct wiphy *wiphy, struct net_device *netdev, int _idx,
|
||||
u8 *mac),
|
||||
|
@ -550,8 +550,7 @@ int ieee80211_data_to_8023_exthdr(struct sk_buff *skb, struct ethhdr *ehdr,
|
||||
return -1;
|
||||
break;
|
||||
case cpu_to_le16(IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS):
|
||||
if (unlikely(iftype != NL80211_IFTYPE_WDS &&
|
||||
iftype != NL80211_IFTYPE_MESH_POINT &&
|
||||
if (unlikely(iftype != NL80211_IFTYPE_MESH_POINT &&
|
||||
iftype != NL80211_IFTYPE_AP_VLAN &&
|
||||
iftype != NL80211_IFTYPE_STATION))
|
||||
return -1;
|
||||
@ -1051,7 +1050,6 @@ int cfg80211_change_iface(struct cfg80211_registered_device *rdev,
|
||||
case NL80211_IFTYPE_P2P_GO:
|
||||
case NL80211_IFTYPE_AP:
|
||||
case NL80211_IFTYPE_AP_VLAN:
|
||||
case NL80211_IFTYPE_WDS:
|
||||
case NL80211_IFTYPE_MESH_POINT:
|
||||
/* bridging OK */
|
||||
break;
|
||||
@ -1063,6 +1061,7 @@ int cfg80211_change_iface(struct cfg80211_registered_device *rdev,
|
||||
/* not happening */
|
||||
break;
|
||||
case NL80211_IFTYPE_P2P_DEVICE:
|
||||
case NL80211_IFTYPE_WDS:
|
||||
case NL80211_IFTYPE_NAN:
|
||||
WARN_ON(1);
|
||||
break;
|
||||
@ -1276,20 +1275,22 @@ static u32 cfg80211_calculate_bitrate_vht(struct rate_info *rate)
|
||||
|
||||
static u32 cfg80211_calculate_bitrate_he(struct rate_info *rate)
|
||||
{
|
||||
#define SCALE 2048
|
||||
u16 mcs_divisors[12] = {
|
||||
34133, /* 16.666666... */
|
||||
17067, /* 8.333333... */
|
||||
11378, /* 5.555555... */
|
||||
8533, /* 4.166666... */
|
||||
5689, /* 2.777777... */
|
||||
4267, /* 2.083333... */
|
||||
3923, /* 1.851851... */
|
||||
3413, /* 1.666666... */
|
||||
2844, /* 1.388888... */
|
||||
2560, /* 1.250000... */
|
||||
2276, /* 1.111111... */
|
||||
2048, /* 1.000000... */
|
||||
#define SCALE 6144
|
||||
u32 mcs_divisors[14] = {
|
||||
102399, /* 16.666666... */
|
||||
51201, /* 8.333333... */
|
||||
34134, /* 5.555555... */
|
||||
25599, /* 4.166666... */
|
||||
17067, /* 2.777777... */
|
||||
12801, /* 2.083333... */
|
||||
11769, /* 1.851851... */
|
||||
10239, /* 1.666666... */
|
||||
8532, /* 1.388888... */
|
||||
7680, /* 1.250000... */
|
||||
6828, /* 1.111111... */
|
||||
6144, /* 1.000000... */
|
||||
5690, /* 0.926106... */
|
||||
5120, /* 0.833333... */
|
||||
};
|
||||
u32 rates_160M[3] = { 960777777, 907400000, 816666666 };
|
||||
u32 rates_969[3] = { 480388888, 453700000, 408333333 };
|
||||
@ -1301,7 +1302,7 @@ static u32 cfg80211_calculate_bitrate_he(struct rate_info *rate)
|
||||
u64 tmp;
|
||||
u32 result;
|
||||
|
||||
if (WARN_ON_ONCE(rate->mcs > 11))
|
||||
if (WARN_ON_ONCE(rate->mcs > 13))
|
||||
return 0;
|
||||
|
||||
if (WARN_ON_ONCE(rate->he_gi > NL80211_RATE_INFO_HE_GI_3_2))
|
||||
|
@ -49,9 +49,6 @@ int cfg80211_wext_siwmode(struct net_device *dev, struct iw_request_info *info,
|
||||
case IW_MODE_ADHOC:
|
||||
type = NL80211_IFTYPE_ADHOC;
|
||||
break;
|
||||
case IW_MODE_REPEAT:
|
||||
type = NL80211_IFTYPE_WDS;
|
||||
break;
|
||||
case IW_MODE_MONITOR:
|
||||
type = NL80211_IFTYPE_MONITOR;
|
||||
break;
|
||||
@ -1150,50 +1147,6 @@ static int cfg80211_wext_giwpower(struct net_device *dev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cfg80211_wds_wext_siwap(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
struct sockaddr *addr, char *extra)
|
||||
{
|
||||
struct wireless_dev *wdev = dev->ieee80211_ptr;
|
||||
struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
|
||||
int err;
|
||||
|
||||
if (WARN_ON(wdev->iftype != NL80211_IFTYPE_WDS))
|
||||
return -EINVAL;
|
||||
|
||||
if (addr->sa_family != ARPHRD_ETHER)
|
||||
return -EINVAL;
|
||||
|
||||
if (netif_running(dev))
|
||||
return -EBUSY;
|
||||
|
||||
if (!rdev->ops->set_wds_peer)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
err = rdev_set_wds_peer(rdev, dev, (u8 *)&addr->sa_data);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
memcpy(&wdev->wext.bssid, (u8 *) &addr->sa_data, ETH_ALEN);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cfg80211_wds_wext_giwap(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
struct sockaddr *addr, char *extra)
|
||||
{
|
||||
struct wireless_dev *wdev = dev->ieee80211_ptr;
|
||||
|
||||
if (WARN_ON(wdev->iftype != NL80211_IFTYPE_WDS))
|
||||
return -EINVAL;
|
||||
|
||||
addr->sa_family = ARPHRD_ETHER;
|
||||
memcpy(&addr->sa_data, wdev->wext.bssid, ETH_ALEN);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cfg80211_wext_siwrate(struct net_device *dev,
|
||||
struct iw_request_info *info,
|
||||
struct iw_param *rate, char *extra)
|
||||
@ -1371,8 +1324,6 @@ static int cfg80211_wext_siwap(struct net_device *dev,
|
||||
return cfg80211_ibss_wext_siwap(dev, info, ap_addr, extra);
|
||||
case NL80211_IFTYPE_STATION:
|
||||
return cfg80211_mgd_wext_siwap(dev, info, ap_addr, extra);
|
||||
case NL80211_IFTYPE_WDS:
|
||||
return cfg80211_wds_wext_siwap(dev, info, ap_addr, extra);
|
||||
default:
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
@ -1389,8 +1340,6 @@ static int cfg80211_wext_giwap(struct net_device *dev,
|
||||
return cfg80211_ibss_wext_giwap(dev, info, ap_addr, extra);
|
||||
case NL80211_IFTYPE_STATION:
|
||||
return cfg80211_mgd_wext_giwap(dev, info, ap_addr, extra);
|
||||
case NL80211_IFTYPE_WDS:
|
||||
return cfg80211_wds_wext_giwap(dev, info, ap_addr, extra);
|
||||
default:
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user