summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/mac/src/cfg/cfgUtil/dot11f.frms7
-rw-r--r--core/mac/src/include/dot11f.h42
-rw-r--r--core/mac/src/sys/legacy/src/utils/src/dot11f.c122
3 files changed, 154 insertions, 17 deletions
diff --git a/core/mac/src/cfg/cfgUtil/dot11f.frms b/core/mac/src/cfg/cfgUtil/dot11f.frms
index 87dd01d8de11..3dddb39f6b6a 100644
--- a/core/mac/src/cfg/cfgUtil/dot11f.frms
+++ b/core/mac/src/cfg/cfgUtil/dot11f.frms
@@ -2622,6 +2622,12 @@ IE fragment_ie (EID_FRAGMENT_IE)
data[0..255];
}
+IE dh_parameter_element (EID_EXTN_ID_ELEMENT) OUI ( 0x20 )
+{
+ group[2];
+ public_key[0..255];
+}
+
const EID_RRM_BEACON_REPORTING = 1;
const EID_RRM_BCN_REPORTING_DETAIL = 2;
@@ -3371,6 +3377,7 @@ FRAME AssocRequest // 7.2.3.4
OPTIE fils_key_confirmation;
OPTIE fils_hlp_container;
OPTIE fragment_ie;
+ OPTIE dh_parameter_element;
OPTIE WPAOpaque;
OPTIE WMMCaps;
OPTIE WMMInfoStation;
diff --git a/core/mac/src/include/dot11f.h b/core/mac/src/include/dot11f.h
index 7087926c5515..84604837f5bc 100644
--- a/core/mac/src/include/dot11f.h
+++ b/core/mac/src/include/dot11f.h
@@ -8067,6 +8067,47 @@ uint32_t dot11f_get_packed_ie_wsc_reassoc_res(
}; /* End extern "C". */
#endif /* C++ */
+/* EID 255 (0xff) Extended EID 32 (0x20) */
+typedef struct sDot11fIEdh_parameter_element {
+ uint8_t present;
+ uint8_t group[2];
+ uint8_t num_public_key;
+ uint8_t 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++ */
+__must_check uint32_t dot11f_unpack_ie_dh_parameter_element(
+ tpAniSirGlobal,
+ uint8_t *,
+ uint8_t,
+ tDot11fIEdh_parameter_element*,
+ bool);
+
+uint32_t dot11f_pack_ie_dh_parameter_element(
+ tpAniSirGlobal,
+ tDot11fIEdh_parameter_element *,
+ uint8_t *,
+ uint32_t,
+ uint32_t*);
+
+uint32_t dot11f_get_packed_ie_dh_parameter_element(
+ tpAniSirGlobal,
+ tDot11fIEdh_parameter_element *,
+ uint32_t*);
+
+#ifdef __cplusplus
+}; /* End extern "C". */
+#endif /* C++ */
+
/* EID 60 (0x3c) */
typedef struct sDot11fIEext_chan_switch_ann {
uint8_t present;
@@ -8877,6 +8918,7 @@ typedef struct sDot11fAssocRequest{
tDot11fIEfils_key_confirmation fils_key_confirmation;
tDot11fIEfils_hlp_container fils_hlp_container;
tDot11fIEfragment_ie fragment_ie;
+ tDot11fIEdh_parameter_element dh_parameter_element;
tDot11fIEWPAOpaque WPAOpaque;
tDot11fIEWMMCaps WMMCaps;
tDot11fIEWMMInfoStation WMMInfoStation;
diff --git a/core/mac/src/sys/legacy/src/utils/src/dot11f.c b/core/mac/src/sys/legacy/src/utils/src/dot11f.c
index 4c83e587aa54..5ca8a5607572 100644
--- a/core/mac/src/sys/legacy/src/utils/src/dot11f.c
+++ b/core/mac/src/sys/legacy/src/utils/src/dot11f.c
@@ -6237,6 +6237,29 @@ uint32_t dot11f_unpack_ie_wsc_reassoc_res(tpAniSirGlobal pCtx,
#define SigIeWscReassocRes (0x007c)
+uint32_t dot11f_unpack_ie_dh_parameter_element(tpAniSirGlobal pCtx,
+ uint8_t *pBuf,
+ uint8_t ielen,
+ tDot11fIEdh_parameter_element *pDst,
+ bool append_ie)
+{
+ uint32_t status = DOT11F_PARSE_SUCCESS;
+ (void) pBuf; (void)ielen; /* Shutup the compiler */
+ if (pDst->present)
+ status = DOT11F_DUPLICATE_IE;
+ pDst->present = 1;
+ DOT11F_MEMCPY(pCtx, pDst->group, pBuf, 2);
+ pBuf += 2;
+ ielen -= (uint8_t)2;
+ pDst->num_public_key = (uint8_t)(ielen);
+ DOT11F_MEMCPY(pCtx, pDst->public_key, pBuf, (ielen));
+ (void)pCtx;
+ return status;
+} /* End dot11f_unpack_ie_dh_parameter_element. */
+
+#define SigIedh_parameter_element (0x007d)
+
+
uint32_t dot11f_unpack_ie_ext_chan_switch_ann(tpAniSirGlobal pCtx,
uint8_t *pBuf,
uint8_t ielen,
@@ -6262,7 +6285,7 @@ uint32_t dot11f_unpack_ie_ext_chan_switch_ann(tpAniSirGlobal pCtx,
return status;
} /* End dot11f_unpack_ie_ext_chan_switch_ann. */
-#define SigIeext_chan_switch_ann (0x007d)
+#define SigIeext_chan_switch_ann (0x007e)
uint32_t dot11f_unpack_ie_fils_assoc_delay_info(tpAniSirGlobal pCtx,
@@ -6281,7 +6304,7 @@ uint32_t dot11f_unpack_ie_fils_assoc_delay_info(tpAniSirGlobal pCtx,
return status;
} /* End dot11f_unpack_ie_fils_assoc_delay_info. */
-#define SigIefils_assoc_delay_info (0x007e)
+#define SigIefils_assoc_delay_info (0x007f)
uint32_t dot11f_unpack_ie_fils_hlp_container(tpAniSirGlobal pCtx,
@@ -6307,7 +6330,7 @@ uint32_t dot11f_unpack_ie_fils_hlp_container(tpAniSirGlobal pCtx,
return status;
} /* End dot11f_unpack_ie_fils_hlp_container. */
-#define SigIefils_hlp_container (0x007f)
+#define SigIefils_hlp_container (0x0080)
uint32_t dot11f_unpack_ie_fils_indication(tpAniSirGlobal pCtx,
@@ -6340,7 +6363,7 @@ uint32_t dot11f_unpack_ie_fils_indication(tpAniSirGlobal pCtx,
return status;
} /* End dot11f_unpack_ie_fils_indication. */
-#define SigIefils_indication (0x0080)
+#define SigIefils_indication (0x0081)
uint32_t dot11f_unpack_ie_fils_kde(tpAniSirGlobal pCtx,
@@ -6363,7 +6386,7 @@ uint32_t dot11f_unpack_ie_fils_kde(tpAniSirGlobal pCtx,
return status;
} /* End dot11f_unpack_ie_fils_kde. */
-#define SigIefils_kde (0x0081)
+#define SigIefils_kde (0x0082)
uint32_t dot11f_unpack_ie_fils_key_confirmation(tpAniSirGlobal pCtx,
@@ -6383,7 +6406,7 @@ uint32_t dot11f_unpack_ie_fils_key_confirmation(tpAniSirGlobal pCtx,
return status;
} /* End dot11f_unpack_ie_fils_key_confirmation. */
-#define SigIefils_key_confirmation (0x0082)
+#define SigIefils_key_confirmation (0x0083)
uint32_t dot11f_unpack_ie_fils_nonce(tpAniSirGlobal pCtx,
@@ -6402,7 +6425,7 @@ uint32_t dot11f_unpack_ie_fils_nonce(tpAniSirGlobal pCtx,
return status;
} /* End dot11f_unpack_ie_fils_nonce. */
-#define SigIefils_nonce (0x0083)
+#define SigIefils_nonce (0x0084)
uint32_t dot11f_unpack_ie_fils_public_key(tpAniSirGlobal pCtx,
@@ -6425,7 +6448,7 @@ uint32_t dot11f_unpack_ie_fils_public_key(tpAniSirGlobal pCtx,
return status;
} /* End dot11f_unpack_ie_fils_public_key. */
-#define SigIefils_public_key (0x0084)
+#define SigIefils_public_key (0x0085)
uint32_t dot11f_unpack_ie_fils_session(tpAniSirGlobal pCtx,
@@ -6444,7 +6467,7 @@ uint32_t dot11f_unpack_ie_fils_session(tpAniSirGlobal pCtx,
return status;
} /* End dot11f_unpack_ie_fils_session. */
-#define SigIefils_session (0x0085)
+#define SigIefils_session (0x0086)
uint32_t dot11f_unpack_ie_fils_wrapped_data(tpAniSirGlobal pCtx,
@@ -6464,7 +6487,7 @@ uint32_t dot11f_unpack_ie_fils_wrapped_data(tpAniSirGlobal pCtx,
return status;
} /* End dot11f_unpack_ie_fils_wrapped_data. */
-#define SigIefils_wrapped_data (0x0086)
+#define SigIefils_wrapped_data (0x0087)
uint32_t dot11f_unpack_ie_fragment_ie(tpAniSirGlobal pCtx,
@@ -6484,7 +6507,7 @@ uint32_t dot11f_unpack_ie_fragment_ie(tpAniSirGlobal pCtx,
return status;
} /* End dot11f_unpack_ie_fragment_ie. */
-#define SigIefragment_ie (0x0087)
+#define SigIefragment_ie (0x0088)
uint32_t dot11f_unpack_ie_hs20vendor_ie(tpAniSirGlobal pCtx,
@@ -6526,7 +6549,7 @@ uint32_t dot11f_unpack_ie_hs20vendor_ie(tpAniSirGlobal pCtx,
return status;
} /* End dot11f_unpack_ie_hs20vendor_ie. */
-#define SigIehs20vendor_ie (0x0088)
+#define SigIehs20vendor_ie (0x0089)
uint32_t dot11f_unpack_ie_ht2040_bss_coexistence(tpAniSirGlobal pCtx,
@@ -6552,7 +6575,7 @@ uint32_t dot11f_unpack_ie_ht2040_bss_coexistence(tpAniSirGlobal pCtx,
return status;
} /* End dot11f_unpack_ie_ht2040_bss_coexistence. */
-#define SigIeht2040_bss_coexistence (0x0089)
+#define SigIeht2040_bss_coexistence (0x008a)
uint32_t dot11f_unpack_ie_ht2040_bss_intolerant_report(tpAniSirGlobal pCtx,
@@ -6580,7 +6603,7 @@ uint32_t dot11f_unpack_ie_ht2040_bss_intolerant_report(tpAniSirGlobal pCtx,
return status;
} /* End dot11f_unpack_ie_ht2040_bss_intolerant_report. */
-#define SigIeht2040_bss_intolerant_report (0x008a)
+#define SigIeht2040_bss_intolerant_report (0x008b)
uint32_t dot11f_unpack_ie_osen_ie(tpAniSirGlobal pCtx,
@@ -6600,7 +6623,7 @@ uint32_t dot11f_unpack_ie_osen_ie(tpAniSirGlobal pCtx,
return status;
} /* End dot11f_unpack_ie_osen_ie. */
-#define SigIeosen_ie (0x008b)
+#define SigIeosen_ie (0x008c)
uint32_t dot11f_unpack_ie_sec_chan_offset_ele(tpAniSirGlobal pCtx,
@@ -6619,7 +6642,7 @@ uint32_t dot11f_unpack_ie_sec_chan_offset_ele(tpAniSirGlobal pCtx,
return status;
} /* End dot11f_unpack_ie_sec_chan_offset_ele. */
-#define SigIesec_chan_offset_ele (0x008c)
+#define SigIesec_chan_offset_ele (0x008d)
static const tFFDefn FFS_vendor_vht_ie[] = {
@@ -6663,7 +6686,7 @@ uint32_t dot11f_unpack_ie_vendor_vht_ie(tpAniSirGlobal pCtx,
return status;
} /* End dot11f_unpack_ie_vendor_vht_ie. */
-#define SigIevendor_vht_ie (0x008d)
+#define SigIevendor_vht_ie (0x008e)
static const tFFDefn FFS_AddTSRequest[] = {
@@ -6875,6 +6898,10 @@ static const tIEDefn IES_AssocRequest[] = {
offsetof(tDot11fIEfragment_ie, present), 0, "fragment_ie",
0, 2, 257, SigIefragment_ie, {0, 0, 0, 0, 0},
0, DOT11F_EID_FRAGMENT_IE, 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, },
@@ -11257,6 +11284,16 @@ static uint32_t unpack_core(tpAniSirGlobal pCtx,
countOffset),
append_ie);
break;
+ case SigIedh_parameter_element:
+ status |=
+ dot11f_unpack_ie_dh_parameter_element(
+ pCtx, pBufRemaining, len,
+ (tDot11fIEdh_parameter_element *)
+ (pFrm + pIe->offset +
+ sizeof(tDot11fIEdh_parameter_element) *
+ countOffset),
+ append_ie);
+ break;
case SigIeext_chan_switch_ann:
status |=
dot11f_unpack_ie_ext_chan_switch_ann(
@@ -14193,6 +14230,15 @@ static uint32_t get_packed_size_core(tpAniSirGlobal pCtx,
(pFrm + pIe->offset + offset * i),
pnNeeded);
break;
+ case SigIedh_parameter_element:
+ offset = sizeof(tDot11fIEdh_parameter_element);
+ byteCount = ((tDot11fIEdh_parameter_element *)
+ (pFrm + pIe->offset + offset * 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;
@@ -22077,6 +22123,40 @@ uint32_t dot11f_pack_ie_wsc_reassoc_res(tpAniSirGlobal pCtx,
return status;
} /* End dot11f_pack_ie_wsc_reassoc_res. */
+uint32_t dot11f_pack_ie_dh_parameter_element(tpAniSirGlobal pCtx,
+ tDot11fIEdh_parameter_element *pSrc,
+ uint8_t *pBuf,
+ uint32_t nBuf,
+ uint32_t *pnConsumed)
+{
+ uint8_t *pIeLen = 0;
+ uint32_t nConsumedOnEntry = *pnConsumed;
+ uint32_t 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 dot11f_pack_ie_dh_parameter_element. */
+
uint32_t dot11f_pack_ie_ext_chan_switch_ann(tpAniSirGlobal pCtx,
tDot11fIEext_chan_switch_ann *pSrc,
uint8_t *pBuf,
@@ -24636,6 +24716,14 @@ static uint32_t pack_core(tpAniSirGlobal pCtx,
sizeof(tDot11fIEWscReassocRes) * i),
pBufRemaining, nBufRemaining, &len);
break;
+ case SigIedh_parameter_element:
+ status |=
+ dot11f_pack_ie_dh_parameter_element(
+ pCtx, (tDot11fIEdh_parameter_element *)
+ (pSrc + pIe->offset +
+ sizeof(tDot11fIEdh_parameter_element) * i),
+ pBufRemaining, nBufRemaining, &len);
+ break;
case SigIeext_chan_switch_ann:
status |=
dot11f_pack_ie_ext_chan_switch_ann(