qcacmn: Split the wds src port learn function
Splitting the wds srcport learn function to add: 1. A wrapper function where host extracts the required fields from nbuf cb and rx_tlv header. 2. A common function which can be called from both host path as well as offload path. Change-Id: I2f2c0580c049f48395a3e0a265e3fb5d8aed6774
This commit is contained in:

committad av
nshrivas

förälder
b75565e98f
incheckning
5079d52ebf
@@ -395,39 +395,35 @@ void dp_rx_add_to_free_desc_list(union dp_rx_desc_list_elem_t **head,
|
||||
}
|
||||
|
||||
/**
|
||||
* dp_rx_wds_srcport_learn() - Add or update the STA PEER which
|
||||
* is behind the WDS repeater.
|
||||
* dp_rx_wds_add_or_update_ast() - Add or update the ast entry.
|
||||
*
|
||||
* @soc: core txrx main context
|
||||
* @rx_tlv_hdr: base address of RX TLV header
|
||||
* @ta_peer: WDS repeater peer
|
||||
* @nbuf: rx pkt
|
||||
* @mac_addr: mac address of the peer
|
||||
* @is_ad4_valid: 4-address valid flag
|
||||
* @is_sa_valid: source address valid flag
|
||||
* @is_chfrag_start: frag start flag
|
||||
* @sa_idx: source-address index for peer
|
||||
* @sa_sw_peer_id: software source-address peer-id
|
||||
*
|
||||
* Return: void:
|
||||
*/
|
||||
#ifdef FEATURE_WDS
|
||||
static inline void
|
||||
dp_rx_wds_srcport_learn(struct dp_soc *soc,
|
||||
uint8_t *rx_tlv_hdr,
|
||||
struct dp_peer *ta_peer,
|
||||
qdf_nbuf_t nbuf)
|
||||
dp_rx_wds_add_or_update_ast(struct dp_soc *soc, struct dp_peer *ta_peer,
|
||||
uint8_t *wds_src_mac, uint8_t is_ad4_valid,
|
||||
uint8_t is_sa_valid, uint8_t is_chfrag_start,
|
||||
uint16_t sa_idx, uint16_t sa_sw_peer_id)
|
||||
{
|
||||
uint16_t sa_sw_peer_id = hal_rx_msdu_end_sa_sw_peer_id_get(rx_tlv_hdr);
|
||||
uint32_t flags = IEEE80211_NODE_F_WDS_HM;
|
||||
uint32_t ret = 0;
|
||||
uint8_t wds_src_mac[IEEE80211_ADDR_LEN];
|
||||
struct dp_peer *sa_peer;
|
||||
struct dp_peer *wds_peer;
|
||||
struct dp_ast_entry *ast;
|
||||
uint16_t sa_idx;
|
||||
uint32_t flags = IEEE80211_NODE_F_WDS_HM;
|
||||
uint32_t ret = 0;
|
||||
bool del_in_progress;
|
||||
uint8_t sa_is_valid;
|
||||
struct dp_neighbour_peer *neighbour_peer = NULL;
|
||||
struct dp_pdev *pdev = ta_peer->vdev->pdev;
|
||||
|
||||
if (qdf_unlikely(!ta_peer))
|
||||
return;
|
||||
|
||||
/* For AP mode : Do wds source port learning only if it is a
|
||||
* 4-address mpdu
|
||||
*
|
||||
@@ -437,8 +433,7 @@ dp_rx_wds_srcport_learn(struct dp_soc *soc,
|
||||
* backbone getting wrongly learnt as MEC on repeater
|
||||
*/
|
||||
if (ta_peer->vdev->opmode != wlan_op_mode_sta) {
|
||||
if (!(qdf_nbuf_is_rx_chfrag_start(nbuf) &&
|
||||
hal_rx_get_mpdu_mac_ad4_valid(rx_tlv_hdr)))
|
||||
if (!(is_chfrag_start && is_ad4_valid))
|
||||
return;
|
||||
} else {
|
||||
/* For HKv2 Source port learing is not needed in STA mode
|
||||
@@ -448,11 +443,7 @@ dp_rx_wds_srcport_learn(struct dp_soc *soc,
|
||||
return;
|
||||
}
|
||||
|
||||
memcpy(wds_src_mac, (qdf_nbuf_data(nbuf) + IEEE80211_ADDR_LEN),
|
||||
IEEE80211_ADDR_LEN);
|
||||
|
||||
sa_is_valid = hal_rx_msdu_end_sa_is_valid_get(rx_tlv_hdr);
|
||||
if (qdf_unlikely(!sa_is_valid)) {
|
||||
if (qdf_unlikely(!is_sa_valid)) {
|
||||
ret = dp_peer_add_ast(soc,
|
||||
ta_peer,
|
||||
wds_src_mac,
|
||||
@@ -461,11 +452,6 @@ dp_rx_wds_srcport_learn(struct dp_soc *soc,
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Get the AST entry from HW SA index and mark it as active
|
||||
*/
|
||||
sa_idx = hal_rx_msdu_end_sa_idx_get(rx_tlv_hdr);
|
||||
|
||||
qdf_spin_lock_bh(&soc->ast_lock);
|
||||
ast = soc->ast_table[sa_idx];
|
||||
qdf_spin_unlock_bh(&soc->ast_lock);
|
||||
@@ -607,6 +593,50 @@ dp_rx_wds_srcport_learn(struct dp_soc *soc,
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* dp_rx_wds_srcport_learn() - Add or update the STA PEER which
|
||||
* is behind the WDS repeater.
|
||||
*
|
||||
* @soc: core txrx main context
|
||||
* @rx_tlv_hdr: base address of RX TLV header
|
||||
* @ta_peer: WDS repeater peer
|
||||
* @nbuf: rx pkt
|
||||
*
|
||||
* Return: void:
|
||||
*/
|
||||
static inline void
|
||||
dp_rx_wds_srcport_learn(struct dp_soc *soc,
|
||||
uint8_t *rx_tlv_hdr,
|
||||
struct dp_peer *ta_peer,
|
||||
qdf_nbuf_t nbuf)
|
||||
{
|
||||
uint16_t sa_sw_peer_id = hal_rx_msdu_end_sa_sw_peer_id_get(rx_tlv_hdr);
|
||||
uint8_t sa_is_valid = hal_rx_msdu_end_sa_is_valid_get(rx_tlv_hdr);
|
||||
uint8_t wds_src_mac[IEEE80211_ADDR_LEN];
|
||||
uint16_t sa_idx;
|
||||
uint8_t is_chfrag_start = 0;
|
||||
uint8_t is_ad4_valid = 0;
|
||||
|
||||
if (qdf_unlikely(!ta_peer))
|
||||
return;
|
||||
|
||||
is_chfrag_start = qdf_nbuf_is_rx_chfrag_start(nbuf);
|
||||
if (is_chfrag_start)
|
||||
is_ad4_valid = hal_rx_get_mpdu_mac_ad4_valid(rx_tlv_hdr);
|
||||
|
||||
memcpy(wds_src_mac, (qdf_nbuf_data(nbuf) + IEEE80211_ADDR_LEN),
|
||||
IEEE80211_ADDR_LEN);
|
||||
|
||||
/*
|
||||
* Get the AST entry from HW SA index and mark it as active
|
||||
*/
|
||||
sa_idx = hal_rx_msdu_end_sa_idx_get(rx_tlv_hdr);
|
||||
|
||||
dp_rx_wds_add_or_update_ast(soc, ta_peer, wds_src_mac, is_ad4_valid,
|
||||
sa_is_valid, is_chfrag_start,
|
||||
sa_idx, sa_sw_peer_id);
|
||||
|
||||
return;
|
||||
}
|
||||
|
Referens i nytt ärende
Block a user