@@ -5933,6 +5933,52 @@ static int brcmf_cfg80211_del_pmk(struct wiphy *wiphy, struct net_device *dev,
return brcmf_set_pmk(ifp, NULL, 0);
}
+static int brcmf_set_ap_bssparam_isolate(struct brcmf_if *ifp, int param_ap_isolate)
+{
+ int ret = 0, cur_ap_isolate = 0;
+
+ /* In cfg80211, for AP mode, the "param_ap_isolate" value represents
+ * 0 = allow low-level bridging of frames between associated stations
+ * 1 = restrict low-level bridging of frames to isolate associated stations
+ */
+ ret = brcmf_fil_iovar_int_get(ifp, "ap_isolate", &cur_ap_isolate);
+ if (ret < 0)
+ return ret;
+
+ if (cur_ap_isolate != param_ap_isolate) {
+ ret = brcmf_fil_iovar_int_set(ifp, "ap_isolate", param_ap_isolate);
+ if (ret < 0) {
+ brcmf_err("ap_isolate iovar failed: ret=%d\n", ret);
+ return ret;
+ }
+ }
+
+ return ret;
+}
+
+static int brcmf_cfg80211_change_bss(struct wiphy *wiphy, struct net_device *dev,
+ struct bss_parameters *params)
+{
+ struct brcmf_if *ifp = netdev_priv(dev);
+ int ret = 0;
+
+ /* Reject the operation if any of the AP BSS params that got changed are not
+ * supported by the driver for explicit configuration.
+ */
+ if (params->changed &
+ ~(CFG80211_BSS_PARAM_CHANGED_AP_ISOLATE))
+ return -EOPNOTSUPP;
+
+ if (params->changed &
+ CFG80211_BSS_PARAM_CHANGED_AP_ISOLATE) {
+ ret = brcmf_set_ap_bssparam_isolate(ifp, params->ap_isolate);
+ if (ret)
+ return ret;
+ }
+
+ return ret;
+}
+
static struct cfg80211_ops brcmf_cfg80211_ops = {
.add_virtual_intf = brcmf_cfg80211_add_iface,
.del_virtual_intf = brcmf_cfg80211_del_iface,
@@ -5980,6 +6026,7 @@ static struct cfg80211_ops brcmf_cfg80211_ops = {
.update_connect_params = brcmf_cfg80211_update_conn_params,
.set_pmk = brcmf_cfg80211_set_pmk,
.del_pmk = brcmf_cfg80211_del_pmk,
+ .change_bss = brcmf_cfg80211_change_bss,
};
struct cfg80211_ops *brcmf_cfg80211_get_ops(struct brcmf_mp_device *settings)