From 666f96e24d6428555a266675f370b6df171d982a Mon Sep 17 00:00:00 2001 From: "Padma, Santhosh Kumar" Date: Fri, 10 Nov 2017 13:22:59 +0530 Subject: [PATCH] qcacld-3.0: Add OWE IEs Add support for Opportunistic Wireless Encryption IEs Change-Id: Ifb5b11c3f775654e31248ea5b91da0df6aebe6a9 CRs-Fixed: 2141423 --- core/mac/src/cfg/cfgUtil/dot11f.frms | 7 + core/mac/src/include/dot11f.h | 42 ++++++ .../mac/src/sys/legacy/src/utils/src/dot11f.c | 130 +++++++++++++++--- 3 files changed, 158 insertions(+), 21 deletions(-) diff --git a/core/mac/src/cfg/cfgUtil/dot11f.frms b/core/mac/src/cfg/cfgUtil/dot11f.frms index f8616cdfca24..690a0a66ccca 100644 --- a/core/mac/src/cfg/cfgUtil/dot11f.frms +++ b/core/mac/src/cfg/cfgUtil/dot11f.frms @@ -2653,6 +2653,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; @@ -3615,6 +3621,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 775d33a03ccf..7563c644722c 100644 --- a/core/mac/src/include/dot11f.h +++ b/core/mac/src/include/dot11f.h @@ -8181,6 +8181,47 @@ uint32_t dot11f_get_packed_ie_bss_color_change( }; /* 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++ */ +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 255 (0xff) Extended EID 11 (0x0b) */ typedef struct sDot11fIEesp_information { uint8_t present; @@ -9283,6 +9324,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 c894be823477..059f37d6fca7 100644 --- a/core/mac/src/sys/legacy/src/utils/src/dot11f.c +++ b/core/mac/src/sys/legacy/src/utils/src/dot11f.c @@ -6246,6 +6246,29 @@ uint32_t dot11f_unpack_ie_bss_color_change(tpAniSirGlobal pCtx, #define SigIebss_color_change (0x007d) +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 (0x007e) + + uint32_t dot11f_unpack_ie_esp_information(tpAniSirGlobal pCtx, uint8_t *pBuf, uint8_t ielen, @@ -6268,7 +6291,7 @@ uint32_t dot11f_unpack_ie_esp_information(tpAniSirGlobal pCtx, return status; } /* End dot11f_unpack_ie_esp_information. */ -#define SigIeesp_information (0x007e) +#define SigIeesp_information (0x007f) uint32_t dot11f_unpack_ie_ext_chan_switch_ann(tpAniSirGlobal pCtx, @@ -6296,7 +6319,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 (0x007f) +#define SigIeext_chan_switch_ann (0x0080) uint32_t dot11f_unpack_ie_fils_assoc_delay_info(tpAniSirGlobal pCtx, @@ -6315,7 +6338,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 (0x0080) +#define SigIefils_assoc_delay_info (0x0081) uint32_t dot11f_unpack_ie_fils_hlp_container(tpAniSirGlobal pCtx, @@ -6341,7 +6364,7 @@ uint32_t dot11f_unpack_ie_fils_hlp_container(tpAniSirGlobal pCtx, return status; } /* End dot11f_unpack_ie_fils_hlp_container. */ -#define SigIefils_hlp_container (0x0081) +#define SigIefils_hlp_container (0x0082) uint32_t dot11f_unpack_ie_fils_indication(tpAniSirGlobal pCtx, @@ -6374,7 +6397,7 @@ uint32_t dot11f_unpack_ie_fils_indication(tpAniSirGlobal pCtx, return status; } /* End dot11f_unpack_ie_fils_indication. */ -#define SigIefils_indication (0x0082) +#define SigIefils_indication (0x0083) uint32_t dot11f_unpack_ie_fils_kde(tpAniSirGlobal pCtx, @@ -6397,7 +6420,7 @@ uint32_t dot11f_unpack_ie_fils_kde(tpAniSirGlobal pCtx, return status; } /* End dot11f_unpack_ie_fils_kde. */ -#define SigIefils_kde (0x0083) +#define SigIefils_kde (0x0084) uint32_t dot11f_unpack_ie_fils_key_confirmation(tpAniSirGlobal pCtx, @@ -6417,7 +6440,7 @@ uint32_t dot11f_unpack_ie_fils_key_confirmation(tpAniSirGlobal pCtx, return status; } /* End dot11f_unpack_ie_fils_key_confirmation. */ -#define SigIefils_key_confirmation (0x0084) +#define SigIefils_key_confirmation (0x0085) uint32_t dot11f_unpack_ie_fils_nonce(tpAniSirGlobal pCtx, @@ -6436,7 +6459,7 @@ uint32_t dot11f_unpack_ie_fils_nonce(tpAniSirGlobal pCtx, return status; } /* End dot11f_unpack_ie_fils_nonce. */ -#define SigIefils_nonce (0x0085) +#define SigIefils_nonce (0x0086) uint32_t dot11f_unpack_ie_fils_public_key(tpAniSirGlobal pCtx, @@ -6459,7 +6482,7 @@ uint32_t dot11f_unpack_ie_fils_public_key(tpAniSirGlobal pCtx, return status; } /* End dot11f_unpack_ie_fils_public_key. */ -#define SigIefils_public_key (0x0086) +#define SigIefils_public_key (0x0087) uint32_t dot11f_unpack_ie_fils_session(tpAniSirGlobal pCtx, @@ -6478,7 +6501,7 @@ uint32_t dot11f_unpack_ie_fils_session(tpAniSirGlobal pCtx, return status; } /* End dot11f_unpack_ie_fils_session. */ -#define SigIefils_session (0x0087) +#define SigIefils_session (0x0088) uint32_t dot11f_unpack_ie_fils_wrapped_data(tpAniSirGlobal pCtx, @@ -6498,7 +6521,7 @@ uint32_t dot11f_unpack_ie_fils_wrapped_data(tpAniSirGlobal pCtx, return status; } /* End dot11f_unpack_ie_fils_wrapped_data. */ -#define SigIefils_wrapped_data (0x0088) +#define SigIefils_wrapped_data (0x0089) uint32_t dot11f_unpack_ie_fragment_ie(tpAniSirGlobal pCtx, @@ -6518,7 +6541,7 @@ uint32_t dot11f_unpack_ie_fragment_ie(tpAniSirGlobal pCtx, return status; } /* End dot11f_unpack_ie_fragment_ie. */ -#define SigIefragment_ie (0x0089) +#define SigIefragment_ie (0x008a) static const tFFDefn FFS_he_cap[] = { @@ -6692,7 +6715,7 @@ uint32_t dot11f_unpack_ie_he_cap(tpAniSirGlobal pCtx, return status; } /* End dot11f_unpack_ie_he_cap. */ -#define SigIehe_cap (0x008a) +#define SigIehe_cap (0x008b) uint32_t dot11f_unpack_ie_he_op(tpAniSirGlobal pCtx, @@ -6748,7 +6771,7 @@ uint32_t dot11f_unpack_ie_he_op(tpAniSirGlobal pCtx, return status; } /* End dot11f_unpack_ie_he_op. */ -#define SigIehe_op (0x008b) +#define SigIehe_op (0x008c) uint32_t dot11f_unpack_ie_hs20vendor_ie(tpAniSirGlobal pCtx, @@ -6790,7 +6813,7 @@ uint32_t dot11f_unpack_ie_hs20vendor_ie(tpAniSirGlobal pCtx, return status; } /* End dot11f_unpack_ie_hs20vendor_ie. */ -#define SigIehs20vendor_ie (0x008c) +#define SigIehs20vendor_ie (0x008d) uint32_t dot11f_unpack_ie_ht2040_bss_coexistence(tpAniSirGlobal pCtx, @@ -6816,7 +6839,7 @@ uint32_t dot11f_unpack_ie_ht2040_bss_coexistence(tpAniSirGlobal pCtx, return status; } /* End dot11f_unpack_ie_ht2040_bss_coexistence. */ -#define SigIeht2040_bss_coexistence (0x008d) +#define SigIeht2040_bss_coexistence (0x008e) uint32_t dot11f_unpack_ie_ht2040_bss_intolerant_report(tpAniSirGlobal pCtx, @@ -6844,7 +6867,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 (0x008e) +#define SigIeht2040_bss_intolerant_report (0x008f) uint32_t dot11f_unpack_ie_mu_edca_param_set(tpAniSirGlobal pCtx, @@ -6931,7 +6954,7 @@ uint32_t dot11f_unpack_ie_mu_edca_param_set(tpAniSirGlobal pCtx, return status; } /* End dot11f_unpack_ie_mu_edca_param_set. */ -#define SigIemu_edca_param_set (0x008f) +#define SigIemu_edca_param_set (0x0090) uint32_t dot11f_unpack_ie_osen_ie(tpAniSirGlobal pCtx, @@ -6951,7 +6974,7 @@ uint32_t dot11f_unpack_ie_osen_ie(tpAniSirGlobal pCtx, return status; } /* End dot11f_unpack_ie_osen_ie. */ -#define SigIeosen_ie (0x0090) +#define SigIeosen_ie (0x0091) uint32_t dot11f_unpack_ie_sec_chan_offset_ele(tpAniSirGlobal pCtx, @@ -6970,7 +6993,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 (0x0091) +#define SigIesec_chan_offset_ele (0x0092) static const tFFDefn FFS_vendor_vht_ie[] = { @@ -7014,7 +7037,7 @@ uint32_t dot11f_unpack_ie_vendor_vht_ie(tpAniSirGlobal pCtx, return status; } /* End dot11f_unpack_ie_vendor_vht_ie. */ -#define SigIevendor_vht_ie (0x0092) +#define SigIevendor_vht_ie (0x0093) static const tFFDefn FFS_AddTSRequest[] = { @@ -7226,6 +7249,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, }, @@ -11821,6 +11848,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 SigIeesp_information: status |= dot11f_unpack_ie_esp_information( @@ -14884,6 +14921,15 @@ static uint32_t get_packed_size_core(tpAniSirGlobal pCtx, (pFrm + pIe->offset + offset * i))-> present; 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 SigIeesp_information: offset = sizeof(tDot11fIEesp_information); byteCount = ((tDot11fIEesp_information *) @@ -22904,6 +22950,40 @@ uint32_t dot11f_pack_ie_bss_color_change(tpAniSirGlobal pCtx, return DOT11F_PARSE_SUCCESS; } /* End dot11f_pack_ie_bss_color_change. */ +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_esp_information(tpAniSirGlobal pCtx, tDot11fIEesp_information *pSrc, uint8_t *pBuf, @@ -25931,6 +26011,14 @@ static uint32_t pack_core(tpAniSirGlobal pCtx, sizeof(tDot11fIEbss_color_change) * 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 SigIeesp_information: status |= dot11f_pack_ie_esp_information(