blob: 9d7590e329ef4c25d930721a61e7de40157f0d70 [file] [log] [blame]
/*
* Copyright (c) 2012 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
* above copyright notice and this permission notice appear in all
* copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
* WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
* AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/
/*
* This file was originally distributed by Qualcomm Atheros, Inc.
* under proprietary terms before Copyright ownership was assigned
* to the Linux Foundation.
*/
/**
* @file ol_txrx_encap.h
* @brief definitions for txrx encap/decap function and struct
*/
#ifndef _OL_TXRX_ENCAP__H_
#define _OL_TXRX_ENCAP__H_
#ifdef QCA_SUPPORT_SW_TXRX_ENCAP
#include <adf_nbuf.h> /* adf_nbuf_t */
#include <ieee80211_common.h> /* ieee80211_qosframe_htc_addr4 */
#include <ol_txrx_types.h> /* ol_tx_desc_t, ol_txrx_msdu_info_t */
/**
* @brief Encap outgoing frm from OS dependent format to Target
* acceptable frm format
* @details
* For native wifi format, the function will add Qos control field
* based on peer's QOS capbabilities .
* For 802.3 format, the function will transform to 802.11 format
* with or without QOS control field based on peer's QOS capabilites.
* @param vdev - handle to vdev object
* @param tx_desc - tx desc struct,some fields will be updated.
* @param msdu - adf_nbuf_t
* @param msdu_info - informations from tx classification.
* @return
* A_OK: encap operation sucessful
* other: operation failed,the msdu need be dropped.
*/
A_STATUS
ol_tx_encap(
struct ol_txrx_vdev_t *vdev,
struct ol_tx_desc_t *tx_desc,
adf_nbuf_t msdu,
struct ol_txrx_msdu_info_t *msdu_info);
struct ol_rx_decap_info_t {
u_int8_t hdr[sizeof(struct ieee80211_qosframe_htc_addr4)];
int hdr_len;
u_int8_t is_subfrm : 1,
is_first_subfrm :1,
is_msdu_cmpl_mpdu : 1;
};
/**
* @brief decap incoming frm from Target to Host OS
* acceptable frm format
* @details
* For native wifi format, the function will remove Qos control field
* and HT control field if any.
* For 802.3 format, the function will will do llc snap header process
* if Target haven't done that.
* @param vdev - handle to vdev object
* @param peer - the peer object.
* @param msdu - adf_nbuf_t
* @param info - ol_rx_decap_info_t: context info for decap
* @return
* A_OK: decap operation sucessful
* other: operation failed,the msdu need be dropped.
*/
A_STATUS
ol_rx_decap (
struct ol_txrx_vdev_t *vdev,
struct ol_txrx_peer_t *peer,
adf_nbuf_t msdu,
struct ol_rx_decap_info_t *info);
static inline A_STATUS
OL_TX_ENCAP(
struct ol_txrx_vdev_t *vdev,
struct ol_tx_desc_t *tx_desc,
adf_nbuf_t msdu,
struct ol_txrx_msdu_info_t *msdu_info)
{
if (vdev->pdev->sw_tx_encap) {
return ol_tx_encap(vdev, tx_desc, msdu,msdu_info);
}
return A_OK;
}
static inline A_STATUS
OL_RX_DECAP(
struct ol_txrx_vdev_t *vdev,
struct ol_txrx_peer_t *peer,
adf_nbuf_t msdu,
struct ol_rx_decap_info_t *info)
{
if (vdev->pdev->sw_rx_decap) {
return ol_rx_decap(vdev, peer, msdu, info);
}
return A_OK;
}
#define OL_TX_RESTORE_HDR(__tx_desc,__msdu) \
if(__tx_desc->orig_l2_hdr_bytes != 0) { \
adf_nbuf_push_head(__msdu, __tx_desc->orig_l2_hdr_bytes); \
}
#else
#define OL_TX_ENCAP(vdev, tx_desc, msdu, msdu_info) A_OK
#define OL_RX_DECAP(vdev, peer, msdu, info) A_OK
#define OL_TX_RESTORE_HDR(__tx_desc,__msdu)
#endif
#endif /* _OL_TXRX_ENCAP__H_ */