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

/*
 *
 * Author:      Sandesh Goel

 * Date:        02/25/02

 * History:-

 * Date            Modified by    Modification Information

 * --------------------------------------------------------------------

 *

 */


#ifndef __DPH_GLOBAL_H__

#define __DPH_GLOBAL_H__


#include "limGlobal.h"

//#include "parserApi.h"

#include "sirMacProtDef.h"

#include "sirMacPropExts.h"

#include "sirApi.h"


/// Following determines whether statistics are maintained or not

#define DPH_STATS


/// traffic category not allowed

#define DPH_TID_NOTALLOWED           0xFF


/// Periodicity of invocation of rate adaptation (in ms)

#define DPH_RATE_ADAPTATION_PERIOD     20


// Rate indices

#define DPH_PHY_RATE_1_INDEX     0

#define DPH_PHY_RATE_2_INDEX     1

#define DPH_PHY_RATE_5_5_INDEX   2

#define DPH_PHY_RATE_11_INDEX    3

#define DPH_PHY_RATE_6_INDEX     4

#define DPH_PHY_RATE_9_INDEX     5

#define DPH_PHY_RATE_12_INDEX    6

#define DPH_PHY_RATE_18_INDEX    7

#define DPH_PHY_RATE_24_INDEX    8

#define DPH_PHY_RATE_36_INDEX    9

#define DPH_PHY_RATE_48_INDEX   10

#define DPH_PHY_RATE_54_INDEX   11

#define DPH_PHY_RATE_72_INDEX   12

#define DPH_PHY_RATE_96_INDEX   13

#define DPH_PHY_RATE_108_INDEX  14

#define DPH_PHY_RATE_144_INDEX  15

#define DPH_PHY_RATE_MAX_INDEX  16


/// Maximum time to wait for a management packet to go out (ms)

#define DPH_MAX_MGMT_WAIT_TIME  10000


/// Step size for the wait time histogram (ms)

#define DPH_WAIT_HIST_STEP 20


/// Number of entries in wait time histogram

#define DPH_WAIT_HIST_SIZE  100


/// TCID for Management & Keep Alive Mgmt frames

#define DPH_MGMT_TCID                      4

#define DPH_KEEPALIVE_PROBE_RESPONSE_TCID  0


/// STAID for Management frames

#define DPH_USE_MGMT_STAID  -1


// Keep Alive frames

#define DPH_NON_KEEPALIVE_FRAME  0

#define DPH_KEEPALIVE_FRAME      1


/// Mask for subtype, type, protocol version, order and wep fields in the mac frame control

#define DPH_FC_BD_FILL_MASK  0xFFCC


/// Enable/Disable Txop generation in TFP for HCF mode

#define DPH_ENABLE_HCF_TXOP_GEN_AT_TFP   0x00

#define DPH_DISABLE_HCF_TXOP_GEN_AT_TFP  0x02


/// Enable/Disable Txop generation in TFP for EDCF mode

#define DPH_ENABLE_EDCF_TXOP_GEN_AT_TFP   0x00

#define DPH_DISABLE_EDCF_TXOP_GEN_AT_TFP  0x01


#define DPH_DUMP_ALL_STA_ID     -1

#define DPH_DUMP_RX_BD           0

#define DPH_DUMP_TX_BD           1

#define DPH_DUMP_TX_MGMT_BD      2


//DPH Hash Index for BSS(STA's Peer) on station.

#define DPH_STA_HASH_INDEX_PEER   1


#ifdef WLAN_FEATURE_11W
//DPH PMF SA Query state for station

#define DPH_SA_QUERY_NOT_IN_PROGRESS      1

#define DPH_SA_QUERY_IN_PROGRESS          2

#define DPH_SA_QUERY_TIMED_OUT            3
#endif


typedef struct sDphRateBasedCtr

{

    tANI_U32 hi;

    tANI_U32 lo;

} tDphRateBasedCtr;


typedef struct sDphPhyRates

{

    tANI_U8 dataRateX2;

    tANI_U8 ackRateX2;

    tANI_U8 rtsRateX2;

} tDphPhyRates;


typedef struct sDphIFSValues

{

    tANI_U8 sifs;

    tANI_U8 pifs;

    tANI_U8 difs;

    tANI_U8 preamble;

} tDphIFSValues;


typedef struct sDphQosParams

{

    tANI_U8                   addtsPresent;

    tSirAddtsReqInfo       addts;

    tSirMacQosCapabilityStaIE capability;

} tDphQosParams;


/// Queue attribute structure

typedef struct sDphQueueAttr

{

    tANI_U16     valid : 1;

    tANI_U16     seqNum : 12;

    tANI_U16     ackPolicy : 2;

    tANI_U16     rsvd : 1;

} tDphQueueAttr, *tpDphQueueAttr;



typedef struct sCfgTrafficClass {

    //Use Block ACK on this STA/TID

    // Fields used to store the default TC parameters for this TSPEC.

    // They will be used when the TSPEC is deleted.

    tANI_U8 fDisableTx:1;

    tANI_U8 fDisableRx:1;

    tANI_U8 fUseBATx:1;

    tANI_U8 fUseBARx:1;


    // 1: expect to see frames with compressed BA coming from this peer MAC

    tANI_U8 fRxCompBA:1;

    tANI_U8 fTxCompBA:1;


    // immediate ACK or delayed ACK for frames from this peer MAC

    tANI_U8 fRxBApolicy:1;


    // immediate ACK or delayed ACK for frames to this peer MAC

    tANI_U8 fTxBApolicy:1;


    //Initiator or recipient

    tANI_U8 role;


    //Max # of MSDU received from this STA, negotiated at ADDBA

    // used for maintaining block ack state info

    tANI_U16 rxBufSize;


    //Max # of MSDU send to this STA, negotiated at ADDBA

    tANI_U16 txBufSize;


    //BA timeout negotiated at ADDBA. Unit: TU

    tANI_U16 tuTxBAWaitTimeout; //Time for Tx to wait for BA. 0 means no timeout


    tANI_U16 tuRxBAWaitTimeout; //Time for Rx to wait for explicit/implicit BAR. 0 means no timeout


} tCfgTrafficClass;


/**
 * struct parsed_ies: Parsed IE's of BSS capability
 * @ht_caps: HT caps IE
 * @vht_caps: VHT caps IE
 * @ht_operation: HT operation IE
 * @vht_operation: VHT operation IE
 * @hs20vendor_ie: HS2.0 vendor IE
 *
 * This structure holds the parsed IE of connected BSS
 * and this is not the intersection of BSS and STA
 * capability. For example, if BSS supports 80 MHz
 * and STA connects to BSS in 20 MHz, this structure
 * holds 80 MHz as peer capability.
 */
struct parsed_ies {
    tDot11fIEHTCaps ht_caps;
    tDot11fIEVHTCaps vht_caps;
    tDot11fIEHTInfo ht_operation;
    tDot11fIEVHTOperation vht_operation;
    tDot11fIEhs20vendor_ie hs20vendor_ie;
};

/// STA state node

typedef struct sDphHashNode

{


    //BYTE 0

    // HASH ENTRY FIELDS NOT NEEDED IN HAL.

    /// This STA valid or not

    tANI_U8   valid : 1;

    tANI_U8   encPolicy : 3;

    tANI_U8   defaultKey : 1;

    tANI_U8   defaultKeyId : 2;

    tANI_U8   qosMode : 1;


    //BYTE 1

    tANI_U8   erpEnabled : 1;

    tANI_U8   added : 1; // This has been added to the dph hash table

    tANI_U8   linkTestOn : 1;

    tANI_U8   shortPreambleEnabled : 1;

    tANI_U8   shortSlotTimeEnabled : 1;

    tANI_U8   stopTx:1;

    tANI_U8   wmeEnabled: 1; // set if both ap and sta are wme capable

    tANI_U8   lleEnabled: 1; // set if both ap and sta are 11e capable


    //BYTE 2

    tANI_U8   wsmEnabled: 1; // set if both ap and sta are wsm capable

    tANI_U8   versionPresent:1; // station gave version info

    tANI_U8   burstEnableForce:1; // allow bursting regardless of qosMode

    tANI_U8   staAuthenticated:1;    

    /// Whether the peer is ANI or not

    tANI_U8  aniPeer:1;

    tANI_U8   titanPeer:1;                // flag to indicate if its a titan peer    

    tANI_U8  fAniCount:1;

    tANI_U8   rmfEnabled:1;


    /// Fragmentation size

    tANI_U16   fragSize;


    /// LIM state

    tLimMlmStaContext mlmStaContext;


    /// Number of Tim to wait if the STA doesn't respond / fetch data

    tANI_U8  timWaitCount;


    /// Number of Successfull MPDU's being sent

    tANI_U32    curTxMpduCnt;

   /// Previous Sequence number of auth packet

    tANI_U16    PrevAuthSeqno;

    /// Previous Sequence number of assoc packet

    tANI_U16    PrevAssocSeqno;

    /// number of consecutive TIMs sent without response

    tANI_U8  numTimSent;


    // qos parameter info

    tDphQosParams  qos;


    // station version info - valid only if versionPresent is set

    tSirMacPropVersion version;

    // station proprietary capability

    tANI_U16                propCapability;


#ifdef PLM_WDS

    tANI_U8  wdsIndex;

    tANI_U8  wdsPeerBeaconSeen;

#endif


   //Taurus capabilities

   tANI_U16 baPolicyFlag;                 //BA Policy for each TID. 


    /*

    * All the legacy and airgo supported rates.

    */

    tSirSupportedRates supportedRates;


    tANI_U8 htGreenfield:1;

    tANI_U8 htShortGI40Mhz:1;

    tANI_U8 htShortGI20Mhz:1;

    // DSSS/CCK at 40 MHz: Enabled 1 or Disabled

    tANI_U8 htDsssCckRate40MHzSupport:1;

    // L-SIG TXOP Protection used only if peer support available

    tANI_U8 htLsigTXOPProtection:1;

    // A-MPDU Density

    // 000 - No restriction

    // 001 - 1/8 usec

    // 010 - 1/4 usec

    // 011 - 1/2 usec

    // 100 - 1 usec

    // 101 - 2 usec

    // 110 - 4 usec

    // 111 - 8 usec

    //

    tANI_U8 htAMpduDensity:3;




    //Set to 0 for 3839 octets

    //Set to 1 for 7935 octets

    tANI_U8 htMaxAmsduLength;




    // MIMO Power Save

    tSirMacHTMIMOPowerSaveState htMIMOPSState;


    //


    // Maximum Rx A-MPDU factor

    tANI_U8 htMaxRxAMpduFactor:2;

    //

    // Recommended Tx Width Set

    // 0 - use 20 MHz channel (control channel)

    // 1 - use 40 Mhz channel

    //

    tANI_U8 htSupportedChannelWidthSet:1;
    tANI_U8 htSecondaryChannelOffset:2;
    tANI_U8 rsvd1:3;


    ///////////////////////////////////////////////////////////////////////

    // DPH HASH ENTRY FIELDS NEEDED IN HAL ONLY

    ///////////////////////////////////////////////////////////////////////

    tANI_U8 dpuSig:4;                       // DPU signiture

    tANI_U8 staSig:4;                       // STA signature

    tANI_U8 staType;


    tANI_U16 bssId;                          // BSSID

    tANI_U16 assocId;                       // Association ID




    //This is the real sta index generated by HAL

    tANI_U16 staIndex;

    tANI_U8    staAddr[6];

    /*The DPU signatures will be sent eventually to TL to help it determine the 

      association to which a packet belongs to*/

    /*Unicast DPU signature*/

    tANI_U8     ucUcastSig;


    /*Broadcast DPU signature*/

    tANI_U8     ucBcastSig;


    //

    // PE needs this info on a per-STA, per-TID basis

    // At any point in time, when this data is sampled,

    // it gives a measure of:

    // a) All the active bA sessions

    // b) And the BA configuration itself

    //

    tCfgTrafficClass tcCfg[STACFG_MAX_TC];


    // Block Ack state

    // This is used between PE and HAL only.

    // can be set to one of the values from the following enum

    /*typedef enum eLimBAState

    {

        eLIM_BA_STATE_IDLE, // we are not waiting for anything from HAL.

        eLIM_BA_STATE_WT_ADD_RSP, //We are waiting for Add rsponse from HAL.

        eLIM_BA_STATE_WT_DEL_RSP //  We are waiting for Del response from HAL.

    } tLimBAState; */




    //BA state bitmap 2 bits per tid

    // BA state for tid i  = (baState >> tid*2) & 0x3

    tANI_U32 baState;

#ifdef WLAN_FEATURE_11AC
    tANI_U8  vhtSupportedChannelWidthSet;
    tANI_U8  vhtBeamFormerCapable;
#endif

#ifdef WLAN_FEATURE_11W
    tANI_U8  pmfSaQueryState;
    tANI_U8  pmfSaQueryRetryCount;
    tANI_U16 pmfSaQueryCurrentTransId;
    tANI_U16 pmfSaQueryStartTransId;
    TX_TIMER pmfSaQueryTimer;
    v_TIME_t last_unprot_deauth_disassoc;
    tANI_U8 proct_deauh_disassoc_cnt;
    v_TIME_t last_assoc_received_time;
#endif

    tANI_U8 htLdpcCapable;
    tANI_U8 vhtLdpcCapable;
    /* key installed for this STA or not in the firmware */
    tANI_U8 isKeyInstalled;
    /* When a station with already an existing dph entry tries to 

     * associate again, the old dph entry will be zeroed out except 

     * for the next pointer. The next pointer must be defined at the  

     * end of the structure.

     */
    tANI_U8 isDisassocDeauthInProgress;
    bool sta_deletion_in_progress;
    struct parsed_ies parsed_ies;
#ifdef SAP_AUTH_OFFLOAD
    tANI_U8 dpuIndex;
    tANI_U8 bcastDpuIndex;
    tANI_U8 bcastMgmtDpuIdx;
    tANI_U8 ucMgmtSig;
#endif
    struct sDphHashNode  *next;


} tDphHashNode, *tpDphHashNode;


#include "dphHashTable.h"


// -------------------------------------------------------------------


// get protection overrides from config variable

// bit0: force cts to self protection for tx to Airgo peers

// bit1: force cts to self protection for tx to non Airgo peers

#define DPH_PROT_OVERRIDE_NONANI_PEER_GET(cfgval)    ((cfgval) & 1)

#define DPH_PROT_OVERRIDE_ANI_PEER_GET(cfgval) (((cfgval) & 2) >> 1)


typedef struct sAniSirDph

{

    /// The hash table object

    dphHashTableClass dphHashTable;

} tAniSirDph, *tpAniSirDph;


#endif




