]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - net/mac80211/cfg.c
mac80211: multicast to unicast conversion
[karo-tx-linux.git] / net / mac80211 / cfg.c
index 7de34a3fbd3519635a96fb50b96b727f55a45350..a0be2f6cd1212ae3a35219d59b8f2bdf90c7d07e 100644 (file)
@@ -864,6 +864,8 @@ static int ieee80211_start_ap(struct wiphy *wiphy, struct net_device *dev,
        }
        sdata->needed_rx_chains = sdata->local->rx_chains;
 
+       sdata->vif.bss_conf.beacon_int = params->beacon_interval;
+
        mutex_lock(&local->mtx);
        err = ieee80211_vif_use_channel(sdata, &params->chandef,
                                        IEEE80211_CHANCTX_SHARED);
@@ -894,7 +896,6 @@ static int ieee80211_start_ap(struct wiphy *wiphy, struct net_device *dev,
                                              vlan->vif.type);
        }
 
-       sdata->vif.bss_conf.beacon_int = params->beacon_interval;
        sdata->vif.bss_conf.dtim_period = params->dtim_period;
        sdata->vif.bss_conf.enable_beacon = true;
        sdata->vif.bss_conf.allow_p2p_go_ps = sdata->vif.p2p;
@@ -1520,9 +1521,6 @@ static int ieee80211_change_station(struct wiphy *wiphy,
                goto out_err;
 
        if (params->vlan && params->vlan != sta->sdata->dev) {
-               bool prev_4addr = false;
-               bool new_4addr = false;
-
                vlansdata = IEEE80211_DEV_TO_SUB_IF(params->vlan);
 
                if (params->vlan->ieee80211_ptr->use_4addr) {
@@ -1532,26 +1530,21 @@ static int ieee80211_change_station(struct wiphy *wiphy,
                        }
 
                        rcu_assign_pointer(vlansdata->u.vlan.sta, sta);
-                       new_4addr = true;
                        __ieee80211_check_fast_rx_iface(vlansdata);
                }
 
                if (sta->sdata->vif.type == NL80211_IFTYPE_AP_VLAN &&
-                   sta->sdata->u.vlan.sta) {
+                   sta->sdata->u.vlan.sta)
                        RCU_INIT_POINTER(sta->sdata->u.vlan.sta, NULL);
-                       prev_4addr = true;
-               }
+
+               if (test_sta_flag(sta, WLAN_STA_AUTHORIZED))
+                       ieee80211_vif_dec_num_mcast(sta->sdata);
 
                sta->sdata = vlansdata;
                ieee80211_check_fast_xmit(sta);
 
-               if (sta->sta_state == IEEE80211_STA_AUTHORIZED &&
-                   prev_4addr != new_4addr) {
-                       if (new_4addr)
-                               atomic_dec(&sta->sdata->bss->num_mcast_sta);
-                       else
-                               atomic_inc(&sta->sdata->bss->num_mcast_sta);
-               }
+               if (test_sta_flag(sta, WLAN_STA_AUTHORIZED))
+                       ieee80211_vif_inc_num_mcast(sta->sdata);
 
                ieee80211_send_layer2_update(sta);
        }
@@ -3570,6 +3563,17 @@ void ieee80211_nan_func_match(struct ieee80211_vif *vif,
 }
 EXPORT_SYMBOL(ieee80211_nan_func_match);
 
+static int ieee80211_set_multicast_to_unicast(struct wiphy *wiphy,
+                                             struct net_device *dev,
+                                             const bool enabled)
+{
+       struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
+
+       sdata->u.ap.multicast_to_unicast = enabled;
+
+       return 0;
+}
+
 const struct cfg80211_ops mac80211_config_ops = {
        .add_virtual_intf = ieee80211_add_iface,
        .del_virtual_intf = ieee80211_del_iface,
@@ -3660,4 +3664,5 @@ const struct cfg80211_ops mac80211_config_ops = {
        .nan_change_conf = ieee80211_nan_change_conf,
        .add_nan_func = ieee80211_add_nan_func,
        .del_nan_func = ieee80211_del_nan_func,
+       .set_multicast_to_unicast = ieee80211_set_multicast_to_unicast,
 };