From 6523a02ecc846a47d78fbc186b6446c94a4f0fb4 Mon Sep 17 00:00:00 2001 From: Venkateswara Swamy Bandaru Date: Thu, 22 Feb 2018 17:55:49 +0530 Subject: [PATCH] qcacmn: Fix mesh no ecryption frame issue Send no encryption frame only to the firmware and do not duplicate the frame. Change-Id: Ie601126b59027d33808db27b18ec23efbab564c0 CRs-Fixed: 2186526 --- dp/wifi3.0/dp_tx.c | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/dp/wifi3.0/dp_tx.c b/dp/wifi3.0/dp_tx.c index 055bbb8ffe22..7dc200b39ae8 100644 --- a/dp/wifi3.0/dp_tx.c +++ b/dp/wifi3.0/dp_tx.c @@ -1542,6 +1542,7 @@ qdf_nbuf_t dp_tx_extract_mesh_meta_data(struct dp_vdev *vdev, qdf_nbuf_t nbuf, if (mhdr->flags & METAHDR_FLAG_NOENCRYPT) { meta_data->encrypt_type = 0; meta_data->valid_encrypt_type = 1; + meta_data->learning_frame = 0; } meta_data->valid_key_flags = 1; @@ -1788,6 +1789,7 @@ qdf_nbuf_t dp_tx_send_mesh(void *vap_dev, qdf_nbuf_t nbuf) qdf_nbuf_t nbuf_mesh = NULL; qdf_nbuf_t nbuf_clone = NULL; struct dp_vdev *vdev = (struct dp_vdev *) vap_dev; + uint8_t no_enc_frame = 0; nbuf_mesh = qdf_nbuf_unshare(nbuf); if (nbuf_mesh == NULL) { @@ -1798,7 +1800,13 @@ qdf_nbuf_t dp_tx_send_mesh(void *vap_dev, qdf_nbuf_t nbuf) nbuf = nbuf_mesh; mhdr = (struct meta_hdr_s *)qdf_nbuf_data(nbuf); - if (mhdr->flags & METAHDR_FLAG_INFO_UPDATED) { + + if ((vdev->sec_type != cdp_sec_type_none) && + (mhdr->flags & METAHDR_FLAG_NOENCRYPT)) + no_enc_frame = 1; + + if ((mhdr->flags & METAHDR_FLAG_INFO_UPDATED) && + !no_enc_frame) { nbuf_clone = qdf_nbuf_clone(nbuf); if (nbuf_clone == NULL) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, @@ -1815,8 +1823,17 @@ qdf_nbuf_t dp_tx_send_mesh(void *vap_dev, qdf_nbuf_t nbuf) qdf_nbuf_free(nbuf_clone); } - qdf_nbuf_set_tx_ftype(nbuf, CB_FTYPE_INVALID); - return dp_tx_send(vap_dev, nbuf); + if (no_enc_frame) + qdf_nbuf_set_tx_ftype(nbuf, CB_FTYPE_MESH_TX_INFO); + else + qdf_nbuf_set_tx_ftype(nbuf, CB_FTYPE_INVALID); + + nbuf = dp_tx_send(vap_dev, nbuf); + if ((nbuf == NULL) && no_enc_frame) { + DP_STATS_INC(vdev, tx_i.mesh.exception_fw, 1); + } + + return nbuf; } #else