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

Commit 5bbe754d authored by Johannes Berg's avatar Johannes Berg
Browse files

mac80211: don't call bss_info_changed on p2p-device/monitor



Since the idle decision rework, mac80211 started calling
bss_info_changed() for the driver's monitor interface,
which causes a crash for iwlwifi, but drivers generally
don't expect this to happen. Therefore, avoid it.

While at it, also prevent calling it in such cases and
only print a warning. For the P2P Device interface the
idle will no longer be called (no channel context), so
also prevent that and warn on it.

Reported-by: default avatarChaitanya <chaitanya.mgit@gmail.com>
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 89afe614
Loading
Loading
Loading
Loading
+8 −2
Original line number Diff line number Diff line
@@ -137,6 +137,9 @@ static int ieee80211_assign_vif_chanctx(struct ieee80211_sub_if_data *sdata,

	ieee80211_recalc_txpower(sdata);
	sdata->vif.bss_conf.idle = false;

	if (sdata->vif.type != NL80211_IFTYPE_P2P_DEVICE &&
	    sdata->vif.type != NL80211_IFTYPE_MONITOR)
		ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_IDLE);

	return 0;
@@ -186,6 +189,9 @@ static void ieee80211_unassign_vif_chanctx(struct ieee80211_sub_if_data *sdata,
	rcu_assign_pointer(sdata->vif.chanctx_conf, NULL);

	sdata->vif.bss_conf.idle = true;

	if (sdata->vif.type != NL80211_IFTYPE_P2P_DEVICE &&
	    sdata->vif.type != NL80211_IFTYPE_MONITOR)
		ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_IDLE);

	drv_unassign_vif_chanctx(local, sdata, ctx);
+10 −7
Original line number Diff line number Diff line
@@ -207,13 +207,16 @@ static inline void drv_bss_info_changed(struct ieee80211_local *local,
{
	might_sleep();

	WARN_ON_ONCE(changed & (BSS_CHANGED_BEACON |
	if (WARN_ON_ONCE(changed & (BSS_CHANGED_BEACON |
				    BSS_CHANGED_BEACON_ENABLED) &&
			 sdata->vif.type != NL80211_IFTYPE_AP &&
			 sdata->vif.type != NL80211_IFTYPE_ADHOC &&
		     sdata->vif.type != NL80211_IFTYPE_MESH_POINT);
	WARN_ON_ONCE(sdata->vif.type == NL80211_IFTYPE_P2P_DEVICE &&
		     changed & ~BSS_CHANGED_IDLE);
			 sdata->vif.type != NL80211_IFTYPE_MESH_POINT))
		return;

	if (WARN_ON_ONCE(sdata->vif.type == NL80211_IFTYPE_P2P_DEVICE ||
			 sdata->vif.type == NL80211_IFTYPE_MONITOR))
		return;

	check_sdata_in_driver(sdata);