Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 27 Oct 2004 01:56:35 GMT
From:      Sam Leffler <sam@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 63810 for review
Message-ID:  <200410270156.i9R1uZhs047948@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=63810

Change 63810 by sam@sam_ebb on 2004/10/27 01:56:25

	o allow setting the optional ie in any mode
	o implement IEEE80211_IOC_WPAIE

Affected files ...

.. //depot/projects/wifi/sys/net80211/ieee80211_ioctl.c#4 edit

Differences ...

==== //depot/projects/wifi/sys/net80211/ieee80211_ioctl.c#4 (text+ko) ====

@@ -884,6 +884,32 @@
 }
 
 static int
+ieee80211_ioctl_getwpaie(struct ieee80211com *ic, struct ieee80211req *ireq)
+{
+	struct ieee80211_node *ni;
+	struct ieee80211req_wpaie wpaie;
+	int error;
+
+	if (ireq->i_len != sizeof(wpaie))
+		return EINVAL;
+	error = copyin(ireq->i_data, &wpaie, sizeof(wpaie));
+	if (error != 0)
+		return error;
+	ni = ieee80211_find_node(ic, wpaie.wpa_macaddr);
+	if (ni == NULL)
+		return EINVAL;		/* XXX */
+	memset(wpaie.wpa_ie, 0, sizeof(wpaie.wpa_ie));
+	if (ni->ni_wpa_ie != NULL) {
+		int ielen = ni->ni_wpa_ie[1] + 2;
+		if (ielen > sizeof(wpaie.wpa_ie))
+			ielen = sizeof(wpaie.wpa_ie);
+		memcpy(wpaie.wpa_ie, ni->ni_wpa_ie, ielen);
+	}
+	ieee80211_free_node(ic, ni);
+	return copyout(&wpaie, ireq->i_data, sizeof(wpaie));
+}
+
+static int
 ieee80211_ioctl_getscanresults(struct ieee80211com *ic, struct ieee80211req *ireq)
 {
 	union {
@@ -1103,7 +1129,7 @@
 		/* NB: truncate, caller can check length */
 		if (ireq->i_len > ic->ic_opt_ie_len)
 			ireq->i_len = ic->ic_opt_ie_len;
-		error = copyout(ic->ic_opt_ie, ireq->i_data, ireq->i_len);
+		error = copyout(ireq->i_data, ic->ic_opt_ie, ireq->i_len);
 		break;
 	case IEEE80211_IOC_WPAKEY:
 		error = ieee80211_ioctl_getkey(ic, ireq);
@@ -1120,6 +1146,9 @@
 					ic->ic_des_bssid,
 				ireq->i_len);
 		break;
+	case IEEE80211_IOC_WPAIE:
+		error = ieee80211_ioctl_getwpaie(ic, ireq);
+		break;
 	case IEEE80211_IOC_SCAN_RESULTS:
 		error = ieee80211_ioctl_getscanresults(ic, ireq);
 		break;
@@ -1601,8 +1630,6 @@
 		/* XXXX reset? */
 		break;
 	case IEEE80211_IOC_PRIVACY:
-		if (ic->ic_opmode != IEEE80211_M_STA)
-			return EINVAL;
 		if (ireq->i_val) {
 			/* XXX check for key state? */
 			ic->ic_flags |= IEEE80211_F_PRIVACY;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200410270156.i9R1uZhs047948>