/*
 * Copyright (c) 2013-2014 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( WLAN_HDD_MIB_h__ )
#define WLAN_HDD_MIB_h__


#include <vos_types.h>

typedef enum
{
    eMib_dot11DesiredBssType_infrastructure = 1,
    eMib_dot11DesiredBssType_independent = 2,
    eMib_dot11DesiredBssType_infra_ap =3,
    eMib_dot11DesiredBssType_any = 4

} eMib_dot11DesiredBssType;


/** This is the maximum number of BSSIDs supported in the
      dot11DesiredBssidList.  All the code operates off of
      this maximum BSSID list count.  */
#define MIB_DOT11_DESIRED_BSSID_LIST_MAX_COUNT ( 1 )

typedef struct
{
    v_U32_t cEntries;

    v_MACADDR_t BSSIDs[ MIB_DOT11_DESIRED_BSSID_LIST_MAX_COUNT ];

}  sMib_dot11DesiredBssidList;



/** This is the maximum number of SSIDs supported in the
     dot11DesiredSsidList.  All the code operates off of
     this maximum SSID list count.  */

#define MIB_DOT11_DESIRED_SSID_LIST_MAX_COUNT ( 1 )

#define MIB_DOT11_SSID_MAX_LENGTH ( 32 )

typedef struct
{
    v_U32_t ssidLength;
    v_U8_t  ssid[ MIB_DOT11_SSID_MAX_LENGTH ];

} sDot11Ssid;

typedef struct
{
    v_U32_t cEntries;

    sDot11Ssid SSIDs[ MIB_DOT11_DESIRED_SSID_LIST_MAX_COUNT ];

}  sMib_dot11DesiredSsidList;



typedef enum
{
    // these are bitmasks....
    eMib_dot11AutoConfigEnabled_None = 0U,
    eMib_dot11AutoConfigEnabled_Phy  = 0x00000001U,
    eMib_dot11AutoConfigEnabled_Mac  = 0x00000002U

} eMib_dot11AutoConfigEnabled;



#define MIB_DOT11_SUPPORTED_PHY_TYPES_MAX_COUNT ( 3 )

typedef enum tagMib_dot11PhyType
{
    eMib_dot11PhyType_11b,
    eMib_dot11PhyType_11a,
    eMib_dot11PhyType_11g,
    eMib_dot11PhyType_all
} eMib_dot11PhyType;

typedef struct tagMib_dot11SupportedPhyTypes
{
    v_U32_t cEntries;
    eMib_dot11PhyType phyTypes[ MIB_DOT11_SUPPORTED_PHY_TYPES_MAX_COUNT ];
}  sMib_dot11SupportedPhyTypes;


typedef enum
{
   eMib_DevicePowerState_D0,
   eMib_DevicePowerState_D1,
   eMib_DevicePowerState_D2,
   eMib_DevicePowerState_D3

} eMib_DevicePowerState;


typedef enum
{
    eMib_dot11NICPowerState_OFF = VOS_FALSE,
    eMib_dot11NICPowerState_ON  = VOS_TRUE

} eMib_dot11NICPowerState;


typedef enum
{
    eMib_dot11HardwarePHYState_OFF = VOS_FALSE,
    eMib_dot11HardwarePHYState_ON  = VOS_TRUE

} eMib_dot11HardwarePHYState;


typedef enum
{
    eMib_dot11PowerSavingLevel_None,
    eMib_dot11PowerSavingLevel_MaxPS,
    eMib_dot11PowerSavingLevel_FastPS,
    eMib_dot11PowerSavingLevel_MaximumLevel

} eMib_dot11PowerSavingLevel;


#define MIB_DOT11_MAC_EXCLUSION_LIST_MAX_COUNT 4
typedef struct
{
    v_U32_t cEntries;

    v_MACADDR_t macAddrs[ MIB_DOT11_MAC_EXCLUSION_LIST_MAX_COUNT ];

} sMib_dot11MacExcludeList;

#define MIB_DOT11_PRIVACY_EXEMPT_LIST_MAX_COUNT 32

typedef enum
{
    eMib_dot11ExemptionAction_Always,
    eMib_dot11ExemptionAction_OnKeyMapUnavailable

}eMib_dot11ExemptAction;

typedef enum
{
    eMib_dot11ExemptPacket_Unicast,
    eMib_dot11ExemptPacket_Multicast,
    eMib_dot11ExemptPacket_Both

}eMib_dot11ExemptPacket;

typedef struct
{
    v_U16_t uEtherType;
    eMib_dot11ExemptAction exemptAction;
    eMib_dot11ExemptPacket exemptPacket;

}sMib_dot11PrivacyExemption;

typedef struct
{
    v_U32_t cEntries;

    sMib_dot11PrivacyExemption privacyExemptList[ MIB_DOT11_PRIVACY_EXEMPT_LIST_MAX_COUNT ];

} sMib_dot11PrivacyExemptionList;

typedef struct sHddMib_s
{
    eMib_dot11DesiredBssType    mibDot11DesiredBssType;

    sMib_dot11DesiredBssidList  mibDot11DesiredBssidList;

    sMib_dot11DesiredSsidList   mibDot11DesiredSsidList;

    eMib_dot11AutoConfigEnabled mibDot11AutoConfigEnabled;

    // the device power state for the device (the D-state... you know D0, D1, D2, etc.
    eMib_DevicePowerState      mibDevicePowerState;

    // dot11NICPowerState is really the on/off state of the PHY.  This can be
    /* Manipulated through OIDs like a software control for radio on/off. */
    eMib_dot11NICPowerState    mibDot11NICPowerState;

    // Hardware PHY state is the on/off state of the hardware PHY.
    eMib_dot11HardwarePHYState mibDot11HardwarePHYState;

    // dot11 Power Saving level is the 802.11 power saving level/state for the 802.11
    // NIC.  Typically this is mapped to 802.11 BMPS in some fashion.  We are not going
    // to disappoint; the Libra NIC maps these to different BMPS settings.
    eMib_dot11PowerSavingLevel mibDot11PowerSavingLevel;

    sMib_dot11MacExcludeList mibDot11MacExcludeList;

    sMib_dot11PrivacyExemptionList mibDot11PrivacyExemptionList;

    sMib_dot11SupportedPhyTypes  mibDot11SupportedPhyTypes;
    eMib_dot11PhyType            mibDot11CurrentPhyType;

    v_BOOL_t                      dot11IbssJoinOnly;
    v_BOOL_t                      HiddenNetworkEnabled;


}sHddMib_t;

#endif
