Commit 190355cc authored by John W. Linville's avatar John W. Linville

Merge tag 'mac80211-for-john-2014-08-29' of...

Merge tag 'mac80211-for-john-2014-08-29' of git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211

Johannes Berg <johannes@sipsolutions.net> says:

"Here are a few fixes for mac80211. One has been discussed for a while
and adds a terminating NUL-byte to the alpha2 sent to userspace, which
shouldn't be necessary but since many places treat it as a string we
couldn't move to just sending two bytes.

In addition to that, we have two VLAN fixes from Felix, a mesh fix, a
fix for the recently introduced RX aggregation offload, a revert for
a broken patch (that luckily didn't really cause any harm) and a small
fix for alignment in debugfs."
Signed-off-by: default avatarJohn W. Linville <linville@redhat.com>
parents c6651716 14b058bb
...@@ -167,7 +167,7 @@ struct ieee80211_reg_rule { ...@@ -167,7 +167,7 @@ struct ieee80211_reg_rule {
struct ieee80211_regdomain { struct ieee80211_regdomain {
struct rcu_head rcu_head; struct rcu_head rcu_head;
u32 n_reg_rules; u32 n_reg_rules;
char alpha2[2]; char alpha2[3];
enum nl80211_dfs_regions dfs_region; enum nl80211_dfs_regions dfs_region;
struct ieee80211_reg_rule reg_rules[]; struct ieee80211_reg_rule reg_rules[];
}; };
......
...@@ -541,6 +541,8 @@ static void ieee80211_recalc_chanctx_chantype(struct ieee80211_local *local, ...@@ -541,6 +541,8 @@ static void ieee80211_recalc_chanctx_chantype(struct ieee80211_local *local,
continue; continue;
if (rcu_access_pointer(sdata->vif.chanctx_conf) != conf) if (rcu_access_pointer(sdata->vif.chanctx_conf) != conf)
continue; continue;
if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
continue;
if (!compat) if (!compat)
compat = &sdata->vif.bss_conf.chandef; compat = &sdata->vif.bss_conf.chandef;
......
...@@ -167,7 +167,7 @@ static ssize_t sta_agg_status_read(struct file *file, char __user *userbuf, ...@@ -167,7 +167,7 @@ static ssize_t sta_agg_status_read(struct file *file, char __user *userbuf,
p += scnprintf(p, sizeof(buf) + buf - p, "next dialog_token: %#02x\n", p += scnprintf(p, sizeof(buf) + buf - p, "next dialog_token: %#02x\n",
sta->ampdu_mlme.dialog_token_allocator + 1); sta->ampdu_mlme.dialog_token_allocator + 1);
p += scnprintf(p, sizeof(buf) + buf - p, p += scnprintf(p, sizeof(buf) + buf - p,
"TID\t\tRX active\tDTKN\tSSN\t\tTX\tDTKN\tpending\n"); "TID\t\tRX\tDTKN\tSSN\t\tTX\tDTKN\tpending\n");
for (i = 0; i < IEEE80211_NUM_TIDS; i++) { for (i = 0; i < IEEE80211_NUM_TIDS; i++) {
tid_rx = rcu_dereference(sta->ampdu_mlme.tid_rx[i]); tid_rx = rcu_dereference(sta->ampdu_mlme.tid_rx[i]);
......
...@@ -1175,8 +1175,8 @@ static void ieee80211_iface_work(struct work_struct *work) ...@@ -1175,8 +1175,8 @@ static void ieee80211_iface_work(struct work_struct *work)
if (sta) { if (sta) {
u16 last_seq; u16 last_seq;
last_seq = le16_to_cpu( last_seq = IEEE80211_SEQ_TO_SN(le16_to_cpu(
sta->last_seq_ctrl[rx_agg->tid]); sta->last_seq_ctrl[rx_agg->tid]));
__ieee80211_start_rx_ba_session(sta, __ieee80211_start_rx_ba_session(sta,
0, 0, 0, 0,
......
...@@ -959,7 +959,8 @@ mesh_plink_get_event(struct ieee80211_sub_if_data *sdata, ...@@ -959,7 +959,8 @@ mesh_plink_get_event(struct ieee80211_sub_if_data *sdata,
if (!matches_local) if (!matches_local)
event = CNF_RJCT; event = CNF_RJCT;
if (!mesh_plink_free_count(sdata) || if (!mesh_plink_free_count(sdata) ||
(sta->llid != llid || sta->plid != plid)) sta->llid != llid ||
(sta->plid && sta->plid != plid))
event = CNF_IGNR; event = CNF_IGNR;
else else
event = CNF_ACPT; event = CNF_ACPT;
...@@ -1080,6 +1081,10 @@ mesh_process_plink_frame(struct ieee80211_sub_if_data *sdata, ...@@ -1080,6 +1081,10 @@ mesh_process_plink_frame(struct ieee80211_sub_if_data *sdata,
goto unlock_rcu; goto unlock_rcu;
} }
/* 802.11-2012 13.3.7.2 - update plid on CNF if not set */
if (!sta->plid && event == CNF_ACPT)
sta->plid = plid;
changed |= mesh_plink_fsm(sdata, sta, event); changed |= mesh_plink_fsm(sdata, sta, event);
unlock_rcu: unlock_rcu:
......
...@@ -4376,8 +4376,7 @@ int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata, ...@@ -4376,8 +4376,7 @@ int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata,
rcu_read_unlock(); rcu_read_unlock();
if (bss->wmm_used && bss->uapsd_supported && if (bss->wmm_used && bss->uapsd_supported &&
(sdata->local->hw.flags & IEEE80211_HW_SUPPORTS_UAPSD) && (sdata->local->hw.flags & IEEE80211_HW_SUPPORTS_UAPSD)) {
sdata->wmm_acm != 0xff) {
assoc_data->uapsd = true; assoc_data->uapsd = true;
ifmgd->flags |= IEEE80211_STA_UAPSD_ENABLED; ifmgd->flags |= IEEE80211_STA_UAPSD_ENABLED;
} else { } else {
......
...@@ -1094,8 +1094,11 @@ void ieee80211_sta_ps_deliver_wakeup(struct sta_info *sta) ...@@ -1094,8 +1094,11 @@ void ieee80211_sta_ps_deliver_wakeup(struct sta_info *sta)
unsigned long flags; unsigned long flags;
struct ps_data *ps; struct ps_data *ps;
if (sdata->vif.type == NL80211_IFTYPE_AP || if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
sdata->vif.type == NL80211_IFTYPE_AP_VLAN) sdata = container_of(sdata->bss, struct ieee80211_sub_if_data,
u.ap);
if (sdata->vif.type == NL80211_IFTYPE_AP)
ps = &sdata->bss->ps; ps = &sdata->bss->ps;
else if (ieee80211_vif_is_mesh(&sdata->vif)) else if (ieee80211_vif_is_mesh(&sdata->vif))
ps = &sdata->u.mesh.ps; ps = &sdata->u.mesh.ps;
......
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