Couple of fixes/small things:
* TX control port status check fixed to not assume frame format * mesh control port fixes * error handling/leak fixes when starting AP, with HE attributes * fix broadcast packet handling with encapsulation offload * add new AKM suites * and a small code cleanup -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEH1e1rEeCd0AIMq6MB8qZga/fl8QFAl75+b4ACgkQB8qZga/f l8QfpA//QLGvnLKLZwEpmGhqtp/ZvmX3jv24QsbxLO8do210/UqVojf8WrUUWq8P 5kccKp1wxbobuUVzviAmSRRfYIkXQjFsz82dV1hei2xVhhOB1rHavCPqkorZIX+s p3a9WzaqRwgK+chGtGGDEGjkx31+Ve8tRkvRmIfhxX+r1mAF1jI8gwlsUmX7jTfN VfbiLP1pbyNemNBqrugjhOmprTqUanfaY9alJVEaglQAild7YcFdmqbpKEBogQk7 0KPnYRsD0w3pv4ewLeBypnz4+kD2+JPaPkgAeq1ppi9YcvFwTalTRaP2P4miL0+x lxfsT8eSlCls/FTEb7UheWP1Xt4ym0xAQh9e9VaWavzvbw2l6oHtCOEFL9YQrOa2 xSmNJBvle82DXy38RSFpcsaQSHAS3TAJyEeS1Z1b0D7IzBudpbwDLE828FXwylDP eTnlNy7zrYtKwazhtI0uVB2K/DrEWmwqnyPmX75AiP/3FmiDI4mxmIj0hwpzC27e jfl2d7qWLRQ8WVs0mE5u7QnNz2sZ3trq6TeO6NwLDIjdm65GpiQB2kpS6DsmIOiu phpS8vnGAC9ZNThIDvFPYvEBTkRQ+hzrsonwIU54PEVj3RMAqQaL3RPrN7UFfmVK fDZ21rjzujOchDZNCzwIpXMeAz1EzyNOzBcYwDs2bOoSKD5nYdE= =rzWh -----END PGP SIGNATURE----- Merge tag 'mac80211-for-net-2020-06-29' of git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211 Johannes Berg says: ==================== Couple of fixes/small things: * TX control port status check fixed to not assume frame format * mesh control port fixes * error handling/leak fixes when starting AP, with HE attributes * fix broadcast packet handling with encapsulation offload * add new AKM suites * and a small code cleanup ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
33c568ba49
@ -3333,13 +3333,17 @@ struct ieee80211_multiple_bssid_configuration {
|
||||
#define WLAN_AKM_SUITE_TDLS SUITE(0x000FAC, 7)
|
||||
#define WLAN_AKM_SUITE_SAE SUITE(0x000FAC, 8)
|
||||
#define WLAN_AKM_SUITE_FT_OVER_SAE SUITE(0x000FAC, 9)
|
||||
#define WLAN_AKM_SUITE_AP_PEER_KEY SUITE(0x000FAC, 10)
|
||||
#define WLAN_AKM_SUITE_8021X_SUITE_B SUITE(0x000FAC, 11)
|
||||
#define WLAN_AKM_SUITE_8021X_SUITE_B_192 SUITE(0x000FAC, 12)
|
||||
#define WLAN_AKM_SUITE_FT_8021X_SHA384 SUITE(0x000FAC, 13)
|
||||
#define WLAN_AKM_SUITE_FILS_SHA256 SUITE(0x000FAC, 14)
|
||||
#define WLAN_AKM_SUITE_FILS_SHA384 SUITE(0x000FAC, 15)
|
||||
#define WLAN_AKM_SUITE_FT_FILS_SHA256 SUITE(0x000FAC, 16)
|
||||
#define WLAN_AKM_SUITE_FT_FILS_SHA384 SUITE(0x000FAC, 17)
|
||||
#define WLAN_AKM_SUITE_OWE SUITE(0x000FAC, 18)
|
||||
#define WLAN_AKM_SUITE_FT_PSK_SHA384 SUITE(0x000FAC, 19)
|
||||
#define WLAN_AKM_SUITE_PSK_SHA384 SUITE(0x000FAC, 20)
|
||||
|
||||
#define WLAN_MAX_KEY_LEN 32
|
||||
|
||||
|
@ -1105,11 +1105,8 @@ void mesh_path_start_discovery(struct ieee80211_sub_if_data *sdata)
|
||||
ttl, lifetime, 0, ifmsh->preq_id++, sdata);
|
||||
|
||||
spin_lock_bh(&mpath->state_lock);
|
||||
if (mpath->flags & MESH_PATH_DELETED) {
|
||||
spin_unlock_bh(&mpath->state_lock);
|
||||
goto enddiscovery;
|
||||
}
|
||||
mod_timer(&mpath->timer, jiffies + mpath->discovery_timeout);
|
||||
if (!(mpath->flags & MESH_PATH_DELETED))
|
||||
mod_timer(&mpath->timer, jiffies + mpath->discovery_timeout);
|
||||
spin_unlock_bh(&mpath->state_lock);
|
||||
|
||||
enddiscovery:
|
||||
|
@ -2396,6 +2396,7 @@ static int ieee80211_802_1x_port_control(struct ieee80211_rx_data *rx)
|
||||
|
||||
static int ieee80211_drop_unencrypted(struct ieee80211_rx_data *rx, __le16 fc)
|
||||
{
|
||||
struct ieee80211_hdr *hdr = (void *)rx->skb->data;
|
||||
struct sk_buff *skb = rx->skb;
|
||||
struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
|
||||
|
||||
@ -2406,6 +2407,31 @@ static int ieee80211_drop_unencrypted(struct ieee80211_rx_data *rx, __le16 fc)
|
||||
if (status->flag & RX_FLAG_DECRYPTED)
|
||||
return 0;
|
||||
|
||||
/* check mesh EAPOL frames first */
|
||||
if (unlikely(rx->sta && ieee80211_vif_is_mesh(&rx->sdata->vif) &&
|
||||
ieee80211_is_data(fc))) {
|
||||
struct ieee80211s_hdr *mesh_hdr;
|
||||
u16 hdr_len = ieee80211_hdrlen(fc);
|
||||
u16 ethertype_offset;
|
||||
__be16 ethertype;
|
||||
|
||||
if (!ether_addr_equal(hdr->addr1, rx->sdata->vif.addr))
|
||||
goto drop_check;
|
||||
|
||||
/* make sure fixed part of mesh header is there, also checks skb len */
|
||||
if (!pskb_may_pull(rx->skb, hdr_len + 6))
|
||||
goto drop_check;
|
||||
|
||||
mesh_hdr = (struct ieee80211s_hdr *)(skb->data + hdr_len);
|
||||
ethertype_offset = hdr_len + ieee80211_get_mesh_hdrlen(mesh_hdr) +
|
||||
sizeof(rfc1042_header);
|
||||
|
||||
if (skb_copy_bits(rx->skb, ethertype_offset, ðertype, 2) == 0 &&
|
||||
ethertype == rx->sdata->control_port_protocol)
|
||||
return 0;
|
||||
}
|
||||
|
||||
drop_check:
|
||||
/* Drop unencrypted frames if key is set. */
|
||||
if (unlikely(!ieee80211_has_protected(fc) &&
|
||||
!ieee80211_is_any_nullfunc(fc) &&
|
||||
|
@ -639,11 +639,23 @@ static void ieee80211_report_ack_skb(struct ieee80211_local *local,
|
||||
u64 cookie = IEEE80211_SKB_CB(skb)->ack.cookie;
|
||||
struct ieee80211_sub_if_data *sdata;
|
||||
struct ieee80211_hdr *hdr = (void *)skb->data;
|
||||
__be16 ethertype = 0;
|
||||
|
||||
if (skb->len >= ETH_HLEN && skb->protocol == cpu_to_be16(ETH_P_802_3))
|
||||
skb_copy_bits(skb, 2 * ETH_ALEN, ðertype, ETH_TLEN);
|
||||
|
||||
rcu_read_lock();
|
||||
sdata = ieee80211_sdata_from_skb(local, skb);
|
||||
if (sdata) {
|
||||
if (ieee80211_is_any_nullfunc(hdr->frame_control))
|
||||
if (ethertype == sdata->control_port_protocol ||
|
||||
ethertype == cpu_to_be16(ETH_P_PREAUTH))
|
||||
cfg80211_control_port_tx_status(&sdata->wdev,
|
||||
cookie,
|
||||
skb->data,
|
||||
skb->len,
|
||||
acked,
|
||||
GFP_ATOMIC);
|
||||
else if (ieee80211_is_any_nullfunc(hdr->frame_control))
|
||||
cfg80211_probe_status(sdata->dev, hdr->addr1,
|
||||
cookie, acked,
|
||||
info->status.ack_signal,
|
||||
@ -654,12 +666,8 @@ static void ieee80211_report_ack_skb(struct ieee80211_local *local,
|
||||
skb->data, skb->len,
|
||||
acked, GFP_ATOMIC);
|
||||
else
|
||||
cfg80211_control_port_tx_status(&sdata->wdev,
|
||||
cookie,
|
||||
skb->data,
|
||||
skb->len,
|
||||
acked,
|
||||
GFP_ATOMIC);
|
||||
pr_warn("Unknown status report in ack skb\n");
|
||||
|
||||
}
|
||||
rcu_read_unlock();
|
||||
|
||||
|
@ -3996,6 +3996,9 @@ void __ieee80211_subif_start_xmit(struct sk_buff *skb,
|
||||
skb_list_walk_safe(skb, skb, next) {
|
||||
skb_mark_not_on_list(skb);
|
||||
|
||||
if (skb->protocol == sdata->control_port_protocol)
|
||||
ctrl_flags |= IEEE80211_TX_CTRL_SKIP_MPATH_LOOKUP;
|
||||
|
||||
skb = ieee80211_build_hdr(sdata, skb, info_flags,
|
||||
sta, ctrl_flags, cookie);
|
||||
if (IS_ERR(skb)) {
|
||||
@ -4206,7 +4209,7 @@ static void ieee80211_8023_xmit(struct ieee80211_sub_if_data *sdata,
|
||||
(!sta || !test_sta_flag(sta, WLAN_STA_TDLS_PEER)))
|
||||
ra = sdata->u.mgd.bssid;
|
||||
|
||||
if (!is_valid_ether_addr(ra))
|
||||
if (is_zero_ether_addr(ra))
|
||||
goto out_free;
|
||||
|
||||
multicast = is_multicast_ether_addr(ra);
|
||||
@ -5371,7 +5374,8 @@ int ieee80211_tx_control_port(struct wiphy *wiphy, struct net_device *dev,
|
||||
return -EINVAL;
|
||||
|
||||
if (proto == sdata->control_port_protocol)
|
||||
ctrl_flags |= IEEE80211_TX_CTRL_PORT_CTRL_PROTO;
|
||||
ctrl_flags |= IEEE80211_TX_CTRL_PORT_CTRL_PROTO |
|
||||
IEEE80211_TX_CTRL_SKIP_MPATH_LOOKUP;
|
||||
|
||||
if (unencrypted)
|
||||
flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT;
|
||||
|
@ -5016,7 +5016,8 @@ static int nl80211_start_ap(struct sk_buff *skb, struct genl_info *info)
|
||||
err = nl80211_parse_he_obss_pd(
|
||||
info->attrs[NL80211_ATTR_HE_OBSS_PD],
|
||||
¶ms.he_obss_pd);
|
||||
goto out;
|
||||
if (err)
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (info->attrs[NL80211_ATTR_HE_BSS_COLOR]) {
|
||||
@ -5024,7 +5025,7 @@ static int nl80211_start_ap(struct sk_buff *skb, struct genl_info *info)
|
||||
info->attrs[NL80211_ATTR_HE_BSS_COLOR],
|
||||
¶ms.he_bss_color);
|
||||
if (err)
|
||||
return err;
|
||||
goto out;
|
||||
}
|
||||
|
||||
nl80211_calculate_ap_params(¶ms);
|
||||
|
Loading…
Reference in New Issue
Block a user