From bd5b3c2c9b0df177c78e044d3731a8dd631d848c Mon Sep 17 00:00:00 2001 From: c_cgodav Date: Wed, 7 Jun 2017 12:31:40 +0530 Subject: [PATCH] qcacmn: Add CDP APIs to get security type from peer handler Add CDP API to get security type for ucast and mcast from peer handler. Add additional peer handler argument for raw mode rx decap functions. The peer handler is needed in the raw mode functions for getting the security type of the frame and process it accordingly. Change-Id: I8b4728e9eb0ff29849805bb461c81e4fc3accc81 --- dp/inc/cdp_txrx_cmn_struct.h | 5 ++++- dp/inc/cdp_txrx_ctrl.h | 32 ++++++++++++++++++++++++++++++-- dp/inc/cdp_txrx_ops.h | 5 +++-- dp/wifi3.0/dp_main.c | 4 ++-- dp/wifi3.0/dp_rx.c | 11 +++++++---- dp/wifi3.0/dp_rx.h | 3 ++- dp/wifi3.0/dp_rx_err.c | 2 +- 7 files changed, 49 insertions(+), 13 deletions(-) diff --git a/dp/inc/cdp_txrx_cmn_struct.h b/dp/inc/cdp_txrx_cmn_struct.h index fcd3e5e320..48d0b837bb 100644 --- a/dp/inc/cdp_txrx_cmn_struct.h +++ b/dp/inc/cdp_txrx_cmn_struct.h @@ -36,6 +36,7 @@ #ifndef CONFIG_WIN #include #endif /* CONFIG_WIN */ +#include #ifndef OL_TXRX_NUM_LOCAL_PEER_IDS #define OL_TXRX_NUM_LOCAL_PEER_IDS 33 /* default */ @@ -310,10 +311,12 @@ typedef QDF_STATUS(*ol_txrx_rx_fp)(void *osif_dev, qdf_nbuf_t msdu_list); * @osif_dev - the virtual device's OS shim object * @list_head - poniter to head of receive packet queue to decap * @list_tail - poniter to tail of receive packet queue to decap + * @peer - Peer handler */ typedef QDF_STATUS(*ol_txrx_rsim_rx_decap_fp)(void *osif_dev, qdf_nbuf_t *list_head, - qdf_nbuf_t *list_tail); + qdf_nbuf_t *list_tail, + struct cdp_peer *peer); /* ol_txrx_rx_fp - external tx free function to read per packet stats and * free tx buffer externally diff --git a/dp/inc/cdp_txrx_ctrl.h b/dp/inc/cdp_txrx_ctrl.h index 18585e456a..571e5dd13c 100644 --- a/dp/inc/cdp_txrx_ctrl.h +++ b/dp/inc/cdp_txrx_ctrl.h @@ -236,7 +236,7 @@ cdp_get_pdev_reo_dest(ol_txrx_soc_handle soc, struct cdp_pdev *pdev) */ static inline void cdp_peer_authorize(ol_txrx_soc_handle soc, - struct ol_txrx_peer_t *peer, u_int32_t authorize) + struct cdp_peer *peer, u_int32_t authorize) { if (soc->ops->ctrl_ops->txrx_peer_authorize) return soc->ops->ctrl_ops->txrx_peer_authorize @@ -381,7 +381,7 @@ static inline void cdp_txrx_set_vdev_param(ol_txrx_soc_handle soc, static inline void cdp_peer_set_nawds(ol_txrx_soc_handle soc, - struct ol_txrx_peer_t *peer, uint8_t value) + struct cdp_peer *peer, uint8_t value) { if (soc->ops->ctrl_ops->txrx_peer_set_nawds) return soc->ops->ctrl_ops->txrx_peer_set_nawds @@ -450,4 +450,32 @@ cdp_wdi_event_unsub(ol_txrx_soc_handle soc, (pdev, event_cb_sub, event); return 0; } + +/** + * @brief Get security type from the from peer. + * @details + * This function gets the Security information from the peer handler. + * The security information is got from the rx descriptor and filled in + * to the peer handler. + * + * @param soc - pointer to the soc + * @param peer - peer handler + * @param sec_idx - mcast or ucast frame type. + * @return - int + */ +static inline int +cdp_get_sec_type(ol_txrx_soc_handle soc, struct cdp_peer *peer, uint8_t sec_idx) +{ + if (!soc || !soc->ops || !soc->ops->ctrl_ops) { + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL, + "%s invalid instance", __func__); + return A_ERROR; + } + + if (soc->ops->ctrl_ops->txrx_get_sec_type) + return soc->ops->ctrl_ops->txrx_get_sec_type + (peer, sec_idx); + return A_ERROR; + +} #endif diff --git a/dp/inc/cdp_txrx_ops.h b/dp/inc/cdp_txrx_ops.h index c88fff7908..755cef0ad4 100644 --- a/dp/inc/cdp_txrx_ops.h +++ b/dp/inc/cdp_txrx_ops.h @@ -309,7 +309,7 @@ struct cdp_ctrl_ops { * @return none */ void - (*txrx_peer_authorize)(void *peer, + (*txrx_peer_authorize)(struct cdp_peer *peer, u_int32_t authorize); bool @@ -378,7 +378,7 @@ struct cdp_ctrl_ops { void (*txrx_set_vdev_param)(struct cdp_vdev *vdev, enum cdp_vdev_param_type param, uint32_t val); - void (*txrx_peer_set_nawds)(void *peer, uint8_t value); + void (*txrx_peer_set_nawds)(struct cdp_peer *peer, uint8_t value); /** * @brief Set the reo dest ring num of the radio * @details @@ -409,6 +409,7 @@ struct cdp_ctrl_ops { int (*txrx_wdi_event_unsub)(struct cdp_pdev *pdev, void *event_cb_sub, uint32_t event); + int (*txrx_get_sec_type)(struct cdp_peer *peer, uint8_t sec_idx); }; struct cdp_me_ops { diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index 91f2d600fd..37981b05df 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -2223,7 +2223,7 @@ fail0: * @authorize * */ -static void dp_peer_authorize(void *peer_handle, uint32_t authorize) +static void dp_peer_authorize(struct cdp_peer *peer_handle, uint32_t authorize) { struct dp_peer *peer = (struct dp_peer *)peer_handle; struct dp_soc *soc; @@ -3592,7 +3592,7 @@ static void dp_set_vdev_param(struct cdp_vdev *vdev_handle, * * return: void */ -static void dp_peer_set_nawds(void *peer_handle, uint8_t value) +static void dp_peer_set_nawds(struct cdp_peer *peer_handle, uint8_t value) { struct dp_peer *peer = (struct dp_peer *)peer_handle; peer->nawds_enabled = value; diff --git a/dp/wifi3.0/dp_rx.c b/dp/wifi3.0/dp_rx.c index 25bf6465f3..80e44e43a0 100644 --- a/dp/wifi3.0/dp_rx.c +++ b/dp/wifi3.0/dp_rx.c @@ -214,11 +214,13 @@ QDF_STATUS dp_rx_buffers_replenish(struct dp_soc *dp_soc, uint32_t mac_id, * * @vdev: vdev on which RAW mode is enabled * @nbuf_list: list of RAW pkts to process + * @peer: peer object from which the pkt is rx * * Return: void */ void -dp_rx_deliver_raw(struct dp_vdev *vdev, qdf_nbuf_t nbuf_list) +dp_rx_deliver_raw(struct dp_vdev *vdev, qdf_nbuf_t nbuf_list, + struct cdp_peer *peer) { qdf_nbuf_t deliver_list_head = NULL; qdf_nbuf_t deliver_list_tail = NULL; @@ -246,7 +248,7 @@ dp_rx_deliver_raw(struct dp_vdev *vdev, qdf_nbuf_t nbuf_list) } vdev->osif_rsim_rx_decap(vdev->osif_vdev, &deliver_list_head, - &deliver_list_tail); + &deliver_list_tail, peer); vdev->osif_rx(vdev->osif_vdev, deliver_list_head); } @@ -1305,8 +1307,9 @@ done: } if (qdf_unlikely(vdev->rx_decap_type == htt_cmn_pkt_type_raw) || - (vdev->rx_decap_type == htt_cmn_pkt_type_native_wifi)) - dp_rx_deliver_raw(vdev, deliver_list_head); + (vdev->rx_decap_type == htt_cmn_pkt_type_native_wifi)) + dp_rx_deliver_raw(vdev, deliver_list_head, + (struct cdp_peer *) peer); else if (qdf_likely(vdev->osif_rx) && deliver_list_head) vdev->osif_rx(vdev->osif_vdev, deliver_list_head); } diff --git a/dp/wifi3.0/dp_rx.h b/dp/wifi3.0/dp_rx.h index 64253d2ba4..f97fe57315 100644 --- a/dp/wifi3.0/dp_rx.h +++ b/dp/wifi3.0/dp_rx.h @@ -304,7 +304,8 @@ void dp_rx_desc_pool_free(struct dp_soc *soc, uint32_t pool_id, struct rx_desc_pool *rx_desc_pool); -void dp_rx_deliver_raw(struct dp_vdev *vdev, qdf_nbuf_t nbuf_list); +void dp_rx_deliver_raw(struct dp_vdev *vdev, qdf_nbuf_t nbuf_list, + struct cdp_peer *peer); /** * dp_rx_add_to_free_desc_list() - Adds to a local free descriptor list diff --git a/dp/wifi3.0/dp_rx_err.c b/dp/wifi3.0/dp_rx_err.c index 6a6d20ec75..00805ebae4 100644 --- a/dp/wifi3.0/dp_rx_err.c +++ b/dp/wifi3.0/dp_rx_err.c @@ -393,7 +393,7 @@ dp_rx_null_q_desc_handle(struct dp_soc *soc, struct dp_rx_desc *rx_desc, if (qdf_unlikely(vdev->rx_decap_type == htt_cmn_pkt_type_raw)) { qdf_nbuf_set_next(nbuf, NULL); - dp_rx_deliver_raw(vdev, nbuf); + dp_rx_deliver_raw(vdev, nbuf, (struct cdp_peer *) peer); } else { if (qdf_unlikely(peer->bss_peer)) { QDF_TRACE(QDF_MODULE_ID_DP,