Commit 0d846bdc authored by Johannes Berg's avatar Johannes Berg

wifi: mac80211: pass 'sta' to ieee80211_rx_data_set_sta()

There's at least one case in ieee80211_rx_for_interface()
where we might pass &((struct sta_info *)NULL)->sta to it
only to then do container_of(), and then checking the
result for NULL, but checking the result of container_of()
for NULL looks really odd.

Fix this by just passing the struct sta_info * instead.

Fixes: e66b7920 ("wifi: mac80211: fix initialization of rx->link and rx->link_sta")
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent c38c7018
...@@ -4115,13 +4115,8 @@ static bool ieee80211_rx_data_set_link(struct ieee80211_rx_data *rx, ...@@ -4115,13 +4115,8 @@ static bool ieee80211_rx_data_set_link(struct ieee80211_rx_data *rx,
} }
static bool ieee80211_rx_data_set_sta(struct ieee80211_rx_data *rx, static bool ieee80211_rx_data_set_sta(struct ieee80211_rx_data *rx,
struct ieee80211_sta *pubsta, struct sta_info *sta, int link_id)
int link_id)
{ {
struct sta_info *sta;
sta = container_of(pubsta, struct sta_info, sta);
rx->link_id = link_id; rx->link_id = link_id;
rx->sta = sta; rx->sta = sta;
...@@ -4159,7 +4154,7 @@ void ieee80211_release_reorder_timeout(struct sta_info *sta, int tid) ...@@ -4159,7 +4154,7 @@ void ieee80211_release_reorder_timeout(struct sta_info *sta, int tid)
if (sta->sta.valid_links) if (sta->sta.valid_links)
link_id = ffs(sta->sta.valid_links) - 1; link_id = ffs(sta->sta.valid_links) - 1;
if (!ieee80211_rx_data_set_sta(&rx, &sta->sta, link_id)) if (!ieee80211_rx_data_set_sta(&rx, sta, link_id))
return; return;
tid_agg_rx = rcu_dereference(sta->ampdu_mlme.tid_rx[tid]); tid_agg_rx = rcu_dereference(sta->ampdu_mlme.tid_rx[tid]);
...@@ -4205,7 +4200,7 @@ void ieee80211_mark_rx_ba_filtered_frames(struct ieee80211_sta *pubsta, u8 tid, ...@@ -4205,7 +4200,7 @@ void ieee80211_mark_rx_ba_filtered_frames(struct ieee80211_sta *pubsta, u8 tid,
sta = container_of(pubsta, struct sta_info, sta); sta = container_of(pubsta, struct sta_info, sta);
if (!ieee80211_rx_data_set_sta(&rx, pubsta, -1)) if (!ieee80211_rx_data_set_sta(&rx, sta, -1))
return; return;
rcu_read_lock(); rcu_read_lock();
...@@ -4914,6 +4909,7 @@ static void __ieee80211_rx_handle_8023(struct ieee80211_hw *hw, ...@@ -4914,6 +4909,7 @@ static void __ieee80211_rx_handle_8023(struct ieee80211_hw *hw,
struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb); struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
struct ieee80211_fast_rx *fast_rx; struct ieee80211_fast_rx *fast_rx;
struct ieee80211_rx_data rx; struct ieee80211_rx_data rx;
struct sta_info *sta;
int link_id = -1; int link_id = -1;
memset(&rx, 0, sizeof(rx)); memset(&rx, 0, sizeof(rx));
...@@ -4941,7 +4937,8 @@ static void __ieee80211_rx_handle_8023(struct ieee80211_hw *hw, ...@@ -4941,7 +4937,8 @@ static void __ieee80211_rx_handle_8023(struct ieee80211_hw *hw,
* link_id is used only for stats purpose and updating the stats on * link_id is used only for stats purpose and updating the stats on
* the deflink is fine? * the deflink is fine?
*/ */
if (!ieee80211_rx_data_set_sta(&rx, pubsta, link_id)) sta = container_of(pubsta, struct sta_info, sta);
if (!ieee80211_rx_data_set_sta(&rx, sta, link_id))
goto drop; goto drop;
fast_rx = rcu_dereference(rx.sta->fast_rx); fast_rx = rcu_dereference(rx.sta->fast_rx);
...@@ -4981,7 +4978,7 @@ static bool ieee80211_rx_for_interface(struct ieee80211_rx_data *rx, ...@@ -4981,7 +4978,7 @@ static bool ieee80211_rx_for_interface(struct ieee80211_rx_data *rx,
link_id = status->link_id; link_id = status->link_id;
} }
if (!ieee80211_rx_data_set_sta(rx, &sta->sta, link_id)) if (!ieee80211_rx_data_set_sta(rx, sta, link_id))
return false; return false;
return ieee80211_prepare_and_rx_handle(rx, skb, consume); return ieee80211_prepare_and_rx_handle(rx, skb, consume);
...@@ -5048,7 +5045,8 @@ static void __ieee80211_rx_handle_packet(struct ieee80211_hw *hw, ...@@ -5048,7 +5045,8 @@ static void __ieee80211_rx_handle_packet(struct ieee80211_hw *hw,
link_id = status->link_id; link_id = status->link_id;
if (pubsta) { if (pubsta) {
if (!ieee80211_rx_data_set_sta(&rx, pubsta, link_id)) sta = container_of(pubsta, struct sta_info, sta);
if (!ieee80211_rx_data_set_sta(&rx, sta, link_id))
goto out; goto out;
/* /*
...@@ -5085,8 +5083,7 @@ static void __ieee80211_rx_handle_packet(struct ieee80211_hw *hw, ...@@ -5085,8 +5083,7 @@ static void __ieee80211_rx_handle_packet(struct ieee80211_hw *hw,
} }
rx.sdata = prev_sta->sdata; rx.sdata = prev_sta->sdata;
if (!ieee80211_rx_data_set_sta(&rx, &prev_sta->sta, if (!ieee80211_rx_data_set_sta(&rx, prev_sta, link_id))
link_id))
goto out; goto out;
if (!status->link_valid && prev_sta->sta.mlo) if (!status->link_valid && prev_sta->sta.mlo)
...@@ -5099,8 +5096,7 @@ static void __ieee80211_rx_handle_packet(struct ieee80211_hw *hw, ...@@ -5099,8 +5096,7 @@ static void __ieee80211_rx_handle_packet(struct ieee80211_hw *hw,
if (prev_sta) { if (prev_sta) {
rx.sdata = prev_sta->sdata; rx.sdata = prev_sta->sdata;
if (!ieee80211_rx_data_set_sta(&rx, &prev_sta->sta, if (!ieee80211_rx_data_set_sta(&rx, prev_sta, link_id))
link_id))
goto out; goto out;
if (!status->link_valid && prev_sta->sta.mlo) if (!status->link_valid && prev_sta->sta.mlo)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment