static int mwifiex_set_gen_ie_helper(struct mwifiex_private *priv, u8 *ie_data_ptr, u16 ie_len) { int ret = 0; struct ieee_types_vendor_header *pvendor_ie; const u8 wpa_oui[] = { 0x00, 0x50, 0xf2, 0x01 }; const u8 wps_oui[] = { 0x00, 0x50, 0xf2, 0x04 }; if (!ie_len) { priv->gen_ie_buf_len = 0; priv->wps.session_enable = false; return 0; } else if (!ie_data_ptr) { return -1; } pvendor_ie = (struct ieee_types_vendor_header *) ie_data_ptr; if (((pvendor_ie->element_id == WLAN_EID_WPA) && (!memcmp(pvendor_ie->oui, wpa_oui, sizeof(wpa_oui)))) || (pvendor_ie->element_id == WLAN_EID_RSN)) { ret = mwifiex_set_wpa_ie_helper(priv, ie_data_ptr, ie_len); priv->wps.session_enable = false; return ret; } else if (pvendor_ie->element_id == WLAN_EID_BSS_AC_ACCESS_DELAY) { ret = mwifiex_set_wapi_ie(priv, ie_data_ptr, ie_len); return ret; } if (ie_len < (sizeof(priv->gen_ie_buf) - priv->gen_ie_buf_len)) { pvendor_ie = (struct ieee_types_vendor_header *) ie_data_ptr; if ((pvendor_ie->element_id == WLAN_EID_VENDOR_SPECIFIC) && (!memcmp(pvendor_ie->oui, wps_oui, sizeof(wps_oui)))) { priv->wps.session_enable = true; dev_dbg(priv->adapter->dev, "info: WPS Session Enabled.\n"); } memcpy(priv->gen_ie_buf + priv->gen_ie_buf_len, ie_data_ptr, ie_len); priv->gen_ie_buf_len += ie_len; } else { ret = -1; } return ret; }
/* * This function sets a generic IE. In addition to generic IE, it can * also handle WPA, WPA2 and WAPI IEs. */ static int mwifiex_set_gen_ie_helper(struct mwifiex_private *priv, u8 *ie_data_ptr, u16 ie_len) { int ret = 0; struct ieee_types_vendor_header *pvendor_ie; const u8 wpa_oui[] = { 0x00, 0x50, 0xf2, 0x01 }; const u8 wps_oui[] = { 0x00, 0x50, 0xf2, 0x04 }; /* If the passed length is zero, reset the buffer */ if (!ie_len) { priv->gen_ie_buf_len = 0; priv->wps.session_enable = false; return 0; } else if (!ie_data_ptr) { return -1; } pvendor_ie = (struct ieee_types_vendor_header *) ie_data_ptr; /* Test to see if it is a WPA IE, if not, then it is a gen IE */ if (((pvendor_ie->element_id == WLAN_EID_WPA) && (!memcmp(pvendor_ie->oui, wpa_oui, sizeof(wpa_oui)))) || (pvendor_ie->element_id == WLAN_EID_RSN)) { /* IE is a WPA/WPA2 IE so call set_wpa function */ ret = mwifiex_set_wpa_ie_helper(priv, ie_data_ptr, ie_len); priv->wps.session_enable = false; return ret; } else if (pvendor_ie->element_id == WLAN_EID_BSS_AC_ACCESS_DELAY) { /* IE is a WAPI IE so call set_wapi function */ ret = mwifiex_set_wapi_ie(priv, ie_data_ptr, ie_len); return ret; } /* * Verify that the passed length is not larger than the * available space remaining in the buffer */ if (ie_len < (sizeof(priv->gen_ie_buf) - priv->gen_ie_buf_len)) { /* Test to see if it is a WPS IE, if so, enable * wps session flag */ pvendor_ie = (struct ieee_types_vendor_header *) ie_data_ptr; if ((pvendor_ie->element_id == WLAN_EID_VENDOR_SPECIFIC) && (!memcmp(pvendor_ie->oui, wps_oui, sizeof(wps_oui)))) { priv->wps.session_enable = true; dev_dbg(priv->adapter->dev, "info: WPS Session Enabled.\n"); } /* Append the passed data to the end of the genIeBuffer */ memcpy(priv->gen_ie_buf + priv->gen_ie_buf_len, ie_data_ptr, ie_len); /* Increment the stored buffer length by the size passed */ priv->gen_ie_buf_len += ie_len; } else { /* Passed data does not fit in the remaining buffer space */ ret = -1; } /* Return 0, or -1 for error case */ return ret; }