/*
 * Copyright (c) 2012-2013, 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.
 */
/*
 * 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.
 */

#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 
  
   Copyright 2008 (c) Qualcomm, Incorporated.  All Rights Reserved.
   
   Qualcomm Confidential and Proprietary.
  
  ========================================================================*/

/* $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;


/// data vector
typedef struct
{         
   /// address of data
   v_VOID_t *pData;
   
   /// number of bytes at address
   v_U32_t  numBytes;
   
} vos_pkt_data_vector_t;



/// 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_BAP,
   VOS_PKT_USER_DATA_ID_BSL,

   VOS_PKT_USER_DATA_ID_MAX
   
} VOS_PKT_USER_DATA_ID;

/**------------------------------------------------------------------------
  
  \brief voss asynchronous get_packet callback function

  This is a callback function invoked when vos_pkt_get_packet() cannot
  get the requested packet and the caller specified a callback to be 
  invoked when packets are available. 
  
  \param pPacket - the packet obtained by voss for the caller. 
  
  \param userData - the userData field given on the vos_pkt_get_packet() 
         call
  
  \return
    
  \sa
  
  ------------------------------------------------------------------------*/
typedef VOS_STATUS ( *vos_pkt_get_packet_callback )( vos_pkt_t *pPacket, 
                                                     v_VOID_t *userData );

/*
 * include the OS-specific packet abstraction
 * we include it here since the abstraction probably needs to access the
 * generic types defined above
 */
#include "i_vos_packet.h"

/*------------------------------------------------------------------------- 
  Function declarations and documenation
  ------------------------------------------------------------------------*/
  
/**--------------------------------------------------------------------------
  
  \brief vos_pkt_get_packet() - Get a voss Packets

  Gets a voss Packets from an internally managed packet pool. 
  
  \param ppPacket - pointer to location where the voss Packet pointer is 
                    returned.  If multiple packets are requested, they 
                    will be chained onto this first packet.  
                    
  \param pktType - the packet type to be retreived.  Valid packet types are:
     <ul>
       <li> VOS_PKT_TYPE_TX_802_11_MGMT - voss packet is for Transmitting 802.11 
            Management frames.
     
       <li> VOS_PKT_TYPE_RX_RAW - voss Packet contains a buffer for Receiving 
            raw frames of unknown type.  
     </ul>
     
  \param dataSize - the Data size needed in the voss Packet.
  
  \param numPackets - the number of packets requested.  
                              
  \param zeroBuffer - parameter that tells the API to zero the data buffer
                      in this voss Packet.  
     <ul>                      
       <li> VOS_TRUE - the API will zero out the entire data buffer.
                                              
       <li> VOS_FALSE - the API will not zero out the data buffer.                                       
     </ul>
                               
  \note If enough room for headers to transmit or receive the packet is not 
        available, this API will fail.
        
  \param callback - This callback function, if provided, is invoked in the 
         case when resources are not available at the time of the call to 
         get packets.  This callback function is invoked when packets are 
         available.  
                    
  \param userData - This user data is passed back to the caller in the 
         callback function, if the callback is invoked.
                        
  \return VOS_STATUS_SUCCESS - the API was able to get a vos_packet for the
          requested type.  *ppPacket contains a pointer to the packet.
          
          VOS_STATUS_E_INVAL - pktType is not a valid packet type.  This 
          API only supports getting vos packets for 802_11_MGMT and 
          RX_RAW packet types.  This status is also returned if the 
          numPackets or dataSize are invalid.
          
          VOS_STATUS_E_RESOURCES - unable to get resources needed to get
          a vos packet.  If a callback function is specified and this 
          status is returned from the API, the callback will be called 
          when resources are available to fulfill the original request.
          
          Note that the low resources condition is indicated to the caller
          by returning VOS_STATUS_E_RESOURCES.  This status is the only 
          non-success status that indicates to the caller that the callback
          will be called when resources are available.  All other status
          indicate failures that are not recoverable and the 'callback' 
          will not be called.

          VOS_STATUS_E_FAILURE - The API returns this status when unable 
          to get a packet from the packet pool because the pool
          is depleted and the caller did not specify a low resource callback.
          
          VOS_STATUS_E_ALREADY - This status is returned when the VOS
          packet pool is in a 'low resource' condition and cannot 
          accomodate any more calls to retrieve packets from that 
          pool.   Note this is a FAILURE and the 'low resource' callback
          will *not* be called.
          
          VOS_STATUS_E_FAULT - ppPacket does not specify a valid pointer.          
    
  \sa
  
  ------------------------------------------------------------------------*/  
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 );
                               

/**--------------------------------------------------------------------------
  
  \brief vos_pkt_wrap_data_packets() - Wrap an OS provided data packet in a
         vos packet.

  Takes as input an OS provided data packet and 'wraps' that packet in a 
  vos_packet, returning the vos_packet to the caller.  
  
  This function is intended to be called from the HDD to wrap Tx data packets
  from the OS into vos_packets before sending them to TL for transmission.
    
  \param ppPacket - pointer to location where the voss Packet pointer is 
                    returned.  If multiple packets are requested, they 
                    will be chained onto this first packet.  
                    
  \param pktType - the packet type to be retreived.  Valid packet types are:
     <ul>
       <li> VOS_PKT_TYPE_802_3_DATA - voss packet is for Transmitting 802.3 
            data frames.
     
       <li> VOS_PKT_TYPE_802_11_DATA - voss Packet is for Transmitting 802.11
            data frames.  
     </ul>
     
  \param pOSPacket - a pointer to the Transmit packet provided by the OS.  This
         OS provided packet will be wrapped into a vos_packet_t.  Note this 
         OS packet pointer can be NULL.  The OS packet pointer can be inserted
         into a VOS packet of type VOS_PKT_TYPE_802_3_DATA or 
         VOS_PKT_TYPE_802_11_DATA through vos_pkt_set_os_packet().
                               
  \note If enough room for headers to transmit or receive the packet is not 
        available, this API will fail.
        
  \param callback - This callback function, if provided, is invoked in the 
         case where packets are not available at the time of the call to 
         return the packets to the caller (a 'low resource' condition).
         
         When packets become available, the callback callback function is
         invoked to return a VOS packet to the caller.  Note that the 
         OS Packet is *not* inserted into the VOS packet when it is returned
         to the low resource callback.  It is up to the caller to insert
         the OS packet into the VOS packet by calling vos_pkt_set_os_packet()
                    
  \param userData - This user data is passed back to the caller in the 
         callback function, if the callback is invoked.
                        
  \return VOS_STATUS_SUCCESS - the API was able to get a vos_packet for the
          requested type.  *ppPacket contains a pointer to the packet.
          
          VOS_STATUS_E_INVAL - pktType is not a valid packet type.  This 
          API only supports getting vos packets for 802_11_MGMT and 
          RX_RAW packet types.            
          
          VOS_STATUS_E_RESOURCES - unable to get resources needed to get
          a vos packet.  If a callback function is specified and this 
          status is returned from the API, the callback will be called 
          when resources are available to fulfill the original request.
          
          Note that the low resources condition is indicated to the caller
          by returning VOS_STATUS_E_RESOURCES.  This status is the only 
          non-success status that indicates to the caller that the callback
          will be called when resources are available.  All other status
          indicate failures that are not recoverable and the 'callback' 
          will not be called.          
          
          VOS_STATUS_E_FAILURE - The API returns this status when unable 
          to get a packet from the packet pool because the pool
          is depleted and the caller did not specify a low resource callback.
          
          VOS_STATUS_E_ALREADY - This status is returned when the VOS
          packet pool is in a 'low resource' condition and cannot 
          accomodate any more calls to retrieve packets from that 
          pool.   Note this is a FAILURE and the 'low resource' callback
          will *not* be called.
          
          VOS_STATUS_E_FAULT - ppPacket or pOSPacket do not specify valid
          pointers.          
    
  \sa vos_pkt_set_os_packet()
  
  ------------------------------------------------------------------------*/  
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 );


/*---------------------------------------------------------------------------
  
  \brief vos_pkt_set_os_packet() - set the OS packet in a VOS data packet

  This API inserts an OS packet into a previously retreived VOS packet.
  This API only applies to VOS packets of type VOS_PKT_TYPE_802_3_DATA or
  VOS_PKT_TYPE_802_11_DATA.  
  
  There are cases where a user will need to get a VOS data packet without 
  having the OS packet to insert/wrap into the data packet. This could happen
  if the user calls vos_pkt_wrap_data_packet() without the OS packet.  
  
  Also, when the user hit a 'low resource' situation for data packets, the 
  low resource callback is going to return a VOS packet without an OS packet
  attached to it.  The caller who gets the packet through the low resource
  callback uses this API to insert an OS packet into the VOS packet that 
  was returned through the low resource callback.
  
  \param pPacket - the voss Packet to insert the OS packet into.
         
  \param pOSPacket - a pointer to the Transmit packet provided by the OS.  This
         OS provided packet will be wrapped into a vos_packet_t.  Note this 
         OS packet pointer can be NULL.  The OS packet pointer can be inserted
         into a VOS packet of type VOS_PKT_TYPE_802_3_DATA or 
         VOS_PKT_TYPE_802_11_DATA through vos_pkt_set_os_packet().
         
         Caller beware.  If there is a valid OS packet wrapped into this 
         VOS packet already, this API will blindly overwrite the OS packet
         with the new one specified on this API call.  If you need to determine
         or retreive the current OS packet from a VOS packet, call 
         vos_pkt_get_os_packet() first.
  
  \return VOS_STATUS_SUCCESS - the API was able to insert the OS packet into
          the vos_packet.  
                    
          VOS_STATUS_E_INVAL - pktType is not a valid packet type.  This 
          API only supports getting vos packets of type 
          VOS_PKT_TYPE_802_3_DATA or VOS_PKT_TYPE_802_11_DATA.            
          
          VOS_STATUS_E_FAULT - pPacket does not specify a valid pointer.          
    
  \sa vos_pkt_get_os_packet()
  
  ----------------------------------------------------------------------------*/
VOS_STATUS vos_pkt_set_os_packet( vos_pkt_t *pPacket, v_VOID_t *pOSPacket );



/*---------------------------------------------------------------------------
  
  \brief vos_pkt_get_os_packet() - get the OS packet in a VOS data packet

  This API returns the OS packet that is inserted in a VOS packet.
  This API only applies to VOS packets of type VOS_PKT_TYPE_802_3_DATA or
  VOS_PKT_TYPE_802_11_DATA.  
  
  \param pPacket - the voss Packet to return the OS packet from.
         
  \param ppOSPacket - a pointer to the location where the OS packet pointer 
         retreived from the VOS packet will be returned.  Note this OS packet
         pointer can be NULL, meaning there is no OS packet attached to this
         VOS data packet.
         
  \param clearOSPacket - a boolean value that tells the API to clear out the
         OS packet pointer from the VOS packet.  Setting this to 'true' will
         essentially remove the OS packet from the VOS packet.  'false' means
         the OS packet remains chained to the VOS packet.  In either case, 
         the OS packet pointer is returned to the caller.
         
  \return VOS_STATUS_SUCCESS - the API was able to retreive the OS packet 
          pointer from the VOS packet and return it to the caller in 
          *ppOsPacket  
                    
          VOS_STATUS_E_INVAL - pktType is not a valid packet type.  This 
          API only supports getting vos packets of type 
          VOS_PKT_TYPE_802_3_DATA or VOS_PKT_TYPE_802_11_DATA.            
          
          VOS_STATUS_E_FAULT - pPacket or ppOsPacket does not specify a valid
          pointers.
    
  \sa vos_pkt_set_os_packet(), vos_pkt_wrap_data_packet(), vos_pkt_return_packet()
  
  ----------------------------------------------------------------------------*/
VOS_STATUS vos_pkt_get_os_packet( vos_pkt_t *pPacket, v_VOID_t **ppOSPacket, 
                                  v_BOOL_t clearOSPacket );


/**--------------------------------------------------------------------------
  
  \brief vos_pkt_get_user_data_ptr() - return a pointer to user data area
                                       of a voss Packet

  This API returns a pointer to a specified user Data area in the voss 
  Packet.  User data areas are uniqua areas of the voss Packet that can 
  be used by specific components to store private data.  These areas are 
  identified by a user "ID" and should only be accessed by the component
  specified.
  
  \param pPacket - the voss Packet to retreive the user data pointer from.
  
  \param userID - the identifier for the user data area in the voss Packet
                  to get.
                  
                  User IDs and user data areas in the voss Packet are 
                  available for:
                  - Transport Layer (TL)
                  - Bus Abstraction Layer (BAL)
                  - SDIO Services Component (SSC)
                  - Host Device Driver (HDD)
                  
  \param ppUserData - pointer to location to return the pointer to the user 
                      data.
  
  \return - Nothing.
    
  \sa
  
  ----------------------------------------------------------------------------*/
v_VOID_t vos_pkt_get_user_data_ptr( vos_pkt_t *pPacket, VOS_PKT_USER_DATA_ID userID,
                                    v_VOID_t **ppUserData );


/**--------------------------------------------------------------------------
  
  \brief vos_pkt_set_user_data_ptr() - set the user data pointer of a voss
                                        Packet

  This API sets a pointer in the specified user Data area in the voss 
  Packet.  User data areas are uniqua areas of the voss Packet that can 
  be used by specific components to store private data.  These areas are 
  identified by a user "ID" and should only be accessed by the component
  specified.
  
  Note:  The size of the user data areas in the voss Packet are fixed.  The
         size of a single pointer is available in each user area.
  
  \param pPacket - the voss Packet to set the user pointer.
  
  \param userID - the identifier for the user data area in the voss Packet
                  to set.
                  
                  User IDs and user data areas in the voss Packet are 
                  available for:
                  - Transport Layer (TL)
                  - Bus Abstraction Layer (BAL)
                  - SDIO Services Component (SSC)
                  - Host Device Driver (HDD)
                  
  \param pUserData - pointer value to set in the user data area of the voss 
                     packet..
  
  \return - Nothing.
    
  \sa
  
  ----------------------------------------------------------------------------*/
v_VOID_t vos_pkt_set_user_data_ptr( vos_pkt_t *pPacket, VOS_PKT_USER_DATA_ID userID,
                                    v_VOID_t *pUserData );

/**--------------------------------------------------------------------------
  
  \brief vos_pkt_return_packet() - Return a voss Packet (chain) to vOSS

  This API returns a voss Packet to the internally managed packet pool.  
  
  Note:  If there are multiple packets chained to this packet, the entire 
  packet chain is returned to vOSS.  The caller must unchain the 
  packets throgh vos_pkt_get_next_packet() and return them individually 
  if all packets in the packet chain are not to be returned.
  
  \param pPacket - the voss Packet(s) to return.  Note all packets chained
                   to this packet are returned to vOSS.
  
  \return
    
  \sa
  
  ----------------------------------------------------------------------------*/
VOS_STATUS vos_pkt_return_packet( vos_pkt_t *pPacket );


/**--------------------------------------------------------------------------
  
  \brief vos_pkt_chain_packet() - chain a voss Packet to another packet 

  This API chains a voss Packet to another voss Packet, creating a packet
  chain.  Packets can be chained before or after the current packet in the
  packet chain.
  
  \param pPacket - pointer to a voss packet to chain to 
  
  \param pChainPacket - pointer to packet to chain
  
  \param chainAfter - boolean to specify to chain packet after or before 
                      the input packet
  <ul>                       
    <li> true - chain packet AFTER pPacket (chain behind)
    <li> false - chain packet BEFORE pPacket (chain in front)  
  </ul>
    
  \return
    
  \sa
  
  ----------------------------------------------------------------------------*/
VOS_STATUS vos_pkt_chain_packet( vos_pkt_t *pPacket, vos_pkt_t *pChainPacket, 
                                 v_BOOL_t chainAfter );


/**--------------------------------------------------------------------------
  
  \brief vos_pkt_walk_packet_chain() - Walk packet chain and (possibly) 
                                        unchain packets

  This API will walk the voss Packet and unchain the packet from the chain, 
  if specified.  The 'next' packet in the packet chain is returned as the 
  packet chain is traversed. 
  
  \param  pPacket - input vos_packet walk 
  
  \param ppChainedPacket - pointer to location to return the 'next' voss 
                           packet pointer in the packet chain.  
                           NULL means there is was not packet chained
                           to this packet.
                           
  \param unchainPacket - Flag that specifies if the caller wants the packet
                         to be removed from the packet chain.  This is 
                         provided to allow the caller to walk the packet chain
                         with or without breaking the chain.  
                         
    <ul>
      <li> true - when set 'true' the API will return 
                  the 'next' packet pointer in the voss Packte chain and 
                  *WILL* unchain the input packet from the packet chain.
                    
      <li> NOT false - when set 'false' the API will return 
                       the 'next' packet pointer in the voss Packet chain but
                       *WILL NOT* unchain the packet chain.   This option gives
                       the caller the ability to walk the packet chain without 
                       modifying it in the process.
    </ul>
                    
  \note Having the packets chained has an implicaiton on how the return
        packet API (vos_pkt_return_packet() ) operates.                     
                      
  \return
    
  \sa
  
  ----------------------------------------------------------------------------*/
VOS_STATUS vos_pkt_walk_packet_chain( vos_pkt_t *pPacket, vos_pkt_t **ppChainedPacket,
                                      v_BOOL_t unchainPacket );


/**--------------------------------------------------------------------------
  
  \brief vos_pkt_get_data_vector() - Get data vectors from a voss Packet

  This API gets the complete set of Vectors (pointer / length pairs) that 
  describe all of the data that makes up the voss Packet.

  \param pPacket - pointer to the vOSS Packet to get the pointer/length 
                   vector from
                   
  \param pVector - pointer to the vector array where the vectors are returned.
  
  \param pNumVectors - Number of vector's in the vector array (at pVector).  
                       On successful return, *pNumVectors is updated with the 
                       number of pointer/length vectors at pVector populated 
                       with valid vectors.
  
  Call with NULL pVector or 0 vectorSize, will return the size of vector 
  needed (in *pNumVectors)
  
  Caller allocates and frees the vector memory.
  
  \return
    
  \sa
  
  ----------------------------------------------------------------------------*/
VOS_STATUS vos_pkt_get_data_vector( vos_pkt_t *pPacket, vos_pkt_data_vector_t *pVector, 
                                    v_SIZE_t *pNumVectors );


/**--------------------------------------------------------------------------
  
  \brief vos_pkt_extract_data() - Extract data from the voss Packet.

  This API extracts data from a voss Packet, copying the data into the 
  supplied output buffer.  Note the data is copied from the vos packet
  but the data remains in the vos packet and the size is unaffected.
  
  \param pPacket - the voss Packet to get the data from.
  
  \param pktOffset - the offset from the start of the voss Packet to get the 
         data.  (i.e. 0 would be the beginning of the voss Packet).
         
  \param pOutputBuffer - Pointer to the location where the voss Packet data
         will be copied.
  
  \param pOutputBufferSize - on input, contains the amount of data to extract
         into the output buffer.  Upon return, contains the amount of data
         extracted into the output buffer.   
                             
         Note:  an input of 0 in *pOutputBufferSize, means to copy *all* 
         data in the voss Packet into the output buffer.  The caller is 
         responsible for assuring the output buffer size is big enough
         since the size of the buffer is not being passed in!
                             
  \return
    
  \sa
  
  ----------------------------------------------------------------------------*/
VOS_STATUS vos_pkt_extract_data( vos_pkt_t *pPacket, v_SIZE_t pktOffset, 
                                 v_VOID_t *pOutputBuffer, v_SIZE_t *pOutputBufferSize );


/**--------------------------------------------------------------------------
  
  \brief vos_pkt_extract_data_chain() - Extract data from a voss Packet chain.

  This API extracts *all* the data from a voss Packet chain, copying the 
  data into the supplied output buffer.  Note the data is copied from 
  the vos packet chain but the data remains in the vos packet and the 
  size of the vos packets are unaffected.
  
  \param pPacket - the first voss Packet in the voss packet chain to 
         extract data.
           
  \param pOutputBuffer - Pointer to the location where the voss Packet data
         will be copied.
  
  \param pOutputBufferSize - on input, contains the maximum amount of data 
         that can be extracted into the output buffer.  Upon return, contains
         the amount of data extracted from the packet chain.   
                             
  \return VOS_STATUS_SUCCESS - the data from the entire packet chain is 
          extracted and found at *pOutputBuffer.  *pOutputBufferSize bytes
          were extracted.
          
          VOS_STATUS_E_FAULT - pPacket, pOutputBuffer, or pOutputBufferSize
          is not a valid pointer.
          
          VOS_STATUS_E_NOMEM - there is not enough room to extract the data
          from the entire packet chain. *pOutputBufferSize has been updated 
          with the size needed to extract the entier packet chain.          
    
  \sa vos_pkt_extract_data()
  
  ----------------------------------------------------------------------------*/
VOS_STATUS vos_pkt_extract_data_chain( vos_pkt_t *pPacket, v_VOID_t *pOutputBuffer, 
                                       v_SIZE_t *pOutputBufferSize );



/**--------------------------------------------------------------------------
  
  \brief vos_pkt_peek_data() - peek into voss Packet at given offset 

  This API provides a pointer to a specified offset into a voss Packet, 
  allowing the caller to peek at a given number of bytes in the voss Packet.  
  Upon successful return, the caller can access "numBytes" of data at 
  "pPacketData".  
  
  This API will fail if the data length requested to peek at is not in  
  contiguous memory in the voss Packet.  In this case, the caller should 
  use vos_pkt_extract_data() to have the data copied into a caller supplied
  buffer.
  
  \param pPacket - the vOSS Packet to peek into
  
  \param pktOffset - the offset into the voss Packet data to peek into.
  
  \param ppPacketData - pointer to the location where the pointer to the
                        packet data at pktOffset will be returned.
                        
  \param numBytes - the number of bytes the caller wishes to peek at.                          
  
  \return
    
  \sa
  
  ----------------------------------------------------------------------------*/
VOS_STATUS vos_pkt_peek_data( vos_pkt_t *pPacket, v_SIZE_t pktOffset,
                              v_VOID_t **ppPacketData, v_SIZE_t numBytes );
                        
                        
/**--------------------------------------------------------------------------
  
  \brief vos_pkt_get_packet_type() - Get packet type for a voss Packet 

  This API returns the packet Type for a voss Packet. 
  
  \param pPacket - the voss Packet to get the packet type from.
  
  \param pPacketType - location to return the packet type for the voss Packet
  
  \return
    
  \sa
  
  ----------------------------------------------------------------------------*/
VOS_STATUS vos_pkt_get_packet_type( vos_pkt_t *pPacket, VOS_PKT_TYPE *pPacketType );


/**--------------------------------------------------------------------------
  
  \brief vos_pkt_get_packet_length() - Get packet length for a voss Packet 

  This API returns the total length of the data in a voss Packet. 
  
  \param pPacket - the voss Packet to get the packet length from.
  
  \param pPacketSize - location to return the total size of the data contained
                       in the voss Packet.  
  \return
    
  \sa
  
  ----------------------------------------------------------------------------*/
VOS_STATUS vos_pkt_get_packet_length( vos_pkt_t *pPacket, v_U16_t *pPacketSize );


/**--------------------------------------------------------------------------
  
  \brief vos_pkt_get_packet_chain_length() - Get length of a vos packet chain 

  This API returns the total length of the data in a voss Packet chain.
  
  \param pPacket - the voss Packet at the start of the packet chain.  This API
         will calculate the length of data in the packet chain stating with 
         this packet.
  
  \param pPacketSize - location to return the total size of the data contained
                       in the voss Packet.  
  \return
    
  \sa
  
  ----------------------------------------------------------------------------*/
VOS_STATUS vos_pkt_get_packet_chain_length( vos_pkt_t *pPacketChain, v_SIZE_t *pPacketChainSize );




/**--------------------------------------------------------------------------
  
  \brief vos_pkt_push_head() - push data on the front a of a voss Packet 

  This API will push data onto the front of a voss Packet.  The data will be 
  appended in front of any data already contained in the voss Packet.
  
  \param pPacket - the voss Packet to modify.
  
  \param pData - pointer to the data to push onto the head of the voss Packet.
  
  \param dataSize - the size of the data to put onto the head of the voss Packet.  
  
  \return
    
  \sa
  
  ----------------------------------------------------------------------------*/ 
VOS_STATUS vos_pkt_push_head( vos_pkt_t *pPacket, v_VOID_t *pData, v_SIZE_t dataSize );


/**--------------------------------------------------------------------------
  
  \brief vos_pkt_reserve_head() - Reserve space at the front of a voss Packet 

  This API will reserve space at the front of a voss Packet.  The caller can 
  then copy data into this reserved space using memcpy() like functions.  This 
  allows the caller to reserve space and build headers directly in this
  reserved space in the voss Packet.
  
  Upon successful return, the length of the voss Packet is increased by 
  dataSize.
  
  < put a before / after picture here> 
  
  \param pPacket - the voss Packet to modify.
  
  \param ppData - pointer to the location where the pointer to the reserved 
                  space is returned.  Upon successful return, the caller has 
                  write / read access to the data space at *ppData for length
                  dataSize to build headers, etc.
  
  \param dataSize - the size of the data to reserve at the head of the voss 
                    Packet.  Upon successful return, the length of the voss
                    Packet is increased by dataSize. 
  
  \return
    
  \sa
  
  ----------------------------------------------------------------------------*/ 
VOS_STATUS vos_pkt_reserve_head( vos_pkt_t *pPacket, v_VOID_t **ppData, 
                                 v_SIZE_t dataSize );

/**--------------------------------------------------------------------------
  
  \brief vos_pkt_reserve_head_fast()- Reserve space at the front of a voss Pkt 

  This API will reserve space at the front of a voss Packet.  The caller can 
  then copy data into this reserved space using memcpy() like functions.  This 
  allows the caller to reserve space and build headers directly in this
  reserved space in the voss Packet.
  
  Upon successful return, the length of the voss Packet is increased by 
  dataSize.
 
  Same as above API but no memset to 0.
 
  < put a before / after picture here> 
  
  \param pPacket - the voss Packet to modify.
  
  \param ppData - pointer to the location where the pointer to the reserved 
                  space is returned.  Upon successful return, the caller has 
                  write / read access to the data space at *ppData for length
                  dataSize to build headers, etc.
  
  \param dataSize - the size of the data to reserve at the head of the voss 
                    Packet.  Upon successful return, the length of the voss
                    Packet is increased by dataSize. 
  
  \return
    
  \sa
  
  ----------------------------------------------------------------------------*/ 
VOS_STATUS vos_pkt_reserve_head_fast( vos_pkt_t *pPacket,
                                 v_VOID_t **ppData,
                                 v_SIZE_t dataSize );

/**--------------------------------------------------------------------------
  
  \brief vos_pkt_pop_head() - Remove data from the front of the voss Packet 

  This API removes data from the front of a voss Packet.  The data is 
  copied into the output buffer described by pData and pDataSize
  
  \param pPacket - the voss Packet to operate on.
  
  \param pData - pointer to the data buffer where the data removed from the 
                 voss Packet is placed.
                 
  \param dataSize - The amount of space to remove from the head of the voss
                    Packet.  The output buffer (at *pData) must contain at
                    least this amount of space.
  
  \return
    
  \sa
  
  ----------------------------------------------------------------------------*/
VOS_STATUS vos_pkt_pop_head( vos_pkt_t *pPacket, v_VOID_t *pData, v_SIZE_t dataSize );


/**--------------------------------------------------------------------------
  
  \brief vos_pkt_trim_head() - Skip over bytes at the front of a voss Packet 

  This API moves the pointers at the head of a voss Packet to essentially 
  skip over data at the front of a voss Packet.  Upon successful return, the
  length of the voss Packet is reduced by dataSize and the starting pointer 
  to the voss Packet is adjusted to eliminate the data from the start of the
  voss Packet.  
  
  This API has the opposite effect of \a vos_pkt_reserve_head().
  
  \param pPacket - the voss Packet to operate on.
  
  \param dataSize - The amount of space to skip at the start of the voss
                    Packet.
                    
                    Note that upon return, the data skipped over is 
                    inaccessible to the caller.  If the caller needs access
                    to the head data, use vos_pkt_pop_head() or 
                    vos_pkt_extract_data() to get a copy of the data.
  
  \return
    
  \sa
  
  ----------------------------------------------------------------------------*/
VOS_STATUS vos_pkt_trim_head( vos_pkt_t *pPacket, v_SIZE_t dataSize );


/**--------------------------------------------------------------------------
  
  \brief vos_pkt_push_tail() - push data on the end a of a voss Packet 

  This API will push data onto the end of a voss Packet.  The data will be 
  appended to the end of any data already contained in the voss Packet.
    
  \param pPacket - the voss Packet to modify.
  
  \param pData - pointer to the data to push onto the tail of the voss Packet.
  
  \param dataSize - the size of the data to put onto the tail of the voss Packet.  
  
  \return
    
  \sa
  
  ----------------------------------------------------------------------------*/ 
VOS_STATUS vos_pkt_push_tail( vos_pkt_t *pPacket, v_VOID_t *pData, v_SIZE_t dataSize );


/**--------------------------------------------------------------------------
  
  \brief vos_pkt_reserve_tail() - Reserve space at the end of a voss Packet 

  This API will reserve space at the end of a voss Packet.  The caller can 
  then copy data into this reserved space using memcpy() like functions.  This 
  allows the caller to reserve space and build headers directly in this
  reserved space in the voss Packet.
  
  Upon successful return, the length of the voss Packet is increased by 
  dataSize.
  
  \param pPacket - the voss Packet to modify.
  
  \param ppData - pointer to the location where the pointer to the reserved 
                  space is returned.  Upon successful return, the caller has 
                  write / read access to the data space at *ppData for length
                  dataSize to build headers, etc.
  
  \param dataSize - the size of the data to reserve at the head of the voss 
                    Packet.  Upon successful return, the length of the voss
                    Packet is increased by dataSize. 
  
  \return
    
  \sa
  
  ----------------------------------------------------------------------------*/
VOS_STATUS vos_pkt_reserve_tail( vos_pkt_t *pPacket, v_VOID_t **ppData, 
                                 v_SIZE_t dataSize );


/**--------------------------------------------------------------------------
  
  \brief vos_pkt_pop_tail() - Remove data from the end of the voss Packet 

  This API removes data from the end of a voss Packet.  The data is 
  copied into the output buffer described by pData and pDataSize
  
  \param pPacket - the voss Packet to operate on.
  
  \param pData - pointer to the data buffer where the data removed from the 
                 voss Packet is placed.
                 
  \param dataSize - The amount of space to remove from the end of the voss
                    Packet.  The output buffer (at *pData) must contain at
                    least this amount of space.
  
  \return
    
  \sa
  
  ----------------------------------------------------------------------------*/
VOS_STATUS vos_pkt_pop_tail( vos_pkt_t *pPacket, v_VOID_t *pData, v_SIZE_t dataSize );


/**--------------------------------------------------------------------------
  
  \brief vos_pkt_trim_tail() - Skip over bytes at the end of a voss Packet 

  This API moves the pointers at the head of a voss Packet to essentially 
  skip over data at the end of a voss Packet.  Upon successful return, the
  length of the voss Packet is reduced by dataSize and voss Packet is 
  adjusted to eliminate the data from the end of the voss Packet.  
  
  This API has the opposite effect of \a vos_pkt_reserve_tail().
  
  \param pPacket - the voss Packet to operate on.
  
  \param dataSize - The amount of space to remove at the end of the voss
                    Packet.
                    
                    Note that upon return, the data skipped over is 
                    inaccessible to the caller.  If the caller needs access
                    to the tail data, use vos_pkt_pop_tail() or 
                    vos_pkt_extract_data() to get a copy of the data.
  
  \return
    
  \sa
  
  ----------------------------------------------------------------------------*/
VOS_STATUS vos_pkt_trim_tail( vos_pkt_t *pPacket, v_SIZE_t dataSize );

/**--------------------------------------------------------------------------
  
  \brief vos_pkt_get_timestamp() - Retrive the timestamp attribute from the
  specified VOSS packet

  \param pPacket - the voss Packet to operate on. 

  \param pTstamp - the timestamp will be returned here. 
  
  \return VOS_STATUS_E_FAULT - invalid parameter(s) specified

          VOS_STATUS_SUCCESS - timestamp retrived successfully
    
  \sa
  
  ----------------------------------------------------------------------------*/
VOS_STATUS vos_pkt_get_timestamp( vos_pkt_t *pPacket, v_TIME_t* pTstamp );

/**--------------------------------------------------------------------------
  
  \brief vos_pkt_flatten_rx_pkt() - Transform a platform based RX VOSS
  packet into a flat buffer based VOSS packet if needed. This is needed in cases 
  where for reasons of efficiency we want the RX packets to be very platform specific
  (for e.g. DSM based on AMSS, etc). However platform independent code may rely
  on making calls on the VOSS packet which can only be supported by the flat buffer
  based implementation of a RX packet. This API will allocate a new VOSS packet 
  with flat buffer, extract the data from the input VOSS packet and then release 
  the input VOSS packet. The new VOSS packet will be returned from this call.
 
  \param ppPacket - the voss Packet to operate on. on input contains
                    the platform based packet. On output contains the flat
                    buffer based packet. Any applicable resources
                    are freed as part of this call.
  
  \return VOS_STATUS_E_FAULT - invalid parameter specified

          VOS_STATUS_E_INVAL - packet type not RX_RAW 

          VOS_STATUS_SUCCESS - transform successful

          other VOSS status - other errors encountered
    
  \sa
  
  ----------------------------------------------------------------------------*/
VOS_STATUS vos_pkt_flatten_rx_pkt( vos_pkt_t **ppPacket );

/**--------------------------------------------------------------------------
  
  \brief vos_pkt_set_rx_length() - Set the length of a received packet 

  This API set the length of the data inside the packet after a DMA has occurred
  on rx, it will also set the tail pointer to the end of the data.

  \param pPacket - the voss Packet to operate on.

  \param pktLen - The size of the data placed in the Rx packet during DMA.


  \return

  \sa

  ---------------------------------------------------------------------------*/
VOS_STATUS vos_pkt_set_rx_length( vos_pkt_t *pPacket, v_SIZE_t pktLen );

/**--------------------------------------------------------------------------
  
  \brief vos_pkt_get_available_buffer_pool() - Get avaliable VOS packet size
   VOSS Packet pool is limitted resource
   VOSS Client need to know how many packet pool is still avaliable to control the flow
   
  \param  pktType - Packet type want to know free buffer count
                    VOS_PKT_TYPE_TX_802_11_MGMT, management free buffer count,
                    VOS_PKT_TYPE_TX_802_11_DATA
                    VOS_PKT_TYPE_TX_802_3_DATA, TX free buffer count
                    VOS_PKT_TYPE_RX_RAW, RX free buffer count

          vosFreeBuffer - free frame buffer size
  
  \return VOS_STATUS_E_INVAL - invalid input parameter

          VOS_STATUS_SUCCESS - Get size success
    
  \sa
  
  ----------------------------------------------------------------------------*/
VOS_STATUS vos_pkt_get_available_buffer_pool
(
   VOS_PKT_TYPE  pktType,
   v_SIZE_t     *vosFreeBuffer
);

#endif  // !defined( __VOS_PKT_H )
