/*
 * Copyright (c) 2006-2007 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 dot11f.frms
 *
 * \brief Primary 'frames' file for the MAC parser
 *
 *
 * This  file defines  several  802.11 frames  (along  with their  associated
 * constituents) in a little language  called "frames".  When run through the
 * 'framesc' program, it will generate  C code for working with these frames:
 * C  structs  representing the  802.11  frame  together  with functions  for
 * packing & unpacking them.
 *
 * For more information on the "frames" language, run 'framesc --help'...
 *
 *
 */


// Tell framesc what types to use for...
%8-bit-type   tANI_U8  // 8,
%16-bit-type  tANI_U16 // 16,
%32-bit-type  tANI_U32 // & 32-bit unsigned integral types.  These can also
                       // be specified on the command line.

// Define some mnemonic constants; these are just for our use with the frames
// files we're compiling.  IOW, they won't result in any C code being
// emitted.

const EID_SSID                       =   0;
const EID_SUPP_RATES                 =   1;
const EID_FH_PARAM_SET               =   2;
const EID_DS_PARAM_SET               =   3;
const EID_CF_PARAM_SET               =   4;
const EID_TIM                        =   5;
const EID_IBSS_PARAM_SET             =   6;
const EID_COUNTRY                    =   7;
const EID_FH_PATTERN                 =   8;
const EID_FH_PATT_TABLE              =   9;
const EID_REQUEST                    =  10;
const EID_QBSS_LOAD                  =  11;
const EID_EDCA_PARAM_SET             =  12;
const EID_TSPEC                      =  13;
const EID_TCLAS                      =  14;
const EID_SCHEDULE                   =  15;
const EID_CHALLENGE_TEXT             =  16;
const EID_POWER_CONSTRAINTS          =  32;
const EID_POWER_CAPABILITY           =  33;
const EID_TPC_REQUEST                =  34;
const EID_TPC_REPORT                 =  35;
const EID_SUPPORTED_CHANNELS         =  36;
const EID_CHANNEL_SWITCH_ANN         =  37;
const EID_MEAS_REQUEST               =  38;
const EID_MEAS_REPORT                =  39;
const EID_QUIET                      =  40;
const EID_ERP_INFO                   =  42;
const EID_TS_DELAY                   =  43;
const EID_TCLASS_PROC                =  44;
const EID_HT_CAPABILITIES            =  45;
const EID_QOS_CAPABILITY             =  46;
const EID_RSN                        =  48;
const EID_EXT_SUPP_RATES             =  50;
const EID_AP_CHAN_REPORT             =  51;
const EID_NEIGHBOR_REPORT            =  52;
const EID_RCPI                       =  53;
const EID_FT_MOBILITY_DOMAIN         =  54;
const EID_FT_INFO                    =  55;
const EID_TIMEOUT_INTERVAL           =  56;
const EID_FT_RIC_DATA                =  57;
const EID_SUPPORTED_OPER_CLASSES     =  59;
const EID_EXT_CHAN_SWITCH            =  60;
const EID_HT_INFO                    =  61;
const EID_SEC_CHAN_OFFSET            =  62;
const EID_RSNI                       =  65;
const EID_RRM_MEAS_PILOT_TX_INFO     =  66;
const EID_WAPI                       =  68;
const EID_RRM_ENABLED_CAPS           =  70;
const EID_MULTIPLE_BSSID             =  71;
const EID_20_40_BSS_COEXISTENCE      =  72;
const EID_20_40_BSS_INTOLERANT_REPORT=  73;
const EID_OBSS_SCAN_PARAMETERS       =  74;
const EID_FT_RIC_DESCRIPTOR          =  75;
const EID_LINK_IDENTIFIER            = 101;
const EID_PTI_CONTROL                = 105;
const EID_PU_BUFFER_STATUS           = 106;
const EID_QOS_MAP_SET                = 110;
const EID_ESE_SPECIFIC               = 150;
const EID_ESE_CCKM_SPECIFIC          = 156;
const EID_VHT_CAPABILITIES           =  191;
const EID_VHT_OPERATION_ELEMENT      =  192;
const EID_VHT_EXT_BSS_LOAD           =  193;
const EID_AID                        =  197;
const EID_EXT_CAP           	     =  127;
const EID_OPERATING_MODE             =  199;
const EID_WIDER_BW_CHANNEL_SWITCH_ANN=  194;
const EID_VENDOR_SPECIFIC            = 221;

const SIR_MAC_PROP_EXT_RATES_TYPE    =   0;
const SIR_MAC_PROP_AP_NAME_TYPE      =   1;
const SIR_MAC_PROP_HCF_TYPE          =   2;
const SIR_MAC_PROP_WDS_TYPE          =   3;
const SIR_MAC_PROP_BP_IND_TYPE       =   4;
const SIR_MAC_PROP_NEIGHBOR_BSS_TYPE =   5;
const SIR_MAC_PROP_LOAD_INFO_TYPE    =   6;
const SIR_MAC_PROP_ASSOC_TYPE        =   7;
const SIR_MAC_PROP_LOAD_BALANCE_TYPE =   8;
const SIR_MAC_PROP_LL_ATTR_TYPE      =   9;
const SIR_MAC_PROP_CAPABILITY        =  10;
const SIR_MAC_PROP_VERSION           =  11;
const SIR_MAC_PROP_EDCAPARAMS        =  12;
const SIR_MAC_PROP_TITAN             =  14;
const SIR_MAC_PROP_CHANNEL_SWITCH    =  15;
const SIR_MAC_PROP_QUIET_BSS         =  16;
const SIR_MAC_PROP_TRIG_STA_BK_SCAN	 =  17;
const SIR_MAC_PROP_TAURUS            =  18;

const ANI_WDS_INFO_MAX_LENGTH        =  64;
const SIR_MAC_MAX_NUMBER_OF_RATES    =  12;
const HT_MAX_SUPPORTED_MCS_SET       =  16;

/////////////////////////////////////////////////////////////////////////////
//                  Wi-Fi Protected Setup TLV Identifiers                  //
//                  WSC Version 2.0.0 Table 28                             //
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
//                  Wi-Fi Simple Configuration TLV Identifiers             //
// WFA Vendor Extension Subelements                                        //
/////////////////////////////////////////////////////////////////////////////
const TLV_VERSION2                          = 0;
const TLV_AUTHORIZED_MAC                    = 1;
const TLV_NETWORK_KEY_SHAREABLE             = 2;
const TLV_REQUEST_TO_ENROLL                 = 3;
const TLV_SETTINGS_DELAY_TIME               = 4;

const TLV_VERSION                           = 0x104A;
const TLV_WI_FI_SIMPLE_CONFIG_STATE         = 0x1044;
const TLV_AP_SETUP_LOCKED                   = 0x1057;
const TLV_SELECTED_REGISTRAR_CONFIG_METHODS = 0x1053;
const TLV_DEVICE_PASSWORD_ID                = 0x1012;
const TLV_UUID_E                            = 0x1047;
const TLV_UUID_R                            = 0x1048;
const TLV_RF_BANDS                          = 0x103C;
const TLV_REQUEST_TYPE                      = 0x103A;
const TLV_RESPONSE_TYPE                     = 0x103B;
const TLV_CONFIG_METHODS                    = 0x1008;
const TLV_PRIMARY_DEVICE_TYPE               = 0x1054;
const TLV_ASSOCIATION_STATE                 = 0x1002;
const TLV_CONFIGURATION_ERROR               = 0x1009;
const TLV_MANUFACTURER                      = 0x1021;
const TLV_MODEL_NAME                        = 0x1023;
const TLV_MODEL_NUMBER                      = 0x1024;
const TLV_SERIAL_NUMBER                     = 0x1042;
const TLV_DEVICE_NAME                       = 0x1011;
const TLV_SELECTED_REGISTRAR                = 0x1041;
const TLV_VENDOR_EXTENSION                  = 0x1049;
const TLV_REQUESTED_DEVICE_TYPE             = 0x106A;

/////////////////////////////////////////////////////////////////////////////
//                  Wi-Fi Direct/P2P TLV Identifiers                       //
/////////////////////////////////////////////////////////////////////////////
const TLV_P2P_STATUS                         =   0;
const TLV_MINOR_REASON_CODE                  =   1;
const TLV_P2P_CAPABILITY                     =   2;
const TLV_P2P_DEVICE_ID                      =   3;
const TLV_P2P_GROUP_OWNER_INTENT             =   4;
const TLV_CONFIGURATION_TIMEOUT              =   5;
const TLV_LISTEN_CHANNEL                     =   6;
const TLV_P2P_GROUP_BSSID                    =   7;
const TLV_EXTENDED_LISTEN_TIMING             =   8;
const TLV_INTENDED_P2P_INTERFACE_ADDRESS     =   9;
const TLV_P2P_MANAGEABILITY                  =  10;
const TLV_CHANNEL_LIST                       =  11;
const TLV_NOTICE_OF_ABSENCE                  =  12;
const TLV_P2P_DEVICE_INFO                    =  13;
const TLV_P2P_GROUP_INFO                     =  14;
const TLV_P2P_GROUP_ID                       =  15;
const TLV_P2P_INTERFACE                      =  16;
const TLV_OPERATING_CHANNEL                  =  17;
const TLV_INVITATION_FLAGS                   =  18;
const TLV_P2P_VENDOR_SPECIFIC                = 221;

/////////////////////////////////////////////////////////////////////////////
// Fixed Fields

FF AuthAlgo (2)                           // C.f. Sec. 7.3.1.1
{
    algo, 2;
}

FF AuthSeqNo (2)                          // 7.3.1.2
{
    no, 2;
}

FF BeaconInterval (2)                     // 7.3.1.3
{
    interval, 2;
}

FF Capabilities (2)                       // 7.3.1.4
{
    {
        ess:            1;
        ibss:           1;
        cfPollable:     1;
        cfPollReq:      1;
        privacy:        1;
        shortPreamble:  1;
        pbcc:           1;
        channelAgility: 1;
        spectrumMgt:    1;
        qos:            1;
        shortSlotTime:  1;
        apsd:           1;
        rrm:            1;
        dsssOfdm:       1;
        delayedBA:      1;
        immediateBA:    1;
    }
}

FF CurrentAPAddress(6)                    // 7.3.1.5
{
    mac[6];
}

FF ListenInterval (2)                     // 7.3.1.6
{
    interval, 2;
}

FF Reason (2)                             // 7.3.1.7
{
    code, 2;
}

FF AID (2)                                // 7.3.1.8
{
    associd, 2;
}

FF Status (2)                             // 7.3.1.9
{
    status, 2;
}

FF TimeStamp (8)                          // 7.3.1.10
{
    timestamp, 8;
}

FF Category (1)                           // 7.3.1.11
{
    category, 1;
}

FF Action (1)                             // 7.3.1.11
{
    action, 1;
}

FF TransactionId (2)                      // 7.3.1.11
{
    transId[2];
}

FF DialogToken (1)                        // 7.3.1.12
{
    token, 1;
}

FF StatusCode (1)                         // WMM Spec 2.2.10
{
    statusCode, 1;
}

FF OperatingMode (1)
{
   {
    //Operating Mode field
    chanWidth:    2;
    reserved:     2;
    rxNSS:        3;
    rxNSSType:    1;
    }
}
FF AddBAParameterSet (2)                     // 7.3.1.14
{
    {
        amsduSupported:    1;
        policy:      1;
        tid:         4;
        bufferSize: 10;
    }
}

FF BATimeout (2)                          // 7.3.1.15
{
    timeout, 2;
}

FF BAStartingSequenceControl (2)                  // 7.2.1.7
{
    {
        fragNumber: 4;
        ssn:       12;
    }
}

FF DelBAParameterSet (2)                     // 7.3.1.16
{
    {
        reserved:   11;
        initiator:   1;
        tid:         4;
    }
}

FF SMPowerModeSet (1)				//7.3.1.25
{
    {
        PowerSave_En: 1;
        Mode: 1;
        reserved: 6;
     }
}

FF TSInfo (3)                             // 7.3.2.30
{
    {
        traffic_type:    1;
        tsid:            4;
        direction:       2;
        access_policy:   2;
        aggregation:     1;
        psb:             1;
        user_priority:   3;
        tsinfo_ack_pol:  2;
        schedule:        1;
        unused:         15;
    }
}

FF NumOfRepetitions (2)
{
     repetitions, 2;
}

FF TxPower (1)
{
     txPower, 1;
}

FF MaxTxPower (1)
{
     maxTxPower, 1;
}
FF TPCEleID (1)
{
     TPCId, 1;
}
FF TPCEleLen (1)
{
     TPCLen, 1;
}
FF LinkMargin (1)
{
     linkMargin, 1;
}
FF RxAntennaId (1)
{
     antennaId, 1;
}
FF TxAntennaId (1)
{
     antennaId, 1;
}
FF RCPI (1)
{
     rcpi, 1;
}
FF RSNI (1)
{
     rsni, 1;
}

FF P2POUI (4)
{
     oui, 4;
}

FF P2POUISubType (1)
{
    ouiSubtype, 1;
}

FF RMCOUI (3)
{
     oui[3];
}

FF MagicCode (6)
{
     magic[6];
}

FF RMCVersion (1)
{
     version, 1;
}

FF RMCDialogToken (4)
{
     token, 4;
}

FF Ruler (6)
{
     mac[6];
}

FF VhtMembershipStatusArray(8)                    // 8.4.1.51
{
    membershipStatusArray[8];
}

FF VhtUserPositionArray(16)                    // 8.4.1.52
{
    userPositionArray[16];
}

FF ext_chan_switch_ann_action(4)
{
   {
     switch_mode: 8;
     op_class: 8;
     new_channel: 8;
     switch_count: 8;
   }
}

/////////////////////////////////////////////////////////////////////////////
//                                  TLVs                                   //
/////////////////////////////////////////////////////////////////////////////

/**
 * \brief Version
 *
 * WPS 1.0h
 * Version specifies  the Easy  Setup version. The  one-byte field  is broken
 * into a  four-bit major  part using  the top MSBs  and four-bit  minor part
 * using the LSBs. As an example, version 3.2 would be 0x32.
 *
 * WSC 2.0.0
 * Deprecated Version mechanism. This attribute is always set to value 0x10
 * (version 1.0) for backwards compatibility. Version 1.0h of the specification
 * did not fully describe the version negotiation mechanism and version 2.0
 * introduced a new subelement (Version2) for indicating the version number
 * to avoid potential interoperability issues with deployed 1.0h-based devices.
 *
 */

TLV Version( TLV_VERSION ) ( 2 : 2 ) MSB
{
  {
      minor: 4;
      major: 4;
  }
}

/// Wi-Fi Protected Setup State
TLV WPSState( TLV_WI_FI_SIMPLE_CONFIG_STATE ) ( 2 : 2 ) MSB
{
  state, 1;
}

/**
 * \brief AP Setup Locked
 *
 *
 * This variable indicates that the AP has entered a state in which it will
 * refuse to allow an external Registrar to attempt to run the Registration
 * Protocol using the AP?s PIN (with the AP acting as Enrollee). The AP
 * should enter this state if it believes a brute force attack is underway
 * against the AP?s PIN.
 *
 * When the AP is in this state, it MUST continue to allow other Enrollees to
 * connect and run the Registration  Protocol with any external Registrars or
 * the AP's built-in  Registrar (if any). It  is only the use of  the AP' PIN
 * for adding external Registrars that is disabled in this state.
 *
 * The AP Setup Locked state can be reset to FALSE through an authenticated
 * call to SetAPSettings. APs may provide other implementation-specific
 * methods of resetting the AP Setup Locked state as well.
 *
 *
 */

TLV APSetupLocked( TLV_AP_SETUP_LOCKED ) ( 2 : 2 ) MSB
{
    fLocked, 1;
}

/**
 * \brief Selected Registrar Config Methods
 *
 *
 * This attribute has the same values that Config Methods have. It is used in
 * Probe Response messages to convey the Config Methods of the selected
 * Registrar.
 *
 *
 */

TLV SelectedRegistrarConfigMethods ( TLV_SELECTED_REGISTRAR_CONFIG_METHODS ) ( 2 : 2 ) MSB
{
    methods, 2;
}

/**
 * \brief UUID-E
 *
 *
 * The  universally  unique  identifier  (UUID)  element  is  a  unique  GUID
 * generated by  the Enrollee. It  uniquely identifies an  operational device
 * and  should survive reboots  and resets.  The UUID  is provided  in binary
 * format. If the device also supports UPnP, then the UUID corresponds to the
 * UPnP UUID.
 *
 *
 */

TLV UUID_E ( TLV_UUID_E ) ( 2 : 2 ) MSB
{
    uuid[ 16 ];
}

/**
 * \brief UUID-R
 *
 *
 * The  universally  unique  identifier  (UUID)  element  is  a  unique  GUID
 * generated by  the Registrar. It uniquely identifies  an operational device
 * and  should survive reboots  and resets.  The UUID  is provided  in binary
 * format. If the device also supports UPnP, then the UUID corresponds to the
 * UPnP UUID.
 *
 *
 */

TLV UUID_R ( TLV_UUID_R ) ( 2 : 2 ) MSB
{
    uuid[ 16 ];
}

/**
 * \brief RF Bands
 *
 *
 \code

  0x01 2.4GHz
  0x02 5.0GHz

 \endcode
 *
 *
 */

TLV RFBands ( TLV_RF_BANDS ) ( 2 : 2 ) MSB
{
    bands, 1;
}


/**
 * \brief Selected Registrar
 *
 *
 * This field indicates that a Registrar has been selected by a user and that
 * an Enrollee  should proceed  with setting up  an 802.1X  uncontrolled data
 * port with the Registrar.
 *
 *
 */

TLV SelectedRegistrar ( TLV_SELECTED_REGISTRAR ) ( 2 : 2 ) MSB
{
    selected, 1;
}

/**
 * \brief Config Methods
 *
 *
 * The  Config Methods  Data component  lists the  configuration  methods the
 * Enrollee or Registrar  supports.  The list is a bitwise  OR of values from
 * the table below. In addition to  Config Methods, APs and STAs that support
 * the UPnP  Management Interface must  support the Permitted  Config Methods
 * attribute, which is used to control the Config Methods that are enabled on
 * that AP.
 *
 \code

   Value   Hardware Interface
   0x0001  USBA (Flash Drive)
   0x0002  Ethernet
   0x0004  Label
   0x0008  Display
   0x0010  External NFC Token
   0x0020  Integrated NFC Token
   0x0040  NFC Interface
   0x0080  PushButton
   0x0100  Keypad

 \endcode
 *
 *
 */

TLV ConfigMethods ( TLV_CONFIG_METHODS ) ( 2 : 2 ) MSB
{
    methods, 2;
}

/**
 * \brief Association State
 *
 *
 * The  Association  State component  shows  the  configuration and  previous
 * association  state  of  the  wireless  station when  sending  a  Discovery
 * request.
 *
 \code

  Association State    Description
  0                    Not Associated
  1                    Connection Success
  2                    Configuration Failure
  3                    Association Failure
  4                    IP Failure

 \endcode
 *
 *
 */

TLV AssociationState ( TLV_ASSOCIATION_STATE ) ( 2 : 2 ) MSB
{
    state, 2;
}

/**
 * \brief Configuration Error
 *
 *
 * The  Configuration  Error  component   shows  the  result  of  the  device
 * attempting to configure itself and to associate with the WLAN.
 *
 \code

   Configuration Error  Description
    0                   No Error
    1                   OOB Interface Read Error
    2                   Decryption CRC Failure
    3                   2.4 channel not supported
    4                   5.0 channel not supported
    5                   Signal too weak
    6                   Network auth failure
    7                   Network association failure
    8                   No DHCP response
    9                   Failed DHCP config
   10                   IP address conflict
   11                   Couldn't connect to Registrar
   12                   Multiple PBC sessions detected
   13                   Rogue activity suspected
   14                   Device busy
   15                   Setup locked
   16                   Message Timeout
   17                   Registration Session Timeout
   18                   Device Password Auth Failure

 \endcode
 *
 * The  Device busy  error is  returned if  the sending  device is  unable to
 * respond  to  the  request  due  to  some  internal  conflict  or  resource
 * contention issue. For example, if a device is only capable of performing a
 * single instance of the Registration Protocol at a time, it may return this
 * error in response  to attempts to start another instance  in the middle of
 * an active session.
 *
 *
 */

TLV ConfigurationError ( TLV_CONFIGURATION_ERROR ) ( 2 : 2 ) MSB
{
    error, 2;
}

TLV Manufacturer ( TLV_MANUFACTURER ) ( 2 : 2 ) MSB
{
    name[ 0..64 ];
}

TLV ModelName ( TLV_MODEL_NAME ) ( 2 : 2 ) MSB
{
    text[ 0..32 ];
}

TLV ModelNumber ( TLV_MODEL_NUMBER ) ( 2 : 2 ) MSB
{
    text[ 0..32 ];
}

TLV SerialNumber ( TLV_SERIAL_NUMBER ) ( 2 : 2 ) MSB
{
    text[ 0..32 ];
}

TLV DeviceName ( TLV_DEVICE_NAME ) ( 2 : 2 ) MSB
{
    text[ 0..32 ];
}

/**
 * \brief Device Password ID
 *
 *
 * This  attribute is  used  to identify  a  device password.  There are  six
 * predefined values  and ten reserved values.  If the Device  Password ID is
 * Default,  the Enrollee  should use  its PIN  password (from  the  label or
 * display).  This  password may  correspond  to  the  label, display,  or  a
 * user-defined  password that has  been configured  to replace  the original
 * device password.
 *
 * User-specified indicates that the user  has overridden the password with a
 * manually  selected value.  Machine-specified  indicates that  the original
 * PIN  password has  been overridden  by a  strong,  machinegenerated device
 * password  value.  The Rekey  value  indicates  that  the device's  256-bit
 * rekeying password  will be used.  The PushButton value indicates  that the
 * PIN  is  the all-zero  value  reserved  for  the PushButton  Configuration
 * method.
 *
 * The Registrar-specified value indicates a  PIN that has been obtained from
 * the Registrar (via a display  or other out-of-band method). This value may
 * be further  augmented with the  optional 'Identity' attribute in  M1. This
 * augmentation is useful when multiple predefined UserID/PIN pairs have been
 * established  by a  Registrar such  as  an authenticator  used for  Hotspot
 * access. If the  Device Password ID in  M1 is not one of  the predefined or
 * reserved values, it corresponds to a password given to the Registrar as an
 * OOB Device Password.
 *
 \code

   Value            Description

   0x0000           Default (PIN)
   0x0001           User-specified
   0x0002           Machine-specified
   0x0003           Rekey
   0x0004           PushButton
   0x0005           Registrar-specified
   0x0006 - 0x000F  Reserved

 \endcode
 *
 *
 */

TLV DevicePasswordID ( TLV_DEVICE_PASSWORD_ID ) ( 2 : 2 ) MSB
{
    id, 2;
}


/**
 * \brief Primary Device Type
 *
 *
 * This attribute contains the primary type of the device. Its format
 * follows:
 *
 \code

   0 1 2 3
   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   | Attribute ID                   | Length                       |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   | Category ID                    | OUI (1-2)                    |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   | OUI (3-4)                      | Sub Category ID              |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

 \endcode
 *
 * Vendor-specific sub-categories  are designated by  setting the OUI  to the
 * value associated with  that vendor.  Note that a  four-byte subdivided OUI
 * is used. For the predefined values, the  Wi-Fi Alliance OUI of 00 50 F2 04
 * is used.  The predefined values  for Category ID  and Sub Category  ID are
 * provided in the next table. There  is no way to indicate a vendor-specific
 * main device  category. The OUI applies  only to the  interpretation of the
 * Sub Category. If  a vendor does not use sub categories  for their OUI, the
 * three-byte OUI  occupies the first  three bytes of  the OUI field  and the
 * fourth byte is set to zero.
 *
 *
 \code

   Category              ID Value  Sub Category             ID Value
   Computer              1         PC                       1
                                   Server                   2
                                   Media Center             3
   Input Device          2
   Printers, Scanners,             Printer                  1
   Faxes and Copiers     3         Scanner                  2
   Camera                4         Digital Still Camera     1
   Storage               5         NAS                      1
   Network                         AP                       1
   Infrastructure        6         Router                   2
                                   Switch                   3
   Displays              7         Television               1
                                   Electronic Picture Frame 2
                                   Projector                3
   Multimedia Devices    8         DAR                      1
                                   PVR                      2
                                   MCX                      3
   Gaming Devices        9         Xbox                     1
                                   Xbox360                  2
                                   Playstation              3
   Telephone             10        Windows Mobile           1

 \endcode
 *
 *
 */

TLV PrimaryDeviceType ( TLV_PRIMARY_DEVICE_TYPE ) ( 2 : 2 ) MSB
{
    primary_category, 2;
    oui[ 4 ];
    sub_category, 2;
}


/**
 * \brief Request Type
 *
 *
 * The Request  Type component  specifies the mode  in which the  device will
 * operate in for  this setup exchange. If the device is  an Enrollee, it may
 * send only  discovery messages  or it may  also request that  the Registrar
 * proceed with opening a data  connection. This protocol allows Enrollees to
 * more efficiently discover devices on the network.

 * If  the device  indicates that  it  intends to  engage setup  either as  a
 * Registrar or an  Enrollee, the Access Point continues  to indicate that it
 * will  operate as  an AP  in the  response. The  Request Type  attribute is
 * carried  throughout the  802.1X data  channel setup  process in  the Wi-Fi
 * Protected Setup IE.   There are two sub-types of  Registrars: WLAN Manager
 * Registrar indicates  that this Registrar intends  to manage the  AP or STA
 * settings using UPnP.  It will derive a UPnP AP or  STA Management key. The
 * ordinary Registrar type  indicates that this Registrar does  not intend to
 * subsequently  manage  the Enrollee's  settings.  APs  must  not derive  AP
 * Management Keys for an ordinary  Registrar. If a Registrar does not intend
 * to  be  a WLAN  Manager  Registrar,  it should  set  the  Request Type  to
 * Registrar. Doing so avoids needlessly consuming resources on the AP.

 \code

 Request Type Value        Description
 0x00                      Enrollee, Info only
 0x01                      Enrollee, open 802.1X
 0x02                      Registrar
 0x03                      WLAN Manager Registrar

 \endcode
 *
 *
 */

TLV RequestType ( TLV_REQUEST_TYPE ) ( 2 : 2 ) MSB
{
    reqType, 1;
}

/**
 * \brief Response Type
 *
 *
 * The Response Type component specifies the operational mode of the
 * device for this setup exchange. The Response Type IE is carried
 * throughout the 802.1X data channel setup process.

 \code

 Response Type Value       Description
 0x00                      Enrollee, Info only
 0x01                      Enrollee, open 802.1X
 0x02                      Registrar
 0x03                      AP

\endcode
 *
 *
 */

TLV ResponseType ( TLV_RESPONSE_TYPE  ) ( 2 : 2 ) MSB
{
    resType, 1;
}


///////////////////////////////////////////////////////////////////////////
//                       WiFi Direct/P2P TLVs                            //
///////////////////////////////////////////////////////////////////////////

/**
 * \brief P2P Status Attribute
 */

TLV P2PStatus ( TLV_P2P_STATUS ) ( 1 : 2 ) LSB
{
    status, 1;
}


/**
 * \brief Minor Reason Code Attribute
 */

TLV MinorReasonCode ( TLV_MINOR_REASON_CODE ) ( 1 : 2 ) LSB
{
    minorReasonCode, 1;
}


/**
 * \brief P2P Capability Attribute
 */

TLV P2PCapability ( TLV_P2P_CAPABILITY ) ( 1 : 2 ) LSB
{
    deviceCapability, 1;
    groupCapability, 1;
}


/**
 * \brief P2P Device Id Attribute
 */

TLV P2PDeviceId ( TLV_P2P_DEVICE_ID ) ( 1 : 2 ) LSB
{
    P2PDeviceAddress[6];
}


/**
 * \brief Group Owner Intent Attribute
 */

TLV GOIntent ( TLV_P2P_GROUP_OWNER_INTENT ) ( 1 : 2 ) LSB
{
    GOIntent, 1;
}


/**
 * \brief Configuration Timeout Attribute
 */

TLV ConfigurationTimeout ( TLV_CONFIGURATION_TIMEOUT ) ( 1 : 2 ) LSB
{
    GOConfigTimeout, 1;
    CLConfigTimeout, 1;
}


/**
 * \brief Listen Channel Attribute
 */

TLV ListenChannel ( TLV_LISTEN_CHANNEL ) ( 1 : 2 ) LSB
{
    countryString[3];
    regulatoryClass, 1;
    channel,         1;
}


/**
 * \brief P2P Group BSSID Attribute
 */

TLV P2PGroupBssid ( TLV_P2P_GROUP_BSSID ) ( 1 : 2 ) LSB
{
    P2PGroupBssid[6];
}


/**
 * \brief Extended Listen Attribute
 */

TLV ExtendedListenTiming ( TLV_EXTENDED_LISTEN_TIMING ) ( 1 : 2 ) LSB
{
    availibilityPeriod, 2;
    availibilityInterval, 2;
}


/**
 * \brief Intended P2P Interface Address Attribute
 */

TLV IntendedP2PInterfaceAddress ( TLV_INTENDED_P2P_INTERFACE_ADDRESS ) ( 1 : 2 ) LSB
{
    P2PInterfaceAddress[6];
}


/**
 * \brief P2P Manageability Attribute
 */

TLV P2PManageability ( TLV_P2P_MANAGEABILITY ) ( 1 : 2 ) LSB
{
    manageability, 1;
}


/**
 * \brief ChannelList Attribute
 */

TLV ChannelList ( TLV_CHANNEL_LIST ) ( 1 : 2 ) LSB
{
    countryString[3];
    channelList[0..251];
}


/**
 * \brief Notice of Absence
 */

TLV NoticeOfAbsence ( TLV_NOTICE_OF_ABSENCE ) ( 1 : 2 ) LSB
{
    index, 1;
    CTSWindowOppPS, 1;
    NoADesc[0..36];
}

/**
 * \brief P2P Device Info Attribute
 */

TLV P2PDeviceInfo ( TLV_P2P_DEVICE_INFO ) ( 1 : 2 ) LSB
{
    P2PDeviceAddress[6];
    configMethod, 2 , FLIPBYTEORDER;
    primaryDeviceType[8];
    MANDATORYTLV DeviceName;
}


/**
 * \brief P2P Group Info Attribute
 */

TLV P2PGroupInfo ( TLV_P2P_GROUP_INFO ) ( 1 : 2 ) LSB
{
    P2PClientInfoDesc[0..1024];
}


/**
 * \brief P2P Group Id Attribute
 */

TLV P2PGroupId ( TLV_P2P_GROUP_ID ) ( 1 : 2 ) LSB
{
    deviceAddress[6];
    ssid[0..32];
}


/**
 * \brief P2P Interface Attribute
 */

TLV P2PInterface ( TLV_P2P_INTERFACE ) ( 1 : 2 ) LSB
{
    P2PDeviceAddress[6];
}


/**
 * \brief Operating Channel Attribute
 */

TLV OperatingChannel ( TLV_OPERATING_CHANNEL ) ( 1 : 2 ) LSB
{
    countryString[3];
    regulatoryClass, 1;
    channel,         1;
}


/**
 * \brief Invitation Flags Attribute
 */

TLV InvitationFlags ( TLV_INVITATION_FLAGS ) ( 1 : 2 ) LSB
{
    invitationFlags, 1;
}

/**
 * \brief Vendor Extension
 *
 * This variable permits vendor extensions in the Wi-Fi Simple
 * Configuration TLV framework. The Vendor Extension figure
 * illustrates the implementation of vendor extensions. Vendor
 * ID is the SMI network management private enterprise code
 *
 * +-----------+----------------------+
 * | Vendor ID |   Vendor Data        |
 * +-----------+----------------------+
 * |<--- 3 --->|<----- 1 - 1021 ----->|
 *
 */

TLV VendorExtension ( TLV_VENDOR_EXTENSION ) ( 2 : 2 ) MSB
{
    /*
     * vendorId is the SMI network management private enterprise code.
     * WFA Vendor ID 0x00372A
     *
     */
    vendorId[ 3 ];

    /**
     * \breif Version2
     *
     * The Version2 field specifies the version Wi-Fi Simple
     * Configuration implemented by the device sending this attribute.
     * The one-byte field is broken into a four-bit major part using
     * the top MSBs and four-bit minor part using the LSBs. As an example,
     * version 3.2 would be 0x32. This subelement was added in the
     * specification version 2.0 and if the subelement is not included
     * in a message, the transmitter of the message is assumed to
     * use version 1.0.
     *
     */
    OPTIONALTLV TLV Version2 ( TLV_VERSION2 )  ( 1 : 1 ) MSB
    {
      {
          minor: 4;
          major: 4;
      }
    }
    /**
     * \brief AuthorizedMACs
     *
     * This subelement contains a list of Enrollee MAC addresses (each
     * being six bytes in length) that have been registered to start WSC.
     * The AP includes this field in Beacon and Probe Response frames so
     * Enrollees can tell if they have been registered to start WSC. There
     * may be multiple Enrollees active on the network, but not all of them have
     * been registered to start WSC. This element allows an Enrollee to detect
     * if they should start WSC with the AP. The AuthorizedMACs field augments
     * the use of the Selected Registrar.
    *
     */
    OPTIONALTLV TLV AuthorizedMACs ( TLV_AUTHORIZED_MAC ) ( 1 : 1 ) MSB
    {
        mac[6];
    }

    /**
     * \brief Request to Enroll
     *
     * This optional subelement in the WSC IE in Probe Request or M1 indicates
     * the desire to enroll in the network by setting its value to TRUE. If the
     * Registrar gets this subelement it can use this as a trigger that a device
     * wants to enroll (maybe an indication can be shown to the user). The device
     * must set it to FALSE after the registration protocol completion.
     *
     */
    OPTIONALTLV TLV RequestToEnroll( TLV_REQUEST_TO_ENROLL ) ( 1 : 1 ) MSB
    {
        req, 1;
    }
}

/**
 * \brief Requested Device Type
 *
 * This attribute contains the requested device type of a Wi-Fi
 * Direct device.
 *
 * This attribute allows a device to specify the Primary Device Type
 * or the Secondary Device Type of other devices it is interested in.
 * Only a device that receives a Probe Request containing a WSC IE with
 * this attribute and with a Primary Device Type or Secondary Device Type
 * that matches the Requested Device Type will respond with a Probe Response.
 *
 * Its format and contents is identical to the 'Primary Device Type'.
 *
 * Both the Category ID and Sub Category ID can be used as a filter. If only
 * looking for devices with a certain Category ID, the OUI and Sub Category ID
 * fields will have to be set to zero.
 *
 */
TLV RequestDeviceType ( TLV_REQUESTED_DEVICE_TYPE ) ( 2 : 2 ) MSB
{
    primary_category, 2;
    oui[ 4 ];
    sub_category, 2;
}

/////////////////////////////////////////////////////////////////////////////
// Information Elements

IE SSID (EID_SSID)                        // C.f. Sec. 7.3.2.1
{
    ssid[0..32];
}

IE SuppRates (EID_SUPP_RATES)             // 7.3.2.2
{
    rates[0..SIR_MAC_MAX_NUMBER_OF_RATES];
}

IE FHParamSet (EID_FH_PARAM_SET)          // 7.3.2.3
{
    dwell_time,  2;
    hop_set,     1;
    hop_pattern, 1;
    hop_index,   1;
}

IE DSParams (EID_DS_PARAM_SET)            // 7.3.2.4
{
    curr_channel, 1;
}

IE CFParams (EID_CF_PARAM_SET)            // 7.3.2.5
{
    cfp_count,        1;
    cfp_period,       1;
    cfp_maxduration,  2;
    cfp_durremaining, 2;
}

IE TIM (EID_TIM)                          // 7.3.2.6
{
    dtim_count,    1;
    dtim_period,   1;
    bmpctl,        1;
    vbmp[1..251];
}

IE IBSSParams (EID_IBSS_PARAM_SET)        // 7.3.2.7
{
    atim, 2;
}

IE ChallengeText (EID_CHALLENGE_TEXT)     // 7.3.2.8
{
    text[1..253];
}

IE RequestedInfo (EID_REQUEST)            // 7.3.2.12
{
    requested_eids[0..255];
}

IE Country (EID_COUNTRY)                  // 7.3.2.9
{
    country[3];
    OPTIONAL triplets[3][0..84];
}

IE FHParams (EID_FH_PATTERN)              // 7.3.2.10
{
    radix, 1;
    nchannels, 1;
}

IE FHPattTable (EID_FH_PATT_TABLE)        // 7.3.2.11
{
    flag,    1;
    nsets,   1;
    modulus, 1;
    offset,  1;
    randtable[0..251];
}

IE ERPInfo (EID_ERP_INFO)                 // 7.3.2.13
{
    {
        non_erp_present : 1;
        use_prot:         1;
        barker_preamble:  1;
        unused:           5;
    }
}

IE ExtSuppRates (EID_EXT_SUPP_RATES)      // 7.3.2.14
{
    rates[1..SIR_MAC_MAX_NUMBER_OF_RATES];
}

IE PowerConstraints (EID_POWER_CONSTRAINTS) // 7.3.2.15
{
    localPowerConstraints, 1;
}

IE PowerCaps (EID_POWER_CAPABILITY)       // 7.3.2.16
{
    minTxPower, 1;
    maxTxPower, 1;
}

IE TPCRequest (EID_TPC_REQUEST)           // 7.3.2.17
{ }

IE TPCReport (EID_TPC_REPORT)             // 7.3.2.18
{
    tx_power,    1;
    link_margin, 1;
}

IE SuppChannels (EID_SUPPORTED_CHANNELS)  // 7.2.3.19
{
    bands[2][1..48];
}

IE SuppOperatingClasses (EID_SUPPORTED_OPER_CLASSES)
{
    classes[1..32];
}

IE ChanSwitchAnn (EID_CHANNEL_SWITCH_ANN) // 7.3.2.20
{
    switchMode,  1;
    newChannel,  1;
    switchCount, 1;
}

IE ext_chan_switch_ann (EID_EXT_CHAN_SWITCH) //9.4.2.53
{
    switch_mode,   1;
    new_reg_class, 1;
    new_channel,   1;
    switch_count,  1;
}

IE sec_chan_offset (EID_SEC_CHAN_OFFSET) //9.4.2.20
{
	secondaryChannelOffset, 1;
}

IE Quiet (EID_QUIET)                      // 7.3.2.23
{
    count,    1;
    period,   1;
    duration, 2;
    offset,   2;
}

IE RSN (EID_RSN)                          // 7.3.2.25
{
    // The version is 2 octets, and we only support version 1.
    version, 2 MUSTBE 1;
    // The next four octets will be the Optional Group Cipher Suite
    OPTIONAL gp_cipher_suite[4];
    // The IE *may* stop here; if there's any more, we should see two more
    // octets giving the number of Pairwise Cipher Suites
    OPTIONAL pwise_cipher_suite_count, 2;
    // I don't see anything in the Standard limiting the number of Pairwise
    // Cypher Suites, other than the maximum length of an IE, which limits us
    // to 61.  However, that seems needlessly wasteful of space.
    pwise_cipher_suites[4][0..4] COUNTIS pwise_cipher_suite_count;
    // Optional count of AKM suite selectors
    OPTIONAL akm_suite_cnt, 2;
    // Again, I see nothing in the Standard explicitly limiting the number of
    // AKM suite selectors other than the maximum size of an IE.
    akm_suite[4][0..4] COUNTIS akm_suite_cnt;
    OPTIONAL RSN_Cap[2];
    // Finally, the IE may contain zero or more PMKIDs:
    OPTIONAL pmkid_count, 2;
    pmkid[16][0..4] COUNTIS pmkid_count;
    OPTIONAL gp_mgmt_cipher_suite[4];
}

IE RSNOpaque (EID_RSN)                    // 7.3.2.25
{
    data[ 0..253 ];
}

IE WAPI (EID_WAPI)                          // 7.3.2.25
{
    // The version is 2 octets, and we only support version 1.
    version, 2 MUSTBE 1;
    // count of AKM suite selectors
    akm_suite_count, 2;
    // Again, I see nothing in the Standard explicitly limiting the number of
    // AKM suite selectors other than the maximum size of an IE.
    akm_suites[4][0..4] COUNTIS akm_suite_count;
    // we should see two more
    // octets giving the number of Unicast Cipher Suites
    unicast_cipher_suite_count, 2;
    // I don't see anything in the Standard limiting the number of Pairwise
    // Cypher Suites, other than the maximum length of an IE, which limits us
    // to 61.  However, that seems needlessly wasteful of space.
    unicast_cipher_suites[4][0..4] COUNTIS unicast_cipher_suite_count;
    // The next four octets will be the Multicast Cipher Suite
    multicast_cipher_suite[4];
    // WAPI capabilities
    {
        preauth:               1;
        reserved:             15;
    }
    // Finally, the IE may contain zero or more BKIDs:
    OPTIONAL bkid_count, 2;
    bkid[16][0..4] COUNTIS bkid_count;
}

IE WAPIOpaque (EID_WAPI)                    // 7.3.2.25
{
    data[ 6..253 ];
}

IE QBSSLoad (EID_QBSS_LOAD)               // 7.3.2.28
{
    stacount, 2;
    chautil,  1;
    avail,    2;
}

IE EDCAParamSet (EID_EDCA_PARAM_SET)      // 7.3.2.29
{
    qos, 1;                     // ToDo: This is a bitfield whose format
                                // depends on whether this is from an AP
                                // or a STA, information which I'm not
                                // sure we have at parse time...
    reserved, 1;
    {
        acbe_aifsn: 4;
        acbe_acm:   1;
        acbe_aci:   2;
        unused1:    1;
    }
    {
        acbe_acwmin: 4;
        acbe_acwmax: 4;
    }
    acbe_txoplimit, 2;
    {
        acbk_aifsn: 4;
        acbk_acm:   1;
        acbk_aci:   2;
        unused2:    1;
    }
    {
        acbk_acwmin: 4;
        acbk_acwmax: 4;
    }
    acbk_txoplimit, 2;
    {
        acvi_aifsn: 4;
        acvi_acm:   1;
        acvi_aci:   2;
        unused3:    1;
    }
    {
        acvi_acwmin: 4;
        acvi_acwmax: 4;
    }
    acvi_txoplimit, 2;
    {
        acvo_aifsn: 4;
        acvo_acm:   1;
        acvo_aci:   2;
        unused4:    1;
    }
    {
        acvo_acwmin: 4;
        acvo_acwmax: 4;
    }
    acvo_txoplimit, 2;
}

IE TSPEC (EID_TSPEC)                             // 7.3.2.30
{

    // TS Info
    {
        traffic_type:    1;
        tsid:            4;
        direction:       2;
        access_policy:   2;
        aggregation:     1;
        psb:             1;
        user_priority:   3;
        tsinfo_ack_pol:  2;
    }
    {
        schedule:        1;
        unused:          7;
    }

    // Nominal MSDU Size
    {
        size:  15;
        fixed: 1;
    }

    max_msdu_size,        2;
    min_service_int,      4;
    max_service_int,      4;
    inactivity_int,       4;
    suspension_int,       4;
    service_start_time,   4;
    min_data_rate,        4;
    mean_data_rate,       4;
    peak_data_rate,       4;
    burst_size,           4;
    delay_bound,          4;
    min_phy_rate,         4;
    surplus_bw_allowance, 2;
    medium_time,          2;

} // End IE TSPEC.

IE TCLAS (EID_TCLAS)                             // 7.3.2.31
{
    user_priority, 1;
    classifier_type, 1;
    classifier_mask, 1;
    UNION info (DISCRIMINATOR classifier_type)
    {
        EthParams (classifier_type IS 0)
        {
            source[6];
            dest[6];
            type, 2;
        }
        IpParams (classifier_type IS 1)
        {
            version, 1;
            UNION params (DISCRIMINATOR version)
            {
                IpV4Params (version IS 4)
                {
                    source[4];
                    dest[4];
                    src_port, 2;
                    dest_port, 2;
                    DSCP, 1;
                    proto, 1;
                    reserved, 1;
                }
                IpV6Params (version IS 6)
                {
                    source[16];
                    dest[16];
                    src_port, 2;
                    dest_port, 2;
                    flow_label[3];
                }
            };
        }
        Params8021dq (classifier_type IS 2)
        {
            tag_type, 2;
        }
    };
} // End IE TCLASS

const EID_RRM_BEACON_REPORTING     = 1;
const EID_RRM_BCN_REPORTING_DETAIL = 2;

IE BeaconReporting (EID_RRM_BEACON_REPORTING)
{
     reportingCondition, 1;
     threshold,          1;
}

IE BcnReportingDetail (EID_RRM_BCN_REPORTING_DETAIL)
{
     reportingDetail, 1;
}

IE APChannelReport (EID_AP_CHAN_REPORT)
{
     regulatoryClass, 1;
     channelList[0..50];
}

IE MeasurementRequest (EID_MEAS_REQUEST)  // 7.3.2.21
{
    measurement_token, 1;

    // Measurement Request Mode
    {
        parallel:          1;
        enable:            1;
        request:           1;
        report:            1;
        durationMandatory: 1;
        unused:            3;
    }

    measurement_type, 1;
    UNION measurement_request (DISCRIMINATOR measurement_type)
    {
       Basic (measurement_type IS 0)
       {
           channel_no,       1;
           meas_start_time[8];
           meas_duration,    2;
       }
       CCA (measurement_type IS 1)
       {
           channel_no,       1;
           meas_start_time[8];
           meas_duration,    2;
       }
       RPIHistogram (measurement_type IS 2)
       {
           channel_no,       1;
           meas_start_time[8];
           meas_duration,    2;
       }
       Beacon (measurement_type IS 5)
       {
          regClass,          1;
          channel,           1;
          randomization,     2;
          meas_duration,     2;
          meas_mode,         1;
          BSSID[6];
          OPTIE SSID;
          OPTIE BeaconReporting;
          OPTIE BcnReportingDetail;
          OPTIE RequestedInfo;
          OPTIE APChannelReport[0..2];
          //OPTIONAL vendor_specific[1..239];
       }

    };
}

const EID_BCN_REPORT_FRAME_BODY    = 1;
IE BeaconReportFrmBody (EID_BCN_REPORT_FRAME_BODY)
{
     reportedFields[0..224];
}

IE MeasurementReport (EID_MEAS_REPORT)    // 7.3.2.22
{
    token, 1;
    // Measurement Report Mode
    {
        late:      1;
        incapable: 1;
        refused:   1;
        unused:    5;
    }
    type, 1;
    OPTIONAL UNION report (DISCRIMINATOR type)
    {
        Basic (type IS 0)                 // 7.3.2.22.1
        {
            channel,         1;
            meas_start_time, 8;
            meas_duration,   2;
            // Map
            {
                bss:           1;
                ofdm_preamble: 1;
                unid_signal:   1;
                rader:         1;
                unmeasured:    1;
                unused:        3;
            }
        }
        CCA (type IS 1)
        {
            channel,           1;
            meas_start_time,   8;
            meas_duration,     2;
            cca_busy_fraction, 1;
        }
        RPIHistogram (type IS 2)
        {
            channel,         1;
            meas_start_time, 8;
            meas_duration,   2;
            rpi0_density,    1;
            rpi1_density,    1;
            rpi2_density,    1;
            rpi3_density,    1;
            rpi4_density,    1;
            rpi5_density,    1;
            rpi6_density,    1;
            rpi7_density,    1;
        }
       Beacon (type IS 5)
       {
           regClass,               1;
           channel,                1;
           meas_start_time,        8;
           meas_duration,          2;
           // reported_frame_info,
           {
              condensed_PHY:        7;
              reported_frame_type: 1;
           }
           RCPI,                   1;
           RSNI,                   1;
           BSSID[6];
           antenna_id,               1;
           parent_TSF,              4;
           OPTIE BeaconReportFrmBody;
           //IE vendor_specific
     }
    };
}

IE TSDelay (EID_TS_DELAY)                 // 7.3.2.32
{
    delay, 4;
}

IE TCLASSPROC (EID_TCLASS_PROC)           // 7.3.2.33
{
    processing, 1;
}

IE Schedule (EID_SCHEDULE)                // 7.3.2.34
{
    {
        aggregation: 1;
        tsid:        4;
        direction:   2;
        reserved:    9;
    }
    service_start_time, 4;
    service_interval,   4;
    max_service_dur,    2;
    spec_interval,      2;
}

IE QOSCapsAp (EID_QOS_CAPABILITY)           // 7.3.2.35
{
    {
        count:   4;
        qack:    1;
        qreq:    1;
        txopreq: 1;
        reserved: 1;
    }
}

IE QOSCapsStation (EID_QOS_CAPABILITY)           // 7.3.2.35
{
    {
        acvo_uapsd:    1;
        acvi_uapsd:    1;
        acbk_uapsd:    1;
        acbe_uapsd:    1;
        qack:          1;
        max_sp_length: 2;
        more_data_ack: 1;
    }
}

IE LinkIdentifier (EID_LINK_IDENTIFIER)          // 7.3.2.62
{
    bssid[6];
    InitStaAddr[6];
    RespStaAddr[6];
}

IE WPA (EID_VENDOR_SPECIFIC) OUI (0x00, 0x50, 0xF2, 0x01)
{
    // This IE's first two octets should be interpreted as a version number;
    // we only support version 1.
    version, 2 MUSTBE 1;
    // A four-octet Multicast Cipher may or may not appear next (hence the
    // OPTIONAL keyword)
    OPTIONAL multicast_cipher[4];
    // Optional Unicast Cipher count
    OPTIONAL unicast_cipher_count, 2;
    // Next comes an array of four-octet Cipher Suite selectors; the COUNTIS
    // clause indicates that the actual number of selectors seen is in the
    // member 'unicast_cipher_count'.
    unicast_ciphers[4][0..4] COUNTIS unicast_cipher_count;
    // (Optional) Authentication suites:
    OPTIONAL auth_suite_count, 2;
    auth_suites[4][0..4] COUNTIS auth_suite_count;
    // This field is declared optional as per bugs 15234, 14755, & 14991.
    OPTIONAL caps, 2;
}

IE WPAOpaque (EID_VENDOR_SPECIFIC) OUI (0x00, 0x50, 0xF2, 0x01)
{
    data[ 2..249 ];
}

IE WMMInfoStation (EID_VENDOR_SPECIFIC) OUI(0x00, 0x50, 0xF2, 0x02, 0x00)
{
    // This IE contains the QoS Info field when sent from WMM Station
    version, 1;
    {
        acvo_uapsd:    1;
        acvi_uapsd:    1;
        acbk_uapsd:    1;
        acbe_uapsd:    1;
        reserved1:     1;
        max_sp_length: 2;
        reserved2:     1;
    }
}

IE WMMInfoAp (EID_VENDOR_SPECIFIC) OUI(0x00, 0x50, 0xF2, 0x02, 0x00)
{
    // This IE contains the QoS Info field when sent from WMM AP
    version, 1;
    {
        param_set_count: 4;
        reserved:        3;
        uapsd:           1;
    }
}


IE WMMParams (EID_VENDOR_SPECIFIC) OUI(0x00, 0x50, 0xF2, 0x02, 0x01)
{
    version, 1 MUSTBE 1;
    qosInfo, 1;                           // ToDo: This is actually a
                                          // bitfield, but it's format
                                          // varies depending on whether
                                          // the sender is a STA or AP...
    reserved2, 1;
    {
        acbe_aifsn: 4;
        acbe_acm: 1;
        acbe_aci: 2;
        unused1: 1;
    }
    {
        acbe_acwmin: 4;
        acbe_acwmax: 4;
    }
    acbe_txoplimit, 2;
    {
        acbk_aifsn: 4;
        acbk_acm: 1;
        acbk_aci: 2;
        unused2: 1;
    }
    {
        acbk_acwmin: 4;
        acbk_acwmax: 4;
    }
    acbk_txoplimit, 2;
    {
        acvi_aifsn: 4;
        acvi_acm: 1;
        acvi_aci: 2;
        unused3: 1;
    }
    {
        acvi_acwmin: 4;
        acvi_acwmax: 4;
    }
    acvi_txoplimit, 2;
    {
        acvo_aifsn: 4;
        acvo_acm: 1;
        acvo_aci: 2;
        unused4: 1;
    }
    {
        acvo_acwmin: 4;
        acvo_acwmax: 4;
    }
    acvo_txoplimit, 2;
}

IE WMMTSPEC (EID_VENDOR_SPECIFIC) OUI (0x00, 0x50, 0xf2, 0x02, 0x02)
{
    version, 1 MUSTBE 1;

    // TS Info
    {
        traffic_type:    1;
        tsid:            4;
        direction:       2;
        access_policy:   2;
        aggregation:     1;
        psb:             1;
        user_priority:   3;
        tsinfo_ack_pol:  2;
    }
    {
       tsinfo_rsvd:      7;
       burst_size_defn:  1;
    }

    // Nominal MSDU Size
    {
        size:  15;
        fixed: 1;
    }

    max_msdu_size,        2;
    min_service_int,      4;
    max_service_int,      4;
    inactivity_int,       4;
    suspension_int,       4;
    service_start_time,   4;
    min_data_rate,        4;
    mean_data_rate,       4;
    peak_data_rate,       4;
    burst_size,           4;
    delay_bound,          4;
    min_phy_rate,         4;
    surplus_bw_allowance, 2;
    medium_time,          2;

} // End IE WMMTSpec.

IE WMMCaps (EID_VENDOR_SPECIFIC) OUI (0x00, 0x50, 0xF2, 0x02, 0x05)
{
    version, 1 MUSTBE 1;
    {
        reserved:      4;
        qack:          1;
        queue_request: 1;
        txop_request:  1;
        more_ack:      1;
    }
}

IE WMMTCLAS (EID_VENDOR_SPECIFIC) OUI (0x00, 0x50, 0xF2, 0x02, 0x06)
{
    version, 1 MUSTBE 1;

    user_priority, 1;
    classifier_type, 1;
    classifier_mask, 1;
    UNION info (DISCRIMINATOR classifier_type)
    {
        EthParams (classifier_type IS 0)
        {
            source[6];
            dest[6];
            type, 2;
        }
        IpParams (classifier_type IS 1)
        {
            version, 1;
            UNION params (DISCRIMINATOR version)
            {
                IpV4Params (version IS 4)
                {
                    source[4];
                    dest[4];
                    src_port, 2;
                    dest_port, 2;
                    DSCP, 1;
                    proto, 1;
                    reserved, 1;
                }
                IpV6Params (version IS 6)
                {
                    source[16];
                    dest[16];
                    src_port, 2;
                    dest_port, 2;
                    flow_label[3];
                }
            };
        }
        Params8021dq (classifier_type IS 2)
        {
            tag_type, 2;
        }
    };

}

IE WMMTCLASPROC (EID_VENDOR_SPECIFIC) OUI (0x00, 0x50, 0xF2, 0x02, 0x07)
{
    version, 1 MUSTBE 1;
    processing, 1;
}

IE WMMTSDelay (EID_VENDOR_SPECIFIC) OUI (0x00, 0x50, 0xF2, 0x02, 0x08)
{
    version, 1 MUSTBE 1;
    delay, 4;
}

IE WMMSchedule (EID_VENDOR_SPECIFIC) OUI (0x00, 0x50, 0xF2, 0x02, 0x09)
{
    version, 1 MUSTBE 1;

    {
        aggregation: 1;
        tsid:        4;
        direction:   2;
        reserved:    9;
    }

    service_start_time, 4;
    service_interval,   4;
    max_service_dur,    2;
    spec_interval,      2;
}

IE ESERadMgmtCap (EID_VENDOR_SPECIFIC) OUI (0x00, 0x40, 0x96, 0x01)
{

    mgmt_state,  1;

    {
        mbssid_mask:    3;
        reserved:       5;
    }

}

IE hs20vendor_ie (EID_VENDOR_SPECIFIC) OUI (0x50, 0x6F, 0x9A, 0x10)
{
    /* hotspot_configurations */
    {
        dgaf_dis:               1;
        hs_id_present:          2;
        reserved:               1;
        release_num:            4;
    }
    OPTIONAL UNION hs_id (DISCRIMINATOR hs_id_present)
    {
        pps_mo (hs_id_present IS 1)
        {
            pps_mo_id,          2;
        }
        anqp_domain (hs_id_present IS 2)
        {
            anqp_domain_id,     2;
        }
    };
}

IE ESETrafStrmMet (EID_VENDOR_SPECIFIC) OUI (0x00, 0x40, 0x96, 0x07)
{
    tsid,           1;
    state,          1;
    msmt_interval,  2;
}

IE ESETrafStrmRateSet (EID_VENDOR_SPECIFIC) OUI (0x00, 0x40, 0x96, 0x08)
{
    tsid,         1;
    tsrates[0..8];
}

IE ESEVersion (EID_VENDOR_SPECIFIC) OUI (0x00, 0x40, 0x96, 0x03)
{
    version,           1;
}

IE ESETxmitPower (EID_ESE_SPECIFIC) OUI (0x00, 0x40, 0x96, 0x00)
{
    power_limit,    1;
    reserved,       1;
}

IE ESECckmOpaque (EID_ESE_CCKM_SPECIFIC) OUI (0x00, 0x40, 0x96, 0x00)
{
    data[ 6..20 ];
}

IE RRMEnabledCap (EID_RRM_ENABLED_CAPS)
{
     //Capability bitmap
     {
          LinkMeasurement:         1;
          NeighborRpt:             1;
          parallel:                1;
          repeated:                1;
          BeaconPassive:           1;
          BeaconActive:            1;
          BeaconTable:             1;
          BeaconRepCond:           1;
     }
     {
          FrameMeasurement:        1;
          ChannelLoad:             1;
          NoiseHistogram:          1;
          statistics:              1;
          LCIMeasurement:          1;
          LCIAzimuth:              1;
          TCMCapability:           1;
          triggeredTCM:            1;
     }
     {
          APChanReport:            1;
          RRMMIBEnabled:           1;
          operatingChanMax:        3;
          nonOperatinChanMax:      3;
     }
     {
          MeasurementPilot:        3;
          MeasurementPilotEnabled: 1;
          NeighborTSFOffset:       1;
          RCPIMeasurement:         1;
          RSNIMeasurement:         1;
          BssAvgAccessDelay:       1;
     }
     {
          BSSAvailAdmission:       1;
          AntennaInformation:      1;
          reserved:                6;
     }
}

IE MeasurementPilot (EID_RRM_MEAS_PILOT_TX_INFO)
{
     measurementPilot, 1;
     vendorSpecific[0..255]; //Should be an IE. But currently only one level of nesting allowed. Can ignore for now.
}

IE MultiBssid (EID_MULTIPLE_BSSID)
{
     maxBSSIDIndicator, 1;
     vendorSpecific[0..255];
}

IE OBSSScanParameters (EID_OBSS_SCAN_PARAMETERS)
{
    obssScanPassiveDwell, 2;
	obssScanActiveDwell, 2;
	bssChannelWidthTriggerScanInterval, 2;
	obssScanPassiveTotalPerChannel, 2;
	obssScanActiveTotalPerChannel, 2;
	bssWidthChannelTransitionDelayFactor, 2;
    obssScanActivityThreshold, 2;
}

IE HT2040BSSCoexistence (EID_20_40_BSS_COEXISTENCE)
{
     // 20/40 BSS Coexistence Information
    {
        infoRequest:             1;
        fortyMHzIntolerant:      1;
        twentyMHzBssWidthReq:    1;
        obssScanExemptionReq:    1;
        obssScanExemptionGrant:  1;
        unused:                  3;
    }
}

IE HT2040BSSIntolerantReport (EID_20_40_BSS_INTOLERANT_REPORT)
{
     operatingClass, 1;
     channelList[0..50];
}

const EID_RRM_NBR_RPT_TSF              =    1;
const EID_RRM_NBR_CD_COUNTRY           =    2;
const EID_RRM_NBR_MSMT_PILOT_TX_INFO   =   66;

IE NeighborReport (EID_NEIGHBOR_REPORT)
{
     bssid[6];
     //Bssid Info
     {
          APReachability: 2;
          Security:       1;
          KeyScope:       1;
          //Capabilities
          SpecMgmtCap:    1;
          QosCap:         1;
          apsd:           1;
          rrm:            1;
     }
     //Capabilities contd.
     {
          DelayedBA:      1;
          ImmBA:          1;
     //Capabilities end.
          MobilityDomain: 1;
          reserved:       5;
     }

          reserved1,      2; //part of BSSID Info.

     regulatoryClass, 1;
     channel,         1;
     PhyType,         1;
     OPTIE IE TSFInfo (EID_RRM_NBR_RPT_TSF)
     {
          TsfOffset, 2;
          BeaconIntvl, 2;
     }
     OPTIE IE CondensedCountryStr (EID_RRM_NBR_CD_COUNTRY)
     {
          countryStr[2];
     }
     OPTIE IE MeasurementPilot; // (EID_RRM_NBR_MSMT_PILOT_TX_INFO)
//     {
//          measurementPilot, 1;
//          vendorSpecific[0..255]; //Should be an IE. But currently only one level of nesting allowed. Can ignore for now.
//     }
     OPTIE IE RRMEnabledCap;
     OPTIE IE MultiBssid;
     //Ignoring vendor specific.
}

IE RCPIIE (EID_RCPI)
{
     rcpi, 1;
}

IE RSNIIE (EID_RSNI)
{
     rsni, 1;
}

IE WFATPC (EID_VENDOR_SPECIFIC) OUI (0x00, 0x50, 0xF2, 0x08, 0x00)
{
     txPower, 1;
     linkMargin, 1;
}

IE MobilityDomain (EID_FT_MOBILITY_DOMAIN)
{
   MDID, 2;
   //FT Capability and policy
   {
      overDSCap:         1;
      resourceReqCap:    1;
      reserved:          6;
   }
}
const SUB_EID_FT_R1KH_ID = 1;
const SUB_EID_FT_GTK     = 2;
const SUB_EID_FT_R0KH_ID = 3;
const SUB_EID_FT_IGTK    = 4;
IE FTInfo (EID_FT_INFO)
{
   // MicControl, 2;
   {
      reserved: 8;
      IECount:  8;
   }
   MIC[16];
   Anonce[32];
   Snonce[32];

   OPTIE IE R1KH_ID (SUB_EID_FT_R1KH_ID)
   {
      PMK_R1_ID[6];
   }

   OPTIE IE GTK (SUB_EID_FT_GTK)
   {
      //Key Info
      {
         keyId: 2;
         reserved: 14;
      }
      keyLength, 1;
      RSC[8];
      key[5..32];
   }

   OPTIE IE R0KH_ID (SUB_EID_FT_R0KH_ID)
   {
      PMK_R0_ID[1..48];
   }

   OPTIE IE IGTK (SUB_EID_FT_IGTK)
   {
      //Key Info
      keyID[2];
      IPN[6];
      keyLength, 1;
      key[24];
   }
}

IE TimeoutInterval (EID_TIMEOUT_INTERVAL)
{
   timeoutType, 1;
   timeoutValue, 4;
}

//TODO: need to define this properly.
IE RICData (EID_FT_RIC_DATA)
{
   Identifier, 1;
   resourceDescCount, 1;
   statusCode, 2;
}

IE RICDescriptor (EID_FT_RIC_DESCRIPTOR)
{
   resourceType, 1;
   variableData[0..255]; //Block ack param set...TODO:
}

IE WscIEOpaque (EID_VENDOR_SPECIFIC) OUI ( 0x00, 0x50, 0xF2, 0x04 )
{
    data[ 2..249 ];
}

IE P2PIEOpaque (EID_VENDOR_SPECIFIC) OUI ( 0x50, 0x6F, 0x9A, 0x09 )
{
    data[ 2..249 ];
}

IE WFDIEOpaque (EID_VENDOR_SPECIFIC) OUI ( 0x50, 0x6F, 0x9A, 0x0A )
{
    data[ 2..249 ];
}

IE PTIControl (EID_PTI_CONTROL)                 // 7.3.2.65
{
    tid,                  1;
    sequence_control,     2;
}

IE PUBufferStatus (EID_PU_BUFFER_STATUS)        // 7.3.2.66
{
    {
        ac_bk_traffic_aval:          1;
        ac_be_traffic_aval:          1;
        ac_vi_traffic_aval:          1;
        ac_vo_traffic_aval:          1;
        reserved:    4;
    }
}


/////////////////////////////////////////////////////////////////////////////
// Airgo Information Elements


IE Airgo (EID_VENDOR_SPECIFIC) OUI (0x00, 0x0A, 0xF5)
{
    // N.B. The fact that these IEs are defined inside the Airgo IE indicates
    // that they can *only* occur inside the Airgo IE.

    OPTIE IE PropSuppRates (SIR_MAC_PROP_EXT_RATES_TYPE)
    {
        rates[1..12];
    }

    OPTIE IE APName (SIR_MAC_PROP_AP_NAME_TYPE)
    {
        name[1..32];
    }

    OPTIE IE HCF (SIR_MAC_PROP_HCF_TYPE)
    {
        enabled, 1;
    }

    OPTIE IE WDS (SIR_MAC_PROP_WDS_TYPE)
    {
        wdsData[0..ANI_WDS_INFO_MAX_LENGTH];
    }

    OPTIE IE BPIndicator (SIR_MAC_PROP_BP_IND_TYPE)
    {
        indicator, 1;
        type, 1;
    }


    // In Progress: I think SIR_MAC_PROP_NEIGHBOR_BSS_TYPE is going to need a
    // custom parser...


    OPTIE IE LoadInfo (SIR_MAC_PROP_LOAD_INFO_TYPE) MSB
    {
        num_stas, 2;
        channel_util, 2;
    }

    OPTIE IE LoadBalance (SIR_MAC_PROP_LOAD_BALANCE_TYPE)
    {
        bssid[6];
        channel, 1;
    }

    OPTIE IE PropAssocType (SIR_MAC_PROP_ASSOC_TYPE)
    {
        type, 1;
    }

    OPTIE IE LLAttr (SIR_MAC_PROP_LL_ATTR_TYPE) MSB
    {
        defer_threshold, 4;
    }

    OPTIE IE PropCapability (SIR_MAC_PROP_CAPABILITY)
    {
        capability, 2;
    }

    OPTIE IE Version (SIR_MAC_PROP_VERSION)
    {
        chip_rev, 4;
        card_type, 1;
        build_version[0..20];
    }

    OPTIE IE PropEDCAParams (SIR_MAC_PROP_EDCAPARAMS)
    {
        qos, 1;                 // ToDo: This is a bitfield whose format
                                // depends on whether this is from an AP
                                // or a STA, information which I'm not
                                // sure we have at parse time...
        reserved, 1;

        // Best Effort
        {
            acbe_aifsn: 4;
            acbe_acm:   1;
            acbe_aci:   2;
            unused1:    1;
        }
        {
            acbe_min: 4;
            acbe_max: 4;
        }
        acbe_txoplimit, 2;

        // Background
        {
            acbk_aifsn: 4;
            acbk_acm:   1;
            acbk_aci:   2;
            unused2:    1;
        }
        {
            acbk_min: 4;
            acbk_max: 4;
        }
        acbk_txoplimit, 2;

        // Video
        {
            acvi_aifsn: 4;
            acvi_acm: 1;
            acvi_aci: 2;
            unused3:    1;
        }
        {
            acvi_min: 4;
            acvi_max: 4;
        }
        acvi_txoplimit, 2;

        // Voice
        {
            acvo_aifsn: 4;
            acvo_acm: 1;
            acvo_aci: 2;
            unused4:    1;
        }
        {
            acvo_min: 4;
            acvo_max: 4;
        }
        acvo_txoplimit, 2;

    } // End IE PropEDCAParams.

    /**
     * \ie Titan
     *
     * \brief Proprietary Next Generation (TITAN) IE structure
     *
     *
     * Based on the setting of the "Titan" proprietary bit in the
     * tSirPropIEStruct.capability field (bit #6), this IE will be sent
     * appropriately to all the ANIpeers in the following management frames -
     *
     * - Beacons
     * - Assoc Req/Rsp
     * - Reassoc Req/Rsp
     * - Probe Req/Rsp
     *
     */

    OPTIE IE Titan (SIR_MAC_PROP_TITAN)
    {
        concat_tcid_bitmap, 1;
        compression_tcid_bitmap, 1;

        // Identifies the OPERATIONAL state of Channel Bonding
        // This info is encoded as a bitmap as follows:
        //
        //     b7    b6   b5  b4  b3  b2  b1  b0
        // --------------------------------------
        // |CCA_CB |CCA |ICE | AU|CS|U/D| O | A |
        // --------------------------------------
        // where,
        // A   - Admin state of CB - [enabled(1)/disabled(0)]
        // O   - Oper state of CB - [on(1)/off(0)]
        // U/D - Indicates where the secondary CB channel is
        //       parked - Up(1)/Down(0) from the primary
        // CS  - Channel Switch announcement in progress with
        //       respect to the secondary CB channel
        //       CS_on(1)/CS_off(0)
        //       This applies to an AP only
        // AU  - Autonomous updates. This indicates to an STA
        //       that it can send an unsolicited CB Report
        //       regarding its neighbor BSS during an Assoc/
        //       ReAssoc REQ.
        //       AU_on(1)/AU_off(0)
        //       This applies to an AP only
        // ICE - Intelligent Channel Expansion mode enable/disable
        //       ICE_on(1)/ICE_off(0)
        // CCA - CCA mode to be used
        //       CCA_20MHz(0)/CCA_40MHz(1)
        // CCA_CB  - channel bonding enable/disable based on cca monitoring
        //           enable(1)/disable(0)

        cb_state, 1;

        // Identifies Reverse FCS pattern and state
        // This info is encoded as a bitmap as follows:
        //
        //  b7  b6  b5  b4  b3  b2  b1  b0
        // ---------------------------------
        // | X | X | X | X | P | P | P | O |
        // ---------------------------------
        // where,
        // O   - Oper state of Reverse FCS - [on(1)/off(0)]
        // P   - Identifies the pattern ID to be used
        // NOTE - These bits are used only during Assoc Req/Rsp
        // management frames. Thus, the pattern ID needs to be
        // looked up only during Assoc Req/Rsp. In other words,
        // the pattern ID between an AP/STA is negotiated via
        // the revFcsState during Assoc Req/Rsp

        rev_fcs_state, 1;
    }

    OPTIE IE PropChannSwitchAnn (SIR_MAC_PROP_CHANNEL_SWITCH)
    {
        mode,                 1;
        primary_channel,      1;
        sub_band,             1;
        channel_switch_count, 1;
    }

    /**
     * \ie PropQuietBSS
     *
     * \brief Proprietary Quite BSS IE structure
     *
     *
     * Based on the setting of the "Titan" proprietary bit in the
     * tSirPropIEStruct.capability field (bit #6), this IE will be sent
     * appropriately to all the ANI peers in the following management
     * frames
     *
     * - Beacons
     * - Probe Rsp
     *
     */

    OPTIE IE PropQuietBSS (SIR_MAC_PROP_QUIET_BSS)
    {
        // Indicates the number of TBTT's until the next beacon
        // interval during which the next quiet interval will
        // start
        // 1 - Quiet Interval will start during the beacon
        // interval starting at the next TBTT
        // 0 - Reserved
        quiet_count, 1;

        // Shall be set to the number of beacon intervals between
        // the start of regularly scheduled quiet intervals
        // defined by this Quiet Element
        // 0 - No periodic quiet interval is defined
        quiet_period, 1;

        // Duration of the quiet interval, expressed in TUs
        // 1 TU = 1024 microseconds??
        quiet_duration, 2;

        // Set to the offset of the start of the quiet interval
        // from the TBTT specified by the quietCount field,
        // expressed in TUs. The value of this offset field will
        // be less than one beacon interval
        // 1 TU = 1024 microseconds??
        quiet_offset, 2;

    }

    OPTIE IE TriggerStaBgScan (SIR_MAC_PROP_TRIG_STA_BK_SCAN)
    {
        enable, 1;
    }

    OPTIE IE Taurus (SIR_MAC_PROP_TAURUS)
    {
        // TID bitmap indicating the TIDs for which BA is setup.
        // bit0 for TID0, bit1 for TID1 and so on.
        baTIDBitmap, 2;

        // Block Ack Policy: 0-Delayed BA 1-Immediate BA.
        // One bit for each TID
        baPolicy, 2;

        // Buffer size for each AC, in exponential notation.
        // 3 bits reserved for each AC.
        // bit0-2 for AC0[TID 0 and 3], bit3-5 for AC1[TID 1 and 2]
        // and so on.

        // TID 8 & 11 will use AC0, TID 9 & 10 will use AC1, so use of AC is
        // overloaded.  This is done to reduce the size of IE in the beacons.
        {
            baBufferSize: 12;
            rsvd:          4;
        }
    }

} // End IE Airgo.

IE VHTCaps (EID_VHT_CAPABILITIES)
{
    //VHT Capability Info
    {
        maxMPDULen:               2;
        supportedChannelWidthSet: 2;
        ldpcCodingCap:            1;
        shortGI80MHz:             1;
        shortGI160and80plus80MHz: 1;
        txSTBC:                   1;
        rxSTBC:                   3;
        suBeamFormerCap:          1;
        suBeamformeeCap:          1;
        csnofBeamformerAntSup:    3;
        numSoundingDim:           3;
        muBeamformerCap:          1;
        muBeamformeeCap:          1;
        vhtTXOPPS:                1;
        htcVHTCap:                1;
        maxAMPDULenExp:           3;
        vhtLinkAdaptCap:          2;
        rxAntPattern:             1;
        txAntPattern:             1;
        reserved1:                2;
    }
    rxMCSMap,                     2;
    {
         rxHighSupDataRate:       13;
         reserved2:               3;
    }
    txMCSMap,                     2;
    {
        txSupDataRate:            13;
        reserved3:                3;
    }
}

IE VHTOperation (EID_VHT_OPERATION_ELEMENT)
{
    chanWidth,           1;
    chanCenterFreqSeg1,  1;
    chanCenterFreqSeg2,  1;
    basicMCSSet,         2;
}

IE VHTExtBssLoad (EID_VHT_EXT_BSS_LOAD)
{
    muMIMOCapStaCount,    1;
    ssUnderUtil,          1;
    FortyMHzUtil,         1;
    EightyMHzUtil,        1;
    OneSixtyMHzUtil,      1;
}

IE AID (EID_AID)
{
    assocId,              2;
}

IE WiderBWChanSwitchAnn (EID_WIDER_BW_CHANNEL_SWITCH_ANN)
{
   newChanWidth,          1;
   newCenterChanFreq0,    1;
   newCenterChanFreq1,    1;
}

IE ExtCap (EID_EXT_CAP)
{
   bytes[1..9];
}

IE HTCaps (EID_HT_CAPABILITIES)
{
    // HT Capability Info
    {
        advCodingCap:             1;
        supportedChannelWidthSet: 1;
        mimoPowerSave:            2;
        greenField:               1;
        shortGI20MHz:             1;
        shortGI40MHz:             1;
        txSTBC:                   1;
        rxSTBC:                   2;
        delayedBA:                1;
        maximalAMSDUsize:         1;
        dsssCckMode40MHz:         1;
        psmp:                     1;
        stbcControlFrame:         1;
        lsigTXOPProtection:       1;
    }
    // HT Parameters Info;
    {
        maxRxAMPDUFactor: 2;
        mpduDensity:      3;
        reserved1:        3;
    }

    supportedMCSSet[ HT_MAX_SUPPORTED_MCS_SET ];

    // Extended HT Capability Info
    {
        pco:            1;
        transitionTime: 2;
        reserved2:      5;
        mcsFeedback:    2;
        reserved3:      6;
    }
    // TXBF Capability Info
    {
        txBF:                                       1;
        rxStaggeredSounding:                        1;
        txStaggeredSounding:                        1;
        rxZLF:                                      1;
        txZLF:                                      1;
        implicitTxBF:                               1;
        calibration:                                2;
        explicitCSITxBF:                            1;
        explicitUncompressedSteeringMatrix:         1;
        explicitBFCSIFeedback:                      3;
        explicitUncompressedSteeringMatrixFeedback: 3;
        explicitCompressedSteeringMatrixFeedback:   3;
        csiNumBFAntennae:                           2;
        uncompressedSteeringMatrixBFAntennae:       2;
        compressedSteeringMatrixBFAntennae:         2;
        reserved4:           7;
    }
    // AS Capability Info
    {
        antennaSelection:         1;
        explicitCSIFeedbackTx:    1;
        antennaIndicesFeedbackTx: 1;
        explicitCSIFeedback:      1;
        antennaIndicesFeedback:   1;
        rxAS:                     1;
        txSoundingPPDUs:          1;
        reserved5:                1;
    }
    //TODO: take it out when generic fix to remove extra bytes in IE is available.
    //This is required to interop with Dlink AP which is sending 2 bytes extra in HTInfo IE.
    rsvd[0..32];

} // End IE HTCaps.

IE HTInfo (EID_HT_INFO)
{
    primaryChannel, 1;

    // ahtInfoField1
    {
        secondaryChannelOffset:     2;
        recommendedTxWidthSet:      1;
        rifsMode:                   1;
        controlledAccessOnly:       1;
        serviceIntervalGranularity: 3;
    }

    // ahtInfoField2


    // ahtInfoField2
    {
        opMode:              2;
        nonGFDevicesPresent: 1;
        transmitBurstLimit: 1;
        obssNonHTStaPresent:1;
        reserved:           11;
    }


    // ahtInfoField3
    {
        basicSTBCMCS:                  7;
        dualCTSProtection:             1;
        secondaryBeacon:               1;
        lsigTXOPProtectionFullSupport: 1;
        pcoActive:                     1;
        pcoPhase:                      1;
        reserved2:                     4;
    }

    basicMCSSet[ HT_MAX_SUPPORTED_MCS_SET ];

    //TODO: take it out when generic fix to remove extra bytes in IE is available.
    //This is required to interop with Dlink AP which is sending 2 bytes extra in HTInfo IE.
    rsvd[0..32];

} // End IE HTInfo.


IE OperatingMode (EID_OPERATING_MODE)
{
    { //Operating Mode field
        chanWidth:    2;
        reserved:     2;
        rxNSS:        3;
        rxNSSType:    1;
    }
}

IE QosMapSet (EID_QOS_MAP_SET)
{
    dscp_exceptions[0..60];
}

CONTAINERIE RICDataDesc
{
  MANDIE RICData;
  OPTIE  RICDescriptor;
  OPTIE  TSPEC;
  OPTIE  TCLAS[0..2];
  OPTIE  TCLASSPROC;
  OPTIE  TSDelay;
  OPTIE  Schedule;
  OPTIE  WMMTSPEC;
  OPTIE  WMMTCLAS[0..2];
  OPTIE  WMMTCLASPROC;
  OPTIE  WMMTSDelay;
  OPTIE  WMMSchedule;
}

/////////////////////////////////////////////////////////////////////////////
//                                MULTIIEs                                 //
/////////////////////////////////////////////////////////////////////////////

MULTIIE WSC ( EID_VENDOR_SPECIFIC ) OUI( 0x00, 0x50, 0xF2, 0x04 )
{
    MANDATORYTLV Version;                               // Must be 0x10
    OPTIONALTLV  WPSState;
    OPTIONALTLV  APSetupLocked;
    OPTIONALTLV  SelectedRegistrarConfigMethods;
    OPTIONALTLV  UUID_E;
    OPTIONALTLV  UUID_R;
    OPTIONALTLV  RFBands;
    OPTIONALTLV  SelectedRegistrar;
    OPTIONALTLV  ConfigMethods;
    OPTIONALTLV  AssociationState;
    OPTIONALTLV  ConfigurationError;
    OPTIONALTLV  Manufacturer;
    OPTIONALTLV  ModelName;
    OPTIONALTLV  ModelNumber;
    OPTIONALTLV  SerialNumber;
    OPTIONALTLV  DeviceName;
    OPTIONALTLV  DevicePasswordID;
    OPTIONALTLV  PrimaryDeviceType;
    OPTIONALTLV  RequestType;
    OPTIONALTLV  ResponseType;
    OPTIONALTLV  VendorExtension;
    OPTIONALTLV  RequestDeviceType;
}

MULTIIE WscBeacon ( EID_VENDOR_SPECIFIC ) OUI( 0x00, 0x50, 0xF2, 0x04 )
{
    MANDATORYTLV Version;                        // 0x10 = version 1.0, 0x11
                                                 // = version 1.1, etc.
    MANDATORYTLV WPSState;                       // 1 = unconfigured, 2 =
                                                 // configured
    OPTIONALTLV  APSetupLocked;                  // Must be included if value
                                                 // is TRUE
    OPTIONALTLV  SelectedRegistrar;              // BOOL: indicates if the
                                                 // user has recently
                                                 // activated a Registrar to
                                                 // add an Enrollee.
    OPTIONALTLV  DevicePasswordID;               // Device Password ID
                                                 // indicates the method or
                                                 // identifies the specific
                                                 // password that the
                                                 // selected Registrar
                                                 // intends to use.
    OPTIONALTLV  SelectedRegistrarConfigMethods; // This attribute contains
                                                 // the config methods active
                                                 // on the selected
                                                 // Registrar.
    OPTIONALTLV  UUID_E;                         // The AP's UUID is provided
                                                 // only when the AP is a
                                                 // dual-band AP in push
                                                 // button mode and
                                                 // indicating push button
                                                 // mode on both radios
    OPTIONALTLV  RFBands;                        // Indicates all RF bands
                                                 // available on the AP. A
                                                 // dual-band AP must provide
                                                 // this attribute.
    // WSC 2.0
    OPTIONALTLV  VendorExtension;                // Version2 and AuthorizedMACs

} // End Multi-IE WscBeacon.

MULTIIE WscAssocReq ( EID_VENDOR_SPECIFIC ) OUI( 0x00, 0x50, 0xF2, 0x04 )
{
    MANDATORYTLV Version;                        // 0x10 = version 1.0, 0x11
                                                 // = version 1.1, etc.
    MANDATORYTLV RequestType;                    //
                                                 //
    // WSC 2.0
    OPTIONALTLV  VendorExtension;                // Version2

} // End Multi-IE WscAssocReq.


MULTIIE WscAssocRes ( EID_VENDOR_SPECIFIC ) OUI( 0x00, 0x50, 0xF2, 0x04 )
{
    MANDATORYTLV Version;                        // 0x10 = version 1.0, 0x11
                                                 // = version 1.1, etc.
    MANDATORYTLV ResponseType;                   //
                                                 //
    // WSC 2.0
    OPTIONALTLV  VendorExtension;                // Version2

} // End Multi-IE WscAssocRes.

MULTIIE WscReassocRes ( 221 ) OUI( 0x00, 0x50, 0xF2, 0x04 )
{
    MANDATORYTLV Version;                        // 0x10 = version 1.0, 0x11
                                                 // = version 1.1, etc.
    MANDATORYTLV ResponseType;                   //
                                                 //
    // WSC 2.0
    OPTIONALTLV  VendorExtension;                // Version2

} // End Multi-IE WscReassocRes

MULTIIE WscProbeReq ( EID_VENDOR_SPECIFIC ) OUI( 0x00, 0x50, 0xF2, 0x04 )
{
    MANDATORYTLV Version;                        // 0x10 = version 1.0, 0x11
                                                 // = version 1.1, etc.
    MANDATORYTLV RequestType;                    //
                                                 //
    MANDATORYTLV ConfigMethods;                  // Configuration methods the
                                                 // Enrollee or Registrar
                                                 // supports
    MANDATORYTLV UUID_E;                         // unique GUID generated by
                                                 // the Enrollee.
    MANDATORYTLV PrimaryDeviceType;
    MANDATORYTLV RFBands;                        // Specific RF bands used
                                                 // for this message
    MANDATORYTLV AssociationState;               // Configuration and previous
                                                 // association state
    MANDATORYTLV ConfigurationError;
    MANDATORYTLV DevicePasswordID;

    // WSC 2.0
    OPTIONALTLV  Manufacturer;                   // Must be included in ver 2.0
                                                 // or higher.
    OPTIONALTLV  ModelName;                      // Must be included in ver 2.0
                                                 // or higher.
    OPTIONALTLV  ModelNumber;                    // Must be included in ver 2.0
                                                 // or higher.
    OPTIONALTLV  DeviceName;                     // Must be included in ver 2.0
                                                 // or higher.
    OPTIONALTLV  VendorExtension;                // Version2 and RequestToEntroll

    OPTIONALTLV  RequestDeviceType;              // When a device receives a Probe
                                                 // Request containing this type,
                                                 // It will only reponse if Primary
                                                 // or Secondary Device Type matches.

} // End Multi-IE WscProbeReq.

MULTIIE WscProbeRes ( EID_VENDOR_SPECIFIC ) OUI( 0x00, 0x50, 0xF2, 0x04 )
{
    MANDATORYTLV Version;                        // 0x10 = version 1.0, 0x11
                                                 // = version 1.1, etc.
    MANDATORYTLV WPSState;                       // 1 = unconfigured, 2 =
                                                 // configured
    OPTIONALTLV  APSetupLocked;                  // Must be included if value
                                                 // is TRUE
    OPTIONALTLV  SelectedRegistrar;              // BOOL: indicates if the
                                                 // user has recently
                                                 // activated a Registrar to
                                                 // add an Enrollee.
    OPTIONALTLV  DevicePasswordID;               // Device Password ID
                                                 // indicates the method or
                                                 // identifies the specific
                                                 // password that the
                                                 // selected Registrar
                                                 // intends to use.
    OPTIONALTLV  SelectedRegistrarConfigMethods; // This attribute contains
                                                 // the config methods active
                                                 // on the selected
                                                 // Registrar.
    MANDATORYTLV ResponseType;
    MANDATORYTLV UUID_E;                         // unique identifier of AP
    MANDATORYTLV Manufacturer;
    MANDATORYTLV ModelName;
    MANDATORYTLV ModelNumber;
    MANDATORYTLV SerialNumber;
    MANDATORYTLV PrimaryDeviceType;
    MANDATORYTLV DeviceName;                     // User-friendly description
                                                 // of device
    MANDATORYTLV ConfigMethods;                  // Config Methods corresponds
                                                 // to the methods the AP
                                                 // supports as an Enrollee
                                                 // for adding external
                                                 // Registrars.
    OPTIONALTLV RFBands;                         // Indicates all RF bands
                                                 // available on the AP. A
                                                 // dual-band AP must provide
                                                 // this attribute.
    // WSC 2.0
    OPTIONALTLV  VendorExtension;                // Version2 and AuthorizedMACs

} // WscProbeRes.

// This MULTIIE combines the fields from the WSC IEs as they appear in
// Beacons *and* in Probe Responses, with the difference that they're all
// optional.  In our device drivers, we combine Probe Responses and Beacons
// into one list, and parse their IEs later (c.f. frame BeaconIEs).  Because
// the WSC IE differs in those two frames, we'd often see warning messages
// about either unexpected fields showing up (if we thought we were parsing a
// Beacon, and we in fact had data from a Probe Response) or mandatory fields
// missing (if we thought we were parsing a Probe Response, and in fact had
// data from a Beacon).

// I created this MULTIIE to stuff into the BeaconIEs frames to avoid this.
// It's intended to be used on unpack only, and to do so in a very forgiving
// way.

MULTIIE WscBeaconProbeRes ( EID_VENDOR_SPECIFIC ) OUI( 0x00, 0x50, 0xF2, 0x04 )
{
    OPTIONALTLV Version;                        // 0x10 = version 1.0, 0x11
                                                 // = version 1.1, etc.
    OPTIONALTLV WPSState;                       // 1 = unconfigured, 2 =
                                                 // configured
    OPTIONALTLV  APSetupLocked;                  // Must be included if value
                                                 // is TRUE
    OPTIONALTLV  SelectedRegistrar;              // BOOL: indicates if the
                                                 // user has recently
                                                 // activated a Registrar to
                                                 // add an Enrollee.
    OPTIONALTLV  DevicePasswordID;               // Device Password ID
                                                 // indicates the method or
                                                 // identifies the specific
                                                 // password that the
                                                 // selected Registrar
                                                 // intends to use.
    OPTIONALTLV  SelectedRegistrarConfigMethods; // This attribute contains
                                                 // the config methods active
                                                 // on the selected
                                                 // Registrar.
    OPTIONALTLV ResponseType;
    OPTIONALTLV UUID_E;                         // unique identifier of AP
    OPTIONALTLV Manufacturer;
    OPTIONALTLV ModelName;
    OPTIONALTLV ModelNumber;
    OPTIONALTLV SerialNumber;
    OPTIONALTLV PrimaryDeviceType;
    OPTIONALTLV DeviceName;                     // User-friendly description
                                                 // of device
    OPTIONALTLV ConfigMethods;                  // Config Methods corresponds
                                                 // to the methods the AP
                                                 // supports as an Enrollee
                                                 // for adding external
                                                 // Registrars.
    OPTIONALTLV RFBands;                         // Indicates all RF bands
                                                 // available on the AP. A
                                                 // dual-band AP must provide
                                                 // this attribute.
    // WSC 2.0
    OPTIONALTLV  VendorExtension;                // Version2 and AuthorizedMACs

} // WscProbeRes.
/////////////////////////////////////////////////////////////////////////////
//                                MULTIIEs                                 //
/////////////////////////////////////////////////////////////////////////////

MULTIIE P2PBeacon ( EID_VENDOR_SPECIFIC ) OUI( 0x50, 0x6F, 0x9A, 0x09 )
{
    MANDATORYTLV P2PCapability;                  // Contains P2P Device
                                                 // and P2P Group Capability
    MANDATORYTLV P2PDeviceId;                    // Contains P2P Device
                                                 // Address
    OPTIONALTLV  NoticeOfAbsence;                // Indicates Notice of
                                                 // Absence schedule and
                                                 // CT Window

} // End P2PBeacon


MULTIIE P2PAssocReq ( EID_VENDOR_SPECIFIC ) OUI( 0x50, 0x6F, 0x9A, 0x09 )
{
    MANDATORYTLV P2PCapability;                  // Contains P2P Device
                                                 // and P2P Group Capability
    OPTIONALTLV  ExtendedListenTiming;
    MANDATORYTLV P2PDeviceInfo;

} // End P2PAssocReq


MULTIIE P2PAssocRes ( EID_VENDOR_SPECIFIC ) OUI( 0x50, 0x6F, 0x9A, 0x09 )
{
    MANDATORYTLV P2PStatus;
    OPTIONALTLV  ExtendedListenTiming;

} // End P2PAssocRes


MULTIIE P2PProbeReq ( EID_VENDOR_SPECIFIC ) OUI( 0x50, 0x6F, 0x9A, 0x09 )
{
    MANDATORYTLV P2PCapability;
    OPTIONALTLV  P2PDeviceId;
    MANDATORYTLV ListenChannel;
    OPTIONALTLV  ExtendedListenTiming;
    OPTIONALTLV  OperatingChannel;
} // End P2PProbeReq


MULTIIE P2PProbeRes ( EID_VENDOR_SPECIFIC ) OUI( 0x50, 0x6F, 0x9A, 0x09 )
{
    MANDATORYTLV P2PCapability;
    OPTIONALTLV  ExtendedListenTiming;
    OPTIONALTLV  NoticeOfAbsence;
    MANDATORYTLV P2PDeviceInfo;
    OPTIONALTLV  P2PGroupInfo;

} // End P2PProbeRes


MULTIIE P2PBeaconProbeRes ( EID_VENDOR_SPECIFIC ) OUI( 0x50, 0x6F, 0x9A, 0x09 )
{
    OPTIONALTLV P2PCapability;
    OPTIONALTLV P2PDeviceId;
    OPTIONALTLV ExtendedListenTiming;
    OPTIONALTLV NoticeOfAbsence;
    OPTIONALTLV P2PDeviceInfo;
    OPTIONALTLV P2PGroupInfo;

} // End P2PBeaconProbeRes


MULTIIE P2PGONegReq ( EID_VENDOR_SPECIFIC ) OUI( 0x50, 0x6F, 0x9A, 0x09 )
{
    MANDATORYTLV P2PCapability;
    MANDATORYTLV GOIntent;
    MANDATORYTLV ConfigurationTimeout;
    MANDATORYTLV ListenChannel;
    OPTIONALTLV  ExtendedListenTiming;
    MANDATORYTLV IntendedP2PInterfaceAddress;
    MANDATORYTLV ChannelList;
    MANDATORYTLV P2PDeviceInfo;
    MANDATORYTLV OperatingChannel;

} // End P2PGONegReq


MULTIIE P2PGONegRes ( EID_VENDOR_SPECIFIC ) OUI( 0x50, 0x6F, 0x9A, 0x09 )
{
    MANDATORYTLV P2PStatus;
    MANDATORYTLV P2PCapability;
    MANDATORYTLV GOIntent;
    MANDATORYTLV ConfigurationTimeout;
    MANDATORYTLV OperatingChannel;
    MANDATORYTLV IntendedP2PInterfaceAddress;
    MANDATORYTLV ChannelList;
    MANDATORYTLV P2PDeviceInfo;
    OPTIONALTLV P2PGroupId;

} // End P2PGONegRes


MULTIIE P2PGONegCnf ( EID_VENDOR_SPECIFIC ) OUI( 0x50, 0x6F, 0x9A, 0x09 )
{
    MANDATORYTLV P2PStatus;
    MANDATORYTLV P2PCapability;
    MANDATORYTLV OperatingChannel;
    MANDATORYTLV ChannelList;
    OPTIONALTLV P2PGroupId;

} // End P2PGONegCnf


MULTIIE P2PGONegWPS ( EID_VENDOR_SPECIFIC ) OUI( 0x00, 0x50, 0xF2, 0x04 )
{
    MANDATORYTLV Version;
    MANDATORYTLV DevicePasswordID;

} // End P2PGONegWPS


MULTIIE P2PDeAuth ( EID_VENDOR_SPECIFIC ) OUI( 0x50, 0x6F, 0x9A, 0x09 )
{
   MANDATORYTLV MinorReasonCode;
}


MULTIIE P2PDisAssoc ( EID_VENDOR_SPECIFIC ) OUI( 0x50, 0x6F, 0x9A, 0x09 )
{
   MANDATORYTLV MinorReasonCode;
}


MULTIIE P2PInvitationReq ( EID_VENDOR_SPECIFIC ) OUI( 0x50, 0x6F, 0x9A, 0x09 )
{
   MANDATORYTLV ConfigurationTimeout;
   MANDATORYTLV InvitationFlags;
   MANDATORYTLV OperatingChannel;
   MANDATORYTLV P2PGroupBssid;
   MANDATORYTLV ChannelList;
   MANDATORYTLV P2PGroupId;
   MANDATORYTLV P2PDeviceInfo;
}


MULTIIE P2PInvitationRes ( EID_VENDOR_SPECIFIC ) OUI( 0x50, 0x6F, 0x9A, 0x09 )
{
   MANDATORYTLV P2PStatus;
   MANDATORYTLV ConfigurationTimeout;
   MANDATORYTLV OperatingChannel;
   MANDATORYTLV P2PGroupBssid;
   MANDATORYTLV ChannelList;
}


MULTIIE P2PDeviceDiscoverabilityReq ( EID_VENDOR_SPECIFIC ) OUI( 0x50, 0x6F, 0x9A, 0x09 )
{
   MANDATORYTLV P2PDeviceId;
   MANDATORYTLV P2PGroupId;
}


MULTIIE P2PDeviceDiscoverabilityRes ( EID_VENDOR_SPECIFIC ) OUI( 0x50, 0x6F, 0x9A, 0x09 )
{
   MANDATORYTLV P2PStatus;
}


MULTIIE P2PProvisionDiscoveryReq ( EID_VENDOR_SPECIFIC ) OUI( 0x50, 0x6F, 0x9A, 0x09 )
{
   MANDATORYTLV P2PCapability;
   MANDATORYTLV P2PDeviceInfo;
   MANDATORYTLV P2PGroupId;
}

MULTIIE P2PWSCProvisionDiscoveryRes ( EID_VENDOR_SPECIFIC ) OUI( 0x00, 0x50, 0xF2, 0x04 )
{
   MANDATORYTLV ConfigMethods;
}


MULTIIE P2PNoticeOfAbsence ( EID_VENDOR_SPECIFIC ) OUI( 0x50, 0x6F, 0x9A, 0x09 )
{
   MANDATORYTLV NoticeOfAbsence;
}


MULTIIE P2PPresenceResponse ( EID_VENDOR_SPECIFIC ) OUI( 0x50, 0x6F, 0x9A, 0x09 )
{
   MANDATORYTLV P2PStatus;
   MANDATORYTLV NoticeOfAbsence;
}


/////////////////////////////////////////////////////////////////////////////
// Frames

FRAME Beacon                              // C.f. Sec. 7.2.3.1
{
    FF     TimeStamp;
    FF     BeaconInterval;
    FF     Capabilities;
    MANDIE SSID;
    MANDIE SuppRates;
    OPTIE  FHParamSet;
    OPTIE  DSParams;
    OPTIE  CFParams;
    OPTIE  IBSSParams;
    OPTIE  TIM;
    OPTIE  Country;
    OPTIE  FHParams;
    OPTIE  FHPattTable;
    OPTIE  PowerConstraints;
    OPTIE  ChanSwitchAnn;
    OPTIE  ext_chan_switch_ann;
    OPTIE  Quiet;
    OPTIE  TPCReport;
    OPTIE  ERPInfo;
    OPTIE  ExtSuppRates;
    OPTIE  RSN;
    OPTIE  QBSSLoad;
    OPTIE  EDCAParamSet;
    OPTIE  QOSCapsAp;
    OPTIE  APChannelReport;
    OPTIE  RRMEnabledCap;
    OPTIE  MobilityDomain;
    OPTIE  WPA;
    OPTIE  HTCaps;
    OPTIE  HTInfo;
    OPTIE  sec_chan_offset;
    OPTIE  WMMInfoAp;
    OPTIE  WMMParams;
    OPTIE  WMMCaps;
    OPTIE  WAPI;
    OPTIE  ESERadMgmtCap;
    OPTIE  ESETrafStrmMet;
    OPTIE  ESETxmitPower;

    OPTIE  Airgo;
    OPTIE  WscBeacon;
    OPTIE  P2PBeacon;
    OPTIE  VHTCaps;
    OPTIE  VHTOperation;
    OPTIE  VHTExtBssLoad;
    OPTIE  ExtCap;
    OPTIE  OperatingMode;
    OPTIE  WiderBWChanSwitchAnn;
    OPTIE  OBSSScanParameters;
    OPTIE  hs20vendor_ie;
} // End frame Beacon.

// Ok, here's  the story on  Beacon1 & Beacon2.   We presumably beacon  a lot
// more than we  change configuration.  So it makes sense  to keep the beacon
// we plan to send next in  serialized format.  We do this in struct schMisc.
// Whenever our  config changes in  a way that  would affect our  beacons, we
// just  update  our internal  datastructures  &  re-generate the  serialized
// beacon.

// The problem  is that there  are *some* fields  that need to be  updated at
// send time,  specifically the CF Param  Set & the  TIM.  So, what we  do is
// this: whenever  our config changes,  call schSetFixedBeaconFields.  There,
// we serialize the following  Beacon fields into gSchBeaconFrameBegin (after
// the power template & MAC header): TimeStamp, BeaconInterval, Capabilities,
// SSID, SuppRates, DSParams, & IBSSParams.  It sets gSchBeaconOffsetBegin to
// the length of this buffer (incl. power template & MAC header).

// Next, it serializes the following fields into gSchBeaconFrameEnd: Country,
// EDCAParamSet,   PowerConstraints,   TPCReport,  ChannelSwitchAnn,   Quiet,
// ERPInfo,      HTCaps,      HTInfo,      ExtSuppRates,      Airgo      (via
// sirFillPropIEsInBeaconPR),  WPA, RSN,  WMMInfo,  WMMParams, WMMCaps.   The
// length of *this* buffer is kept in gSchBeaconOffsetEnd.

// Then, in 'schBeaconInterruptHandler',  we write CFParams & TIM  at the end
// of gSchBeaconFrameBegin, keeping track of the (new) size of this buffer in
// the local 'beaconSize'.

// After  that,  we  call  'specialBeaconProcessing'.   Note  that  this  may
// actually call  schSetFixedBeaconFields repeatedly!  The  comments say they
// try to avoid this, but...

// Finally, we call writeBeaconToTFP, where the first thing we do is copy the
// gSchBeaconFrameEnd buffer after the end of gSchBeaconFrameBegin.

FRAME Beacon1
{
    FF     TimeStamp;
    FF     BeaconInterval;
    FF     Capabilities;
    MANDIE SSID;
    MANDIE SuppRates;
    OPTIE  DSParams;
    OPTIE  IBSSParams;
}

FRAME Beacon2
{
    OPTIE  Country;
    OPTIE  PowerConstraints;
    OPTIE  ChanSwitchAnn;
    OPTIE  ext_chan_switch_ann;
    OPTIE  Quiet;
    OPTIE  TPCReport;
    OPTIE  ERPInfo;
    OPTIE  ExtSuppRates;
    OPTIE  RSNOpaque;
    OPTIE  EDCAParamSet;
    OPTIE  APChannelReport;
    OPTIE  RRMEnabledCap;
    OPTIE  MobilityDomain;
    OPTIE  WPA;
    OPTIE  HTCaps;
    OPTIE  HTInfo;
    OPTIE  sec_chan_offset;
    OPTIE  WMMInfoAp;
    OPTIE  WMMParams;
    OPTIE  WMMCaps;
    OPTIE  Airgo;
    OPTIE  WscBeacon;
    OPTIE  WAPI;
    OPTIE  ESERadMgmtCap;
    OPTIE  ESETrafStrmMet;
    OPTIE  ESETxmitPower;
    OPTIE  P2PBeacon;
    OPTIE  VHTCaps;
    OPTIE  VHTOperation;
    OPTIE  VHTExtBssLoad;
    OPTIE  ExtCap;
    OPTIE  OperatingMode;
    OPTIE  WiderBWChanSwitchAnn;
    OPTIE  OBSSScanParameters;
    OPTIE  hs20vendor_ie;
}

// This frame is just Beacon with its Fixed Fields stripped out.  It's handy
// for use with struct 'tSirBssDescription', which has members corresponding
// to some fixed fields, but keeps its IEs in un-parsed format.

// Note that it also includes the IE 'WscBeaconProbeRes'.

FRAME BeaconIEs
{

    MANDIE SSID;
    MANDIE SuppRates;
    OPTIE  FHParamSet;
    OPTIE  DSParams;
    OPTIE  CFParams;
    OPTIE  IBSSParams;
    OPTIE  TIM;
    OPTIE  Country;
    OPTIE  FHParams;
    OPTIE  FHPattTable;
    OPTIE  PowerConstraints;
    OPTIE  ChanSwitchAnn;
    OPTIE  ext_chan_switch_ann;
    OPTIE  Quiet;
    OPTIE  TPCReport;
    OPTIE  ERPInfo;
    OPTIE  ExtSuppRates;
    OPTIE  RSN;
    OPTIE  QBSSLoad;
    OPTIE  EDCAParamSet;
    OPTIE  QOSCapsAp;
    OPTIE  APChannelReport;
    OPTIE  RRMEnabledCap;
    OPTIE  MobilityDomain;
    OPTIE  WPA;
    OPTIE  HTCaps;
    OPTIE  HTInfo;
    OPTIE  sec_chan_offset;
    OPTIE  WMMInfoAp;
    OPTIE  WMMParams;
    OPTIE  WMMCaps;
    OPTIE  WAPI;
    OPTIE  ESEVersion;
    OPTIE  ESERadMgmtCap;
    OPTIE  ESETrafStrmMet;
    OPTIE  ESETxmitPower;

    OPTIE  Airgo;
    OPTIE  WscBeaconProbeRes;
    OPTIE  P2PBeaconProbeRes;
    OPTIE  VHTCaps;
    OPTIE  VHTOperation;
    OPTIE  VHTExtBssLoad;
    OPTIE  ExtCap;
    OPTIE  OperatingMode;
    OPTIE  WiderBWChanSwitchAnn;
    OPTIE  OBSSScanParameters;
    OPTIE  hs20vendor_ie;

} // End frame BeaconIEs.

FRAME Disassociation                      // 7.3.3.3
{
    FF    Reason;
    OPTIE P2PDisAssoc;
}

FRAME AssocRequest                        // 7.2.3.4
{
    FF     Capabilities;
    FF     ListenInterval;
    MANDIE SSID;
    MANDIE SuppRates;
    OPTIE  ExtSuppRates;
    OPTIE  PowerCaps;
    OPTIE  SuppChannels;
    OPTIE  RSNOpaque;
    OPTIE  QOSCapsStation;
    OPTIE  RRMEnabledCap;
    OPTIE  MobilityDomain;
    OPTIE  WPAOpaque;
    OPTIE  HTCaps;
    OPTIE  WMMCaps;
    OPTIE  WMMInfoStation;
    OPTIE  Airgo;
    OPTIE  WscIEOpaque;
    OPTIE  WAPIOpaque;
    OPTIE  ESERadMgmtCap;
    OPTIE  ESEVersion;
    OPTIE  P2PIEOpaque;
    OPTIE  WFDIEOpaque;
    OPTIE  VHTCaps;
    OPTIE  ExtCap;
    OPTIE  OperatingMode;
    OPTIE  QosMapSet;
    OPTIE  hs20vendor_ie;
} // End frame AssocRequest.

FRAME AssocResponse                       // 7.2.3.5
{
    FF     Capabilities;
    FF     Status;
    FF     AID;
    MANDIE SuppRates;
    OPTIE  ExtSuppRates;
    OPTIE  EDCAParamSet;
    OPTIE  RCPIIE;
    OPTIE  RSNIIE;
    OPTIE  RRMEnabledCap;
    OPTIE  MobilityDomain;
    OPTIE  FTInfo;
    OPTIE  RICDataDesc[2];
    OPTIE  WPA;
    OPTIE  TimeoutInterval;
    OPTIE  HTCaps;
    OPTIE  HTInfo;
    OPTIE  WMMParams;
    OPTIE  WMMCaps;
    OPTIE  ESERadMgmtCap;
    OPTIE  ESETrafStrmMet;
    OPTIE  ESETxmitPower;
    OPTIE  WMMTSPEC[0..4];
    OPTIE  Airgo;
    OPTIE  WscAssocRes;
    OPTIE  P2PAssocRes;
    OPTIE  VHTCaps;
    OPTIE  VHTOperation;
    OPTIE  ExtCap;
    OPTIE  OBSSScanParameters;
    OPTIE  QosMapSet;
} // End frame AssocResponse.

FRAME ReAssocRequest                      // 7.2.3.6
{
    FF     Capabilities;
    FF     ListenInterval;
    FF     CurrentAPAddress;
    MANDIE SSID;
    MANDIE SuppRates;
    OPTIE  ExtSuppRates;
    OPTIE  PowerCaps;
    OPTIE  SuppChannels;
    OPTIE  RSNOpaque;
    OPTIE  QOSCapsStation;
    OPTIE  RRMEnabledCap;
    OPTIE  MobilityDomain;
    OPTIE  FTInfo;
    OPTIE  RICDataDesc[2];
    OPTIE  WPAOpaque;
    OPTIE  HTCaps;
    OPTIE  WMMCaps;
    OPTIE  WMMInfoStation;
    OPTIE  Airgo;
    OPTIE  WscIEOpaque;
    OPTIE  WAPIOpaque;
    OPTIE  ESERadMgmtCap;
    OPTIE  ESEVersion;
    OPTIE  ESECckmOpaque;
    OPTIE  WMMTSPEC[0..4];
    OPTIE  ESETrafStrmRateSet;
    OPTIE  P2PIEOpaque;
    OPTIE  WFDIEOpaque;
    OPTIE  VHTCaps;
    OPTIE  ExtCap;
    OPTIE  OperatingMode;
    OPTIE  QosMapSet;
    OPTIE  hs20vendor_ie;
} // End frame ReAssocRequest.

FRAME ReAssocResponse                     // 7.2.3.7
{
    FF     Capabilities;
    FF     Status;
    FF     AID;
    MANDIE SuppRates;
    OPTIE  ExtSuppRates;
    OPTIE  EDCAParamSet;
    OPTIE  RCPIIE;
    OPTIE  RSNIIE;
    OPTIE  RRMEnabledCap;
    OPTIE  RSNOpaque;
    OPTIE  MobilityDomain;
    OPTIE  FTInfo;
    OPTIE  RICDataDesc[2];
    OPTIE  WPA;
    OPTIE  TimeoutInterval;
    OPTIE  HTCaps;
    OPTIE  HTInfo;
    OPTIE  WMMParams;
    OPTIE  ESERadMgmtCap;
    OPTIE  ESETrafStrmMet;
    OPTIE  ESETxmitPower;
    OPTIE  WMMTSPEC[0..4];
    OPTIE  ESETrafStrmRateSet;
    OPTIE  Airgo;
    OPTIE  WscReassocRes;
    OPTIE  P2PAssocRes;
    OPTIE  VHTCaps;
    OPTIE  VHTOperation;
    OPTIE  ExtCap;
    OPTIE  OBSSScanParameters;
    OPTIE  QosMapSet;
} // End frame ReAssocResponse.

FRAME ProbeRequest                        // 7.2.3.8
{
    MANDIE SSID;
    MANDIE SuppRates;
    OPTIE  RequestedInfo;
    OPTIE  ExtSuppRates;
    OPTIE  DSParams;
    OPTIE  HTCaps;
    OPTIE  WscProbeReq;
    OPTIE  WFATPC;
    OPTIE  P2PProbeReq;
    OPTIE  VHTCaps;
} // End frame ProbeRequest.

FRAME ProbeResponse                       // 7.2.3.9
{
    FF     TimeStamp;
    FF     BeaconInterval;
    FF     Capabilities;
    MANDIE SSID;
    MANDIE SuppRates;
    OPTIE  FHParamSet;
    OPTIE  DSParams;
    OPTIE  CFParams;
    OPTIE  IBSSParams;
    OPTIE  Country;
    OPTIE  FHParams;
    OPTIE  FHPattTable;
    OPTIE  PowerConstraints;
    OPTIE  ChanSwitchAnn;
    OPTIE  ext_chan_switch_ann;
    OPTIE  Quiet;
    OPTIE  TPCReport;
    OPTIE  ERPInfo;
    OPTIE  ExtSuppRates;
    OPTIE  RSNOpaque;
    OPTIE  QBSSLoad;
    OPTIE  EDCAParamSet;
    OPTIE  RRMEnabledCap;
    OPTIE  APChannelReport;
    OPTIE  MobilityDomain;
    OPTIE  WPA;
    OPTIE  HTCaps;
    OPTIE  HTInfo;
    OPTIE  sec_chan_offset;
    OPTIE  WMMInfoAp;
    OPTIE  WMMParams;
    OPTIE  WMMCaps;
    OPTIE  WAPI;
    OPTIE  ESERadMgmtCap;
    OPTIE  ESETrafStrmMet;
    OPTIE  ESETxmitPower;

    OPTIE  Airgo;
    OPTIE  WscProbeRes;
    OPTIE  P2PProbeRes;

    OPTIE  VHTCaps;
    OPTIE  VHTOperation;
    OPTIE  VHTExtBssLoad;
    OPTIE  ExtCap;
    OPTIE  OBSSScanParameters;
    OPTIE  hs20vendor_ie;
    OPTIE  WiderBWChanSwitchAnn;
} // End frame ProbeResponse.

FRAME Authentication                      // 7.2.3.10
{
    FF    AuthAlgo;
    FF    AuthSeqNo;
    FF    Status;
    OPTIE ChallengeText;
    OPTIE  RSNOpaque;
    OPTIE  MobilityDomain;
    OPTIE  FTInfo;
    OPTIE  TimeoutInterval;
    OPTIE  RICDataDesc[2];
} // End frame Auth.

FRAME DeAuth                              // 7.2.3.11
{
    FF    Reason;
    OPTIE P2PDeAuth;
}

FRAME AddTSRequest                        // 7.4.2.1
{

    FF     Category;
    FF     Action;
    FF     DialogToken;
    MANDIE TSPEC;
    OPTIE  TCLAS[0..2];
    OPTIE  TCLASSPROC;

    // These IEs aren't in the spec, but our extant code *will* parse them if
    // they're present.  I included them to preserve that capability

    OPTIE  WMMTSPEC;
    OPTIE  WMMTCLAS[0..2];
    OPTIE  WMMTCLASPROC;
    OPTIE  ESETrafStrmRateSet;

} // End frame AddTSRequest.

FRAME WMMAddTSRequest
{
    FF     Category;
    FF     Action;
    FF     DialogToken;
    FF     StatusCode;
    MANDIE WMMTSPEC;
    OPTIE  ESETrafStrmRateSet;
} // End Frame WMMAddTSRequest

FRAME AddTSResponse                       // 7.4.2.2
{

    FF     Category;
    FF     Action;
    FF     DialogToken;
    FF     Status;
    MANDIE TSDelay;
    MANDIE TSPEC;
    OPTIE  TCLAS[0..2];
    OPTIE  TCLASSPROC;
    OPTIE  Schedule;

    // These IEs aren't in the spec, but our extant code *will* parse them if
    // they're present.  I included them to preserve that capability
    OPTIE  WMMTSDelay;
    OPTIE  WMMSchedule;
    OPTIE  WMMTSPEC;
    OPTIE  WMMTCLAS[0..2];
    OPTIE  WMMTCLASPROC;
    OPTIE  ESETrafStrmMet;

} // End frame AddTSResponse.

FRAME WMMAddTSResponse
{

    FF     Category;
    FF     Action;
    FF     DialogToken;
    FF     StatusCode;
    OPTIE  WMMTSPEC;
    OPTIE  ESETrafStrmMet;

} // End frame WMMAddTSResponse.

FRAME DelTS                               // 7.4.2.3
{
    FF     Category;
    FF     Action;
    FF     TSInfo;
    FF     Reason;
}

FRAME WMMDelTS
{
    FF     Category;
    FF     Action;
    FF     DialogToken;
    FF     StatusCode;
    MANDIE WMMTSPEC;
}

FRAME TPCRequest
{
    FF     Category;
    FF     Action;
    FF     DialogToken;
    MANDIE TPCRequest;
}

FRAME TPCReport
{
    FF     Category;
    FF     Action;
    FF     DialogToken;
    MANDIE TPCReport;
}

FRAME ChannelSwitch
{
    FF     Category;
    FF     Action;
    MANDIE ChanSwitchAnn;
    OPTIE  sec_chan_offset;
    OPTIE  WiderBWChanSwitchAnn;
}

FRAME ext_channel_switch_action_frame
{
    FF     Category;
    FF     Action;
    FF     ext_chan_switch_ann_action;
}

FRAME MeasurementRequest
{
    FF     Category;
    FF     Action;
    FF     DialogToken;
    MANDIE MeasurementRequest[1..4];
}

FRAME MeasurementReport
{
    FF     Category;
    FF     Action;
    FF     DialogToken;
    MANDIE MeasurementReport;
}

FRAME AddBAReq
{
    FF    Category;
    FF    Action;
    FF    DialogToken;
    FF    AddBAParameterSet;
    FF    BATimeout;
    FF    BAStartingSequenceControl;
}

FRAME AddBARsp
{
    FF    Category;
    FF    Action;
    FF    DialogToken;
    FF    Status;
    FF    AddBAParameterSet;
    FF    BATimeout;
}

FRAME DelBAInd
{
    FF    Category;
    FF    Action;
    FF    DelBAParameterSet;
    FF    Reason;
}

FRAME SMPowerSave
{
    FF    Category;
    FF    Action;
    FF    SMPowerModeSet;
}

FRAME RadioMeasurementRequest
{
   FF    Category;
   FF    Action;
   FF    DialogToken;
   FF    NumOfRepetitions;
   //Measurement Request IE.
   MANDIE MeasurementRequest[1..2];
}

FRAME RadioMeasurementReport
{
   FF   Category;
   FF   Action;
   FF   DialogToken;
   //Measurement Report elements.
   MANDIE MeasurementReport[1..4];
}

FRAME LinkMeasurementRequest
{
   FF   Category;
   FF   Action;
   FF   DialogToken;
   FF   TxPower;
   FF   MaxTxPower;
   //Optional Sub Ies
}

FRAME LinkMeasurementReport
{
   FF   Category;
   FF   Action;
   FF   DialogToken;
   FF   TPCEleID;
   FF   TPCEleLen;
   FF   TxPower;
   FF   LinkMargin;
   FF   RxAntennaId;
   FF   TxAntennaId;
   FF   RCPI;
   FF   RSNI;
   //Optional Vendor specific IEs ... ignoring
}

FRAME NeighborReportRequest
{
   FF     Category;
   FF     Action;
   FF     DialogToken;
   OPTIE  SSID;
   //Optional vendor specific IE...ignoring.
}

FRAME NeighborReportResponse
{
   FF     Category;
   FF     Action;
   FF     DialogToken;
   OPTIE  NeighborReport[1..4];
}

FRAME GONegReq
{
   FF      Category;
   FF      Action;
   FF      P2POUI;
   FF      P2POUISubType;
   FF      DialogToken;
   MANDIE  P2PGONegWPS;
   MANDIE  P2PGONegReq;
}

FRAME GONegRes
{
   FF      Category;
   FF      Action;
   FF      P2POUI;
   FF      P2POUISubType;
   FF      DialogToken;
   MANDIE  P2PGONegWPS;
   MANDIE  P2PGONegRes;
}


FRAME GONegCnf
{
   FF      Category;
   FF      Action;
   FF      P2POUI;
   FF      P2POUISubType;
   FF      DialogToken;
   MANDIE  P2PGONegCnf;
}


FRAME InvitationReq
{
   FF      Category;
   FF      Action;
   FF      P2POUI;
   FF      P2POUISubType;
   FF      DialogToken;
   MANDIE  P2PInvitationReq;
}


FRAME InvitationRes
{
   FF      Category;
   FF      Action;
   FF      P2POUI;
   FF      P2POUISubType;
   FF      DialogToken;
   MANDIE  P2PInvitationRes;
}


FRAME DeviceDiscoverabilityReq
{
   FF      Category;
   FF      Action;
   FF      P2POUI;
   FF      P2POUISubType;
   FF      DialogToken;
   MANDIE  P2PDeviceDiscoverabilityReq;
}


FRAME DeviceDiscoverabilityRes
{
   FF      Category;
   FF      Action;
   FF      P2POUI;
   FF      P2POUISubType;
   FF      DialogToken;
   MANDIE  P2PDeviceDiscoverabilityRes;
}



FRAME ProvisionDiscoveryReq
{
   FF      Category;
   FF      Action;
   FF      P2POUI;
   FF      P2POUISubType;
   FF      DialogToken;
   MANDIE  P2PProvisionDiscoveryReq;
}


FRAME ProvisionDiscoveryRes
{
   FF      Category;
   FF      Action;
   FF      P2POUI;
   FF      P2POUISubType;
   FF      DialogToken;
   MANDIE  P2PWSCProvisionDiscoveryRes;
}


FRAME NoticeOfAbs
{
   FF      Category;
   FF      P2POUI;
   FF      P2POUISubType;
   FF      DialogToken;
   MANDIE  P2PNoticeOfAbsence;
}


FRAME PresenceReq
{
   FF      Category;
   FF      P2POUI;
   FF      P2POUISubType;
   FF      DialogToken;
   MANDIE  P2PNoticeOfAbsence;
}


FRAME PresenceRes
{
   FF      Category;
   FF      P2POUI;
   FF      P2POUISubType;
   FF      DialogToken;
   MANDIE  P2PPresenceResponse;
}


FRAME GODiscoverabilityReq
{
   FF      Category;
   FF      P2POUI;
   FF      P2POUISubType;
   FF      DialogToken;
}

FRAME OperatingMode
{
    FF        Category;
    FF        Action;
    //Operating Mode field
    FF        OperatingMode;
}

FRAME TDLSDisReq
{
    FF     Category;
    FF     Action;
    FF     DialogToken;
    MANDIE LinkIdentifier;
}

FRAME TDLSDisRsp
{
    FF     Category;
    FF     Action;
    FF     DialogToken;
    FF     Capabilities;
    MANDIE SuppRates;
    OPTIE  ExtSuppRates;
    OPTIE  SuppChannels;
    OPTIE  SuppOperatingClasses;
    OPTIE  RSN;
    OPTIE  ExtCap;
    OPTIE  FTInfo;
    OPTIE  TimeoutInterval;
    OPTIE  RICData;
    OPTIE  HTCaps;
    OPTIE  HT2040BSSCoexistence;
    MANDIE LinkIdentifier;
    OPTIE  VHTCaps;
}

FRAME TDLSSetupReq
{
    FF     Category;
    FF     Action;
    FF     DialogToken;
    FF     Capabilities;
    MANDIE SuppRates;
    OPTIE  Country;
    OPTIE  ExtSuppRates;
    OPTIE  SuppChannels;
    OPTIE  RSN;
    OPTIE  ExtCap;
    OPTIE  SuppOperatingClasses;
    OPTIE  QOSCapsStation;
    OPTIE  FTInfo;
    OPTIE  TimeoutInterval;
    OPTIE  RICData;
    OPTIE  HTCaps;
    OPTIE  HT2040BSSCoexistence;
    MANDIE LinkIdentifier;
    OPTIE  WMMInfoStation;
    OPTIE  AID;
    OPTIE  VHTCaps;
}

FRAME TDLSSetupRsp
{
    FF     Category;
    FF     Action;
    FF     Status;
    FF     DialogToken;
    FF     Capabilities ;
    OPTIE  SuppRates;
    OPTIE  Country;
    OPTIE  ExtSuppRates;
    OPTIE  SuppChannels;
    OPTIE  RSN;
    OPTIE  ExtCap;
    OPTIE  SuppOperatingClasses;
    OPTIE  QOSCapsStation;
    OPTIE  FTInfo;
    OPTIE  TimeoutInterval;
    OPTIE  RICData;
    OPTIE  HTCaps;
    OPTIE  HT2040BSSCoexistence;
    OPTIE  LinkIdentifier;
    OPTIE  WMMInfoStation;
    OPTIE  AID;
    OPTIE  VHTCaps;
    OPTIE  OperatingMode;
}

FRAME TDLSSetupCnf
{
    FF     Category;
    FF     Action;
    FF     Status;
    FF     DialogToken;
    OPTIE  RSN;
    OPTIE  EDCAParamSet;
    OPTIE  FTInfo;
    OPTIE  TimeoutInterval;
    OPTIE  HTInfo;
    OPTIE  HT2040BSSCoexistence;
    OPTIE  LinkIdentifier;
    OPTIE  WMMParams;
    OPTIE  VHTOperation;
    OPTIE  OperatingMode;
}
FRAME TDLSTeardown
{
    FF     Category;
    FF     Action;
    FF     Reason;
    OPTIE  FTInfo;
    MANDIE LinkIdentifier;
}

FRAME TDLSPeerTrafficInd
{
    FF     Category;
    FF     Action;
    FF     DialogToken;
    MANDIE LinkIdentifier;
    OPTIE  PTIControl;
    MANDIE PUBufferStatus;
}

FRAME TDLSPeerTrafficRsp
{
    FF     Category;
    FF     Action;
    FF     DialogToken;
    MANDIE LinkIdentifier;
}

FRAME SaQueryReq
{
    FF     Category;
    FF     Action;
    FF     TransactionId;
}

FRAME SaQueryRsp
{
    FF     Category;
    FF     Action;
    FF     TransactionId;
}

FRAME QosMapConfigure
{
    FF     Category;
    FF     Action;
    MANDIE  QosMapSet;
}

FRAME RMC
{
    FF     Category;
    FF     RMCOUI;
    FF     MagicCode;
    FF     RMCVersion;
    FF     Action;
    FF     RMCDialogToken;
    FF     Ruler;
}

FRAME VHTGidManagementActionFrame
{
    FF     Category;
    FF     Action;
    FF     VhtMembershipStatusArray;
    FF     VhtUserPositionArray;
}

FRAME HT2040BSSCoexistenceManagementActionFrame
{
    FF     Category;
    FF     Action;
    MANDIE HT2040BSSCoexistence;
    MANDIE HT2040BSSIntolerantReport;
}

// Local Variables:
// mode: c++
// fill-column: 77
// comment-column: 42
// indent-tabs-mode: nil
// show-trailing-whitespace: t
// End:

// parser.frms ends here.
