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
这个提交包含在:
Subhranil Choudhury
2018-09-07 19:26:24 +05:30
提交者 nshrivas
父节点 b75565e98f
当前提交 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 * dp_rx_wds_add_or_update_ast() - Add or update the ast entry.
* is behind the WDS repeater.
* *
* @soc: core txrx main context * @soc: core txrx main context
* @rx_tlv_hdr: base address of RX TLV header
* @ta_peer: WDS repeater peer * @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: * Return: void:
*/ */
#ifdef FEATURE_WDS #ifdef FEATURE_WDS
static inline void static inline void
dp_rx_wds_srcport_learn(struct dp_soc *soc, dp_rx_wds_add_or_update_ast(struct dp_soc *soc, struct dp_peer *ta_peer,
uint8_t *rx_tlv_hdr, uint8_t *wds_src_mac, uint8_t is_ad4_valid,
struct dp_peer *ta_peer, uint8_t is_sa_valid, uint8_t is_chfrag_start,
qdf_nbuf_t nbuf) 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 *sa_peer;
struct dp_peer *wds_peer; struct dp_peer *wds_peer;
struct dp_ast_entry *ast; 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; bool del_in_progress;
uint8_t sa_is_valid;
struct dp_neighbour_peer *neighbour_peer = NULL; struct dp_neighbour_peer *neighbour_peer = NULL;
struct dp_pdev *pdev = ta_peer->vdev->pdev; 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 /* For AP mode : Do wds source port learning only if it is a
* 4-address mpdu * 4-address mpdu
* *
@@ -437,8 +433,7 @@ dp_rx_wds_srcport_learn(struct dp_soc *soc,
* backbone getting wrongly learnt as MEC on repeater * backbone getting wrongly learnt as MEC on repeater
*/ */
if (ta_peer->vdev->opmode != wlan_op_mode_sta) { if (ta_peer->vdev->opmode != wlan_op_mode_sta) {
if (!(qdf_nbuf_is_rx_chfrag_start(nbuf) && if (!(is_chfrag_start && is_ad4_valid))
hal_rx_get_mpdu_mac_ad4_valid(rx_tlv_hdr)))
return; return;
} else { } else {
/* For HKv2 Source port learing is not needed in STA mode /* 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; return;
} }
memcpy(wds_src_mac, (qdf_nbuf_data(nbuf) + IEEE80211_ADDR_LEN), if (qdf_unlikely(!is_sa_valid)) {
IEEE80211_ADDR_LEN);
sa_is_valid = hal_rx_msdu_end_sa_is_valid_get(rx_tlv_hdr);
if (qdf_unlikely(!sa_is_valid)) {
ret = dp_peer_add_ast(soc, ret = dp_peer_add_ast(soc,
ta_peer, ta_peer,
wds_src_mac, wds_src_mac,
@@ -461,11 +452,6 @@ dp_rx_wds_srcport_learn(struct dp_soc *soc,
return; 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); qdf_spin_lock_bh(&soc->ast_lock);
ast = soc->ast_table[sa_idx]; ast = soc->ast_table[sa_idx];
qdf_spin_unlock_bh(&soc->ast_lock); 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; return;
} }