Loading net/mac80211/iface.c +19 −16 Original line number Diff line number Diff line Loading @@ -349,21 +349,19 @@ static void ieee80211_set_default_queues(struct ieee80211_sub_if_data *sdata) static int ieee80211_add_virtual_monitor(struct ieee80211_local *local) { struct ieee80211_sub_if_data *sdata; int ret = 0; int ret; if (!(local->hw.flags & IEEE80211_HW_WANT_MONITOR_VIF)) return 0; mutex_lock(&local->iflist_mtx); ASSERT_RTNL(); if (local->monitor_sdata) goto out_unlock; return 0; sdata = kzalloc(sizeof(*sdata) + local->hw.vif_data_size, GFP_KERNEL); if (!sdata) { ret = -ENOMEM; goto out_unlock; } if (!sdata) return -ENOMEM; /* set up data */ sdata->local = local; Loading @@ -377,13 +375,13 @@ static int ieee80211_add_virtual_monitor(struct ieee80211_local *local) if (WARN_ON(ret)) { /* ok .. stupid driver, it asked for this! */ kfree(sdata); goto out_unlock; return ret; } ret = ieee80211_check_queues(sdata); if (ret) { kfree(sdata); goto out_unlock; return ret; } ret = ieee80211_vif_use_channel(sdata, &local->monitor_chandef, Loading @@ -391,13 +389,14 @@ static int ieee80211_add_virtual_monitor(struct ieee80211_local *local) if (ret) { drv_remove_interface(local, sdata); kfree(sdata); goto out_unlock; return ret; } mutex_lock(&local->iflist_mtx); rcu_assign_pointer(local->monitor_sdata, sdata); out_unlock: mutex_unlock(&local->iflist_mtx); return ret; return 0; } static void ieee80211_del_virtual_monitor(struct ieee80211_local *local) Loading @@ -407,14 +406,20 @@ static void ieee80211_del_virtual_monitor(struct ieee80211_local *local) if (!(local->hw.flags & IEEE80211_HW_WANT_MONITOR_VIF)) return; ASSERT_RTNL(); mutex_lock(&local->iflist_mtx); sdata = rcu_dereference_protected(local->monitor_sdata, lockdep_is_held(&local->iflist_mtx)); if (!sdata) goto out_unlock; if (!sdata) { mutex_unlock(&local->iflist_mtx); return; } rcu_assign_pointer(local->monitor_sdata, NULL); mutex_unlock(&local->iflist_mtx); synchronize_net(); ieee80211_vif_release_channel(sdata); Loading @@ -422,8 +427,6 @@ static void ieee80211_del_virtual_monitor(struct ieee80211_local *local) drv_remove_interface(local, sdata); kfree(sdata); out_unlock: mutex_unlock(&local->iflist_mtx); } /* Loading net/mac80211/mesh.c +2 −1 Original line number Diff line number Diff line Loading @@ -1060,7 +1060,8 @@ void ieee80211_mesh_notify_scan_completed(struct ieee80211_local *local) rcu_read_lock(); list_for_each_entry_rcu(sdata, &local->interfaces, list) if (ieee80211_vif_is_mesh(&sdata->vif)) if (ieee80211_vif_is_mesh(&sdata->vif) && ieee80211_sdata_running(sdata)) ieee80211_queue_work(&local->hw, &sdata->work); rcu_read_unlock(); } Loading net/mac80211/mlme.c +4 −2 Original line number Diff line number Diff line Loading @@ -3608,8 +3608,10 @@ void ieee80211_mlme_notify_scan_completed(struct ieee80211_local *local) /* Restart STA timers */ rcu_read_lock(); list_for_each_entry_rcu(sdata, &local->interfaces, list) list_for_each_entry_rcu(sdata, &local->interfaces, list) { if (ieee80211_sdata_running(sdata)) ieee80211_restart_sta_timer(sdata); } rcu_read_unlock(); } Loading net/mac80211/rx.c +13 −1 Original line number Diff line number Diff line Loading @@ -2675,7 +2675,19 @@ ieee80211_rx_h_action_return(struct ieee80211_rx_data *rx) memset(nskb->cb, 0, sizeof(nskb->cb)); ieee80211_tx_skb(rx->sdata, nskb); if (rx->sdata->vif.type == NL80211_IFTYPE_P2P_DEVICE) { struct ieee80211_tx_info *info = IEEE80211_SKB_CB(nskb); info->flags = IEEE80211_TX_CTL_TX_OFFCHAN | IEEE80211_TX_INTFL_OFFCHAN_TX_OK | IEEE80211_TX_CTL_NO_CCK_RATE; if (local->hw.flags & IEEE80211_HW_QUEUE_CONTROL) info->hw_queue = local->hw.offchannel_tx_hw_queue; } __ieee80211_tx_skb_tid_band(rx->sdata, nskb, 7, status->band); } dev_kfree_skb(rx->skb); return RX_QUEUED; Loading net/mac80211/sta_info.c +10 −2 Original line number Diff line number Diff line Loading @@ -766,6 +766,7 @@ int __must_check __sta_info_destroy(struct sta_info *sta) struct ieee80211_local *local; struct ieee80211_sub_if_data *sdata; int ret, i; bool have_key = false; might_sleep(); Loading Loading @@ -793,12 +794,19 @@ int __must_check __sta_info_destroy(struct sta_info *sta) list_del_rcu(&sta->list); mutex_lock(&local->key_mtx); for (i = 0; i < NUM_DEFAULT_KEYS; i++) for (i = 0; i < NUM_DEFAULT_KEYS; i++) { __ieee80211_key_free(key_mtx_dereference(local, sta->gtk[i])); if (sta->ptk) have_key = true; } if (sta->ptk) { __ieee80211_key_free(key_mtx_dereference(local, sta->ptk)); have_key = true; } mutex_unlock(&local->key_mtx); if (!have_key) synchronize_net(); sta->dead = true; local->num_sta--; Loading Loading
net/mac80211/iface.c +19 −16 Original line number Diff line number Diff line Loading @@ -349,21 +349,19 @@ static void ieee80211_set_default_queues(struct ieee80211_sub_if_data *sdata) static int ieee80211_add_virtual_monitor(struct ieee80211_local *local) { struct ieee80211_sub_if_data *sdata; int ret = 0; int ret; if (!(local->hw.flags & IEEE80211_HW_WANT_MONITOR_VIF)) return 0; mutex_lock(&local->iflist_mtx); ASSERT_RTNL(); if (local->monitor_sdata) goto out_unlock; return 0; sdata = kzalloc(sizeof(*sdata) + local->hw.vif_data_size, GFP_KERNEL); if (!sdata) { ret = -ENOMEM; goto out_unlock; } if (!sdata) return -ENOMEM; /* set up data */ sdata->local = local; Loading @@ -377,13 +375,13 @@ static int ieee80211_add_virtual_monitor(struct ieee80211_local *local) if (WARN_ON(ret)) { /* ok .. stupid driver, it asked for this! */ kfree(sdata); goto out_unlock; return ret; } ret = ieee80211_check_queues(sdata); if (ret) { kfree(sdata); goto out_unlock; return ret; } ret = ieee80211_vif_use_channel(sdata, &local->monitor_chandef, Loading @@ -391,13 +389,14 @@ static int ieee80211_add_virtual_monitor(struct ieee80211_local *local) if (ret) { drv_remove_interface(local, sdata); kfree(sdata); goto out_unlock; return ret; } mutex_lock(&local->iflist_mtx); rcu_assign_pointer(local->monitor_sdata, sdata); out_unlock: mutex_unlock(&local->iflist_mtx); return ret; return 0; } static void ieee80211_del_virtual_monitor(struct ieee80211_local *local) Loading @@ -407,14 +406,20 @@ static void ieee80211_del_virtual_monitor(struct ieee80211_local *local) if (!(local->hw.flags & IEEE80211_HW_WANT_MONITOR_VIF)) return; ASSERT_RTNL(); mutex_lock(&local->iflist_mtx); sdata = rcu_dereference_protected(local->monitor_sdata, lockdep_is_held(&local->iflist_mtx)); if (!sdata) goto out_unlock; if (!sdata) { mutex_unlock(&local->iflist_mtx); return; } rcu_assign_pointer(local->monitor_sdata, NULL); mutex_unlock(&local->iflist_mtx); synchronize_net(); ieee80211_vif_release_channel(sdata); Loading @@ -422,8 +427,6 @@ static void ieee80211_del_virtual_monitor(struct ieee80211_local *local) drv_remove_interface(local, sdata); kfree(sdata); out_unlock: mutex_unlock(&local->iflist_mtx); } /* Loading
net/mac80211/mesh.c +2 −1 Original line number Diff line number Diff line Loading @@ -1060,7 +1060,8 @@ void ieee80211_mesh_notify_scan_completed(struct ieee80211_local *local) rcu_read_lock(); list_for_each_entry_rcu(sdata, &local->interfaces, list) if (ieee80211_vif_is_mesh(&sdata->vif)) if (ieee80211_vif_is_mesh(&sdata->vif) && ieee80211_sdata_running(sdata)) ieee80211_queue_work(&local->hw, &sdata->work); rcu_read_unlock(); } Loading
net/mac80211/mlme.c +4 −2 Original line number Diff line number Diff line Loading @@ -3608,8 +3608,10 @@ void ieee80211_mlme_notify_scan_completed(struct ieee80211_local *local) /* Restart STA timers */ rcu_read_lock(); list_for_each_entry_rcu(sdata, &local->interfaces, list) list_for_each_entry_rcu(sdata, &local->interfaces, list) { if (ieee80211_sdata_running(sdata)) ieee80211_restart_sta_timer(sdata); } rcu_read_unlock(); } Loading
net/mac80211/rx.c +13 −1 Original line number Diff line number Diff line Loading @@ -2675,7 +2675,19 @@ ieee80211_rx_h_action_return(struct ieee80211_rx_data *rx) memset(nskb->cb, 0, sizeof(nskb->cb)); ieee80211_tx_skb(rx->sdata, nskb); if (rx->sdata->vif.type == NL80211_IFTYPE_P2P_DEVICE) { struct ieee80211_tx_info *info = IEEE80211_SKB_CB(nskb); info->flags = IEEE80211_TX_CTL_TX_OFFCHAN | IEEE80211_TX_INTFL_OFFCHAN_TX_OK | IEEE80211_TX_CTL_NO_CCK_RATE; if (local->hw.flags & IEEE80211_HW_QUEUE_CONTROL) info->hw_queue = local->hw.offchannel_tx_hw_queue; } __ieee80211_tx_skb_tid_band(rx->sdata, nskb, 7, status->band); } dev_kfree_skb(rx->skb); return RX_QUEUED; Loading
net/mac80211/sta_info.c +10 −2 Original line number Diff line number Diff line Loading @@ -766,6 +766,7 @@ int __must_check __sta_info_destroy(struct sta_info *sta) struct ieee80211_local *local; struct ieee80211_sub_if_data *sdata; int ret, i; bool have_key = false; might_sleep(); Loading Loading @@ -793,12 +794,19 @@ int __must_check __sta_info_destroy(struct sta_info *sta) list_del_rcu(&sta->list); mutex_lock(&local->key_mtx); for (i = 0; i < NUM_DEFAULT_KEYS; i++) for (i = 0; i < NUM_DEFAULT_KEYS; i++) { __ieee80211_key_free(key_mtx_dereference(local, sta->gtk[i])); if (sta->ptk) have_key = true; } if (sta->ptk) { __ieee80211_key_free(key_mtx_dereference(local, sta->ptk)); have_key = true; } mutex_unlock(&local->key_mtx); if (!have_key) synchronize_net(); sta->dead = true; local->num_sta--; Loading