From: Hauke Mehrtens Date: Tue, 26 Feb 2019 19:41:03 +0000 (+0100) Subject: mac80211: Add WDS / 4addr fix for ath10k supported devices X-Git-Url: http://git.openwrt.org/?p=openwrt%2Fstaging%2Flynxis.git;a=commitdiff_plain;h=b1c614784d006cea3f91ac02f816019f1da7abbd 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 Signed-off-by: Hauke Mehrtens --- 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 +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 +--- + 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, ¶ms); + if (err < 0) + return err;