Loading net/mac80211/cfg.c +23 −21 Original line number Diff line number Diff line Loading @@ -1021,8 +1021,10 @@ static int ieee80211_start_ap(struct wiphy *wiphy, struct net_device *dev, IEEE80211_P2P_OPPPS_ENABLE_BIT; err = ieee80211_assign_beacon(sdata, ¶ms->beacon); if (err < 0) if (err < 0) { ieee80211_vif_release_channel(sdata); return err; } changed |= err; err = drv_start_ap(sdata->local, sdata); Loading @@ -1032,6 +1034,7 @@ static int ieee80211_start_ap(struct wiphy *wiphy, struct net_device *dev, if (old) kfree_rcu(old, rcu_head); RCU_INIT_POINTER(sdata->u.ap.beacon, NULL); ieee80211_vif_release_channel(sdata); return err; } Loading Loading @@ -1090,8 +1093,6 @@ static int ieee80211_stop_ap(struct wiphy *wiphy, struct net_device *dev) kfree(sdata->u.ap.next_beacon); sdata->u.ap.next_beacon = NULL; cancel_work_sync(&sdata->u.ap.request_smps_work); /* turn off carrier for this interface and dependent VLANs */ list_for_each_entry(vlan, &sdata->u.ap.vlans, u.vlan.list) netif_carrier_off(vlan->dev); Loading @@ -1103,6 +1104,7 @@ static int ieee80211_stop_ap(struct wiphy *wiphy, struct net_device *dev) kfree_rcu(old_beacon, rcu_head); if (old_probe_resp) kfree_rcu(old_probe_resp, rcu_head); sdata->u.ap.driver_smps_mode = IEEE80211_SMPS_OFF; __sta_info_flush(sdata, true); ieee80211_free_keys(sdata, true); Loading Loading @@ -2638,6 +2640,24 @@ static int ieee80211_start_roc_work(struct ieee80211_local *local, INIT_DELAYED_WORK(&roc->work, ieee80211_sw_roc_work); INIT_LIST_HEAD(&roc->dependents); /* * cookie is either the roc cookie (for normal roc) * or the SKB (for mgmt TX) */ if (!txskb) { /* local->mtx protects this */ local->roc_cookie_counter++; roc->cookie = local->roc_cookie_counter; /* wow, you wrapped 64 bits ... more likely a bug */ if (WARN_ON(roc->cookie == 0)) { roc->cookie = 1; local->roc_cookie_counter++; } *cookie = roc->cookie; } else { *cookie = (unsigned long)txskb; } /* if there's one pending or we're scanning, queue this one */ if (!list_empty(&local->roc_list) || local->scanning || local->radar_detect_enabled) Loading Loading @@ -2772,24 +2792,6 @@ static int ieee80211_start_roc_work(struct ieee80211_local *local, if (!queued) list_add_tail(&roc->list, &local->roc_list); /* * cookie is either the roc cookie (for normal roc) * or the SKB (for mgmt TX) */ if (!txskb) { /* local->mtx protects this */ local->roc_cookie_counter++; roc->cookie = local->roc_cookie_counter; /* wow, you wrapped 64 bits ... more likely a bug */ if (WARN_ON(roc->cookie == 0)) { roc->cookie = 1; local->roc_cookie_counter++; } *cookie = roc->cookie; } else { *cookie = (unsigned long)txskb; } return 0; } Loading net/mac80211/ht.c +3 −1 Original line number Diff line number Diff line Loading @@ -466,7 +466,9 @@ void ieee80211_request_smps_ap_work(struct work_struct *work) u.ap.request_smps_work); sdata_lock(sdata); __ieee80211_request_smps_ap(sdata, sdata->u.ap.driver_smps_mode); if (sdata_dereference(sdata->u.ap.beacon, sdata)) __ieee80211_request_smps_ap(sdata, sdata->u.ap.driver_smps_mode); sdata_unlock(sdata); } Loading net/mac80211/ibss.c +1 −4 Original line number Diff line number Diff line Loading @@ -695,12 +695,9 @@ static void ieee80211_ibss_disconnect(struct ieee80211_sub_if_data *sdata) struct cfg80211_bss *cbss; struct beacon_data *presp; struct sta_info *sta; int active_ibss; u16 capability; active_ibss = ieee80211_sta_active_ibss(sdata); if (!active_ibss && !is_zero_ether_addr(ifibss->bssid)) { if (!is_zero_ether_addr(ifibss->bssid)) { capability = WLAN_CAPABILITY_IBSS; if (ifibss->privacy) Loading net/mac80211/iface.c +19 −8 Original line number Diff line number Diff line Loading @@ -418,20 +418,24 @@ int ieee80211_add_virtual_monitor(struct ieee80211_local *local) return ret; } mutex_lock(&local->iflist_mtx); rcu_assign_pointer(local->monitor_sdata, sdata); mutex_unlock(&local->iflist_mtx); mutex_lock(&local->mtx); ret = ieee80211_vif_use_channel(sdata, &local->monitor_chandef, IEEE80211_CHANCTX_EXCLUSIVE); mutex_unlock(&local->mtx); if (ret) { mutex_lock(&local->iflist_mtx); rcu_assign_pointer(local->monitor_sdata, NULL); mutex_unlock(&local->iflist_mtx); synchronize_net(); drv_remove_interface(local, sdata); kfree(sdata); return ret; } mutex_lock(&local->iflist_mtx); rcu_assign_pointer(local->monitor_sdata, sdata); mutex_unlock(&local->iflist_mtx); return 0; } Loading Loading @@ -770,12 +774,19 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata, ieee80211_roc_purge(local, sdata); if (sdata->vif.type == NL80211_IFTYPE_STATION) switch (sdata->vif.type) { case NL80211_IFTYPE_STATION: ieee80211_mgd_stop(sdata); if (sdata->vif.type == NL80211_IFTYPE_ADHOC) break; case NL80211_IFTYPE_ADHOC: ieee80211_ibss_stop(sdata); break; case NL80211_IFTYPE_AP: cancel_work_sync(&sdata->u.ap.request_smps_work); break; default: break; } /* * Remove all stations associated with this interface. Loading net/mac80211/tx.c +1 −1 Original line number Diff line number Diff line Loading @@ -878,7 +878,7 @@ static int ieee80211_fragment(struct ieee80211_tx_data *tx, } /* adjust first fragment's length */ skb->len = hdrlen + per_fragm; skb_trim(skb, hdrlen + per_fragm); return 0; } Loading Loading
net/mac80211/cfg.c +23 −21 Original line number Diff line number Diff line Loading @@ -1021,8 +1021,10 @@ static int ieee80211_start_ap(struct wiphy *wiphy, struct net_device *dev, IEEE80211_P2P_OPPPS_ENABLE_BIT; err = ieee80211_assign_beacon(sdata, ¶ms->beacon); if (err < 0) if (err < 0) { ieee80211_vif_release_channel(sdata); return err; } changed |= err; err = drv_start_ap(sdata->local, sdata); Loading @@ -1032,6 +1034,7 @@ static int ieee80211_start_ap(struct wiphy *wiphy, struct net_device *dev, if (old) kfree_rcu(old, rcu_head); RCU_INIT_POINTER(sdata->u.ap.beacon, NULL); ieee80211_vif_release_channel(sdata); return err; } Loading Loading @@ -1090,8 +1093,6 @@ static int ieee80211_stop_ap(struct wiphy *wiphy, struct net_device *dev) kfree(sdata->u.ap.next_beacon); sdata->u.ap.next_beacon = NULL; cancel_work_sync(&sdata->u.ap.request_smps_work); /* turn off carrier for this interface and dependent VLANs */ list_for_each_entry(vlan, &sdata->u.ap.vlans, u.vlan.list) netif_carrier_off(vlan->dev); Loading @@ -1103,6 +1104,7 @@ static int ieee80211_stop_ap(struct wiphy *wiphy, struct net_device *dev) kfree_rcu(old_beacon, rcu_head); if (old_probe_resp) kfree_rcu(old_probe_resp, rcu_head); sdata->u.ap.driver_smps_mode = IEEE80211_SMPS_OFF; __sta_info_flush(sdata, true); ieee80211_free_keys(sdata, true); Loading Loading @@ -2638,6 +2640,24 @@ static int ieee80211_start_roc_work(struct ieee80211_local *local, INIT_DELAYED_WORK(&roc->work, ieee80211_sw_roc_work); INIT_LIST_HEAD(&roc->dependents); /* * cookie is either the roc cookie (for normal roc) * or the SKB (for mgmt TX) */ if (!txskb) { /* local->mtx protects this */ local->roc_cookie_counter++; roc->cookie = local->roc_cookie_counter; /* wow, you wrapped 64 bits ... more likely a bug */ if (WARN_ON(roc->cookie == 0)) { roc->cookie = 1; local->roc_cookie_counter++; } *cookie = roc->cookie; } else { *cookie = (unsigned long)txskb; } /* if there's one pending or we're scanning, queue this one */ if (!list_empty(&local->roc_list) || local->scanning || local->radar_detect_enabled) Loading Loading @@ -2772,24 +2792,6 @@ static int ieee80211_start_roc_work(struct ieee80211_local *local, if (!queued) list_add_tail(&roc->list, &local->roc_list); /* * cookie is either the roc cookie (for normal roc) * or the SKB (for mgmt TX) */ if (!txskb) { /* local->mtx protects this */ local->roc_cookie_counter++; roc->cookie = local->roc_cookie_counter; /* wow, you wrapped 64 bits ... more likely a bug */ if (WARN_ON(roc->cookie == 0)) { roc->cookie = 1; local->roc_cookie_counter++; } *cookie = roc->cookie; } else { *cookie = (unsigned long)txskb; } return 0; } Loading
net/mac80211/ht.c +3 −1 Original line number Diff line number Diff line Loading @@ -466,7 +466,9 @@ void ieee80211_request_smps_ap_work(struct work_struct *work) u.ap.request_smps_work); sdata_lock(sdata); __ieee80211_request_smps_ap(sdata, sdata->u.ap.driver_smps_mode); if (sdata_dereference(sdata->u.ap.beacon, sdata)) __ieee80211_request_smps_ap(sdata, sdata->u.ap.driver_smps_mode); sdata_unlock(sdata); } Loading
net/mac80211/ibss.c +1 −4 Original line number Diff line number Diff line Loading @@ -695,12 +695,9 @@ static void ieee80211_ibss_disconnect(struct ieee80211_sub_if_data *sdata) struct cfg80211_bss *cbss; struct beacon_data *presp; struct sta_info *sta; int active_ibss; u16 capability; active_ibss = ieee80211_sta_active_ibss(sdata); if (!active_ibss && !is_zero_ether_addr(ifibss->bssid)) { if (!is_zero_ether_addr(ifibss->bssid)) { capability = WLAN_CAPABILITY_IBSS; if (ifibss->privacy) Loading
net/mac80211/iface.c +19 −8 Original line number Diff line number Diff line Loading @@ -418,20 +418,24 @@ int ieee80211_add_virtual_monitor(struct ieee80211_local *local) return ret; } mutex_lock(&local->iflist_mtx); rcu_assign_pointer(local->monitor_sdata, sdata); mutex_unlock(&local->iflist_mtx); mutex_lock(&local->mtx); ret = ieee80211_vif_use_channel(sdata, &local->monitor_chandef, IEEE80211_CHANCTX_EXCLUSIVE); mutex_unlock(&local->mtx); if (ret) { mutex_lock(&local->iflist_mtx); rcu_assign_pointer(local->monitor_sdata, NULL); mutex_unlock(&local->iflist_mtx); synchronize_net(); drv_remove_interface(local, sdata); kfree(sdata); return ret; } mutex_lock(&local->iflist_mtx); rcu_assign_pointer(local->monitor_sdata, sdata); mutex_unlock(&local->iflist_mtx); return 0; } Loading Loading @@ -770,12 +774,19 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata, ieee80211_roc_purge(local, sdata); if (sdata->vif.type == NL80211_IFTYPE_STATION) switch (sdata->vif.type) { case NL80211_IFTYPE_STATION: ieee80211_mgd_stop(sdata); if (sdata->vif.type == NL80211_IFTYPE_ADHOC) break; case NL80211_IFTYPE_ADHOC: ieee80211_ibss_stop(sdata); break; case NL80211_IFTYPE_AP: cancel_work_sync(&sdata->u.ap.request_smps_work); break; default: break; } /* * Remove all stations associated with this interface. Loading
net/mac80211/tx.c +1 −1 Original line number Diff line number Diff line Loading @@ -878,7 +878,7 @@ static int ieee80211_fragment(struct ieee80211_tx_data *tx, } /* adjust first fragment's length */ skb->len = hdrlen + per_fragm; skb_trim(skb, hdrlen + per_fragm); return 0; } Loading