wlan: Include vendor specific IE in Beacon
Code to include VSIE of hostapd.conf in beacon.
CRs-Fixed: 538538
Change-Id: I610c644091a58558ed457f65db218cf2e166a331
diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c
index a4a98d3..91538cf 100644
--- a/CORE/HDD/src/wlan_hdd_cfg80211.c
+++ b/CORE/HDD/src/wlan_hdd_cfg80211.c
@@ -1193,7 +1193,7 @@
static int wlan_hdd_add_ie(hdd_adapter_t* pHostapdAdapter, v_U8_t *genie,
v_U8_t *total_ielen, v_U8_t *oui, v_U8_t oui_size)
{
- v_U8_t ielen = 0;
+ v_U16_t ielen = 0;
v_U8_t *pIe = NULL;
beacon_data_t *pBeacon = pHostapdAdapter->sessionCtx.ap.beacon;
@@ -1217,6 +1217,67 @@
return 0;
}
+static void wlan_hdd_add_hostapd_conf_vsie(hdd_adapter_t* pHostapdAdapter,
+ v_U8_t *genie, v_U8_t *total_ielen)
+{
+ beacon_data_t *pBeacon = pHostapdAdapter->sessionCtx.ap.beacon;
+ int left = pBeacon->tail_len;
+ v_U8_t *ptr = pBeacon->tail;
+ v_U8_t elem_id, elem_len;
+ v_U16_t ielen = 0;
+
+ if ( NULL == ptr || 0 == left )
+ return;
+
+ while (left >= 2)
+ {
+ elem_id = ptr[0];
+ elem_len = ptr[1];
+ left -= 2;
+ if (elem_len > left)
+ {
+ hddLog( VOS_TRACE_LEVEL_ERROR,
+ "****Invalid IEs eid = %d elem_len=%d left=%d*****",
+ elem_id, elem_len, left);
+ return;
+ }
+ if (IE_EID_VENDOR == elem_id)
+ {
+ /* skipping the VSIE's which we don't want to include or
+ * it will be included by existing code
+ */
+ if ((memcmp( &ptr[2], WPS_OUI_TYPE, WPS_OUI_TYPE_SIZE) != 0 ) &&
+#ifdef WLAN_FEATURE_WFD
+ (memcmp( &ptr[2], WFD_OUI_TYPE, WFD_OUI_TYPE_SIZE) != 0) &&
+#endif
+ (memcmp( &ptr[2], WHITELIST_OUI_TYPE, WPA_OUI_TYPE_SIZE) != 0) &&
+ (memcmp( &ptr[2], BLACKLIST_OUI_TYPE, WPA_OUI_TYPE_SIZE) != 0) &&
+ (memcmp( &ptr[2], "\x00\x50\xf2\x02", WPA_OUI_TYPE_SIZE) != 0) &&
+ (memcmp( &ptr[2], WPA_OUI_TYPE, WPA_OUI_TYPE_SIZE) != 0) &&
+ (memcmp( &ptr[2], P2P_OUI_TYPE, P2P_OUI_TYPE_SIZE) != 0))
+ {
+ ielen = ptr[1] + 2;
+ if ((*total_ielen + ielen) <= MAX_GENIE_LEN)
+ {
+ vos_mem_copy(&genie[*total_ielen], ptr, ielen);
+ *total_ielen += ielen;
+ }
+ else
+ {
+ hddLog( VOS_TRACE_LEVEL_ERROR,
+ "IE Length is too big "
+ "IEs eid=%d elem_len=%d total_ie_lent=%d",
+ elem_id, elem_len, *total_ielen);
+ }
+ }
+ }
+
+ left -= elem_len;
+ ptr += (elem_len + 2);
+ }
+ return;
+}
+
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,4,0))
static int wlan_hdd_cfg80211_update_apies(hdd_adapter_t* pHostapdAdapter,
struct beacon_parameters *params)
@@ -1262,12 +1323,7 @@
if (WLAN_HDD_SOFTAP == pHostapdAdapter->device_mode)
{
- if (0 != wlan_hdd_add_ie(pHostapdAdapter, genie,
- &total_ielen, SS_OUI_TYPE, SS_OUI_TYPE_SIZE))
- {
- ret = -EINVAL;
- goto done;
- }
+ wlan_hdd_add_hostapd_conf_vsie(pHostapdAdapter, genie, &total_ielen);
}
if (ccmCfgSetStr((WLAN_HDD_GET_CTX(pHostapdAdapter))->hHal,