/*
 * Copyright (c) 2006-2007, 2014-2016 The Linux Foundation. All rights reserved.
 *
 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
 *
 *
 * Permission to use, copy, modify, and/or distribute this software for
 * any purpose with or without fee is hereby granted, provided that the
 * above copyright notice and this permission notice appear in all
 * copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 * PERFORMANCE OF THIS SOFTWARE.
 */

/*
 * This file was originally distributed by Qualcomm Atheros, Inc.
 * under proprietary terms before Copyright ownership was assigned
 * to the Linux Foundation.
 */

/**
 * \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_TIME_ADVERTISEMENT         =  69;
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 VHT_TRANSMIT_POWER_ENVELOPE    = 195;
const EID_CHANNEL_SWITCH_WRAPPER     = 196;
const EID_VENDOR_SPECIFIC            = 221;
const EID_FILS_INDICATION            = 240;
/**
 * Extended Element ID
 *
 * As part of IEEE-802.11-2016 spec, extended element ID is introduced(9.4.2.1)
 * Elements are defined to have a common general format consisting of a 1 octet
 * Element ID field, a 1 octet Length field, an optional 1 octet Element ID
 * Extension field, and a variable-length element-specific Information field.
 * Each element is identified by the contents of the Element ID and, when
 * present, Element ID Extension fields as defined in this standard. An Extended
 * Element ID is a combination of an Element ID and an Element ID Extension for
 * those elements that have a defined Element ID Extension. The Length field
 * specifies the number of octets following the Length field. The presence of
 * the Element ID Extension field is determined by the Element ID field having
 * value of 255
 */
const EID_EXTN_ID_ELEMENT            = 255;

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_CHANNEL_SWITCH    =  15;
const SIR_MAC_PROP_QUIET_BSS         =  16;
const SIR_MAC_PROP_TRIG_STA_BK_SCAN	 =  17;

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

/////////////////////////////////////////////////////////////////////////////
//                  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 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) // 8.4.2.55
{
    switch_mode,   1;
    new_reg_class, 1;
    new_channel,   1;
    switch_count,  1;
}

IE sec_chan_offset_ele (EID_SEC_CHAN_OFFSET) // 7.3.2.20a
{
	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 Group Cipher Suite
    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_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;
    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[ 6..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 Vendor1IE (EID_VENDOR_SPECIFIC) OUI (0x00, 0x10, 0x18)
{
}

IE Vendor3IE (EID_VENDOR_SPECIFIC) OUI (0x00, 0x16, 0x32)
{
}

const EID_VENDOR_QCOM_MCC_CHAN              =    1;
const EID_VENDOR_QCOM_SUB20_BW              =    2;

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 QComVendorIE (EID_VENDOR_SPECIFIC) OUI (0x00, 0xA0, 0xC6)
{
    OPTIE IE MccChanInfo (EID_VENDOR_QCOM_MCC_CHAN)
    {
        channel,   1;
    }

    OPTIE IE Sub20Info (EID_VENDOR_QCOM_SUB20_BW)
    {
        capability,     1;
        csa_chanwidth,  1;
    }
}

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;
          fine_time_meas_rpt:      1;
          lci_capability:          1;
          reserved:                4;
     }
}

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;
    }
}



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 vht_transmit_power_env (VHT_TRANSMIT_POWER_ENVELOPE)
{
    bytes[2..5];
}

IE ChannelSwitchWrapper (EID_CHANNEL_SWITCH_WRAPPER)
{
    OPTIE IE  WiderBWChanSwitchAnn;
    OPTIE IE  vht_transmit_power_env;
}
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;
}

IE TimeAdvertisement (EID_TIME_ADVERTISEMENT)   // 8.4.2.63
{
    timing_capabilities, 1;
    time_value[10];
    time_error[5];
}

IE fils_indication (EID_FILS_INDICATION)
{
   // FILS Information element
   {
       public_key_identifiers_cnt     : 3;
       realm_identifiers_cnt          : 3;
       is_ip_config_supported         : 1;
       is_cache_id_present            : 1;
       is_hessid_present              : 1;
       is_fils_sk_auth_supported      : 1;
       is_fils_sk_auth_pfs_supported  : 1;
       is_pk_auth_supported           : 1;
       reserved                       : 4;
   }
   // other FILS elements
   variable_data[3..255];
}

IE fils_assoc_delay_info (EID_EXTN_ID_ELEMENT) OUI ( 0x01 )
{
    assoc_delay_info, 1;
}

IE fils_key_confirmation (EID_EXTN_ID_ELEMENT) OUI ( 0x03 )
{
    key_auth[0..255];
}

IE fils_session (EID_EXTN_ID_ELEMENT) OUI ( 0x04 )
{
    session[8];
}

IE fils_hlp_container (EID_EXTN_ID_ELEMENT) OUI ( 0x05 )
{
    dest_mac[6];
    src_mac[6];
    hlp_packet[0..255];
}

IE fils_kde (EID_EXTN_ID_ELEMENT) OUI ( 0x07 )
{
    key_rsc[8];
    kde_list[0..255];
}

IE fils_wrapped_data (EID_EXTN_ID_ELEMENT) OUI ( 0x08 )
{
    wrapped_data[0..255];
}

IE fils_public_key (EID_EXTN_ID_ELEMENT) OUI ( 0x0C )
{
    key_type, 1;
    public_key[0..255];
}

IE fils_nonce (EID_EXTN_ID_ELEMENT) OUI ( 0x0D )
{
    nonce[16];
}

/////////////////////////////////////////////////////////////////////////////
//                                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;
}

IE vendor2_ie (EID_VENDOR_SPECIFIC) OUI (0x00, 0x90, 0x4c)
{
   type, 1;
   sub_type, 1;
   OPTIE IE VHTCaps;
   OPTIE IE VHTOperation;
}


/////////////////////////////////////////////////////////////////////////////
// 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  SuppOperatingClasses;
    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_ele;
    OPTIE  WMMInfoAp;
    OPTIE  WMMParams;
    OPTIE  WMMCaps;
    OPTIE  WAPI;
    OPTIE  ESERadMgmtCap;
    OPTIE  ESETrafStrmMet;
    OPTIE  ESETxmitPower;

    OPTIE  WscBeacon;
    OPTIE  P2PBeacon;
    OPTIE  VHTCaps;
    OPTIE  VHTOperation;
    OPTIE  VHTExtBssLoad;
    OPTIE  ExtCap;
    OPTIE  OperatingMode;
    OPTIE  WiderBWChanSwitchAnn;
    OPTIE  OBSSScanParameters;
    //WLAN_FEATURE_FILS_SK
    OPTIE  fils_indication;
    OPTIE  Vendor1IE;
    OPTIE  vendor2_ie;
    OPTIE  Vendor3IE;
    OPTIE  hs20vendor_ie;
    OPTIE  ChannelSwitchWrapper;
    OPTIE  QComVendorIE;
    OPTIE  ESEVersion;
} // 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, 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  SuppOperatingClasses;
    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_ele;
    OPTIE  WMMInfoAp;
    OPTIE  WMMParams;
    OPTIE  WMMCaps;
    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;
    //WLAN_FEATURE_FILS_SK
    OPTIE  fils_indication;
    OPTIE  Vendor1IE;
    OPTIE  vendor2_ie;
    OPTIE  Vendor3IE;
    OPTIE  hs20vendor_ie;
    OPTIE  ChannelSwitchWrapper;
    OPTIE  QComVendorIE;
    OPTIE  ESEVersion;
}

// 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  SuppOperatingClasses;
    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_ele;
    OPTIE  WMMInfoAp;
    OPTIE  WMMParams;
    OPTIE  WMMCaps;
    OPTIE  WAPI;
    OPTIE  ESEVersion;
    OPTIE  ESERadMgmtCap;
    OPTIE  ESETrafStrmMet;
    OPTIE  ESETxmitPower;

    OPTIE  WscBeaconProbeRes;
    OPTIE  P2PBeaconProbeRes;
    OPTIE  VHTCaps;
    OPTIE  VHTOperation;
    OPTIE  VHTExtBssLoad;
    OPTIE  ExtCap;
    OPTIE  OperatingMode;
    OPTIE  WiderBWChanSwitchAnn;
    OPTIE  OBSSScanParameters;
    //WLAN_FEATURE_FILS_SK
    OPTIE  fils_indication;
    OPTIE  Vendor1IE;
    OPTIE  vendor2_ie;
    OPTIE  Vendor3IE;
    OPTIE  hs20vendor_ie;
    OPTIE  ChannelSwitchWrapper;
    OPTIE  QComVendorIE;

} // 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  WscIEOpaque;
    OPTIE  WAPIOpaque;
    OPTIE  WAPI;
    OPTIE  ESERadMgmtCap;
    OPTIE  ESEVersion;
    OPTIE  P2PIEOpaque;
    OPTIE  WFDIEOpaque;
    OPTIE  VHTCaps;
    //WLAN_FEATURE_FILS_SK
    OPTIE  fils_session;
    OPTIE  fils_public_key;
    OPTIE  fils_key_confirmation;
    OPTIE  fils_hlp_container;
    OPTIE  ExtCap;
    OPTIE  OperatingMode;
    OPTIE  QosMapSet;
    OPTIE  vendor2_ie;
    OPTIE  QComVendorIE;
    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  WscAssocRes;
    OPTIE  P2PAssocRes;
    OPTIE  VHTCaps;
    OPTIE  VHTOperation;
    OPTIE  ExtCap;
    OPTIE  OBSSScanParameters;
    OPTIE  QosMapSet;
    //WLAN_FEATURE_FILS_SK
    OPTIE  fils_session;
    OPTIE  fils_public_key;
    OPTIE  fils_key_confirmation;
    OPTIE  fils_hlp_container;
    OPTIE  fils_kde;
    OPTIE  vendor2_ie;
    OPTIE  QComVendorIE;
} // 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  WscIEOpaque;
    OPTIE  WAPIOpaque;
    OPTIE  WAPI;
    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  vendor2_ie;
    OPTIE  QComVendorIE;
    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  WscReassocRes;
    OPTIE  P2PAssocRes;
    OPTIE  VHTCaps;
    OPTIE  VHTOperation;
    OPTIE  ExtCap;
    OPTIE  OBSSScanParameters;
    OPTIE  QosMapSet;
    OPTIE  vendor2_ie;
    OPTIE  QComVendorIE;
} // 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;
    OPTIE  ExtCap;
} // 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  SuppOperatingClasses;
    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_ele;
    OPTIE  WMMInfoAp;
    OPTIE  WMMParams;
    OPTIE  WMMCaps;
    OPTIE  WAPI;
    OPTIE  ESERadMgmtCap;
    OPTIE  ESETrafStrmMet;
    OPTIE  ESETxmitPower;

    OPTIE  WscProbeRes;
    OPTIE  P2PProbeRes;

    OPTIE  VHTCaps;
    OPTIE  VHTOperation;
    OPTIE  VHTExtBssLoad;
    OPTIE  ExtCap;
    OPTIE  OBSSScanParameters;
    //WLAN_FEATURE_FILS_SK
    OPTIE  fils_indication;
    OPTIE  Vendor1IE;
    OPTIE  vendor2_ie;
    OPTIE  Vendor3IE;
    OPTIE  hs20vendor_ie;
    OPTIE  ChannelSwitchWrapper;
    OPTIE  QComVendorIE;
    OPTIE  ESEVersion;
} // 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];
    //WLAN_FEATURE_FILS_SK
    OPTIE  fils_nonce;
    OPTIE  fils_session;
    OPTIE  fils_wrapped_data;
    OPTIE  fils_assoc_delay_info;
} // 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_ele;
    OPTIE  WiderBWChanSwitchAnn;
}

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..MAX_SUPPORTED_NEIGHBOR_RPT];
}

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  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 VHTGidManagementActionFrame
{
    FF     Category;
    FF     Action;
    FF     VhtMembershipStatusArray;
    FF     VhtUserPositionArray;
}

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

FRAME TimingAdvertisementFrame            // 8.3.3.15
{
    FF     TimeStamp;
    FF     Capabilities;
    OPTIE  Country;
    OPTIE  PowerConstraints;
    OPTIE  TimeAdvertisement;
    OPTIE  ExtCap;
    OPTIE  Vendor1IE;
    OPTIE  vendor2_ie;
    OPTIE  Vendor3IE;
}

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

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

// parser.frms ends here.
