qcacmn: iot_sim beacon content change update
Adding support for beacon content change. Change-Id: I8f804dd7d2cbbe7d3b7dea58841d7321f28101c7 CRs-Fixed: 2694454
This commit is contained in:

committed by
nshrivas

parent
c5cdd1eaaf
commit
89a67f807e
@@ -89,7 +89,7 @@ QDF_STATUS iot_sim_get_index_for_action_frm(uint8_t *frm, uint8_t *cat,
|
|||||||
* iot_sim_frame_update() - Management frame update
|
* iot_sim_frame_update() - Management frame update
|
||||||
* @pdev: reference to global pdev object
|
* @pdev: reference to global pdev object
|
||||||
* @nbuf: frame buffer
|
* @nbuf: frame buffer
|
||||||
* @direction: direction tx or rx
|
* @tx: TRUE in case of tx
|
||||||
*
|
*
|
||||||
* This function updates the outgoing management frame with
|
* This function updates the outgoing management frame with
|
||||||
* the content stored in iot_sim_context.
|
* the content stored in iot_sim_context.
|
||||||
@@ -98,7 +98,9 @@ QDF_STATUS iot_sim_get_index_for_action_frm(uint8_t *frm, uint8_t *cat,
|
|||||||
* QDF_STATUS_E_FAILURE on failure
|
* QDF_STATUS_E_FAILURE on failure
|
||||||
*/
|
*/
|
||||||
QDF_STATUS iot_sim_frame_update(struct wlan_objmgr_pdev *pdev,
|
QDF_STATUS iot_sim_frame_update(struct wlan_objmgr_pdev *pdev,
|
||||||
qdf_nbuf_t nbuf, bool direction);
|
qdf_nbuf_t nbuf,
|
||||||
|
struct beacon_tmpl_params *param,
|
||||||
|
bool tx);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* iot_sim_get_ctx_from_pdev() - API to get iot_sim context object
|
* iot_sim_get_ctx_from_pdev() - API to get iot_sim context object
|
||||||
|
@@ -22,6 +22,7 @@
|
|||||||
#include <qdf_util.h>
|
#include <qdf_util.h>
|
||||||
#include <qdf_str.h>
|
#include <qdf_str.h>
|
||||||
#include <wmi_unified_param.h>
|
#include <wmi_unified_param.h>
|
||||||
|
#include <wlan_iot_sim_utils_api.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* iot_sim_oper_to_str - function to return iot sim operation string
|
* iot_sim_oper_to_str - function to return iot sim operation string
|
||||||
@@ -580,6 +581,11 @@ iot_sim_send_rule_to_fw(struct iot_sim_context *isc,
|
|||||||
{
|
{
|
||||||
struct simulation_test_params param;
|
struct simulation_test_params param;
|
||||||
|
|
||||||
|
if (FRAME_TYPE_IS_BEACON(type, subtype) && offset) {
|
||||||
|
iot_sim_info("Beacon update from offset:%d", offset);
|
||||||
|
return QDF_STATUS_E_NOSUPPORT;
|
||||||
|
}
|
||||||
|
|
||||||
if (iot_sim_frame_supported_by_fw(type, subtype, action)) {
|
if (iot_sim_frame_supported_by_fw(type, subtype, action)) {
|
||||||
qdf_mem_zero(¶m, sizeof(struct simulation_test_params));
|
qdf_mem_zero(¶m, sizeof(struct simulation_test_params));
|
||||||
param.pdev_id = wlan_objmgr_pdev_get_pdev_id(isc->pdev_obj);
|
param.pdev_id = wlan_objmgr_pdev_get_pdev_id(isc->pdev_obj);
|
||||||
@@ -608,7 +614,9 @@ iot_sim_send_rule_to_fw(struct iot_sim_context *isc,
|
|||||||
¶m)))
|
¶m)))
|
||||||
iot_sim_err("Sending del rule to fw failed!");
|
iot_sim_err("Sending del rule to fw failed!");
|
||||||
|
|
||||||
if (!FRAME_TYPE_IS_BEACON(type, subtype))
|
if (FRAME_TYPE_IS_BEACON(type, subtype) && clear)
|
||||||
|
return QDF_STATUS_E_NOSUPPORT;
|
||||||
|
|
||||||
return QDF_STATUS_SUCCESS;
|
return QDF_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -889,6 +897,7 @@ iot_sim_debug_content_change_write(struct file *file,
|
|||||||
((struct seq_file *)file->private_data)->private;
|
((struct seq_file *)file->private_data)->private;
|
||||||
uint8_t action = 0, category = 0;
|
uint8_t action = 0, category = 0;
|
||||||
bool is_action = 0, clear = false;
|
bool is_action = 0, clear = false;
|
||||||
|
mlme_pdev_ext_t *ext = NULL;
|
||||||
|
|
||||||
if ((!buf) || (count > USER_BUF_LEN) || (count < 7))
|
if ((!buf) || (count > USER_BUF_LEN) || (count < 7))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
@@ -947,11 +956,24 @@ iot_sim_debug_content_change_write(struct file *file,
|
|||||||
content, length, 0,
|
content, length, 0,
|
||||||
is_action);
|
is_action);
|
||||||
}
|
}
|
||||||
if (QDF_IS_STATUS_SUCCESS(status))
|
if (QDF_IS_STATUS_SUCCESS(status)) {
|
||||||
iot_sim_err("iot_sim: Content Change Operation - success");
|
iot_sim_err("iot_sim: Content Change Operation - success");
|
||||||
else
|
if (FRAME_TYPE_IS_BEACON(type, subtype)) {
|
||||||
|
if (isc->bcn_buf && (!length || !content)) {
|
||||||
|
qdf_nbuf_free(isc->bcn_buf);
|
||||||
|
isc->bcn_buf = NULL;
|
||||||
|
}
|
||||||
|
ext = wlan_pdev_mlme_get_ext_hdl(isc->pdev_obj);
|
||||||
|
if (ext) {
|
||||||
|
isc->iot_sim_update_beacon_trigger(ext);
|
||||||
|
iot_sim_info("Beacon update triggered");
|
||||||
|
} else {
|
||||||
|
iot_sim_err("mlme_pdev_ext is null");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
iot_sim_err("iot_sim: Content Change Operation - Fail");
|
iot_sim_err("iot_sim: Content Change Operation - Fail");
|
||||||
|
}
|
||||||
free:
|
free:
|
||||||
qdf_mem_free(content);
|
qdf_mem_free(content);
|
||||||
qdf_mem_free(locbuf);
|
qdf_mem_free(locbuf);
|
||||||
@@ -1366,6 +1388,7 @@ wlan_iot_sim_pdev_obj_create_handler(struct wlan_objmgr_pdev *pdev, void *arg)
|
|||||||
qdf_set_macaddr_broadcast(&isc->bcast_peer.addr);
|
qdf_set_macaddr_broadcast(&isc->bcast_peer.addr);
|
||||||
qdf_spinlock_create(&isc->bcast_peer.iot_sim_lock);
|
qdf_spinlock_create(&isc->bcast_peer.iot_sim_lock);
|
||||||
qdf_list_create(&isc->bcast_peer.list, 0);
|
qdf_list_create(&isc->bcast_peer.list, 0);
|
||||||
|
isc->bcn_buf = NULL;
|
||||||
|
|
||||||
wlan_objmgr_pdev_component_obj_attach(pdev, WLAN_IOT_SIM_COMP,
|
wlan_objmgr_pdev_component_obj_attach(pdev, WLAN_IOT_SIM_COMP,
|
||||||
(void *)isc, QDF_STATUS_SUCCESS);
|
(void *)isc, QDF_STATUS_SUCCESS);
|
||||||
@@ -1396,11 +1419,14 @@ wlan_iot_sim_pdev_obj_destroy_handler(struct wlan_objmgr_pdev *pdev,
|
|||||||
/* Deinitilise function pointers from iot_sim context */
|
/* Deinitilise function pointers from iot_sim context */
|
||||||
iot_sim_debugfs_deinit(isc);
|
iot_sim_debugfs_deinit(isc);
|
||||||
iot_sim_remove_all_rules(isc);
|
iot_sim_remove_all_rules(isc);
|
||||||
|
if (isc->bcn_buf)
|
||||||
|
qdf_nbuf_free(isc->bcn_buf);
|
||||||
qdf_spinlock_destroy(&isc->bcast_peer.iot_sim_lock);
|
qdf_spinlock_destroy(&isc->bcast_peer.iot_sim_lock);
|
||||||
qdf_mem_free(isc);
|
qdf_mem_free(isc);
|
||||||
}
|
}
|
||||||
iot_sim_debug("iot_sim component pdev%u object created",
|
iot_sim_debug("iot_sim component pdev%u object destroyed",
|
||||||
wlan_objmgr_pdev_get_pdev_id(isc->pdev_obj));
|
wlan_objmgr_pdev_get_pdev_id(isc->pdev_obj));
|
||||||
|
|
||||||
return QDF_STATUS_SUCCESS;
|
return QDF_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -153,6 +153,8 @@ struct iot_sim_context {
|
|||||||
/* IOT_SIM Peer list & Bcast Peer */
|
/* IOT_SIM Peer list & Bcast Peer */
|
||||||
struct iot_sim_rule_per_peer *iot_sim_peer_list, bcast_peer;
|
struct iot_sim_rule_per_peer *iot_sim_peer_list, bcast_peer;
|
||||||
struct iot_sim_debugfs iot_sim_dbgfs_ctx;
|
struct iot_sim_debugfs iot_sim_dbgfs_ctx;
|
||||||
|
void (*iot_sim_update_beacon_trigger)(mlme_pdev_ext_t *);
|
||||||
|
qdf_nbuf_t bcn_buf;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* enum iot_sim_operations - iot sim operations
|
/* enum iot_sim_operations - iot sim operations
|
||||||
|
@@ -21,6 +21,7 @@
|
|||||||
#include <wlan_objmgr_vdev_obj.h>
|
#include <wlan_objmgr_vdev_obj.h>
|
||||||
|
|
||||||
#define IEEE80211_FRAME_BODY_OFFSET 0x18
|
#define IEEE80211_FRAME_BODY_OFFSET 0x18
|
||||||
|
#define IEEE80211_TSF_LEN (8)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* iot_sim_apply_content_change_rule - function to apply content change rule
|
* iot_sim_apply_content_change_rule - function to apply content change rule
|
||||||
@@ -34,13 +35,125 @@
|
|||||||
* QDF_STATUS_E_NOSUPPORT, no content change rule found for this frame
|
* QDF_STATUS_E_NOSUPPORT, no content change rule found for this frame
|
||||||
*/
|
*/
|
||||||
QDF_STATUS
|
QDF_STATUS
|
||||||
iot_sim_apply_content_change_rule(struct iot_sim_rule *piot_sim_rule,
|
iot_sim_update_beacon_template_struct(qdf_nbuf_t nbuf,
|
||||||
|
struct beacon_tmpl_params *param)
|
||||||
|
{
|
||||||
|
struct ie_header *ie = NULL;
|
||||||
|
uint16_t offset = 0, ie_len = 0;
|
||||||
|
struct ieee80211_ath_channelswitch_ie *csa = NULL;
|
||||||
|
struct ieee80211_extendedchannelswitch_ie *ecsa = NULL;
|
||||||
|
struct extn_ie_header *extn_ie = NULL;
|
||||||
|
|
||||||
|
if (!param)
|
||||||
|
return QDF_STATUS_E_NULL_VALUE;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Skip fixed field
|
||||||
|
*/
|
||||||
|
offset += IEEE80211_TSF_LEN; /* TSF field */
|
||||||
|
offset += 2; /* Beacon interval */
|
||||||
|
offset += 2; /* Capability Information */
|
||||||
|
|
||||||
|
ie_len = wbuf_get_pktlen(nbuf) -
|
||||||
|
sizeof(struct ieee80211_frame) - offset;
|
||||||
|
ie = (struct ie_header *)((uint8_t *)qdf_nbuf_data(nbuf) +
|
||||||
|
sizeof(struct ieee80211_frame) + offset);
|
||||||
|
|
||||||
|
while (ie_len >= sizeof(struct ie_header)) {
|
||||||
|
ie_len -= sizeof(struct ie_header);
|
||||||
|
if (!ie->ie_len) {
|
||||||
|
ie += 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ie_len < ie->ie_len) {
|
||||||
|
iot_sim_err("Incomplete corrupted IE:%x", ie->ie_id);
|
||||||
|
return QDF_STATUS_E_INVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (ie->ie_id) {
|
||||||
|
case WLAN_ELEMID_TIM:
|
||||||
|
if (ie->ie_len < WLAN_TIM_IE_MIN_LENGTH) {
|
||||||
|
iot_sim_err("Invalid TIM IE Length");
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
param->tim_ie_offset = ((uint8_t *)ie -
|
||||||
|
(uint8_t *)qdf_nbuf_data(nbuf));
|
||||||
|
break;
|
||||||
|
case WLAN_ELEMID_CHANSWITCHANN:
|
||||||
|
if (ie->ie_len != WLAN_CSA_IE_MAX_LEN) {
|
||||||
|
iot_sim_err("Invalid CSA IE Length");
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
csa =
|
||||||
|
(struct ieee80211_ath_channelswitch_ie *)ie;
|
||||||
|
param->csa_switch_count_offset =
|
||||||
|
(((uint8_t *)&csa->tbttcount) -
|
||||||
|
(uint8_t *)qdf_nbuf_data(nbuf));
|
||||||
|
break;
|
||||||
|
case WLAN_ELEMID_EXTCHANSWITCHANN:
|
||||||
|
if (ie->ie_len != WLAN_XCSA_IE_MAX_LEN) {
|
||||||
|
iot_sim_err("Invalid ECSA IE Length");
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
ecsa =
|
||||||
|
(struct ieee80211_extendedchannelswitch_ie *)ie;
|
||||||
|
param->ext_csa_switch_count_offset =
|
||||||
|
(((uint8_t *)&ecsa->tbttcount) -
|
||||||
|
(uint8_t *)qdf_nbuf_data(nbuf));
|
||||||
|
break;
|
||||||
|
case WLAN_ELEMID_EXTN_ELEM:
|
||||||
|
extn_ie = (struct extn_ie_header *)ie;
|
||||||
|
switch (extn_ie->ie_extn_id) {
|
||||||
|
case WLAN_EXTN_ELEMID_ESP:
|
||||||
|
param->esp_ie_offset =
|
||||||
|
((uint8_t *)ie -
|
||||||
|
(uint8_t *)qdf_nbuf_data(nbuf));
|
||||||
|
break;
|
||||||
|
case WLAN_EXTN_ELEMID_MUEDCA:
|
||||||
|
param->mu_edca_ie_offset =
|
||||||
|
((uint8_t *)ie -
|
||||||
|
(uint8_t *)qdf_nbuf_data(nbuf));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case WLAN_ELEMID_MULTIPLE_BSSID:
|
||||||
|
offset = ((uint8_t *)ie -
|
||||||
|
(uint8_t *)qdf_nbuf_data(nbuf));
|
||||||
|
param->mbssid_ie_offset = offset;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* Consume info element */
|
||||||
|
ie_len -= ie->ie_len;
|
||||||
|
/* Go to next IE */
|
||||||
|
ie = (struct ie_header *)((uint8_t *)ie +
|
||||||
|
sizeof(struct ie_header) +
|
||||||
|
ie->ie_len);
|
||||||
|
}
|
||||||
|
param->tmpl_len = wbuf_get_pktlen(nbuf);
|
||||||
|
param->tmpl_len_aligned = roundup(param->tmpl_len,
|
||||||
|
sizeof(uint32_t));
|
||||||
|
param->frm = (uint8_t *)qdf_nbuf_data(nbuf);
|
||||||
|
return QDF_STATUS_SUCCESS;
|
||||||
|
err:
|
||||||
|
return QDF_STATUS_E_INVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
QDF_STATUS
|
||||||
|
iot_sim_apply_content_change_rule(struct wlan_objmgr_pdev *pdev,
|
||||||
|
struct iot_sim_rule *piot_sim_rule,
|
||||||
qdf_nbuf_t nbuf,
|
qdf_nbuf_t nbuf,
|
||||||
int fixed_param_length)
|
int fixed_param_length,
|
||||||
|
struct beacon_tmpl_params *param)
|
||||||
{
|
{
|
||||||
uint8_t *buf = NULL;
|
uint8_t *buf = NULL;
|
||||||
qdf_size_t buf_len = 0;
|
qdf_size_t buf_len = 0;
|
||||||
int offset = 0;
|
int offset = 0;
|
||||||
|
QDF_STATUS status = QDF_STATUS_SUCCESS;
|
||||||
|
|
||||||
if (!piot_sim_rule->frm_content || !piot_sim_rule->len)
|
if (!piot_sim_rule->frm_content || !piot_sim_rule->len)
|
||||||
return QDF_STATUS_E_NOSUPPORT;
|
return QDF_STATUS_E_NOSUPPORT;
|
||||||
@@ -76,6 +189,11 @@ iot_sim_apply_content_change_rule(struct iot_sim_rule *piot_sim_rule,
|
|||||||
iot_sim_err("Failed to modify content");
|
iot_sim_err("Failed to modify content");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (IEEE80211_IS_BEACON((struct ieee80211_frame *)qdf_nbuf_data(nbuf)))
|
||||||
|
status = iot_sim_update_beacon_template_struct(nbuf, param);
|
||||||
|
if (QDF_IS_STATUS_ERROR(status))
|
||||||
|
iot_sim_err("Failed to update beacon param");
|
||||||
|
|
||||||
return QDF_STATUS_SUCCESS;
|
return QDF_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -113,18 +231,20 @@ iot_sim_apply_drop_rule(struct iot_sim_rule *piot_sim_rule,
|
|||||||
*
|
*
|
||||||
* @pdev: pdev object
|
* @pdev: pdev object
|
||||||
* @nbuf: input packet
|
* @nbuf: input packet
|
||||||
* @direction: direction to specify from where this packet is arrived
|
* @param: beacon template cmd parameter
|
||||||
|
* @tx: tx or not
|
||||||
*
|
*
|
||||||
* Return: QDF_STATUS_SUCCESS in general
|
* Return: QDF_STATUS_SUCCESS in general
|
||||||
* QDF_STATUS_E_NOSUPPORT, no content change rule found for this frame
|
* QDF_STATUS_E_NOSUPPORT, no content change rule found for this frame
|
||||||
*/
|
*/
|
||||||
QDF_STATUS iot_sim_frame_update(struct wlan_objmgr_pdev *pdev, qdf_nbuf_t nbuf,
|
QDF_STATUS iot_sim_frame_update(struct wlan_objmgr_pdev *pdev, qdf_nbuf_t nbuf,
|
||||||
|
struct beacon_tmpl_params *param,
|
||||||
bool tx)
|
bool tx)
|
||||||
{
|
{
|
||||||
uint8_t type, subtype, seq = 0;
|
uint8_t type, subtype, seq = 0;
|
||||||
struct iot_sim_context *isc;
|
struct iot_sim_context *isc;
|
||||||
uint8_t *buf = qdf_nbuf_data(nbuf), *frm = NULL;
|
uint8_t *buf = qdf_nbuf_data(nbuf), *frm = NULL;
|
||||||
int fixed_param_length = 0;
|
int fixed_param_len = 0;
|
||||||
bool is_action_frm = false;
|
bool is_action_frm = false;
|
||||||
uint8_t cat, cat_index;
|
uint8_t cat, cat_index;
|
||||||
int auth_seq_index = 0;
|
int auth_seq_index = 0;
|
||||||
@@ -146,14 +266,15 @@ QDF_STATUS iot_sim_frame_update(struct wlan_objmgr_pdev *pdev, qdf_nbuf_t nbuf,
|
|||||||
auth_seq_index = IEEE80211_FRAME_BODY_OFFSET + 2;
|
auth_seq_index = IEEE80211_FRAME_BODY_OFFSET + 2;
|
||||||
seq = le16toh(*(u_int16_t *)(buf + auth_seq_index));
|
seq = le16toh(*(u_int16_t *)(buf + auth_seq_index));
|
||||||
} else if (type == IEEE80211_FC0_TYPE_MGT &&
|
} else if (type == IEEE80211_FC0_TYPE_MGT &&
|
||||||
subtype == IEEE80211_FC0_SUBTYPE_PROBE_RESP)
|
(subtype == IEEE80211_FC0_SUBTYPE_PROBE_RESP ||
|
||||||
|
subtype == IEEE80211_FC0_SUBTYPE_BEACON))
|
||||||
/* Probe response frame */
|
/* Probe response frame */
|
||||||
fixed_param_length = 12;
|
fixed_param_len = 12;
|
||||||
else if (type == IEEE80211_FC0_TYPE_MGT &&
|
else if (type == IEEE80211_FC0_TYPE_MGT &&
|
||||||
(subtype == IEEE80211_FC0_SUBTYPE_ASSOC_RESP ||
|
(subtype == IEEE80211_FC0_SUBTYPE_ASSOC_RESP ||
|
||||||
subtype == IEEE80211_FC0_SUBTYPE_REASSOC_RESP))
|
subtype == IEEE80211_FC0_SUBTYPE_REASSOC_RESP))
|
||||||
/* Assoc/Reassoc response frame */
|
/* Assoc/Reassoc response frame */
|
||||||
fixed_param_length = 6;
|
fixed_param_len = 6;
|
||||||
else if (type == IEEE80211_FC0_TYPE_MGT &&
|
else if (type == IEEE80211_FC0_TYPE_MGT &&
|
||||||
subtype == IEEE80211_FC0_SUBTYPE_ACTION) {
|
subtype == IEEE80211_FC0_SUBTYPE_ACTION) {
|
||||||
/* Action frame */
|
/* Action frame */
|
||||||
@@ -171,10 +292,12 @@ QDF_STATUS iot_sim_frame_update(struct wlan_objmgr_pdev *pdev, qdf_nbuf_t nbuf,
|
|||||||
type, subtype, seq, is_action_frm,
|
type, subtype, seq, is_action_frm,
|
||||||
tx ? "TX" : "RX");
|
tx ? "TX" : "RX");
|
||||||
|
|
||||||
/* Only broadcast peer is getting handled right now.
|
/**
|
||||||
|
* Only broadcast peer is getting handled right now.
|
||||||
* Need to add support for peer based content modification
|
* Need to add support for peer based content modification
|
||||||
*/
|
*/
|
||||||
qdf_spin_lock(&isc->bcast_peer.iot_sim_lock);
|
qdf_spin_lock(&isc->bcast_peer.iot_sim_lock);
|
||||||
|
|
||||||
if (!isc->bcast_peer.rule_per_seq[seq])
|
if (!isc->bcast_peer.rule_per_seq[seq])
|
||||||
goto norule;
|
goto norule;
|
||||||
|
|
||||||
@@ -189,9 +312,26 @@ QDF_STATUS iot_sim_frame_update(struct wlan_objmgr_pdev *pdev, qdf_nbuf_t nbuf,
|
|||||||
goto norule;
|
goto norule;
|
||||||
|
|
||||||
if (tx) {
|
if (tx) {
|
||||||
status = iot_sim_apply_content_change_rule(piot_sim_rule,
|
if (IEEE80211_IS_BEACON((struct ieee80211_frame *)
|
||||||
|
qdf_nbuf_data(nbuf))) {
|
||||||
|
if (isc->bcn_buf)
|
||||||
|
qdf_nbuf_free(isc->bcn_buf);
|
||||||
|
isc->bcn_buf = qdf_nbuf_copy(nbuf);
|
||||||
|
status =
|
||||||
|
iot_sim_apply_content_change_rule(pdev,
|
||||||
|
piot_sim_rule,
|
||||||
|
isc->bcn_buf,
|
||||||
|
fixed_param_len,
|
||||||
|
param);
|
||||||
|
} else {
|
||||||
|
status =
|
||||||
|
iot_sim_apply_content_change_rule(pdev,
|
||||||
|
piot_sim_rule,
|
||||||
nbuf,
|
nbuf,
|
||||||
fixed_param_length);
|
fixed_param_len,
|
||||||
|
param);
|
||||||
|
}
|
||||||
|
|
||||||
if (status == QDF_STATUS_E_NOSUPPORT)
|
if (status == QDF_STATUS_E_NOSUPPORT)
|
||||||
goto norule;
|
goto norule;
|
||||||
} else {
|
} else {
|
||||||
|
@@ -20,10 +20,20 @@
|
|||||||
#include <wlan_objmgr_cmn.h>
|
#include <wlan_objmgr_cmn.h>
|
||||||
#include <wlan_lmac_if_def.h>
|
#include <wlan_lmac_if_def.h>
|
||||||
#include <wmi_unified_param.h>
|
#include <wmi_unified_param.h>
|
||||||
|
#include "include/wlan_pdev_mlme.h"
|
||||||
|
#include "wlan_pdev_mlme_api.h"
|
||||||
|
|
||||||
/* Forward Declarations */
|
/* Forward Declarations */
|
||||||
struct wmi_iot_sim_cmd_ops;
|
struct wmi_iot_sim_cmd_ops;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* struct iot_sim_cbacks - IOT Sim callbacks
|
||||||
|
* @reg_beacon_trigger_handler: reg_beacon_trigger_handler
|
||||||
|
*/
|
||||||
|
struct iot_sim_cbacks {
|
||||||
|
void (*update_beacon_trigger)(mlme_pdev_ext_t *);
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* iot_sim_cmd_handler() - IOT SIM frame handler function
|
* iot_sim_cmd_handler() - IOT SIM frame handler function
|
||||||
* @vdev - vdev object.
|
* @vdev - vdev object.
|
||||||
@@ -33,7 +43,7 @@ struct wmi_iot_sim_cmd_ops;
|
|||||||
* Return : QDF_STATUS_E_SUCCESS/QDF_STATUS_E_FAILURE.
|
* Return : QDF_STATUS_E_SUCCESS/QDF_STATUS_E_FAILURE.
|
||||||
*/
|
*/
|
||||||
QDF_STATUS iot_sim_cmd_handler(struct wlan_objmgr_vdev *vdev, qdf_nbuf_t buf,
|
QDF_STATUS iot_sim_cmd_handler(struct wlan_objmgr_vdev *vdev, qdf_nbuf_t buf,
|
||||||
bool tx);
|
struct beacon_tmpl_params *param, bool tx);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* wlan_iot_sim_init() - API to init iot_sim component
|
* wlan_iot_sim_init() - API to init iot_sim component
|
||||||
|
@@ -24,11 +24,25 @@
|
|||||||
#define IEEE80211_FRAME_BODY_OFFSET 0x18
|
#define IEEE80211_FRAME_BODY_OFFSET 0x18
|
||||||
|
|
||||||
QDF_STATUS iot_sim_cmd_handler(struct wlan_objmgr_vdev *vdev, qdf_nbuf_t nbuf,
|
QDF_STATUS iot_sim_cmd_handler(struct wlan_objmgr_vdev *vdev, qdf_nbuf_t nbuf,
|
||||||
bool tx)
|
struct beacon_tmpl_params *param, bool tx)
|
||||||
{
|
{
|
||||||
struct wlan_objmgr_pdev *pdev = vdev->vdev_objmgr.wlan_pdev;
|
struct wlan_objmgr_pdev *pdev = vdev->vdev_objmgr.wlan_pdev;
|
||||||
|
|
||||||
return iot_sim_frame_update(pdev, nbuf, tx);
|
return iot_sim_frame_update(pdev, nbuf, param, tx);
|
||||||
|
}
|
||||||
|
|
||||||
|
QDF_STATUS iot_sim_register_callbacks(struct wlan_objmgr_pdev *pdev,
|
||||||
|
struct iot_sim_cbacks *cb)
|
||||||
|
{
|
||||||
|
struct iot_sim_context *isc = NULL;
|
||||||
|
|
||||||
|
isc = wlan_objmgr_pdev_get_comp_private_obj(pdev, WLAN_IOT_SIM_COMP);
|
||||||
|
if (!isc)
|
||||||
|
return QDF_STATUS_E_NULL_VALUE;
|
||||||
|
|
||||||
|
isc->iot_sim_update_beacon_trigger = cb->update_beacon_trigger;
|
||||||
|
|
||||||
|
return QDF_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
QDF_STATUS
|
QDF_STATUS
|
||||||
@@ -79,4 +93,6 @@ void wlan_lmac_if_iot_sim_register_rx_ops(struct wlan_lmac_if_rx_ops *rx_ops)
|
|||||||
&rx_ops->iot_sim_rx_ops;
|
&rx_ops->iot_sim_rx_ops;
|
||||||
|
|
||||||
iot_sim_ops->iot_sim_cmd_handler = iot_sim_cmd_handler;
|
iot_sim_ops->iot_sim_cmd_handler = iot_sim_cmd_handler;
|
||||||
|
iot_sim_ops->iot_sim_register_cb = iot_sim_register_callbacks;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -193,6 +193,7 @@ QDF_STATUS iot_sim_mgmt_tx_update(struct wlan_objmgr_psoc *psoc,
|
|||||||
if (rx_ops->iot_sim_rx_ops.iot_sim_cmd_handler) {
|
if (rx_ops->iot_sim_rx_ops.iot_sim_cmd_handler) {
|
||||||
status = rx_ops->iot_sim_rx_ops.iot_sim_cmd_handler(vdev,
|
status = rx_ops->iot_sim_rx_ops.iot_sim_cmd_handler(vdev,
|
||||||
buf,
|
buf,
|
||||||
|
NULL,
|
||||||
true);
|
true);
|
||||||
if (QDF_IS_STATUS_ERROR(status))
|
if (QDF_IS_STATUS_ERROR(status))
|
||||||
mgmt_txrx_err("iot_sim_cmd_handler returned failure");
|
mgmt_txrx_err("iot_sim_cmd_handler returned failure");
|
||||||
|
@@ -945,7 +945,8 @@ static QDF_STATUS simulation_frame_update(struct wlan_objmgr_psoc *psoc,
|
|||||||
dbgid);
|
dbgid);
|
||||||
if (vdev) {
|
if (vdev) {
|
||||||
status = rx_ops->iot_sim_rx_ops.
|
status = rx_ops->iot_sim_rx_ops.
|
||||||
iot_sim_cmd_handler(vdev, buf, false);
|
iot_sim_cmd_handler(vdev, buf,
|
||||||
|
NULL, false);
|
||||||
if (status == QDF_STATUS_E_NULL_VALUE) {
|
if (status == QDF_STATUS_E_NULL_VALUE) {
|
||||||
wlan_objmgr_vdev_release_ref(vdev, dbgid);
|
wlan_objmgr_vdev_release_ref(vdev, dbgid);
|
||||||
mgmt_txrx_debug("iot_sim:Pkt processed at RX");
|
mgmt_txrx_debug("iot_sim:Pkt processed at RX");
|
||||||
|
@@ -428,6 +428,7 @@ QDF_STATUS wlan_objmgr_register_vdev_create_handler(
|
|||||||
qdf_spin_unlock_bh(&g_umac_glb_obj->global_lock);
|
qdf_spin_unlock_bh(&g_umac_glb_obj->global_lock);
|
||||||
return QDF_STATUS_SUCCESS;
|
return QDF_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
qdf_export_symbol(wlan_objmgr_register_vdev_create_handler);
|
||||||
|
|
||||||
QDF_STATUS wlan_objmgr_unregister_vdev_create_handler(
|
QDF_STATUS wlan_objmgr_unregister_vdev_create_handler(
|
||||||
enum wlan_umac_comp_id id,
|
enum wlan_umac_comp_id id,
|
||||||
@@ -454,6 +455,7 @@ QDF_STATUS wlan_objmgr_unregister_vdev_create_handler(
|
|||||||
qdf_spin_unlock_bh(&g_umac_glb_obj->global_lock);
|
qdf_spin_unlock_bh(&g_umac_glb_obj->global_lock);
|
||||||
return QDF_STATUS_SUCCESS;
|
return QDF_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
qdf_export_symbol(wlan_objmgr_unregister_vdev_create_handler);
|
||||||
|
|
||||||
QDF_STATUS wlan_objmgr_register_vdev_destroy_handler(
|
QDF_STATUS wlan_objmgr_register_vdev_destroy_handler(
|
||||||
enum wlan_umac_comp_id id,
|
enum wlan_umac_comp_id id,
|
||||||
@@ -480,6 +482,7 @@ QDF_STATUS wlan_objmgr_register_vdev_destroy_handler(
|
|||||||
qdf_spin_unlock_bh(&g_umac_glb_obj->global_lock);
|
qdf_spin_unlock_bh(&g_umac_glb_obj->global_lock);
|
||||||
return QDF_STATUS_SUCCESS;
|
return QDF_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
qdf_export_symbol(wlan_objmgr_register_vdev_destroy_handler);
|
||||||
|
|
||||||
QDF_STATUS wlan_objmgr_unregister_vdev_destroy_handler(
|
QDF_STATUS wlan_objmgr_unregister_vdev_destroy_handler(
|
||||||
enum wlan_umac_comp_id id,
|
enum wlan_umac_comp_id id,
|
||||||
@@ -506,6 +509,7 @@ QDF_STATUS wlan_objmgr_unregister_vdev_destroy_handler(
|
|||||||
qdf_spin_unlock_bh(&g_umac_glb_obj->global_lock);
|
qdf_spin_unlock_bh(&g_umac_glb_obj->global_lock);
|
||||||
return QDF_STATUS_SUCCESS;
|
return QDF_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
qdf_export_symbol(wlan_objmgr_unregister_vdev_destroy_handler);
|
||||||
|
|
||||||
QDF_STATUS wlan_objmgr_register_vdev_status_handler(
|
QDF_STATUS wlan_objmgr_register_vdev_status_handler(
|
||||||
enum wlan_umac_comp_id id,
|
enum wlan_umac_comp_id id,
|
||||||
|
@@ -1418,13 +1418,19 @@ struct wlan_lmac_if_sptrl_rx_ops {
|
|||||||
#endif /* WLAN_CONV_SPECTRAL_ENABLE */
|
#endif /* WLAN_CONV_SPECTRAL_ENABLE */
|
||||||
|
|
||||||
#ifdef WLAN_IOT_SIM_SUPPORT
|
#ifdef WLAN_IOT_SIM_SUPPORT
|
||||||
|
struct iot_sim_cbacks;
|
||||||
/**
|
/**
|
||||||
* wlan_lmac_if_iot_sim_rx_ops: iot_sim rx operations
|
* wlan_lmac_if_iot_sim_rx_ops: iot_sim rx operations
|
||||||
* iot_sim_cmd_handler: Applies iot_sim rule in outgoing and incoming frames
|
* iot_sim_cmd_handler: Applies iot_sim rule in outgoing and incoming frames
|
||||||
|
* iot_sim_register_cb: callback registration with iot_sim
|
||||||
**/
|
**/
|
||||||
struct wlan_lmac_if_iot_sim_rx_ops {
|
struct wlan_lmac_if_iot_sim_rx_ops {
|
||||||
QDF_STATUS (*iot_sim_cmd_handler)(struct wlan_objmgr_vdev *vdev,
|
QDF_STATUS (*iot_sim_cmd_handler)(struct wlan_objmgr_vdev *vdev,
|
||||||
qdf_nbuf_t n_buf, bool tx);
|
qdf_nbuf_t n_buf,
|
||||||
|
struct beacon_tmpl_params *param,
|
||||||
|
bool tx);
|
||||||
|
QDF_STATUS (*iot_sim_register_cb)(struct wlan_objmgr_pdev *pdev,
|
||||||
|
struct iot_sim_cbacks *cb);
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user