qcacld-3.0: Add API to get sta information for EasyMesh

Add API to get sta information for EasyMesh.

Change-Id: I12e7eaae3562ca35b33f0637a33e784b912ca8a3
CRs-Fixed: 3044736
This commit is contained in:
bings
2021-08-09 10:28:13 +05:30
committed by Madan Koyyalamudi
부모 8a4bd39b79
커밋 53a13ccb3a
13개의 변경된 파일236개의 추가작업 그리고 1개의 파일을 삭제

파일 보기

@@ -1597,6 +1597,8 @@ static void hdd_fill_station_info(struct hdd_adapter *adapter,
*/ */
is_dot11_mode_abgn = true; is_dot11_mode_abgn = true;
stainfo->ecsa_capable = event->ecsa_capable; stainfo->ecsa_capable = event->ecsa_capable;
stainfo->ext_cap = event->ext_cap;
stainfo->supported_band = event->supported_band;
if (event->vht_caps.present) { if (event->vht_caps.present) {
stainfo->vht_present = true; stainfo->vht_present = true;

파일 보기

@@ -1001,6 +1001,120 @@ static enum ieee80211_phymode hdd_son_get_phymode(struct wlan_objmgr_vdev *vdev)
return hdd_phymode_chwidth_freq_to_son_phymode(phymode, chwidth, freq); return hdd_phymode_chwidth_freq_to_son_phymode(phymode, chwidth, freq);
} }
/**
* hdd_son_per_sta_len() - get sta information length
* @sta_info: pointer to hdd_station_info
*
* TD: Certain IE may be provided for sta info
*
* Return: the size which is needed for given sta info
*/
static uint32_t hdd_son_per_sta_len(struct hdd_station_info *sta_info)
{
return qdf_roundup(sizeof(struct ieee80211req_sta_info),
sizeof(uint32_t));
}
/**
* hdd_son_get_sta_space() - how many space are needed for given vdev
* @vdev: vdev
*
* Return: space needed for given vdev to provide sta info
*/
static uint32_t hdd_son_get_sta_space(struct wlan_objmgr_vdev *vdev)
{
struct hdd_adapter *adapter;
struct hdd_station_info *sta_info = NULL;
uint32_t space = 0;
if (!vdev) {
hdd_err("null vdev");
return space;
}
adapter = wlan_hdd_get_adapter_from_objmgr(vdev);
if (!adapter) {
hdd_err("null adapter");
return space;
}
hdd_for_each_sta_ref(adapter->sta_info_list, sta_info,
STA_INFO_SOFTAP_GET_STA_INFO) {
if (!qdf_is_macaddr_broadcast(&sta_info->sta_mac))
space += hdd_son_per_sta_len(sta_info);
hdd_put_sta_info_ref(&adapter->sta_info_list,
&sta_info, true,
STA_INFO_SOFTAP_GET_STA_INFO);
}
hdd_debug("sta list space %u", space);
return space;
}
/**
* hdd_son_get_stalist() - get connected station list
* @vdev: vdev
* @si: pointer to ieee80211req_sta_info
* @space: space left
*
* Return: void
*/
static void hdd_son_get_sta_list(struct wlan_objmgr_vdev *vdev,
struct ieee80211req_sta_info *si,
uint32_t *space)
{
struct hdd_adapter *adapter;
struct hdd_station_info *sta_info = NULL;
uint32_t len;
if (!vdev) {
hdd_err("null vdev");
return;
}
adapter = wlan_hdd_get_adapter_from_objmgr(vdev);
if (!adapter) {
hdd_err("null adapter");
return;
}
hdd_for_each_sta_ref(adapter->sta_info_list, sta_info,
STA_INFO_SOFTAP_GET_STA_INFO) {
if (!qdf_is_macaddr_broadcast(&sta_info->sta_mac)) {
len = hdd_son_per_sta_len(sta_info);
if (len > *space) {
/* no more space if left */
hdd_put_sta_info_ref(
&adapter->sta_info_list,
&sta_info, true,
STA_INFO_SOFTAP_GET_STA_INFO);
hdd_err("space %u, length %u", *space, len);
return;
}
qdf_mem_copy(si->isi_macaddr, &sta_info->sta_mac,
QDF_MAC_ADDR_SIZE);
si->isi_ext_cap = sta_info->ext_cap;
si->isi_operating_bands = sta_info->supported_band;
si->isi_assoc_time = sta_info->assoc_ts;
si->isi_rssi = sta_info->rssi;
si->isi_len = len;
si->isi_ie_len = 0;
si = (struct ieee80211req_sta_info *)(((uint8_t *)si) +
len);
*space -= len;
hdd_debug("sta " QDF_MAC_ADDR_FMT " ext_cap %u op band %u rssi %d len %u",
QDF_MAC_ADDR_REF(si->isi_macaddr),
si->isi_ext_cap, si->isi_operating_bands,
si->isi_rssi, si->isi_len);
}
hdd_put_sta_info_ref(&adapter->sta_info_list,
&sta_info, true,
STA_INFO_SOFTAP_GET_STA_INFO);
}
}
/** /**
* hdd_son_set_acl_policy() - set son acl policy * hdd_son_set_acl_policy() - set son acl policy
* @vdev: vdev * @vdev: vdev
@@ -1414,6 +1528,8 @@ void hdd_son_register_callbacks(struct hdd_context *hdd_ctx)
cb_obj.os_if_get_chwidth = hdd_son_get_chwidth; cb_obj.os_if_get_chwidth = hdd_son_get_chwidth;
cb_obj.os_if_deauth_sta = hdd_son_deauth_sta; cb_obj.os_if_deauth_sta = hdd_son_deauth_sta;
cb_obj.os_if_modify_acl = hdd_son_modify_acl; cb_obj.os_if_modify_acl = hdd_son_modify_acl;
cb_obj.os_if_get_sta_list = hdd_son_get_sta_list;
cb_obj.os_if_get_sta_space = hdd_son_get_sta_space;
os_if_son_register_hdd_callbacks(hdd_ctx->psoc, &cb_obj); os_if_son_register_hdd_callbacks(hdd_ctx->psoc, &cb_obj);

파일 보기

@@ -1,5 +1,6 @@
/* /*
* Copyright (c) 2019-2021 The Linux Foundation. All rights reserved. * Copyright (c) 2019-2021 The Linux Foundation. All rights reserved.
* Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved.
* *
* Permission to use, copy, modify, and/or distribute this software for * Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the * any purpose with or without fee is hereby granted, provided that the
@@ -177,6 +178,8 @@ char *sta_info_string_from_dbgid(wlan_sta_info_dbgid id);
* @nss: Number of spatial streams supported * @nss: Number of spatial streams supported
* @rate_flags: Rate Flags for this connection * @rate_flags: Rate Flags for this connection
* @ecsa_capable: Extended CSA capabilities * @ecsa_capable: Extended CSA capabilities
* @ext_cap: The first 4 bytes of Extended capabilities IE
* @supported_band: sta band capabilities bitmap from supporting opclass
* @max_phy_rate: Calcuated maximum phy rate based on mode, nss, mcs etc. * @max_phy_rate: Calcuated maximum phy rate based on mode, nss, mcs etc.
* @tx_packets: The number of frames from host to firmware * @tx_packets: The number of frames from host to firmware
* @tx_bytes: Bytes send to current station * @tx_bytes: Bytes send to current station
@@ -244,6 +247,8 @@ struct hdd_station_info {
uint8_t nss; uint8_t nss;
uint32_t rate_flags; uint32_t rate_flags;
uint8_t ecsa_capable; uint8_t ecsa_capable;
uint32_t ext_cap;
uint8_t supported_band;
uint32_t max_phy_rate; uint32_t max_phy_rate;
uint32_t tx_packets; uint32_t tx_packets;
uint64_t tx_bytes; uint64_t tx_bytes;

파일 보기

@@ -1069,6 +1069,8 @@ struct assoc_ind {
uint8_t tx_mcs_map; uint8_t tx_mcs_map;
/* Extended CSA capability of station */ /* Extended CSA capability of station */
uint8_t ecsa_capable; uint8_t ecsa_capable;
uint32_t ext_cap;
uint8_t supported_band;
tDot11fIEHTCaps HTCaps; tDot11fIEHTCaps HTCaps;
tDot11fIEVHTCaps VHTCaps; tDot11fIEVHTCaps VHTCaps;
bool he_caps_present; bool he_caps_present;

파일 보기

@@ -3002,6 +3002,8 @@ bool lim_fill_lim_assoc_ind_params(
bool wme_enable; bool wme_enable;
struct wlan_objmgr_vdev *vdev; struct wlan_objmgr_vdev *vdev;
struct vdev_mlme_obj *mlme_obj; struct vdev_mlme_obj *mlme_obj;
uint8_t country_iso[REG_ALPHA2_LEN + 1];
tDot11fIESuppOperatingClasses *oper_class;
if (!session_entry->parsedAssocReq) { if (!session_entry->parsedAssocReq) {
pe_err(" Parsed Assoc req is NULL"); pe_err(" Parsed Assoc req is NULL");
@@ -3195,9 +3197,30 @@ bool lim_fill_lim_assoc_ind_params(
assoc_ind->max_mcs_idx = maxidx; assoc_ind->max_mcs_idx = maxidx;
} }
fill_mlm_assoc_ind_vht(assoc_req, sta_ds, assoc_ind); fill_mlm_assoc_ind_vht(assoc_req, sta_ds, assoc_ind);
if (assoc_req->ExtCap.present) if (assoc_req->ExtCap.present) {
assoc_ind->ecsa_capable = assoc_ind->ecsa_capable =
((struct s_ext_cap *)assoc_req->ExtCap.bytes)->ext_chan_switch; ((struct s_ext_cap *)assoc_req->ExtCap.bytes)->ext_chan_switch;
if (assoc_req->ExtCap.num_bytes >= sizeof(assoc_ind->ext_cap))
qdf_mem_copy(&assoc_ind->ext_cap,
assoc_req->ExtCap.bytes,
sizeof(assoc_ind->ext_cap));
else
qdf_mem_copy(&assoc_ind->ext_cap,
assoc_req->ExtCap.bytes,
assoc_req->ExtCap.num_bytes);
}
if (assoc_req->supp_operating_classes.present) {
oper_class = &assoc_req->supp_operating_classes;
qdf_mem_zero(country_iso, sizeof(country_iso));
country_iso[2] = OP_CLASS_GLOBAL;
assoc_ind->supported_band =
wlan_reg_get_band_cap_from_op_class(
country_iso,
oper_class->num_classes,
oper_class->classes);
}
/* updates VHT information in assoc indication */ /* updates VHT information in assoc indication */
if (assoc_req->VHTCaps.present) if (assoc_req->VHTCaps.present)
qdf_mem_copy(&assoc_ind->vht_caps, &assoc_req->VHTCaps, qdf_mem_copy(&assoc_ind->vht_caps, &assoc_req->VHTCaps,

파일 보기

@@ -1,5 +1,6 @@
/* /*
* Copyright (c) 2012-2021 The Linux Foundation. All rights reserved. * Copyright (c) 2012-2021 The Linux Foundation. All rights reserved.
* Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved.
* *
* Permission to use, copy, modify, and/or distribute this software for * Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the * any purpose with or without fee is hereby granted, provided that the
@@ -786,6 +787,8 @@ lim_fill_sme_assoc_ind_params(
sme_assoc_ind->rx_mcs_map = assoc_ind->rx_mcs_map; sme_assoc_ind->rx_mcs_map = assoc_ind->rx_mcs_map;
sme_assoc_ind->tx_mcs_map = assoc_ind->tx_mcs_map; sme_assoc_ind->tx_mcs_map = assoc_ind->tx_mcs_map;
sme_assoc_ind->ecsa_capable = assoc_ind->ecsa_capable; sme_assoc_ind->ecsa_capable = assoc_ind->ecsa_capable;
sme_assoc_ind->ext_cap = assoc_ind->ext_cap;
sme_assoc_ind->supported_band = assoc_ind->supported_band;
if (assoc_ind->ht_caps.present) if (assoc_ind->ht_caps.present)
sme_assoc_ind->HTCaps = assoc_ind->ht_caps; sme_assoc_ind->HTCaps = assoc_ind->ht_caps;

파일 보기

@@ -1,5 +1,6 @@
/* /*
* Copyright (c) 2012-2021 The Linux Foundation. All rights reserved. * Copyright (c) 2012-2021 The Linux Foundation. All rights reserved.
* Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved.
* *
* Permission to use, copy, modify, and/or distribute this software for * Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the * any purpose with or without fee is hereby granted, provided that the
@@ -240,6 +241,8 @@ typedef struct sLimMlmAssocInd {
uint8_t rx_mcs_map; uint8_t rx_mcs_map;
uint8_t tx_mcs_map; uint8_t tx_mcs_map;
uint8_t ecsa_capable; uint8_t ecsa_capable;
uint32_t ext_cap;
uint8_t supported_band;
tDot11fIEHTCaps ht_caps; tDot11fIEHTCaps ht_caps;
tDot11fIEVHTCaps vht_caps; tDot11fIEVHTCaps vht_caps;

파일 보기

@@ -278,6 +278,8 @@ typedef struct sap_StationAssocReassocCompleteEvent_s {
uint8_t rx_mcs_map; uint8_t rx_mcs_map;
uint8_t tx_mcs_map; uint8_t tx_mcs_map;
uint8_t ecsa_capable; uint8_t ecsa_capable;
uint32_t ext_cap;
uint8_t supported_band;
tDot11fIEHTCaps ht_caps; tDot11fIEHTCaps ht_caps;
tDot11fIEVHTCaps vht_caps; tDot11fIEVHTCaps vht_caps;
tSirMacCapabilityInfo capability_info; tSirMacCapabilityInfo capability_info;

파일 보기

@@ -2062,6 +2062,8 @@ QDF_STATUS sap_signal_hdd_event(struct sap_context *sap_ctx,
reassoc_complete->rx_mcs_map = csr_roaminfo->rx_mcs_map; reassoc_complete->rx_mcs_map = csr_roaminfo->rx_mcs_map;
reassoc_complete->tx_mcs_map = csr_roaminfo->tx_mcs_map; reassoc_complete->tx_mcs_map = csr_roaminfo->tx_mcs_map;
reassoc_complete->ecsa_capable = csr_roaminfo->ecsa_capable; reassoc_complete->ecsa_capable = csr_roaminfo->ecsa_capable;
reassoc_complete->ext_cap = csr_roaminfo->ext_cap;
reassoc_complete->supported_band = csr_roaminfo->supported_band;
if (csr_roaminfo->ht_caps.present) if (csr_roaminfo->ht_caps.present)
reassoc_complete->ht_caps = csr_roaminfo->ht_caps; reassoc_complete->ht_caps = csr_roaminfo->ht_caps;
if (csr_roaminfo->vht_caps.present) if (csr_roaminfo->vht_caps.present)

파일 보기

@@ -1,5 +1,6 @@
/* /*
* Copyright (c) 2011-2021 The Linux Foundation. All rights reserved. * Copyright (c) 2011-2021 The Linux Foundation. All rights reserved.
* Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved.
* *
* Permission to use, copy, modify, and/or distribute this software for * Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the * any purpose with or without fee is hereby granted, provided that the
@@ -582,6 +583,8 @@ struct csr_roam_info {
uint8_t tx_mcs_map; uint8_t tx_mcs_map;
/* Extended capabilities of STA */ /* Extended capabilities of STA */
uint8_t ecsa_capable; uint8_t ecsa_capable;
uint32_t ext_cap;
uint8_t supported_band;
int rssi; int rssi;
int tx_rate; int tx_rate;
int rx_rate; int rx_rate;
@@ -625,6 +628,8 @@ typedef struct sSirSmeAssocIndToUpperLayerCnf {
uint8_t tx_mcs_map; uint8_t tx_mcs_map;
/* Extended capabilities of STA */ /* Extended capabilities of STA */
uint8_t ecsa_capable; uint8_t ecsa_capable;
uint32_t ext_cap;
uint8_t supported_band;
uint32_t ies_len; uint32_t ies_len;
uint8_t *ies; uint8_t *ies;

파일 보기

@@ -1,5 +1,6 @@
/* /*
* Copyright (c) 2012-2021 The Linux Foundation. All rights reserved. * Copyright (c) 2012-2021 The Linux Foundation. All rights reserved.
* Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved.
* *
* Permission to use, copy, modify, and/or distribute this software for * Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the * any purpose with or without fee is hereby granted, provided that the
@@ -3689,6 +3690,9 @@ void csr_roam_joined_state_msg_processor(struct mac_context *mac, void *msg_buf)
roam_info->rx_mcs_map = pUpperLayerAssocCnf->rx_mcs_map; roam_info->rx_mcs_map = pUpperLayerAssocCnf->rx_mcs_map;
roam_info->tx_mcs_map = pUpperLayerAssocCnf->tx_mcs_map; roam_info->tx_mcs_map = pUpperLayerAssocCnf->tx_mcs_map;
roam_info->ecsa_capable = pUpperLayerAssocCnf->ecsa_capable; roam_info->ecsa_capable = pUpperLayerAssocCnf->ecsa_capable;
roam_info->ext_cap = pUpperLayerAssocCnf->ext_cap;
roam_info->supported_band =
pUpperLayerAssocCnf->supported_band;
if (pUpperLayerAssocCnf->ht_caps.present) if (pUpperLayerAssocCnf->ht_caps.present)
roam_info->ht_caps = pUpperLayerAssocCnf->ht_caps; roam_info->ht_caps = pUpperLayerAssocCnf->ht_caps;
if (pUpperLayerAssocCnf->vht_caps.present) if (pUpperLayerAssocCnf->vht_caps.present)
@@ -4221,6 +4225,8 @@ csr_send_assoc_ind_to_upper_layer_cnf_msg(struct mac_context *mac,
cnf->rx_mcs_map = ind->rx_mcs_map; cnf->rx_mcs_map = ind->rx_mcs_map;
cnf->tx_mcs_map = ind->tx_mcs_map; cnf->tx_mcs_map = ind->tx_mcs_map;
cnf->ecsa_capable = ind->ecsa_capable; cnf->ecsa_capable = ind->ecsa_capable;
cnf->ext_cap = ind->ext_cap;
cnf->supported_band = ind->supported_band;
if (ind->HTCaps.present) if (ind->HTCaps.present)
cnf->ht_caps = ind->HTCaps; cnf->ht_caps = ind->HTCaps;
if (ind->VHTCaps.present) if (ind->VHTCaps.present)

파일 보기

@@ -56,6 +56,8 @@
* @os_if_kickout_mac: kickout sta with given mac * @os_if_kickout_mac: kickout sta with given mac
* @os_if_set_chwidth: set chan width * @os_if_set_chwidth: set chan width
* @os_if_get_chwidth: get chan width * @os_if_get_chwidth: get chan width
* @os_if_get_sta_list: get sta list
* @os_if_get_sta_space: get sta space
* @os_if_deauth_sta: Deauths the target peer * @os_if_deauth_sta: Deauths the target peer
* @os_if_modify_acl: Add/Del target peer in ACL * @os_if_modify_acl: Add/Del target peer in ACL
*/ */
@@ -96,6 +98,10 @@ struct son_callbacks {
enum ieee80211_cwm_width son_chwidth); enum ieee80211_cwm_width son_chwidth);
enum ieee80211_cwm_width (*os_if_get_chwidth)( enum ieee80211_cwm_width (*os_if_get_chwidth)(
struct wlan_objmgr_vdev *vdev); struct wlan_objmgr_vdev *vdev);
void (*os_if_get_sta_list)(struct wlan_objmgr_vdev *vdev,
struct ieee80211req_sta_info *req,
uint32_t *space);
uint32_t (*os_if_get_sta_space)(struct wlan_objmgr_vdev *vdev);
void (*os_if_deauth_sta)(struct wlan_objmgr_vdev *vdev, void (*os_if_deauth_sta)(struct wlan_objmgr_vdev *vdev,
uint8_t *peer_mac, uint8_t *peer_mac,
bool ignore_frame); bool ignore_frame);
@@ -449,6 +455,25 @@ ieee80211_acl_cmd os_if_son_get_acl_policy(struct wlan_objmgr_vdev *vdev);
int os_if_son_add_acl_mac(struct wlan_objmgr_vdev *vdev, int os_if_son_add_acl_mac(struct wlan_objmgr_vdev *vdev,
struct qdf_mac_addr *acl_mac); struct qdf_mac_addr *acl_mac);
/**
* os_if_son_get_sta_space() - get sta space
* @vdev: target vdev
*
* Return: bytes which is needed to fill sta information
*/
uint32_t os_if_son_get_sta_space(struct wlan_objmgr_vdev *vdev);
/**
* os_if_son_get_sta_list() - get sta list
* @vdev: target vdev
* @si: pointer to ieee80211req_sta_info
* @space: space left
*
* Return: void
*/
void os_if_son_get_sta_list(struct wlan_objmgr_vdev *vdev,
struct ieee80211req_sta_info *si, uint32_t *space);
/** /**
* os_if_son_del_acl_mac() - del mac from acl * os_if_son_del_acl_mac() - del mac from acl
* @vdev: vdev * @vdev: vdev

파일 보기

@@ -947,6 +947,47 @@ bool os_if_son_vdev_is_wds(struct wlan_objmgr_vdev *vdev)
qdf_export_symbol(os_if_son_vdev_is_wds); qdf_export_symbol(os_if_son_vdev_is_wds);
uint32_t os_if_son_get_sta_space(struct wlan_objmgr_vdev *vdev)
{
uint32_t sta_space;
if (!vdev) {
osif_err("null vdev");
return 0;
}
sta_space = g_son_os_if_cb.os_if_get_sta_space(vdev);
osif_debug("need space %u", sta_space);
return sta_space;
}
qdf_export_symbol(os_if_son_get_sta_space);
void os_if_son_get_sta_list(struct wlan_objmgr_vdev *vdev,
struct ieee80211req_sta_info *si, uint32_t *space)
{
if (!vdev) {
osif_err("null vdev");
return;
}
if (!si) {
osif_err("null si");
return;
}
if (!space || *space == 0) {
osif_err("invalid input space");
return;
}
g_son_os_if_cb.os_if_get_sta_list(vdev, si, space);
osif_debug("left space %u", *space);
}
qdf_export_symbol(os_if_son_get_sta_list);
void os_if_son_deauth_peer_sta(struct wlan_objmgr_vdev *vdev, void os_if_son_deauth_peer_sta(struct wlan_objmgr_vdev *vdev,
uint8_t *peer_mac, uint8_t *peer_mac,
bool ignore_frame) bool ignore_frame)