123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- From 3ad31f4efe9674a8bda057c79995a9468281e77f Mon Sep 17 00:00:00 2001
- From: Manikanta Pubbisetty <[email protected]>
- 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 <[email protected]>
- ---
- 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
- @@ -3622,7 +3622,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;
|