qcacld-3.0: Reduce the threshold of drop in the intra-bss forwarding path

In case of intra-bss forwarding, tx-path consumes all the tx descriptors
and pause netif queues. As a result, there would be some left for stack
triggered packets such as ARP packets which leads to ref STA disconnection.
To avoid this, reserved a pool of descriptors(OL_TX_NON_FWD_RESERVE = 100)
for high priority packets such as ARP/EAPOL etc and drop the packets
to be forwarded in host itself.

CRs-Fixed: 1095203
Change-Id: I7d473118ef3d986f79aa5b7a47286235d7adcab4
This commit is contained in:
Poddar, Siddarth
2016-11-29 20:17:01 +05:30
committed by qcabuildsw
parent 38e0adc46d
commit 8e3ee2d56e
4 changed files with 80 additions and 1 deletions

View File

@@ -1,5 +1,5 @@
/*
* Copyright (c) 2011, 2014-2016 The Linux Foundation. All rights reserved.
* Copyright (c) 2011, 2014-2017 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -202,6 +202,21 @@ ol_rx_fwd_check(struct ol_txrx_vdev_t *vdev,
qdf_nbuf_set_tid(msdu,
QDF_NBUF_TX_EXT_TID_INVALID);
}
if (!ol_txrx_fwd_desc_thresh_check(vdev)) {
/* Drop the packet*/
htt_rx_msdu_desc_free(pdev->htt_pdev, msdu);
qdf_net_buf_debug_release_skb(msdu);
TXRX_STATS_MSDU_LIST_INCR(
pdev, tx.dropped.host_reject, msdu);
/* add NULL terminator */
qdf_nbuf_set_next(msdu, NULL);
qdf_nbuf_tx_free(msdu,
QDF_NBUF_PKT_ERROR);
msdu = msdu_list;
continue;
}
/*
* This MSDU needs to be forwarded to the tx path.
* Check whether it also needs to be sent to the OS
@@ -219,6 +234,7 @@ ol_rx_fwd_check(struct ol_txrx_vdev_t *vdev,
pub.rx.intra_bss_fwd.packets_fwd, 1);
} else {
qdf_nbuf_t copy;
copy = qdf_nbuf_copy(msdu);
if (copy) {
ol_rx_fwd_to_tx(tx_vdev, copy);

View File

@@ -4879,6 +4879,32 @@ ol_txrx_dump_pkt(qdf_nbuf_t nbuf, uint32_t nbuf_paddr, int len)
qdf_nbuf_data(nbuf), len, true);
}
#ifdef QCA_LL_TX_FLOW_CONTROL_V2
bool
ol_txrx_fwd_desc_thresh_check(struct ol_txrx_vdev_t *vdev)
{
struct ol_tx_flow_pool_t *pool = vdev->pool;
bool enough_desc_flag;
if (!vdev)
return true;
pool = vdev->pool;
qdf_spin_lock_bh(&pool->flow_pool_lock);
enough_desc_flag = (pool->avail_desc < (pool->stop_th +
OL_TX_NON_FWD_RESERVE))
? false : true;
qdf_spin_unlock_bh(&pool->flow_pool_lock);
return enough_desc_flag;
}
#else
bool ol_txrx_fwd_desc_thresh_check(struct ol_txrx_vdev_t *vdev)
{
return true;
}
#endif
/**
* ol_txrx_get_vdev_from_vdev_id() - get vdev from vdev_id
* @vdev_id: vdev_id

View File

@@ -31,6 +31,14 @@
#include <qdf_nbuf.h> /* qdf_nbuf_t */
#include <cdp_txrx_cmn.h> /* ol_txrx_vdev_t, etc. */
#include "cds_sched.h"
#include <ol_txrx_types.h>
/*
* Pool of tx descriptors reserved for
* high-priority traffic, such as ARP/EAPOL etc
* only for forwarding path.
*/
#define OL_TX_NON_FWD_RESERVE 100
void ol_txrx_peer_unref_delete(struct ol_txrx_peer_t *peer);
@@ -89,6 +97,26 @@ ol_txrx_hl_tdls_flag_reset(void *vdev, bool flag)
void
ol_txrx_dump_pkt(qdf_nbuf_t nbuf, uint32_t nbuf_paddr, int len);
/**
* ol_txrx_fwd_desc_thresh_check() - check to forward packet to tx path
* @vdev: which virtual device the frames were addressed to
*
* This API is to check whether enough descriptors are available or not
* to forward packet to tx path. If not enough descriptors left,
* start dropping tx-path packets.
* Do not pause netif queues as still a pool of descriptors is reserved
* for high-priority traffic such as EAPOL/ARP etc.
* In case of intra-bss forwarding, it could be possible that tx-path can
* consume all the tx descriptors and pause netif queues. Due to this,
* there would be some left for stack triggered packets such as ARP packets
* which could lead to disconnection of device. To avoid this, reserved
* a pool of descriptors for high-priority packets, i.e., reduce the
* threshold of drop in the intra-bss forwarding path.
*
* Return: true ; forward the packet, i.e., below threshold
* false; not enough descriptors, drop the packet
*/
bool ol_txrx_fwd_desc_thresh_check(struct ol_txrx_vdev_t *vdev);
void *ol_txrx_get_vdev_from_vdev_id(uint8_t vdev_id);

View File

@@ -48,6 +48,7 @@
#include <linux/inetdevice.h>
#include <linux/ip.h>
#include <wlan_hdd_softap_tx_rx.h>
#include <ol_txrx.h>
#include <cdp_txrx_peer_ops.h>
#include "cds_sched.h"
@@ -3221,6 +3222,14 @@ static enum hdd_ipa_forward_type hdd_ipa_intrabss_forward(
int ret = HDD_IPA_FORWARD_PKT_NONE;
if ((desc & FW_RX_DESC_FORWARD_M)) {
if (!ol_txrx_fwd_desc_thresh_check(
ol_txrx_get_vdev_from_vdev_id(adapter->sessionId))) {
/* Drop the packet*/
hdd_ipa->stats.num_tx_fwd_err++;
kfree_skb(skb);
ret = HDD_IPA_FORWARD_PKT_DISCARD;
return ret;
}
HDD_IPA_LOG(QDF_TRACE_LEVEL_DEBUG,
"Forward packet to Tx (fw_desc=%d)", desc);
hdd_ipa->ipa_tx_forward++;