aboutsummaryrefslogtreecommitdiffstats
path: root/package/kernel
diff options
context:
space:
mode:
authorHauke Mehrtens <hauke@hauke-m.de>2019-02-26 20:41:03 +0100
committerHauke Mehrtens <hauke@hauke-m.de>2019-02-26 23:20:04 +0100
commitb1c614784d006cea3f91ac02f816019f1da7abbd (patch)
tree050fe944910912f9d1a464420cc4af62f66d6522 /package/kernel
parent426ffc563a94ca12531ff8a2df598185ba88487e (diff)
downloadupstream-b1c614784d006cea3f91ac02f816019f1da7abbd.tar.gz
upstream-b1c614784d006cea3f91ac02f816019f1da7abbd.tar.bz2
upstream-b1c614784d006cea3f91ac02f816019f1da7abbd.zip
mac80211: Add WDS / 4addr fix for ath10k supported devices
This should fix the WDS / 4addr mode with ath10k and probably other devices. This patch was found here: https://patchwork.kernel.org/patch/10692383/ Fixes: d9eefa7a7031 ("mac80211: rebase ontop of v4.18.5") Reported-by: Signed-off-by: Stefan Lippers-Hollmann <s.l-h@gmx.de> Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
Diffstat (limited to 'package/kernel')
-rw-r--r--package/kernel/mac80211/patches/subsys/390-nl-mac-80211-allow-4addr-AP-operation-on-crypto-cont.patch107
1 files changed, 107 insertions, 0 deletions
diff --git a/package/kernel/mac80211/patches/subsys/390-nl-mac-80211-allow-4addr-AP-operation-on-crypto-cont.patch b/package/kernel/mac80211/patches/subsys/390-nl-mac-80211-allow-4addr-AP-operation-on-crypto-cont.patch
new file mode 100644
index 0000000000..3f933f8c3b
--- /dev/null
+++ b/package/kernel/mac80211/patches/subsys/390-nl-mac-80211-allow-4addr-AP-operation-on-crypto-cont.patch
@@ -0,0 +1,107 @@
+From 3ad31f4efe9674a8bda057c79995a9468281e77f Mon Sep 17 00:00:00 2001
+From: Manikanta Pubbisetty <mpubbise@codeaurora.org>
+Date: Wed, 21 Nov 2018 16:33:48 +0530
+Subject: [PATCH] {nl,mac}80211: allow 4addr AP operation on crypto controlled
+ devices
+
+As per the current design, for sw crypto controlled devices, it is
+the device which has to advertise the support for AP/VLAN iftype
+based on it's capability to tranmsit packets encrypted in software
+(In VLAN functionality, group traffic generated for a specific
+VLAN group is always encrypted in software). Commit db3bdcb9c3ff
+("mac80211: allow AP_VLAN operation on crypto controlled devices")
+has introduced this change.
+
+Since 4addr AP operation also uses AP/VLAN iftype, this conditional
+way of advertising AP/VLAN support has broken 4addr AP mode operation on
+crypto controlled devices which do not support VLAN functionality.
+
+For example:
+In the case of ath10k driver, not all firmwares have support for VLAN
+functionality but all can support 4addr AP operation. Because AP/VLAN
+support is not advertised for these devices, 4addr AP operations are
+also blocked.
+
+Fix this by allowing 4addr opertion on devices which do not advertise
+AP/VLAN iftype but which can support 4addr operation (the desicion is
+taken based on the wiphy flag WIPHY_FLAG_4ADDR_AP).
+
+Fixes: Commit db3bdcb9c3ff ("mac80211: allow AP_VLAN operation on
+crypto controlled devices")
+Signed-off-by: Manikanta Pubbisetty <mpubbise@codeaurora.org>
+---
+ include/net/cfg80211.h | 3 ++-
+ net/mac80211/util.c | 4 +++-
+ net/wireless/core.c | 9 +++++++--
+ net/wireless/nl80211.c | 10 ++++++++--
+ 4 files changed, 20 insertions(+), 6 deletions(-)
+
+--- a/include/net/cfg80211.h
++++ b/include/net/cfg80211.h
+@@ -3448,7 +3448,8 @@ struct cfg80211_ops {
+ * on wiphy_new(), but can be changed by the driver if it has a good
+ * reason to override the default
+ * @WIPHY_FLAG_4ADDR_AP: supports 4addr mode even on AP (with a single station
+- * on a VLAN interface)
++ * on a VLAN interface). This flag also serves an extra purpose of
++ * supporting 4ADDR AP mode on devices which do not support AP/VLAN iftype.
+ * @WIPHY_FLAG_4ADDR_STATION: supports 4addr mode even as a station
+ * @WIPHY_FLAG_CONTROL_PORT_PROTOCOL: This device supports setting the
+ * control port protocol ethertype. The device also honours the
+--- a/net/mac80211/util.c
++++ b/net/mac80211/util.c
+@@ -3523,7 +3523,9 @@ int ieee80211_check_combinations(struct
+ }
+
+ /* Always allow software iftypes */
+- if (local->hw.wiphy->software_iftypes & BIT(iftype)) {
++ if (local->hw.wiphy->software_iftypes & BIT(iftype) ||
++ (iftype == NL80211_IFTYPE_AP_VLAN &&
++ local->hw.wiphy->flags & WIPHY_FLAG_4ADDR_AP)) {
+ if (radar_detect)
+ return -EINVAL;
+ return 0;
+--- a/net/wireless/core.c
++++ b/net/wireless/core.c
+@@ -1351,8 +1351,13 @@ static int cfg80211_netdev_notifier_call
+ }
+ break;
+ case NETDEV_PRE_UP:
+- if (!(wdev->wiphy->interface_modes & BIT(wdev->iftype)))
+- return notifier_from_errno(-EOPNOTSUPP);
++ if (!(wdev->wiphy->interface_modes & BIT(wdev->iftype))) {
++ if (!(wdev->iftype == NL80211_IFTYPE_AP_VLAN &&
++ rdev->wiphy.flags & WIPHY_FLAG_4ADDR_AP &&
++ wdev->use_4addr))
++ return notifier_from_errno(-EOPNOTSUPP);
++ }
++
+ if (rfkill_blocked(rdev->rfkill))
+ return notifier_from_errno(-ERFKILL);
+ break;
+--- a/net/wireless/nl80211.c
++++ b/net/wireless/nl80211.c
+@@ -3193,8 +3193,7 @@ static int nl80211_new_interface(struct
+ return -EINVAL;
+ }
+
+- if (!rdev->ops->add_virtual_intf ||
+- !(rdev->wiphy.interface_modes & (1 << type)))
++ if (!rdev->ops->add_virtual_intf)
+ return -EOPNOTSUPP;
+
+ if ((type == NL80211_IFTYPE_P2P_DEVICE || type == NL80211_IFTYPE_NAN ||
+@@ -3213,6 +3212,13 @@ static int nl80211_new_interface(struct
+ return err;
+ }
+
++ if (!(rdev->wiphy.interface_modes & (1 << type))) {
++ if (!(type == NL80211_IFTYPE_AP_VLAN &&
++ rdev->wiphy.flags & WIPHY_FLAG_4ADDR_AP &&
++ params.use_4addr))
++ return -EOPNOTSUPP;
++ }
++
+ err = nl80211_parse_mon_options(rdev, type, info, &params);
+ if (err < 0)
+ return err;