Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fae17213 authored by John W. Linville's avatar John W. Linville
Browse files
parents 36ef0b47 370bd005
Loading
Loading
Loading
Loading
+19 −16
Original line number Diff line number Diff line
@@ -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;
@@ -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,
@@ -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)
@@ -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);
@@ -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);
}

/*
+2 −1
Original line number Diff line number Diff line
@@ -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();
}
+4 −2
Original line number Diff line number Diff line
@@ -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();
}

+13 −1
Original line number Diff line number Diff line
@@ -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;
+10 −2
Original line number Diff line number Diff line
@@ -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();

@@ -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