Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b68518fc authored by Zhu Yi's avatar Zhu Yi Committed by John W. Linville
Browse files

iwmc3200wifi: use cfg80211_connect_result to send req/resp IE



cfg80211_connect_result() let us specify associate request and
response IEs as parameters after we are connected. We use this
capability instead of doing it ourselves with WEXT.

Signed-off-by: default avatarZhu Yi <yi.zhu@intel.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 3409ff77
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -281,6 +281,11 @@ struct iwm_priv {
	struct work_struct reset_worker;
	struct mutex mutex;

	u8 *req_ie;
	int req_ie_len;
	u8 *resp_ie;
	int resp_ie_len;

	char private[0] __attribute__((__aligned__(NETDEV_ALIGN)));
};

+7 −0
Original line number Diff line number Diff line
@@ -497,6 +497,13 @@ void iwm_link_off(struct iwm_priv *iwm)
	memset(wstats, 0, sizeof(struct iw_statistics));
	wstats->qual.updated = IW_QUAL_ALL_INVALID;

	kfree(iwm->req_ie);
	iwm->req_ie = NULL;
	iwm->req_ie_len = 0;
	kfree(iwm->resp_ie);
	iwm->resp_ie = NULL;
	iwm->resp_ie_len = 0;

	del_timer_sync(&iwm->watchdog);
}

+23 −13
Original line number Diff line number Diff line
@@ -519,7 +519,8 @@ static int iwm_mlme_assoc_complete(struct iwm_priv *iwm, u8 *buf,

		cfg80211_connect_result(iwm_to_ndev(iwm),
					complete->bssid,
					NULL, 0, NULL, 0,
					iwm->req_ie, iwm->req_ie_len,
					iwm->resp_ie, iwm->resp_ie_len,
					WLAN_STATUS_SUCCESS, GFP_KERNEL);
		break;
	case UMAC_ASSOC_COMPLETE_FAILURE:
@@ -774,34 +775,43 @@ static int iwm_mlme_mgt_frame(struct iwm_priv *iwm, u8 *buf,
			(struct iwm_umac_notif_mgt_frame *)buf;
	struct ieee80211_mgmt *mgt = (struct ieee80211_mgmt *)mgt_frame->frame;
	u8 *ie;
	unsigned int event;
	union iwreq_data wrqu;

	IWM_HEXDUMP(iwm, DBG, MLME, "MGT: ", mgt_frame->frame,
		    le16_to_cpu(mgt_frame->len));

	if (ieee80211_is_assoc_req(mgt->frame_control)) {
		ie = mgt->u.assoc_req.variable;;
		event = IWEVASSOCREQIE;
		iwm->req_ie_len =
				le16_to_cpu(mgt_frame->len) - (ie - (u8 *)mgt);
		kfree(iwm->req_ie);
		iwm->req_ie = kmemdup(mgt->u.assoc_req.variable,
				      iwm->req_ie_len, GFP_KERNEL);
	} else if (ieee80211_is_reassoc_req(mgt->frame_control)) {
		ie = mgt->u.reassoc_req.variable;;
		event = IWEVASSOCREQIE;
		iwm->req_ie_len =
				le16_to_cpu(mgt_frame->len) - (ie - (u8 *)mgt);
		kfree(iwm->req_ie);
		iwm->req_ie = kmemdup(mgt->u.reassoc_req.variable,
				      iwm->req_ie_len, GFP_KERNEL);
	} else if (ieee80211_is_assoc_resp(mgt->frame_control)) {
		ie = mgt->u.assoc_resp.variable;;
		event = IWEVASSOCRESPIE;
		iwm->resp_ie_len =
				le16_to_cpu(mgt_frame->len) - (ie - (u8 *)mgt);
		kfree(iwm->resp_ie);
		iwm->resp_ie = kmemdup(mgt->u.assoc_resp.variable,
				       iwm->resp_ie_len, GFP_KERNEL);
	} else if (ieee80211_is_reassoc_resp(mgt->frame_control)) {
		ie = mgt->u.reassoc_resp.variable;;
		event = IWEVASSOCRESPIE;
		iwm->resp_ie_len =
				le16_to_cpu(mgt_frame->len) - (ie - (u8 *)mgt);
		kfree(iwm->resp_ie);
		iwm->resp_ie = kmemdup(mgt->u.reassoc_resp.variable,
				       iwm->resp_ie_len, GFP_KERNEL);
	} else {
		IWM_ERR(iwm, "Unsupported management frame");
		return 0;
	}

	wrqu.data.length = le16_to_cpu(mgt_frame->len) - (ie - (u8 *)mgt);

	IWM_HEXDUMP(iwm, DBG, MLME, "EVT: ", ie, wrqu.data.length);
	wireless_send_event(iwm_to_ndev(iwm), event, &wrqu, ie);

	return 0;
}