Merge "wlan: Add OWE IEs" into wlan-driver.lnx.1.0
diff --git a/CORE/MAC/src/cfg/cfgUtil/dot11f.frms b/CORE/MAC/src/cfg/cfgUtil/dot11f.frms
index 179b95c..394ef88 100644
--- a/CORE/MAC/src/cfg/cfgUtil/dot11f.frms
+++ b/CORE/MAC/src/cfg/cfgUtil/dot11f.frms
@@ -120,6 +120,22 @@
 const EID_OPERATING_MODE             =  199;
 const EID_WIDER_BW_CHANNEL_SWITCH_ANN=  194;
 const EID_VENDOR_SPECIFIC            = 221;
+/**
+ * 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;
@@ -2890,6 +2906,11 @@
   OPTIE  WMMSchedule;
 }
 
+IE dh_parameter_element (EID_EXTN_ID_ELEMENT) OUI ( 0x20 )
+{
+  group[2];
+  public_key[0..255];
+}
 /////////////////////////////////////////////////////////////////////////////
 //                                MULTIIEs                                 //
 /////////////////////////////////////////////////////////////////////////////
@@ -3539,6 +3560,7 @@
     OPTIE  QOSCapsStation;
     OPTIE  RRMEnabledCap;
     OPTIE  MobilityDomain;
+    OPTIE  dh_parameter_element;
     OPTIE  WPAOpaque;
     OPTIE  HTCaps;
     OPTIE  WMMCaps;
diff --git a/CORE/MAC/src/include/dot11f.h b/CORE/MAC/src/include/dot11f.h
index 25085dd..81d072c 100644
--- a/CORE/MAC/src/include/dot11f.h
+++ b/CORE/MAC/src/include/dot11f.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012-2018 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2019 The Linux Foundation. All rights reserved.
  *
  * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
  *
@@ -32,7 +32,7 @@
   * \brief Structures, function prototypes & definitions
   * for working with 802.11 Frames
   * This file was automatically generated by 'framesc'
-  * Tue Aug 28 09:50:49 2018 from the following file(s):
+  * Mon Jul 22 17:48:28 2019 from the following file(s):
   *
   * dot11f.frms
   *
@@ -6191,6 +6191,33 @@
 #ifdef __cplusplus
 }; /* End extern "C". */
 #endif /* C++ */
+// EID 255 (0xff) Extended EID 32 (0x20)
+typedef struct sDot11fIEdh_parameter_element {
+    tANI_U8      present;
+    tANI_U8      group[2];
+    tANI_U8      num_public_key;
+    tANI_U8      public_key[255];
+} tDot11fIEdh_parameter_element;
+
+#define DOT11F_EID_DH_PARAMETER_ELEMENT ( 255 )
+
+// N.B. These #defines do *not* include the EID & length
+#define DOT11F_IE_DH_PARAMETER_ELEMENT_MIN_LEN ( 2 )
+
+#define DOT11F_IE_DH_PARAMETER_ELEMENT_MAX_LEN ( 257 )
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* C++ */
+tANI_U32 dot11fUnpackIedh_parameter_element(tpAniSirGlobal, tANI_U8*,tANI_U8, tDot11fIEdh_parameter_element*);
+
+tANI_U32 dot11fPackIedh_parameter_element(tpAniSirGlobal, tDot11fIEdh_parameter_element*, tANI_U8*, tANI_U32, tANI_U32*);
+
+tANI_U32 dot11fGetPackedIEdh_parameter_element(tpAniSirGlobal, tDot11fIEdh_parameter_element*, tANI_U32*);
+
+#ifdef __cplusplus
+}; /* End extern "C". */
+#endif /* C++ */
 // EID 60 (0x3c)
 typedef struct sDot11fIEext_chan_switch_ann {
     tANI_U8      present;
@@ -6397,33 +6424,34 @@
 #endif /* C++ */
 
 typedef struct sDot11fAssocRequest{
-    tDot11fFfCapabilities   Capabilities;
-    tDot11fFfListenInterval ListenInterval;
-    tDot11fIESSID           SSID;
-    tDot11fIESuppRates      SuppRates;
-    tDot11fIEExtSuppRates   ExtSuppRates;
-    tDot11fIEPowerCaps      PowerCaps;
-    tDot11fIESuppChannels   SuppChannels;
-    tDot11fIERSNOpaque      RSNOpaque;
-    tDot11fIEQOSCapsStation QOSCapsStation;
-    tDot11fIERRMEnabledCap  RRMEnabledCap;
-    tDot11fIEMobilityDomain MobilityDomain;
-    tDot11fIEWPAOpaque      WPAOpaque;
-    tDot11fIEHTCaps         HTCaps;
-    tDot11fIEWMMCaps        WMMCaps;
-    tDot11fIEWMMInfoStation WMMInfoStation;
-    tDot11fIEAirgo          Airgo;
-    tDot11fIEWscIEOpaque    WscIEOpaque;
-    tDot11fIEWAPIOpaque     WAPIOpaque;
-    tDot11fIEESERadMgmtCap  ESERadMgmtCap;
-    tDot11fIEESEVersion     ESEVersion;
-    tDot11fIEP2PIEOpaque    P2PIEOpaque;
-    tDot11fIEWFDIEOpaque    WFDIEOpaque;
-    tDot11fIEVHTCaps        VHTCaps;
-    tDot11fIEExtCap         ExtCap;
-    tDot11fIEOperatingMode  OperatingMode;
-    tDot11fIEQosMapSet      QosMapSet;
-    tDot11fIEhs20vendor_ie  hs20vendor_ie;
+    tDot11fFfCapabilities         Capabilities;
+    tDot11fFfListenInterval       ListenInterval;
+    tDot11fIESSID                 SSID;
+    tDot11fIESuppRates            SuppRates;
+    tDot11fIEExtSuppRates         ExtSuppRates;
+    tDot11fIEPowerCaps            PowerCaps;
+    tDot11fIESuppChannels         SuppChannels;
+    tDot11fIERSNOpaque            RSNOpaque;
+    tDot11fIEQOSCapsStation       QOSCapsStation;
+    tDot11fIERRMEnabledCap        RRMEnabledCap;
+    tDot11fIEMobilityDomain       MobilityDomain;
+    tDot11fIEdh_parameter_element dh_parameter_element;
+    tDot11fIEWPAOpaque            WPAOpaque;
+    tDot11fIEHTCaps               HTCaps;
+    tDot11fIEWMMCaps              WMMCaps;
+    tDot11fIEWMMInfoStation       WMMInfoStation;
+    tDot11fIEAirgo                Airgo;
+    tDot11fIEWscIEOpaque          WscIEOpaque;
+    tDot11fIEWAPIOpaque           WAPIOpaque;
+    tDot11fIEESERadMgmtCap        ESERadMgmtCap;
+    tDot11fIEESEVersion           ESEVersion;
+    tDot11fIEP2PIEOpaque          P2PIEOpaque;
+    tDot11fIEWFDIEOpaque          WFDIEOpaque;
+    tDot11fIEVHTCaps              VHTCaps;
+    tDot11fIEExtCap               ExtCap;
+    tDot11fIEOperatingMode        OperatingMode;
+    tDot11fIEQosMapSet            QosMapSet;
+    tDot11fIEhs20vendor_ie        hs20vendor_ie;
 } tDot11fAssocRequest;
 
 #define DOT11F_ASSOCREQUEST ( 5 )
diff --git a/CORE/SYS/legacy/src/utils/src/dot11f.c b/CORE/SYS/legacy/src/utils/src/dot11f.c
index a47bbc1..d22f1f8 100644
--- a/CORE/SYS/legacy/src/utils/src/dot11f.c
+++ b/CORE/SYS/legacy/src/utils/src/dot11f.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012-2018 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2019 The Linux Foundation. All rights reserved.
  *
  * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
  *
@@ -30,7 +30,7 @@
   * \brief Structures, functions & definitions for
   * working with 802.11 Frames
   * This file was automatically generated by 'framesc'
-  * Tue Aug 28 09:50:49 2018 from the following file(s):
+  * Mon Jul 22 17:48:28 2019 from the following file(s):
   *
   * dot11f.frms
   *
@@ -7770,6 +7770,29 @@
 #define SigIeWscReassocRes ( 0x008e )
 
 
+tANI_U32 dot11fUnpackIedh_parameter_element(tpAniSirGlobal pCtx, tANI_U8 *pBuf, tANI_U8 ielen, tDot11fIEdh_parameter_element *pDst)
+{
+    tANI_U32 status = DOT11F_PARSE_SUCCESS;
+    (void) pBuf; (void)ielen; /* Shutup the compiler */
+    if (pDst->present) status = DOT11F_DUPLICATE_IE;
+    pDst->present = 1;
+    if (unlikely(ielen < 2)) {
+        pDst->present = 0;
+        return DOT11F_INCOMPLETE_IE;
+    }
+
+    DOT11F_MEMCPY(pCtx, pDst->group, pBuf, 2);
+    pBuf += 2;
+    ielen -= (tANI_U8)2;
+    pDst->num_public_key = (tANI_U8)( ielen );
+    DOT11F_MEMCPY(pCtx, pDst->public_key, pBuf, ( ielen ) );
+    (void)pCtx;
+    return status;
+} /* End dot11fUnpackIedh_parameter_element. */
+
+#define SigIedh_parameter_element ( 0x008f )
+
+
 tANI_U32 dot11fUnpackIeext_chan_switch_ann(tpAniSirGlobal pCtx, tANI_U8 *pBuf, tANI_U8 ielen, tDot11fIEext_chan_switch_ann *pDst)
 {
     tANI_U32 status = DOT11F_PARSE_SUCCESS;
@@ -7810,7 +7833,7 @@
     return status;
 } /* End dot11fUnpackIeext_chan_switch_ann. */
 
-#define SigIeext_chan_switch_ann ( 0x008f )
+#define SigIeext_chan_switch_ann ( 0x0090 )
 
 
 tANI_U32 dot11fUnpackIehs20vendor_ie(tpAniSirGlobal pCtx, tANI_U8 *pBuf, tANI_U8 ielen, tDot11fIEhs20vendor_ie *pDst)
@@ -7866,7 +7889,7 @@
     return status;
 } /* End dot11fUnpackIehs20vendor_ie. */
 
-#define SigIehs20vendor_ie ( 0x0090 )
+#define SigIehs20vendor_ie ( 0x0091 )
 
 
 tANI_U32 dot11fUnpackIesec_chan_offset(tpAniSirGlobal pCtx, tANI_U8 *pBuf, tANI_U8 ielen, tDot11fIEsec_chan_offset *pDst)
@@ -7885,7 +7908,7 @@
     return status;
 } /* End dot11fUnpackIesec_chan_offset. */
 
-#define SigIesec_chan_offset ( 0x0091 )
+#define SigIesec_chan_offset ( 0x0092 )
 
 
     static const tFFDefn FFS_AddBAReq[] = {
@@ -8530,6 +8553,7 @@
         {offsetof(tDot11fAssocRequest, QOSCapsStation), offsetof(tDot11fIEQOSCapsStation, present), 0, "QOSCapsStation" , 0, 3, 3, SigIeQOSCapsStation, {0, 0, 0, 0, 0}, 0, DOT11F_EID_QOSCAPSSTATION, 0, 0, },
         {offsetof(tDot11fAssocRequest, RRMEnabledCap), offsetof(tDot11fIERRMEnabledCap, present), 0, "RRMEnabledCap" , 0, 7, 7, SigIeRRMEnabledCap, {0, 0, 0, 0, 0}, 0, DOT11F_EID_RRMENABLEDCAP, 0, 0, },
         {offsetof(tDot11fAssocRequest, MobilityDomain), offsetof(tDot11fIEMobilityDomain, present), 0, "MobilityDomain" , 0, 5, 5, SigIeMobilityDomain, {0, 0, 0, 0, 0}, 0, DOT11F_EID_MOBILITYDOMAIN, 0, 0, },
+        {offsetof(tDot11fAssocRequest, dh_parameter_element), offsetof(tDot11fIEdh_parameter_element, present), 0, "dh_parameter_element" , 0, 4, 259, SigIedh_parameter_element, {0, 0, 0, 0, 0}, 0, DOT11F_EID_DH_PARAMETER_ELEMENT, 32, 0, },
         {offsetof(tDot11fAssocRequest, WPAOpaque), offsetof(tDot11fIEWPAOpaque, present), 0, "WPAOpaque" , 0, 8, 255, SigIeWPAOpaque, {0, 80, 242, 1, 0}, 4, DOT11F_EID_WPAOPAQUE, 0, 0, },
         {offsetof(tDot11fAssocRequest, HTCaps), offsetof(tDot11fIEHTCaps, present), 0, "HTCaps" , 0, 28, 60, SigIeHTCaps, {0, 0, 0, 0, 0}, 0, DOT11F_EID_HTCAPS, 0, 0, },
         {offsetof(tDot11fAssocRequest, WMMCaps), offsetof(tDot11fIEWMMCaps, present), 0, "WMMCaps" , 0, 9, 9, SigIeWMMCaps, {0, 80, 242, 2, 5}, 5, DOT11F_EID_WMMCAPS, 0, 0, },
@@ -8704,6 +8728,17 @@
             FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("resourceReqCap (1): %d\n"), pFrm->MobilityDomain.resourceReqCap);
             FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("reserved (6): %d\n"), pFrm->MobilityDomain.reserved);
         }
+        FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("dh_parameter_element:\n"));
+        if (!pFrm->dh_parameter_element.present)
+        {
+            FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("Not present.\n"));
+        }
+        else
+        {
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), ( tANI_U8* )&pFrm->dh_parameter_element.group, 2);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("num_public_key: %d.\n"), pFrm->dh_parameter_element.num_public_key);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), ( tANI_U8* ) pFrm->dh_parameter_element.public_key, pFrm->dh_parameter_element.num_public_key);
+        }
         FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("WPAOpaque:\n"));
         if (!pFrm->WPAOpaque.present)
         {
@@ -23207,6 +23242,9 @@
                 case SigIeWscReassocRes:
                         status |= dot11fUnpackIeWscReassocRes(pCtx, pBufRemaining, len, ( tDot11fIEWscReassocRes* )(pFrm + pIe->offset + sizeof(tDot11fIEWscReassocRes)*countOffset) );
                             break;
+                case SigIedh_parameter_element:
+                        status |= dot11fUnpackIedh_parameter_element(pCtx, pBufRemaining, len, ( tDot11fIEdh_parameter_element* )(pFrm + pIe->offset + sizeof(tDot11fIEdh_parameter_element)*countOffset) );
+                            break;
                 case SigIeext_chan_switch_ann:
                         status |= dot11fUnpackIeext_chan_switch_ann(pCtx, pBufRemaining, len, ( tDot11fIEext_chan_switch_ann* )(pFrm + pIe->offset + sizeof(tDot11fIEext_chan_switch_ann)*countOffset) );
                             break;
@@ -25580,6 +25618,11 @@
                             offset = sizeof(tDot11fIEWscReassocRes);
                             status |= dot11fGetPackedIEWscReassocRes(pCtx, ( tDot11fIEWscReassocRes* )(pFrm + pIe->offset + offset * i ), pnNeeded);
                             break;
+                case SigIedh_parameter_element:
+                            offset = sizeof(tDot11fIEdh_parameter_element);
+                            byteCount = ((tDot11fIEdh_parameter_element* )(pFrm + pIe->offset + sizeof(tDot11fIEdh_parameter_element) * i ))->num_public_key + 2;
+                            pIePresent = ( (tDot11fIEdh_parameter_element* )(pFrm + pIe->offset + offset * i  ))->present;
+                            break;
                 case SigIeext_chan_switch_ann:
                             offset = sizeof(tDot11fIEext_chan_switch_ann);
                             byteCount = 4;
@@ -34234,6 +34277,41 @@
     return status;
 } /* End dot11fPackIeWscReassocRes. */
 
+tANI_U32 dot11fPackIedh_parameter_element(tpAniSirGlobal pCtx,
+                                          tDot11fIEdh_parameter_element *pSrc,
+                                          tANI_U8 *pBuf,
+                                          tANI_U32 nBuf,
+                                          tANI_U32 *pnConsumed)
+{
+    tANI_U8* pIeLen = 0;
+    tANI_U32 nConsumedOnEntry = *pnConsumed;
+    tANI_U32 nNeeded = 0U;
+    nNeeded  +=  (pSrc->num_public_key + 2);
+    while ( pSrc->present )
+    {
+        if ( nNeeded > nBuf ) return DOT11F_BUFFER_OVERFLOW;
+        *pBuf = 255;
+        ++pBuf; ++(*pnConsumed);
+        pIeLen = pBuf;
+        ++pBuf; ++(*pnConsumed);
+        *pBuf = 32;
+        ++pBuf; ++(*pnConsumed);
+        DOT11F_MEMCPY(pCtx, pBuf, pSrc->group, 2);
+        *pnConsumed += 2;
+        pBuf += 2;
+        DOT11F_MEMCPY(pCtx, pBuf, &( pSrc->public_key ), pSrc->num_public_key);
+        *pnConsumed += pSrc->num_public_key;
+        // fieldsEndFlag = 1
+        break;
+    }
+    (void)pCtx;
+    if (pIeLen)
+    {
+        *pIeLen = *pnConsumed - nConsumedOnEntry - 2;
+    }
+    return DOT11F_PARSE_SUCCESS;
+} /* End dot11fPackIedh_parameter_element. */
+
 tANI_U32 dot11fPackIeext_chan_switch_ann(tpAniSirGlobal pCtx,
                                          tDot11fIEext_chan_switch_ann *pSrc,
                                          tANI_U8 *pBuf,
@@ -35089,6 +35167,17 @@
             FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("resourceReqCap (1): %d\n"), pFrm->MobilityDomain.resourceReqCap);
             FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("reserved (6): %d\n"), pFrm->MobilityDomain.reserved);
         }
+        FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("dh_parameter_element:\n"));
+        if (!pFrm->dh_parameter_element.present)
+        {
+            FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("Not present.\n"));
+        }
+        else
+        {
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), ( tANI_U8* )&pFrm->dh_parameter_element.group, 2);
+            FRAMES_LOG1(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("num_public_key: %d.\n"), pFrm->dh_parameter_element.num_public_key);
+            FRAMES_DUMP(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), ( tANI_U8* ) pFrm->dh_parameter_element.public_key, pFrm->dh_parameter_element.num_public_key);
+        }
         FRAMES_LOG0(pCtx, FRAMES_SEV_FOR_FRAME(pCtx, DOT11F_ASSOCREQUEST), FRFL("WPAOpaque:\n"));
         if (!pFrm->WPAOpaque.present)
         {
@@ -48559,6 +48648,9 @@
                     case SigIeWscReassocRes:
                         status |= dot11fPackIeWscReassocRes(pCtx, ( tDot11fIEWscReassocRes* )(pSrc + pIe->offset + sizeof(tDot11fIEWscReassocRes) * i ),  pBufRemaining, nBufRemaining, &len);
                         break;
+                    case SigIedh_parameter_element:
+                        status |= dot11fPackIedh_parameter_element(pCtx, ( tDot11fIEdh_parameter_element* )(pSrc + pIe->offset + sizeof(tDot11fIEdh_parameter_element) * i ),  pBufRemaining, nBufRemaining, &len);
+                        break;
                     case SigIeext_chan_switch_ann:
                         status |= dot11fPackIeext_chan_switch_ann(pCtx, ( tDot11fIEext_chan_switch_ann* )(pSrc + pIe->offset + sizeof(tDot11fIEext_chan_switch_ann) * i ),  pBufRemaining, nBufRemaining, &len);
                         break;