|
@@ -5342,201 +5342,6 @@ static int iw_set_bitrate(struct net_device *dev,
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
-/**
|
|
|
- * __iw_set_genie() - SIOCSIWGENIE ioctl handler
|
|
|
- * @dev: device upon which the ioctl was received
|
|
|
- * @info: ioctl request information
|
|
|
- * @wrqu: ioctl request data
|
|
|
- * @extra: ioctl extra data
|
|
|
- *
|
|
|
- * Return: 0 on success, non-zero on error
|
|
|
- */
|
|
|
-static int __iw_set_genie(struct net_device *dev,
|
|
|
- struct iw_request_info *info,
|
|
|
- union iwreq_data *wrqu, char *extra)
|
|
|
-{
|
|
|
- struct hdd_adapter *adapter = WLAN_HDD_GET_PRIV_PTR(dev);
|
|
|
- struct hdd_wext_state *pWextState =
|
|
|
- WLAN_HDD_GET_WEXT_STATE_PTR(adapter);
|
|
|
- uint8_t *genie = NULL;
|
|
|
- uint8_t *base_genie = NULL;
|
|
|
- uint16_t remLen;
|
|
|
- struct hdd_context *hdd_ctx;
|
|
|
- int ret;
|
|
|
-
|
|
|
- ENTER_DEV(dev);
|
|
|
-
|
|
|
- hdd_ctx = WLAN_HDD_GET_CTX(adapter);
|
|
|
- ret = wlan_hdd_validate_context(hdd_ctx);
|
|
|
- if (0 != ret)
|
|
|
- return ret;
|
|
|
-
|
|
|
- ret = hdd_check_standard_wext_control(hdd_ctx, info);
|
|
|
- if (0 != ret)
|
|
|
- return ret;
|
|
|
-
|
|
|
- if (!wrqu->data.length) {
|
|
|
- hdd_clear_roam_profile_ie(adapter);
|
|
|
- EXIT();
|
|
|
- return 0;
|
|
|
- }
|
|
|
-
|
|
|
- base_genie = mem_alloc_copy_from_user_helper(wrqu->data.pointer,
|
|
|
- wrqu->data.length);
|
|
|
- if (NULL == base_genie) {
|
|
|
- hdd_err("mem_alloc_copy_from_user_helper fail");
|
|
|
- return -ENOMEM;
|
|
|
- }
|
|
|
-
|
|
|
- genie = base_genie;
|
|
|
-
|
|
|
- remLen = wrqu->data.length;
|
|
|
-
|
|
|
- hdd_debug("iw_set_genie ioctl IE[0x%X], LEN[%d]", genie[0],
|
|
|
- genie[1]);
|
|
|
-
|
|
|
- /* clear any previous genIE before this call */
|
|
|
- memset(&pWextState->genIE, 0, sizeof(pWextState->genIE));
|
|
|
-
|
|
|
- while (remLen >= 2) {
|
|
|
- uint16_t eLen = 0;
|
|
|
- uint8_t elementId;
|
|
|
-
|
|
|
- elementId = *genie++;
|
|
|
- eLen = *genie++;
|
|
|
- remLen -= 2;
|
|
|
-
|
|
|
- hdd_debug("IE[0x%X], LEN[%d]", elementId, eLen);
|
|
|
-
|
|
|
- if (remLen < eLen) {
|
|
|
- hdd_err("Remaining len: %u less than ie len: %u",
|
|
|
- remLen, eLen);
|
|
|
- ret = -EINVAL;
|
|
|
- goto exit;
|
|
|
- }
|
|
|
-
|
|
|
- switch (elementId) {
|
|
|
- case IE_EID_VENDOR:
|
|
|
- /* should have at least OUI */
|
|
|
- if ((IE_LEN_SIZE + IE_EID_SIZE + IE_VENDOR_OUI_SIZE) > eLen) {
|
|
|
- ret = -EINVAL;
|
|
|
- goto exit;
|
|
|
- }
|
|
|
-
|
|
|
- if (0 == memcmp(&genie[0], "\x00\x50\xf2\x04", 4)) {
|
|
|
- uint16_t curGenIELen = pWextState->genIE.length;
|
|
|
-
|
|
|
- hdd_debug("Set WPS OUI(%02x %02x %02x %02x) IE(len %d)",
|
|
|
- genie[0], genie[1], genie[2],
|
|
|
- genie[3], eLen + 2);
|
|
|
-
|
|
|
- if (SIR_MAC_MAX_IE_LENGTH <
|
|
|
- (pWextState->genIE.length + eLen)) {
|
|
|
- hdd_err("genIE. Need bigger buffer space");
|
|
|
- QDF_ASSERT(0);
|
|
|
- ret = -ENOMEM;
|
|
|
- goto exit;
|
|
|
- }
|
|
|
- /* save to Additional IE; it should be
|
|
|
- * accumulated to handle WPS IE + other IE
|
|
|
- */
|
|
|
- memcpy(pWextState->genIE.addIEdata +
|
|
|
- curGenIELen, genie - 2, eLen + 2);
|
|
|
- pWextState->genIE.length += eLen + 2;
|
|
|
- } else if (0 == memcmp(&genie[0], "\x00\x50\xf2", 3)) {
|
|
|
- hdd_debug("Set WPA IE (len %d)", eLen + 2);
|
|
|
- if ((eLen + 2) > (sizeof(pWextState->WPARSNIE))) {
|
|
|
- hdd_err("genIE, Need bigger buffer space");
|
|
|
- ret = -EINVAL;
|
|
|
- QDF_ASSERT(0);
|
|
|
- goto exit;
|
|
|
- }
|
|
|
- memset(pWextState->WPARSNIE, 0,
|
|
|
- MAX_WPA_RSN_IE_LEN);
|
|
|
- memcpy(pWextState->WPARSNIE, genie - 2,
|
|
|
- (eLen + 2));
|
|
|
- pWextState->roamProfile.pWPAReqIE =
|
|
|
- pWextState->WPARSNIE;
|
|
|
- pWextState->roamProfile.nWPAReqIELength =
|
|
|
- eLen + 2;
|
|
|
- } else {
|
|
|
- /* any vendorId except WPA IE should
|
|
|
- * be accumulated to genIE
|
|
|
- */
|
|
|
- uint16_t curGenIELen = pWextState->genIE.length;
|
|
|
-
|
|
|
- hdd_debug("Set OUI(%02x %02x %02x %02x) IE(len %d)",
|
|
|
- genie[0], genie[1], genie[2],
|
|
|
- genie[3], eLen + 2);
|
|
|
-
|
|
|
- if (SIR_MAC_MAX_IE_LENGTH <
|
|
|
- (pWextState->genIE.length + eLen)) {
|
|
|
- hdd_err("genIE. Need bigger buffer space");
|
|
|
- QDF_ASSERT(0);
|
|
|
- ret = -ENOMEM;
|
|
|
- goto exit;
|
|
|
- }
|
|
|
- /* save to Additional IE; it should be
|
|
|
- * accumulated to handle WPS IE + other IE
|
|
|
- */
|
|
|
- memcpy(pWextState->genIE.addIEdata +
|
|
|
- curGenIELen, genie - 2, eLen + 2);
|
|
|
- pWextState->genIE.length += eLen + 2;
|
|
|
- }
|
|
|
- break;
|
|
|
- case DOT11F_EID_RSN:
|
|
|
- hdd_debug("Set RSN IE (len %d)", eLen + 2);
|
|
|
- if ((eLen + 2) > (sizeof(pWextState->WPARSNIE))) {
|
|
|
- hdd_err("genIE, Need bigger buffer space");
|
|
|
- ret = -EINVAL;
|
|
|
- QDF_ASSERT(0);
|
|
|
- goto exit;
|
|
|
- }
|
|
|
- memset(pWextState->WPARSNIE, 0, MAX_WPA_RSN_IE_LEN);
|
|
|
- memcpy(pWextState->WPARSNIE, genie - 2, (eLen + 2));
|
|
|
- pWextState->roamProfile.pRSNReqIE =
|
|
|
- pWextState->WPARSNIE;
|
|
|
- pWextState->roamProfile.nRSNReqIELength = eLen + 2;
|
|
|
- break;
|
|
|
-
|
|
|
- default:
|
|
|
- hdd_err("Set UNKNOWN IE %X", elementId);
|
|
|
- goto exit;
|
|
|
- }
|
|
|
- remLen -= eLen;
|
|
|
-
|
|
|
- /* Move genie only if next element is present */
|
|
|
- if (remLen >= 2)
|
|
|
- genie += eLen;
|
|
|
- }
|
|
|
-exit:
|
|
|
- EXIT();
|
|
|
- qdf_mem_free(base_genie);
|
|
|
- return ret;
|
|
|
-}
|
|
|
-
|
|
|
-/**
|
|
|
- * iw_set_genie() - SSR wrapper for __iw_set_genie()
|
|
|
- * @dev: pointer to net_device
|
|
|
- * @info: pointer to iw_request_info
|
|
|
- * @wrqu: pointer to iwreq_data
|
|
|
- * @extra: pointer to extra ioctl payload
|
|
|
- *
|
|
|
- * Return: 0 on success, error number otherwise
|
|
|
- */
|
|
|
-static int iw_set_genie(struct net_device *dev,
|
|
|
- struct iw_request_info *info,
|
|
|
- union iwreq_data *wrqu, char *extra)
|
|
|
-{
|
|
|
- int ret;
|
|
|
-
|
|
|
- cds_ssr_protect(__func__);
|
|
|
- ret = __iw_set_genie(dev, info, wrqu, extra);
|
|
|
- cds_ssr_unprotect(__func__);
|
|
|
-
|
|
|
- return ret;
|
|
|
-}
|
|
|
-
|
|
|
/**
|
|
|
* __iw_get_encode() - SIOCGIWENCODE ioctl handler
|
|
|
* @dev: device upon which the ioctl was received
|
|
@@ -12820,7 +12625,7 @@ static const iw_handler we_handler[] = {
|
|
|
(iw_handler) iw_get_power_mode, /* SIOCGIWPOWER */
|
|
|
(iw_handler) NULL, /* -- hole -- */
|
|
|
(iw_handler) NULL, /* -- hole -- */
|
|
|
- (iw_handler) iw_set_genie, /* SIOCSIWGENIE */
|
|
|
+ (iw_handler) NULL, /* SIOCSIWGENIE */
|
|
|
(iw_handler) NULL, /* SIOCGIWGENIE */
|
|
|
(iw_handler) NULL, /* SIOCSIWAUTH */
|
|
|
(iw_handler) NULL, /* SIOCGIWAUTH */
|