Merge branch 'for-john' of git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211-next
Conflicts: drivers/net/wireless/mac80211_hwsim.c
This commit is contained in:
@@ -117,7 +117,7 @@ static u32 mesh_set_ht_prot_mode(struct ieee80211_sub_if_data *sdata)
|
||||
u16 ht_opmode;
|
||||
bool non_ht_sta = false, ht20_sta = false;
|
||||
|
||||
if (local->_oper_channel_type == NL80211_CHAN_NO_HT)
|
||||
if (sdata->vif.bss_conf.channel_type == NL80211_CHAN_NO_HT)
|
||||
return 0;
|
||||
|
||||
rcu_read_lock();
|
||||
@@ -147,7 +147,8 @@ out:
|
||||
|
||||
if (non_ht_sta)
|
||||
ht_opmode = IEEE80211_HT_OP_MODE_PROTECTION_NONHT_MIXED;
|
||||
else if (ht20_sta && local->_oper_channel_type > NL80211_CHAN_HT20)
|
||||
else if (ht20_sta &&
|
||||
sdata->vif.bss_conf.channel_type > NL80211_CHAN_HT20)
|
||||
ht_opmode = IEEE80211_HT_OP_MODE_PROTECTION_20MHZ;
|
||||
else
|
||||
ht_opmode = IEEE80211_HT_OP_MODE_PROTECTION_NONE;
|
||||
@@ -215,12 +216,14 @@ static int mesh_plink_frame_tx(struct ieee80211_sub_if_data *sdata,
|
||||
u8 *da, __le16 llid, __le16 plid, __le16 reason) {
|
||||
struct ieee80211_local *local = sdata->local;
|
||||
struct sk_buff *skb;
|
||||
struct ieee80211_tx_info *info;
|
||||
struct ieee80211_mgmt *mgmt;
|
||||
bool include_plid = false;
|
||||
u16 peering_proto = 0;
|
||||
u8 *pos, ie_len = 4;
|
||||
int hdr_len = offsetof(struct ieee80211_mgmt, u.action.u.self_prot) +
|
||||
sizeof(mgmt->u.action.u.self_prot);
|
||||
int err = -ENOMEM;
|
||||
|
||||
skb = dev_alloc_skb(local->tx_headroom +
|
||||
hdr_len +
|
||||
@@ -236,6 +239,7 @@ static int mesh_plink_frame_tx(struct ieee80211_sub_if_data *sdata,
|
||||
sdata->u.mesh.ie_len);
|
||||
if (!skb)
|
||||
return -1;
|
||||
info = IEEE80211_SKB_CB(skb);
|
||||
skb_reserve(skb, local->tx_headroom);
|
||||
mgmt = (struct ieee80211_mgmt *) skb_put(skb, hdr_len);
|
||||
memset(mgmt, 0, hdr_len);
|
||||
@@ -256,15 +260,18 @@ static int mesh_plink_frame_tx(struct ieee80211_sub_if_data *sdata,
|
||||
pos = skb_put(skb, 2);
|
||||
memcpy(pos + 2, &plid, 2);
|
||||
}
|
||||
if (ieee80211_add_srates_ie(sdata, skb, true) ||
|
||||
ieee80211_add_ext_srates_ie(sdata, skb, true) ||
|
||||
if (ieee80211_add_srates_ie(sdata, skb, true,
|
||||
local->oper_channel->band) ||
|
||||
ieee80211_add_ext_srates_ie(sdata, skb, true,
|
||||
local->oper_channel->band) ||
|
||||
mesh_add_rsn_ie(skb, sdata) ||
|
||||
mesh_add_meshid_ie(skb, sdata) ||
|
||||
mesh_add_meshconf_ie(skb, sdata))
|
||||
return -1;
|
||||
goto free;
|
||||
} else { /* WLAN_SP_MESH_PEERING_CLOSE */
|
||||
info->flags |= IEEE80211_TX_CTL_NO_ACK;
|
||||
if (mesh_add_meshid_ie(skb, sdata))
|
||||
return -1;
|
||||
goto free;
|
||||
}
|
||||
|
||||
/* Add Mesh Peering Management element */
|
||||
@@ -283,11 +290,12 @@ static int mesh_plink_frame_tx(struct ieee80211_sub_if_data *sdata,
|
||||
ie_len += 2; /* reason code */
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
err = -EINVAL;
|
||||
goto free;
|
||||
}
|
||||
|
||||
if (WARN_ON(skb_tailroom(skb) < 2 + ie_len))
|
||||
return -ENOMEM;
|
||||
goto free;
|
||||
|
||||
pos = skb_put(skb, 2 + ie_len);
|
||||
*pos++ = WLAN_EID_PEER_MGMT;
|
||||
@@ -308,14 +316,17 @@ static int mesh_plink_frame_tx(struct ieee80211_sub_if_data *sdata,
|
||||
if (action != WLAN_SP_MESH_PEERING_CLOSE) {
|
||||
if (mesh_add_ht_cap_ie(skb, sdata) ||
|
||||
mesh_add_ht_oper_ie(skb, sdata))
|
||||
return -1;
|
||||
goto free;
|
||||
}
|
||||
|
||||
if (mesh_add_vendor_ies(skb, sdata))
|
||||
return -1;
|
||||
goto free;
|
||||
|
||||
ieee80211_tx_skb(sdata, skb);
|
||||
return 0;
|
||||
free:
|
||||
kfree_skb(skb);
|
||||
return err;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -360,9 +371,14 @@ static struct sta_info *mesh_peer_init(struct ieee80211_sub_if_data *sdata,
|
||||
|
||||
spin_lock_bh(&sta->lock);
|
||||
sta->last_rx = jiffies;
|
||||
if (sta->plink_state == NL80211_PLINK_ESTAB) {
|
||||
spin_unlock_bh(&sta->lock);
|
||||
return sta;
|
||||
}
|
||||
|
||||
sta->sta.supp_rates[band] = rates;
|
||||
if (elems->ht_cap_elem &&
|
||||
sdata->local->_oper_channel_type != NL80211_CHAN_NO_HT)
|
||||
sdata->vif.bss_conf.channel_type != NL80211_CHAN_NO_HT)
|
||||
ieee80211_ht_cap_ie_to_sta_ht_cap(sdata, sband,
|
||||
elems->ht_cap_elem,
|
||||
&sta->sta.ht_cap);
|
||||
|
Reference in New Issue
Block a user