mirror of
git://projects.qi-hardware.com/openwrt-xburst.git
synced 2024-11-27 21:34:04 +02:00
mac80211: update to wireless-testing+wireless-2.6 from 2010-01-13
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@19139 3c298f89-4303-0410-b956-a3cf2f4a3e73
This commit is contained in:
parent
23e3403240
commit
8f8c254d1f
@ -10,12 +10,12 @@ include $(INCLUDE_DIR)/kernel.mk
|
||||
|
||||
PKG_NAME:=mac80211
|
||||
|
||||
PKG_VERSION:=2010-01-11
|
||||
PKG_VERSION:=2010-01-13
|
||||
PKG_RELEASE:=1
|
||||
PKG_SOURCE_URL:=http://mirror2.openwrt.org/sources
|
||||
# http://www.orbit-lab.org/kernel/compat-wireless-2.6/2010/11 \
|
||||
# http://wireless.kernel.org/download/compat-wireless-2.6
|
||||
PKG_MD5SUM:=78a36bb7d28be7028f640a10eaa4692b
|
||||
PKG_MD5SUM:=b773266f141a1a6349b6e09b84948f02
|
||||
|
||||
PKG_SOURCE:=compat-wireless-$(PKG_VERSION).tar.bz2
|
||||
PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/compat-wireless-$(PKG_VERSION)
|
||||
|
@ -1,6 +1,6 @@
|
||||
--- a/config.mk
|
||||
+++ b/config.mk
|
||||
@@ -270,10 +270,10 @@ endif
|
||||
@@ -281,10 +281,10 @@ endif
|
||||
|
||||
CONFIG_P54_PCI=m
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
--- a/config.mk
|
||||
+++ b/config.mk
|
||||
@@ -16,7 +16,7 @@ include $(KLIB_BUILD)/.config
|
||||
endif
|
||||
@@ -73,7 +73,7 @@ endif # build check
|
||||
endif # kernel Makefile check
|
||||
|
||||
# These both are needed by compat-wireless || compat-bluetooth so enable them
|
||||
- CONFIG_COMPAT_RFKILL=y
|
||||
@ -9,7 +9,7 @@
|
||||
|
||||
ifeq ($(CONFIG_MAC80211),y)
|
||||
$(error "ERROR: you have MAC80211 compiled into the kernel, CONFIG_MAC80211=y, as such you cannot replace its mac80211 driver. You need this set to CONFIG_MAC80211=m. If you are using Fedora upgrade your kernel as later version should this set as modular. For further information on Fedora see https://bugzilla.redhat.com/show_bug.cgi?id=470143. If you are using your own kernel recompile it and make mac80211 modular")
|
||||
@@ -463,8 +463,8 @@ endif
|
||||
@@ -474,8 +474,8 @@ endif
|
||||
# We need the backported rfkill module on kernel < 2.6.31.
|
||||
# In more recent kernel versions use the in kernel rfkill module.
|
||||
ifdef CONFIG_COMPAT_KERNEL_31
|
||||
|
@ -1,13 +1,13 @@
|
||||
--- a/config.mk
|
||||
+++ b/config.mk
|
||||
@@ -36,8 +36,8 @@ endif
|
||||
@@ -95,8 +95,8 @@ ifndef CONFIG_COMPAT_KERNEL_27
|
||||
ifeq ($(CONFIG_BT),y)
|
||||
# we'll ignore compiling bluetooth
|
||||
else
|
||||
-CONFIG_COMPAT_BLUETOOTH=y
|
||||
-CONFIG_COMPAT_BLUETOOTH_MODULES=m
|
||||
- CONFIG_COMPAT_BLUETOOTH=y
|
||||
- CONFIG_COMPAT_BLUETOOTH_MODULES=m
|
||||
+# CONFIG_COMPAT_BLUETOOTH=y
|
||||
+# CONFIG_COMPAT_BLUETOOTH_MODULES=m
|
||||
endif
|
||||
endif # Kernel >= 2.6.26
|
||||
|
||||
# We will warn when you don't have MQ support or NET_SCHED enabled.
|
||||
|
@ -1,6 +1,6 @@
|
||||
--- a/config.mk
|
||||
+++ b/config.mk
|
||||
@@ -303,10 +303,10 @@ CONFIG_PCI_ATMEL=m
|
||||
@@ -314,10 +314,10 @@ CONFIG_PCI_ATMEL=m
|
||||
CONFIG_MWL8K=m
|
||||
|
||||
# Ethernet drivers go here
|
||||
@ -15,7 +15,7 @@
|
||||
|
||||
endif
|
||||
## end of PCI
|
||||
@@ -345,10 +345,10 @@ CONFIG_USB_NET_COMPAT_RNDIS_HOST=n
|
||||
@@ -356,10 +356,10 @@ CONFIG_USB_NET_COMPAT_RNDIS_HOST=n
|
||||
CONFIG_USB_NET_COMPAT_RNDIS_WLAN=n
|
||||
CONFIG_USB_NET_COMPAT_CDCETHER=n
|
||||
else
|
||||
|
@ -1,6 +1,6 @@
|
||||
--- a/config.mk
|
||||
+++ b/config.mk
|
||||
@@ -69,21 +69,6 @@ $(error "ERROR: Your 2.6.27 kernel has C
|
||||
@@ -44,21 +44,6 @@ $(error "ERROR: Your 2.6.27 kernel has C
|
||||
endif
|
||||
endif
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
--- a/config.mk
|
||||
+++ b/config.mk
|
||||
@@ -188,9 +188,9 @@ CONFIG_B43_HWRNG=y
|
||||
@@ -199,9 +199,9 @@ CONFIG_B43_HWRNG=y
|
||||
CONFIG_B43_PCI_AUTOSELECT=y
|
||||
CONFIG_B43_PCICORE_AUTOSELECT=y
|
||||
ifneq ($(CONFIG_PCMCIA),)
|
||||
@ -12,7 +12,7 @@
|
||||
CONFIG_B43_LEDS=y
|
||||
CONFIG_B43_PHY_LP=y
|
||||
# CONFIG_B43_DEBUG=y
|
||||
@@ -245,8 +245,8 @@ CONFIG_SSB_PCIHOST_POSSIBLE=y
|
||||
@@ -256,8 +256,8 @@ CONFIG_SSB_PCIHOST_POSSIBLE=y
|
||||
CONFIG_SSB_PCIHOST=y
|
||||
CONFIG_SSB_B43_PCI_BRIDGE=y
|
||||
ifneq ($(CONFIG_PCMCIA),)
|
||||
|
@ -26,7 +26,7 @@
|
||||
int (*set_block)(void *data, bool blocked);
|
||||
};
|
||||
|
||||
-#if defined(CONFIG_RFKILL_BACKPORT) || defined(CONFIG_RFKILL_MODULE_BACKPORT)
|
||||
-#if defined(CONFIG_RFKILL_BACKPORT) || defined(CONFIG_RFKILL_BACKPORT_MODULE)
|
||||
+#if 0
|
||||
/**
|
||||
* rfkill_alloc - allocate rfkill structure
|
||||
|
@ -1,6 +1,6 @@
|
||||
--- a/drivers/net/wireless/ath/ath5k/reset.c
|
||||
+++ b/drivers/net/wireless/ath/ath5k/reset.c
|
||||
@@ -1357,10 +1357,18 @@ int ath5k_hw_reset(struct ath5k_hw *ah,
|
||||
@@ -1360,10 +1360,18 @@ int ath5k_hw_reset(struct ath5k_hw *ah,
|
||||
* guess we can tweak it and see how it goes ;-)
|
||||
*/
|
||||
if (ah->ah_version != AR5K_AR5210) {
|
||||
|
35
package/mac80211/patches/300-ath9k_fix_init_crash.patch
Normal file
35
package/mac80211/patches/300-ath9k_fix_init_crash.patch
Normal file
@ -0,0 +1,35 @@
|
||||
--- a/drivers/net/wireless/ath/ath9k/ahb.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/ahb.c
|
||||
@@ -121,6 +121,9 @@ static int ath_ahb_probe(struct platform
|
||||
sc->mem = mem;
|
||||
sc->irq = irq;
|
||||
|
||||
+ /* Will be cleared in ath9k_start() */
|
||||
+ sc->sc_flags |= SC_OP_INVALID;
|
||||
+
|
||||
ret = request_irq(irq, ath_isr, IRQF_SHARED, "ath9k", sc);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "request_irq failed\n");
|
||||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||
@@ -534,8 +534,6 @@ static int ath9k_init_softc(u16 devid, s
|
||||
int ret = 0, i;
|
||||
int csz = 0;
|
||||
|
||||
- sc->sc_flags |= SC_OP_INVALID;
|
||||
-
|
||||
ah = kzalloc(sizeof(struct ath_hw), GFP_KERNEL);
|
||||
if (!ah)
|
||||
return -ENOMEM;
|
||||
--- a/drivers/net/wireless/ath/ath9k/pci.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/pci.c
|
||||
@@ -202,6 +202,9 @@ static int ath_pci_probe(struct pci_dev
|
||||
sc->dev = &pdev->dev;
|
||||
sc->mem = mem;
|
||||
|
||||
+ /* Will be cleared in ath9k_start() */
|
||||
+ sc->sc_flags |= SC_OP_INVALID;
|
||||
+
|
||||
ret = request_irq(pdev->irq, ath_isr, IRQF_SHARED, "ath9k", sc);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "request_irq failed\n");
|
@ -1,8 +1,8 @@
|
||||
--- a/drivers/net/wireless/ath/ath9k/main.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/main.c
|
||||
@@ -1103,6 +1103,9 @@ static void ath_unregister_led(struct at
|
||||
--- a/drivers/net/wireless/ath/ath9k/gpio.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/gpio.c
|
||||
@@ -119,6 +119,9 @@ static void ath_unregister_led(struct at
|
||||
|
||||
static void ath_deinit_leds(struct ath_softc *sc)
|
||||
void ath_deinit_leds(struct ath_softc *sc)
|
||||
{
|
||||
+ if (AR_SREV_9100(sc->sc_ah))
|
||||
+ return;
|
||||
@ -10,13 +10,13 @@
|
||||
ath_unregister_led(&sc->assoc_led);
|
||||
sc->sc_flags &= ~SC_OP_LED_ASSOCIATED;
|
||||
ath_unregister_led(&sc->tx_led);
|
||||
@@ -1121,6 +1124,9 @@ static void ath_init_leds(struct ath_sof
|
||||
else
|
||||
sc->sc_ah->led_pin = ATH_LED_PIN_DEF;
|
||||
@@ -132,6 +135,9 @@ void ath_init_leds(struct ath_softc *sc)
|
||||
char *trigger;
|
||||
int ret;
|
||||
|
||||
+ if (AR_SREV_9100(sc->sc_ah))
|
||||
+ return;
|
||||
+
|
||||
/* Configure gpio 1 for output */
|
||||
ath9k_hw_cfg_output(sc->sc_ah, sc->sc_ah->led_pin,
|
||||
AR_GPIO_OUTPUT_MUX_AS_OUTPUT);
|
||||
if (AR_SREV_9287(sc->sc_ah))
|
||||
sc->sc_ah->led_pin = ATH_LED_PIN_9287;
|
||||
else
|
||||
|
@ -22,22 +22,24 @@
|
||||
#include "ath9k.h"
|
||||
#include "btcoex.h"
|
||||
|
||||
@@ -1597,6 +1598,7 @@ static int ath_init_softc(u16 devid, str
|
||||
--- a/drivers/net/wireless/ath/ath9k/init.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/init.c
|
||||
@@ -531,6 +531,7 @@ static int ath9k_init_softc(u16 devid, s
|
||||
{
|
||||
struct ath_hw *ah = NULL;
|
||||
struct ath_common *common;
|
||||
+ struct ath9k_platform_data *pdata;
|
||||
int r = 0, i;
|
||||
int ret = 0, i;
|
||||
int csz = 0;
|
||||
int qnum;
|
||||
@@ -1619,6 +1621,10 @@ static int ath_init_softc(u16 devid, str
|
||||
|
||||
ah->hw_version.devid = devid;
|
||||
@@ -542,6 +543,10 @@ static int ath9k_init_softc(u16 devid, s
|
||||
ah->hw_version.subsysid = subsysid;
|
||||
sc->sc_ah = ah;
|
||||
|
||||
+ pdata = (struct ath9k_platform_data *) sc->dev->platform_data;
|
||||
+ if (!pdata)
|
||||
+ ah->ah_flags |= AH_USE_EEPROM;
|
||||
+
|
||||
sc->sc_ah = ah;
|
||||
|
||||
common = ath9k_hw_common(ah);
|
||||
common->ops = &ath9k_common_ops;
|
||||
common->bus_ops = bus_ops;
|
||||
|
@ -91,7 +91,7 @@
|
||||
static ssize_t read_file_dma(struct file *file, char __user *user_buf,
|
||||
size_t count, loff_t *ppos)
|
||||
{
|
||||
@@ -600,6 +684,16 @@ int ath9k_init_debug(struct ath_hw *ah)
|
||||
@@ -710,6 +794,16 @@ int ath9k_init_debug(struct ath_hw *ah)
|
||||
goto err;
|
||||
#endif
|
||||
|
||||
@ -108,18 +108,18 @@
|
||||
sc->debug.debugfs_dma = debugfs_create_file("dma", S_IRUSR,
|
||||
sc->debug.debugfs_phy, sc, &fops_dma);
|
||||
if (!sc->debug.debugfs_dma)
|
||||
@@ -643,6 +737,8 @@ void ath9k_exit_debug(struct ath_hw *ah)
|
||||
@@ -760,6 +854,8 @@ void ath9k_exit_debug(struct ath_hw *ah)
|
||||
struct ath_common *common = ath9k_hw_common(ah);
|
||||
struct ath_softc *sc = (struct ath_softc *) common->priv;
|
||||
|
||||
+ debugfs_remove(sc->debug.debugfs_tx_chainmask);
|
||||
+ debugfs_remove(sc->debug.debugfs_rx_chainmask);
|
||||
debugfs_remove(sc->debug.debugfs_recv);
|
||||
debugfs_remove(sc->debug.debugfs_xmit);
|
||||
debugfs_remove(sc->debug.debugfs_wiphy);
|
||||
debugfs_remove(sc->debug.debugfs_rcstat);
|
||||
--- a/drivers/net/wireless/ath/ath9k/debug.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/debug.h
|
||||
@@ -123,6 +123,8 @@ struct ath_stats {
|
||||
@@ -148,6 +148,8 @@ struct ath_stats {
|
||||
};
|
||||
|
||||
struct ath9k_debug {
|
||||
|
@ -1,6 +1,6 @@
|
||||
--- a/drivers/net/wireless/ath/ath9k/debug.c
|
||||
+++ b/drivers/net/wireless/ath/ath9k/debug.c
|
||||
@@ -664,6 +664,86 @@ static const struct file_operations fops
|
||||
@@ -774,6 +774,86 @@ static const struct file_operations fops
|
||||
.owner = THIS_MODULE
|
||||
};
|
||||
|
||||
@ -87,8 +87,8 @@
|
||||
int ath9k_init_debug(struct ath_hw *ah)
|
||||
{
|
||||
struct ath_common *common = ath9k_hw_common(ah);
|
||||
@@ -726,6 +806,17 @@ int ath9k_init_debug(struct ath_hw *ah)
|
||||
if (!sc->debug.debugfs_xmit)
|
||||
@@ -843,6 +923,17 @@ int ath9k_init_debug(struct ath_hw *ah)
|
||||
if (!sc->debug.debugfs_recv)
|
||||
goto err;
|
||||
|
||||
+ sc->debug.regidx = 0;
|
||||
@ -105,21 +105,21 @@
|
||||
return 0;
|
||||
err:
|
||||
ath9k_exit_debug(ah);
|
||||
@@ -739,6 +830,8 @@ void ath9k_exit_debug(struct ath_hw *ah)
|
||||
@@ -856,6 +947,8 @@ void ath9k_exit_debug(struct ath_hw *ah)
|
||||
|
||||
debugfs_remove(sc->debug.debugfs_tx_chainmask);
|
||||
debugfs_remove(sc->debug.debugfs_rx_chainmask);
|
||||
+ debugfs_remove(sc->debug.debugfs_regval);
|
||||
+ debugfs_remove(sc->debug.debugfs_regidx);
|
||||
debugfs_remove(sc->debug.debugfs_recv);
|
||||
debugfs_remove(sc->debug.debugfs_xmit);
|
||||
debugfs_remove(sc->debug.debugfs_wiphy);
|
||||
debugfs_remove(sc->debug.debugfs_rcstat);
|
||||
--- a/drivers/net/wireless/ath/ath9k/debug.h
|
||||
+++ b/drivers/net/wireless/ath/ath9k/debug.h
|
||||
@@ -132,6 +132,9 @@ struct ath9k_debug {
|
||||
struct dentry *debugfs_rcstat;
|
||||
@@ -158,6 +158,9 @@ struct ath9k_debug {
|
||||
struct dentry *debugfs_wiphy;
|
||||
struct dentry *debugfs_xmit;
|
||||
struct dentry *debugfs_recv;
|
||||
+ struct dentry *debugfs_regidx;
|
||||
+ struct dentry *debugfs_regval;
|
||||
+ u32 regidx;
|
||||
|
@ -1,30 +0,0 @@
|
||||
--- a/net/mac80211/scan.c
|
||||
+++ b/net/mac80211/scan.c
|
||||
@@ -284,6 +284,7 @@ void ieee80211_scan_completed(struct iee
|
||||
ieee80211_mlme_notify_scan_completed(local);
|
||||
ieee80211_ibss_notify_scan_completed(local);
|
||||
ieee80211_mesh_notify_scan_completed(local);
|
||||
+ ieee80211_queue_work(&local->hw, &local->work_work);
|
||||
}
|
||||
EXPORT_SYMBOL(ieee80211_scan_completed);
|
||||
|
||||
--- a/net/mac80211/work.c
|
||||
+++ b/net/mac80211/work.c
|
||||
@@ -818,6 +818,7 @@ static void ieee80211_work_work(struct w
|
||||
wk->chan == local->tmp_channel &&
|
||||
wk->chan_type == local->tmp_channel_type) {
|
||||
wk->started = true;
|
||||
+ wk->timeout = jiffies;
|
||||
}
|
||||
|
||||
if (!wk->started && !local->tmp_channel) {
|
||||
@@ -935,6 +936,9 @@ void ieee80211_add_work(struct ieee80211
|
||||
if (WARN_ON(!wk->done))
|
||||
return;
|
||||
|
||||
+ if (WARN_ON(!ieee80211_sdata_running(wk->sdata)))
|
||||
+ return;
|
||||
+
|
||||
wk->started = false;
|
||||
|
||||
local = wk->sdata->local;
|
@ -1,6 +1,6 @@
|
||||
--- a/net/mac80211/iface.c
|
||||
+++ b/net/mac80211/iface.c
|
||||
@@ -696,10 +696,14 @@ static u16 ieee80211_monitor_select_queu
|
||||
@@ -697,10 +697,14 @@ static u16 ieee80211_monitor_select_queu
|
||||
|
||||
hdr = (void *)((u8 *)skb->data + le16_to_cpu(rtap->it_len));
|
||||
|
@ -1,76 +0,0 @@
|
||||
--- a/net/mac80211/mlme.c
|
||||
+++ b/net/mac80211/mlme.c
|
||||
@@ -312,6 +312,38 @@ void ieee80211_send_nullfunc(struct ieee
|
||||
ieee80211_tx_skb(sdata, skb);
|
||||
}
|
||||
|
||||
+static void ieee80211_send_4addr_nullfunc(struct ieee80211_local *local,
|
||||
+ struct ieee80211_sub_if_data *sdata)
|
||||
+{
|
||||
+ struct sk_buff *skb;
|
||||
+ struct ieee80211_hdr *nullfunc;
|
||||
+ __le16 fc;
|
||||
+
|
||||
+ if (WARN_ON(sdata->vif.type != NL80211_IFTYPE_STATION))
|
||||
+ return;
|
||||
+
|
||||
+ skb = dev_alloc_skb(local->hw.extra_tx_headroom + 30);
|
||||
+ if (!skb) {
|
||||
+ printk(KERN_DEBUG "%s: failed to allocate buffer for 4addr "
|
||||
+ "nullfunc frame\n", sdata->name);
|
||||
+ return;
|
||||
+ }
|
||||
+ skb_reserve(skb, local->hw.extra_tx_headroom);
|
||||
+
|
||||
+ nullfunc = (struct ieee80211_hdr *) skb_put(skb, 30);
|
||||
+ memset(nullfunc, 0, 30);
|
||||
+ fc = cpu_to_le16(IEEE80211_FTYPE_DATA | IEEE80211_STYPE_NULLFUNC |
|
||||
+ IEEE80211_FCTL_FROMDS | IEEE80211_FCTL_TODS);
|
||||
+ nullfunc->frame_control = fc;
|
||||
+ memcpy(nullfunc->addr1, sdata->u.mgd.bssid, ETH_ALEN);
|
||||
+ memcpy(nullfunc->addr2, sdata->vif.addr, ETH_ALEN);
|
||||
+ memcpy(nullfunc->addr3, sdata->u.mgd.bssid, ETH_ALEN);
|
||||
+ memcpy(nullfunc->addr4, sdata->vif.addr, ETH_ALEN);
|
||||
+
|
||||
+ IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT;
|
||||
+ ieee80211_tx_skb(sdata, skb);
|
||||
+}
|
||||
+
|
||||
/* spectrum management related things */
|
||||
static void ieee80211_chswitch_work(struct work_struct *work)
|
||||
{
|
||||
@@ -1120,6 +1152,13 @@ static bool ieee80211_assoc_success(stru
|
||||
ieee80211_set_associated(sdata, cbss, changed);
|
||||
|
||||
/*
|
||||
+ * If we're using 4-addr mode, let the AP know that we're
|
||||
+ * doing so, so that it can create the STA VLAN on its side
|
||||
+ */
|
||||
+ if (ifmgd->use_4addr)
|
||||
+ ieee80211_send_4addr_nullfunc(local, sdata);
|
||||
+
|
||||
+ /*
|
||||
* Start timer to probe the connection to the AP now.
|
||||
* Also start the timer that will detect beacon loss.
|
||||
*/
|
||||
--- a/net/mac80211/rx.c
|
||||
+++ b/net/mac80211/rx.c
|
||||
@@ -1111,6 +1111,18 @@ ieee80211_rx_h_sta_process(struct ieee80
|
||||
if (ieee80211_is_nullfunc(hdr->frame_control) ||
|
||||
ieee80211_is_qos_nullfunc(hdr->frame_control)) {
|
||||
I802_DEBUG_INC(rx->local->rx_handlers_drop_nullfunc);
|
||||
+
|
||||
+ /*
|
||||
+ * If we receive a 4-addr nullfunc frame from a STA
|
||||
+ * that was not moved to a 4-addr STA vlan yet, drop
|
||||
+ * the frame to the monitor interface, to make sure
|
||||
+ * that hostapd sees it
|
||||
+ */
|
||||
+ if (ieee80211_has_a4(hdr->frame_control) &&
|
||||
+ (rx->sdata->vif.type == NL80211_IFTYPE_AP ||
|
||||
+ (rx->sdata->vif.type == NL80211_IFTYPE_AP_VLAN &&
|
||||
+ !rx->sdata->u.vlan.sta)))
|
||||
+ return RX_DROP_MONITOR;
|
||||
/*
|
||||
* Update counter and free packet here to avoid
|
||||
* counting this as a dropped packed.
|
@ -1,98 +0,0 @@
|
||||
--- a/net/mac80211/sta_info.c
|
||||
+++ b/net/mac80211/sta_info.c
|
||||
@@ -119,6 +119,27 @@ struct sta_info *sta_info_get(struct iee
|
||||
return sta;
|
||||
}
|
||||
|
||||
+/*
|
||||
+ * Get sta info either from the specified interface
|
||||
+ * or from one of its vlans
|
||||
+ */
|
||||
+struct sta_info *sta_info_get_bss(struct ieee80211_sub_if_data *sdata,
|
||||
+ const u8 *addr)
|
||||
+{
|
||||
+ struct ieee80211_local *local = sdata->local;
|
||||
+ struct sta_info *sta;
|
||||
+
|
||||
+ sta = rcu_dereference(local->sta_hash[STA_HASH(addr)]);
|
||||
+ while (sta) {
|
||||
+ if ((sta->sdata == sdata ||
|
||||
+ sta->sdata->bss == sdata->bss) &&
|
||||
+ memcmp(sta->sta.addr, addr, ETH_ALEN) == 0)
|
||||
+ break;
|
||||
+ sta = rcu_dereference(sta->hnext);
|
||||
+ }
|
||||
+ return sta;
|
||||
+}
|
||||
+
|
||||
struct sta_info *sta_info_get_by_idx(struct ieee80211_sub_if_data *sdata,
|
||||
int idx)
|
||||
{
|
||||
--- a/net/mac80211/sta_info.h
|
||||
+++ b/net/mac80211/sta_info.h
|
||||
@@ -408,6 +408,9 @@ static inline u32 get_sta_flags(struct s
|
||||
struct sta_info *sta_info_get(struct ieee80211_sub_if_data *sdata,
|
||||
const u8 *addr);
|
||||
|
||||
+struct sta_info *sta_info_get_bss(struct ieee80211_sub_if_data *sdata,
|
||||
+ const u8 *addr);
|
||||
+
|
||||
static inline
|
||||
void for_each_sta_info_type_check(struct ieee80211_local *local,
|
||||
const u8 *addr,
|
||||
--- a/net/mac80211/cfg.c
|
||||
+++ b/net/mac80211/cfg.c
|
||||
@@ -148,7 +148,7 @@ static int ieee80211_add_key(struct wiph
|
||||
rcu_read_lock();
|
||||
|
||||
if (mac_addr) {
|
||||
- sta = sta_info_get(sdata, mac_addr);
|
||||
+ sta = sta_info_get_bss(sdata, mac_addr);
|
||||
if (!sta) {
|
||||
ieee80211_key_free(key);
|
||||
err = -ENOENT;
|
||||
@@ -179,7 +179,7 @@ static int ieee80211_del_key(struct wiph
|
||||
if (mac_addr) {
|
||||
ret = -ENOENT;
|
||||
|
||||
- sta = sta_info_get(sdata, mac_addr);
|
||||
+ sta = sta_info_get_bss(sdata, mac_addr);
|
||||
if (!sta)
|
||||
goto out_unlock;
|
||||
|
||||
@@ -226,7 +226,7 @@ static int ieee80211_get_key(struct wiph
|
||||
rcu_read_lock();
|
||||
|
||||
if (mac_addr) {
|
||||
- sta = sta_info_get(sdata, mac_addr);
|
||||
+ sta = sta_info_get_bss(sdata, mac_addr);
|
||||
if (!sta)
|
||||
goto out;
|
||||
|
||||
@@ -419,7 +419,7 @@ static int ieee80211_get_station(struct
|
||||
|
||||
rcu_read_lock();
|
||||
|
||||
- sta = sta_info_get(sdata, mac);
|
||||
+ sta = sta_info_get_bss(sdata, mac);
|
||||
if (sta) {
|
||||
ret = 0;
|
||||
sta_set_sinfo(sta, sinfo);
|
||||
@@ -775,7 +775,7 @@ static int ieee80211_del_station(struct
|
||||
if (mac) {
|
||||
rcu_read_lock();
|
||||
|
||||
- sta = sta_info_get(sdata, mac);
|
||||
+ sta = sta_info_get_bss(sdata, mac);
|
||||
if (!sta) {
|
||||
rcu_read_unlock();
|
||||
return -ENOENT;
|
||||
@@ -803,7 +803,7 @@ static int ieee80211_change_station(stru
|
||||
|
||||
rcu_read_lock();
|
||||
|
||||
- sta = sta_info_get(sdata, mac);
|
||||
+ sta = sta_info_get_bss(sdata, mac);
|
||||
if (!sta) {
|
||||
rcu_read_unlock();
|
||||
return -ENOENT;
|
@ -1,15 +0,0 @@
|
||||
--- a/net/mac80211/tx.c
|
||||
+++ b/net/mac80211/tx.c
|
||||
@@ -1051,8 +1051,11 @@ ieee80211_tx_prepare(struct ieee80211_su
|
||||
|
||||
hdr = (struct ieee80211_hdr *) skb->data;
|
||||
|
||||
- if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
|
||||
+ if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) {
|
||||
tx->sta = rcu_dereference(sdata->u.vlan.sta);
|
||||
+ if (!tx->sta && sdata->dev->ieee80211_ptr->use_4addr)
|
||||
+ return TX_DROP;
|
||||
+ }
|
||||
if (!tx->sta)
|
||||
tx->sta = sta_info_get(sdata, hdr->addr1);
|
||||
|
Loading…
Reference in New Issue
Block a user