mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 03:01:39 -04:00
mac80211: process and save VHT MU-MIMO group frame
The Group ID Management frame is an Action frame of category VHT. It is transmitted by the AP to assign or change the user position of a STA for one or more group IDs. Process and save the group membership data. Notify underlying driver of changes. Signed-off-by: Sara Sharon <[email protected]> Signed-off-by: Emmanuel Grumbach <[email protected]> Signed-off-by: Johannes Berg <[email protected]>
This commit is contained in:
parent
c799ba6eab
commit
23a1f8d44c
8 changed files with 76 additions and 0 deletions
|
|
@ -1714,6 +1714,8 @@ ieee80211_vht_cap_ie_to_sta_vht_cap(struct ieee80211_sub_if_data *sdata,
|
|||
enum ieee80211_sta_rx_bandwidth ieee80211_sta_cap_rx_bw(struct sta_info *sta);
|
||||
enum ieee80211_sta_rx_bandwidth ieee80211_sta_cur_vht_bw(struct sta_info *sta);
|
||||
void ieee80211_sta_set_rx_nss(struct sta_info *sta);
|
||||
void ieee80211_process_mu_groups(struct ieee80211_sub_if_data *sdata,
|
||||
struct ieee80211_mgmt *mgmt);
|
||||
u32 __ieee80211_vht_handle_opmode(struct ieee80211_sub_if_data *sdata,
|
||||
struct sta_info *sta, u8 opmode,
|
||||
enum ieee80211_band band);
|
||||
|
|
|
|||
|
|
@ -1271,6 +1271,16 @@ static void ieee80211_iface_work(struct work_struct *work)
|
|||
}
|
||||
}
|
||||
mutex_unlock(&local->sta_mtx);
|
||||
} else if (ieee80211_is_action(mgmt->frame_control) &&
|
||||
mgmt->u.action.category == WLAN_CATEGORY_VHT) {
|
||||
switch (mgmt->u.action.u.vht_group_notif.action_code) {
|
||||
case WLAN_VHT_ACTION_GROUPID_MGMT:
|
||||
ieee80211_process_mu_groups(sdata, mgmt);
|
||||
break;
|
||||
default:
|
||||
WARN_ON(1);
|
||||
break;
|
||||
}
|
||||
} else if (ieee80211_is_data_qos(mgmt->frame_control)) {
|
||||
struct ieee80211_hdr *hdr = (void *)mgmt;
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -2079,6 +2079,13 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata,
|
|||
memset(&ifmgd->ht_capa_mask, 0, sizeof(ifmgd->ht_capa_mask));
|
||||
memset(&ifmgd->vht_capa, 0, sizeof(ifmgd->vht_capa));
|
||||
memset(&ifmgd->vht_capa_mask, 0, sizeof(ifmgd->vht_capa_mask));
|
||||
|
||||
/* reset MU-MIMO ownership and group data */
|
||||
memset(sdata->vif.bss_conf.mu_group.membership, 0,
|
||||
sizeof(sdata->vif.bss_conf.mu_group.membership));
|
||||
memset(sdata->vif.bss_conf.mu_group.position, 0,
|
||||
sizeof(sdata->vif.bss_conf.mu_group.position));
|
||||
changed |= BSS_CHANGED_MU_GROUPS;
|
||||
sdata->flags &= ~IEEE80211_SDATA_MU_MIMO_OWNER;
|
||||
|
||||
sdata->ap_power_level = IEEE80211_UNSET_POWER_LEVEL;
|
||||
|
|
|
|||
|
|
@ -2738,6 +2738,11 @@ ieee80211_rx_h_action(struct ieee80211_rx_data *rx)
|
|||
opmode, status->band);
|
||||
goto handled;
|
||||
}
|
||||
case WLAN_VHT_ACTION_GROUPID_MGMT: {
|
||||
if (len < IEEE80211_MIN_ACTION_SIZE + 25)
|
||||
goto invalid;
|
||||
goto queue;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1928,6 +1928,9 @@ int ieee80211_reconfig(struct ieee80211_local *local)
|
|||
BSS_CHANGED_IDLE |
|
||||
BSS_CHANGED_TXPOWER;
|
||||
|
||||
if (sdata->flags & IEEE80211_SDATA_MU_MIMO_OWNER)
|
||||
changed |= BSS_CHANGED_MU_GROUPS;
|
||||
|
||||
switch (sdata->vif.type) {
|
||||
case NL80211_IFTYPE_STATION:
|
||||
changed |= BSS_CHANGED_ASSOC |
|
||||
|
|
|
|||
|
|
@ -1,6 +1,9 @@
|
|||
/*
|
||||
* VHT handling
|
||||
*
|
||||
* Portions of this file
|
||||
* Copyright(c) 2015 Intel Deutschland GmbH
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
|
|
@ -425,6 +428,28 @@ u32 __ieee80211_vht_handle_opmode(struct ieee80211_sub_if_data *sdata,
|
|||
return changed;
|
||||
}
|
||||
|
||||
void ieee80211_process_mu_groups(struct ieee80211_sub_if_data *sdata,
|
||||
struct ieee80211_mgmt *mgmt)
|
||||
{
|
||||
struct ieee80211_bss_conf *bss_conf = &sdata->vif.bss_conf;
|
||||
|
||||
if (!(sdata->flags & IEEE80211_SDATA_MU_MIMO_OWNER))
|
||||
return;
|
||||
|
||||
if (!memcmp(mgmt->u.action.u.vht_group_notif.position,
|
||||
bss_conf->mu_group.position, WLAN_USER_POSITION_LEN) &&
|
||||
!memcmp(mgmt->u.action.u.vht_group_notif.membership,
|
||||
bss_conf->mu_group.membership, WLAN_MEMBERSHIP_LEN))
|
||||
return;
|
||||
|
||||
memcpy(mgmt->u.action.u.vht_group_notif.membership,
|
||||
bss_conf->mu_group.membership, WLAN_MEMBERSHIP_LEN);
|
||||
memcpy(mgmt->u.action.u.vht_group_notif.position,
|
||||
bss_conf->mu_group.position, WLAN_USER_POSITION_LEN);
|
||||
|
||||
ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_MU_GROUPS);
|
||||
}
|
||||
|
||||
void ieee80211_vht_handle_opmode(struct ieee80211_sub_if_data *sdata,
|
||||
struct sta_info *sta, u8 opmode,
|
||||
enum ieee80211_band band)
|
||||
|
|
|
|||
Loading…
Reference in a new issue