Commit 00d67093 authored by Jakub Kicinski's avatar Jakub Kicinski

Merge tag 'wireless-2023-10-24' of git://git.kernel.org/pub/scm/linux/kernel/git/wireless/wireless

Johannes Berg says:

====================
Three more fixes:
 - don't drop all unprotected public action frames since
   some don't have a protected dual
 - fix pointer confusion in scanning code
 - fix warning in some connections with multiple links

* tag 'wireless-2023-10-24' of git://git.kernel.org/pub/scm/linux/kernel/git/wireless/wireless:
  wifi: mac80211: don't drop all unprotected public action frames
  wifi: cfg80211: fix assoc response warning on failed links
  wifi: cfg80211: pass correct pointer to rdev_inform_bss()
====================

Link: https://lore.kernel.org/r/20231024103540.19198-2-johannes@sipsolutions.netSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents cd8892c0 91535613
...@@ -4355,6 +4355,35 @@ static inline bool ieee80211_is_public_action(struct ieee80211_hdr *hdr, ...@@ -4355,6 +4355,35 @@ static inline bool ieee80211_is_public_action(struct ieee80211_hdr *hdr,
return mgmt->u.action.category == WLAN_CATEGORY_PUBLIC; return mgmt->u.action.category == WLAN_CATEGORY_PUBLIC;
} }
/**
* ieee80211_is_protected_dual_of_public_action - check if skb contains a
* protected dual of public action management frame
* @skb: the skb containing the frame, length will be checked
*
* Return: true if the skb contains a protected dual of public action
* management frame, false otherwise.
*/
static inline bool
ieee80211_is_protected_dual_of_public_action(struct sk_buff *skb)
{
u8 action;
if (!ieee80211_is_public_action((void *)skb->data, skb->len) ||
skb->len < IEEE80211_MIN_ACTION_SIZE + 1)
return false;
action = *(u8 *)(skb->data + IEEE80211_MIN_ACTION_SIZE);
return action != WLAN_PUB_ACTION_20_40_BSS_COEX &&
action != WLAN_PUB_ACTION_DSE_REG_LOC_ANN &&
action != WLAN_PUB_ACTION_MSMT_PILOT &&
action != WLAN_PUB_ACTION_TDLS_DISCOVER_RES &&
action != WLAN_PUB_ACTION_LOC_TRACK_NOTI &&
action != WLAN_PUB_ACTION_FTM_REQUEST &&
action != WLAN_PUB_ACTION_FTM_RESPONSE &&
action != WLAN_PUB_ACTION_FILS_DISCOVERY;
}
/** /**
* _ieee80211_is_group_privacy_action - check if frame is a group addressed * _ieee80211_is_group_privacy_action - check if frame is a group addressed
* privacy action frame * privacy action frame
......
...@@ -2468,8 +2468,7 @@ static int ieee80211_drop_unencrypted_mgmt(struct ieee80211_rx_data *rx) ...@@ -2468,8 +2468,7 @@ static int ieee80211_drop_unencrypted_mgmt(struct ieee80211_rx_data *rx)
/* drop unicast public action frames when using MPF */ /* drop unicast public action frames when using MPF */
if (is_unicast_ether_addr(mgmt->da) && if (is_unicast_ether_addr(mgmt->da) &&
ieee80211_is_public_action((void *)rx->skb->data, ieee80211_is_protected_dual_of_public_action(rx->skb))
rx->skb->len))
return -EACCES; return -EACCES;
} }
......
...@@ -43,10 +43,11 @@ void cfg80211_rx_assoc_resp(struct net_device *dev, ...@@ -43,10 +43,11 @@ void cfg80211_rx_assoc_resp(struct net_device *dev,
for (link_id = 0; link_id < ARRAY_SIZE(data->links); link_id++) { for (link_id = 0; link_id < ARRAY_SIZE(data->links); link_id++) {
cr.links[link_id].status = data->links[link_id].status; cr.links[link_id].status = data->links[link_id].status;
cr.links[link_id].bss = data->links[link_id].bss;
WARN_ON_ONCE(cr.links[link_id].status != WLAN_STATUS_SUCCESS && WARN_ON_ONCE(cr.links[link_id].status != WLAN_STATUS_SUCCESS &&
(!cr.ap_mld_addr || !cr.links[link_id].bss)); (!cr.ap_mld_addr || !cr.links[link_id].bss));
cr.links[link_id].bss = data->links[link_id].bss;
if (!cr.links[link_id].bss) if (!cr.links[link_id].bss)
continue; continue;
cr.links[link_id].bssid = data->links[link_id].bss->bssid; cr.links[link_id].bssid = data->links[link_id].bss->bssid;
......
...@@ -2125,7 +2125,7 @@ cfg80211_inform_single_bss_data(struct wiphy *wiphy, ...@@ -2125,7 +2125,7 @@ cfg80211_inform_single_bss_data(struct wiphy *wiphy,
if (!res) if (!res)
goto drop; goto drop;
rdev_inform_bss(rdev, &res->pub, ies, data->drv_data); rdev_inform_bss(rdev, &res->pub, ies, drv_data->drv_data);
if (data->bss_source == BSS_SOURCE_MBSSID) { if (data->bss_source == BSS_SOURCE_MBSSID) {
/* this is a nontransmitting bss, we need to add it to /* this is a nontransmitting bss, we need to add it to
......
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