blob: 6d86b3a2f16dbecf9d1200a22ce530533dfa10f3 [file] [log] [blame]
/*
* Copyright (c) 2011-2012,2014,2016 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.
*/
#if !defined( __VOS_PKT_H )
#define __VOS_PKT_H
/**=========================================================================
\file vos_packet.h
\brief virtual Operating System Services (vOSS) network Packet APIs
Network Protocol packet/buffer support interfaces
========================================================================*/
/* $Header$ */
/*--------------------------------------------------------------------------
Include Files
------------------------------------------------------------------------*/
#include <vos_types.h>
#include <vos_status.h>
/*--------------------------------------------------------------------------
Preprocessor definitions and constants
------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------
Type declarations
------------------------------------------------------------------------*/
struct vos_pkt_t;
typedef struct vos_pkt_t vos_pkt_t;
#include "adf_nbuf.h"
#define VOS_PKT_TRAC_TYPE_EAPOL NBUF_PKT_TRAC_TYPE_EAPOL
#define VOS_PKT_TRAC_TYPE_DHCP NBUF_PKT_TRAC_TYPE_DHCP
#define VOS_PKT_TRAC_TYPE_MGMT_ACTION NBUF_PKT_TRAC_TYPE_MGMT_ACTION /* Managment action frame */
#define VOS_PKT_TRAC_TYPE_ARP NBUF_PKT_TRAC_TYPE_ARP
#define VOS_PKT_TRAC_TYPE_NS NBUF_PKT_TRAC_TYPE_NS
#define VOS_PKT_TRAC_TYPE_NA NBUF_PKT_TRAC_TYPE_NA
#define VOS_PKT_TRAC_DUMP_CMD 9999
/*---------------------------------------------------------------------------
* brief vos_pkt_get_proto_type() -
Find protoco type from packet contents
* skb Packet Pointer
* tracking_map packet type want to track
* dot11_type, frame type when the frame is in dot11 format
---------------------------------------------------------------------------*/
v_U8_t vos_pkt_get_proto_type
(
struct sk_buff *skb,
v_U8_t tracking_map,
v_BOOL_t dot11_type
);
#ifdef QCA_PKT_PROTO_TRACE
/*---------------------------------------------------------------------------
* brief vos_pkt_trace_buf_update() -
Update storage buffer with interest event string
* event_string Event String may packet type or outstanding event
---------------------------------------------------------------------------*/
void vos_pkt_trace_buf_update
(
char *event_string
);
/*---------------------------------------------------------------------------
* brief vos_pkt_trace_buf_dump() -
Dump stored information into kernel log
---------------------------------------------------------------------------*/
void vos_pkt_trace_buf_dump
(
void
);
/*---------------------------------------------------------------------------
* brief vos_pkt_proto_trace_init() -
Initialize protocol trace functionality, allocate required resource
---------------------------------------------------------------------------*/
void vos_pkt_proto_trace_init
(
void
);
/*---------------------------------------------------------------------------
* brief vos_pkt_proto_trace_close() -
Free required resource
---------------------------------------------------------------------------*/
void vos_pkt_proto_trace_close
(
void
);
#endif /* QCA_PKT_PROTO_TRACE */
/**
* vos_pkt_return_packet Free the voss Packet
* @ vos Packet
*/
VOS_STATUS vos_pkt_return_packet(vos_pkt_t *packet);
/**
* vos_pkt_get_packet_length Returns the packet length
* @ vos Packet
*/
VOS_STATUS vos_pkt_get_packet_length( vos_pkt_t *pPacket,
v_U16_t *pPacketSize );
/*
* TODO: Remove later
* All the below difinitions are not
* required for Host Driver 2.0
* once corresponding references are removed
* from HDD and other layers
* below code will be removed
*/
//The size of AMSDU frame per spec can be a max of 3839 bytes
// in BD/PDUs that means 30 (one BD = 128 bytes)
// we must add the size of the 802.11 header to that
#define VPKT_SIZE_BUFFER ((30 * 128) + 32)
/// voss Packet Types
typedef enum
{
/// voss Packet is used to transmit 802.11 Management frames.
VOS_PKT_TYPE_TX_802_11_MGMT,
/// voss Packet is used to transmit 802.11 Data frames.
VOS_PKT_TYPE_TX_802_11_DATA,
/// voss Packet is used to transmit 802.3 Data frames.
VOS_PKT_TYPE_TX_802_3_DATA,
/// voss Packet contains Received data of an unknown frame type
VOS_PKT_TYPE_RX_RAW,
/// Invalid sentinel value
VOS_PKT_TYPE_MAXIMUM
} VOS_PKT_TYPE;
/// user IDs. These IDs are needed on the vos_pkt_get/set_user_data_ptr()
/// to identify the user area in the voss Packet.
typedef enum
{
VOS_PKT_USER_DATA_ID_TL =0,
VOS_PKT_USER_DATA_ID_BAL,
VOS_PKT_USER_DATA_ID_WDA,
VOS_PKT_USER_DATA_ID_HDD,
VOS_PKT_USER_DATA_ID_BSL,
VOS_PKT_USER_DATA_ID_MAX
} VOS_PKT_USER_DATA_ID;
typedef VOS_STATUS ( *vos_pkt_get_packet_callback )( vos_pkt_t *pPacket,
v_VOID_t *userData );
VOS_STATUS vos_pkt_get_available_buffer_pool (VOS_PKT_TYPE pktType,
v_SIZE_t *vosFreeBuffer);
VOS_STATUS vos_pkt_get_os_packet( vos_pkt_t *pPacket,
v_VOID_t **ppOSPacket,
v_BOOL_t clearOSPacket );
VOS_STATUS vos_pkt_wrap_data_packet( vos_pkt_t **ppPacket,
VOS_PKT_TYPE pktType,
v_VOID_t *pOSPacket,
vos_pkt_get_packet_callback callback,
v_VOID_t *userData );
VOS_STATUS vos_pkt_set_os_packet( vos_pkt_t *pPacket,
v_VOID_t *pOSPacket );
VOS_STATUS vos_pkt_get_timestamp( vos_pkt_t *pPacket,
v_TIME_t* pTstamp );
VOS_STATUS vos_pkt_walk_packet_chain( vos_pkt_t *pPacket,
vos_pkt_t **ppChainedPacket,
v_BOOL_t unchainPacket );
VOS_STATUS vos_pkt_peek_data( vos_pkt_t *pPacket,
v_SIZE_t pktOffset,
v_VOID_t **ppPacketData,
v_SIZE_t numBytes );
VOS_STATUS vos_pkt_get_packet( vos_pkt_t **ppPacket,
VOS_PKT_TYPE pktType,
v_SIZE_t dataSize,
v_SIZE_t numPackets,
v_BOOL_t zeroBuffer,
vos_pkt_get_packet_callback callback,
v_VOID_t *userData );
VOS_STATUS vos_pkt_reserve_head( vos_pkt_t *pPacket,
v_VOID_t **ppData,
v_SIZE_t dataSize );
VOS_STATUS vos_pkt_pop_head( vos_pkt_t *pPacket,
v_VOID_t *pData,
v_SIZE_t dataSize );
VOS_STATUS vos_pkt_push_head( vos_pkt_t *pPacket,
v_VOID_t *pData,
v_SIZE_t dataSize );
v_VOID_t vos_pkt_get_user_data_ptr( vos_pkt_t *pPacket,
VOS_PKT_USER_DATA_ID userID,
v_VOID_t **ppUserData );
v_VOID_t vos_pkt_set_user_data_ptr( vos_pkt_t *pPacket,
VOS_PKT_USER_DATA_ID userID,
v_VOID_t *pUserData );
VOS_STATUS vos_pkt_extract_data( vos_pkt_t *pPacket,
v_SIZE_t pktOffset,
v_VOID_t *pOutputBuffer,
v_SIZE_t *pOutputBufferSize );
#endif // !defined( __VOS_PKT_H )