PERFORCE change 64988 for review
Sam Leffler
sam at FreeBSD.org
Fri Nov 12 17:24:39 PST 2004
http://perforce.freebsd.org/chv.cgi?CH=64988
Change 64988 by sam at sam_ebb on 2004/11/13 01:23:52
fill in some more ioctls
Affected files ...
.. //depot/projects/wifi/sys/net80211/ieee80211_ioctl.c#14 edit
.. //depot/projects/wifi/sys/net80211/ieee80211_ioctl.h#7 edit
Differences ...
==== //depot/projects/wifi/sys/net80211/ieee80211_ioctl.c#14 (text+ko) ====
@@ -866,14 +866,13 @@
}
static int
-ieee80211_ioctl_getchanlist(struct ieee80211com *ic, struct ieee80211req *ireq)
+ieee80211_ioctl_getchaninfo(struct ieee80211com *ic, struct ieee80211req *ireq)
{
- struct ieee80211req_chanlist chans;
- int i, j;
+ struct ieee80211req_chaninfo chans; /* XXX off stack? */
+ int i, space;
if (ireq->i_len != sizeof(chans))
return EINVAL;
- memset(&chans, 0, sizeof(chans));
/*
* Since channel 0 is not available for DS, channel 1
* is assigned to LSB on WaveLAN.
@@ -882,10 +881,19 @@
i = 1;
else
i = 0;
- for (j = 0; i <= IEEE80211_CHAN_MAX; i++, j++)
- if (isset(ic->ic_chan_active, i))
- setbit(chans.ic_channels, j);
- return copyout(&chans, ireq->i_data, sizeof(chans));
+ memset(&chans, 0, sizeof(chans));
+ for (; i <= IEEE80211_CHAN_MAX; i++)
+ if (isset(ic->ic_chan_active, i)) {
+ struct ieee80211_channel *c = &ic->ic_channels[i];
+ chans.ic_chans[chans.ic_nchans].ic_freq = c->ic_freq;
+ chans.ic_chans[chans.ic_nchans].ic_flags = c->ic_flags;
+ chans.ic_nchans++;
+ }
+ space = __offsetof(struct ieee80211req_chaninfo,
+ ic_chans[chans.ic_nchans]);
+ if (space > ireq->i_len)
+ space = ireq->i_len;
+ return copyout(&chans, ireq->i_data, space);
}
static int
@@ -1245,7 +1253,8 @@
ireq->i_val = (ic->ic_flags & IEEE80211_F_COUNTERM) != 0;
break;
case IEEE80211_IOC_DRIVER_CAPS:
- ireq->i_val = ic->ic_caps;
+ ireq->i_val = ic->ic_caps>>16;
+ ireq->i_len = ic->ic_caps&0xffff;
break;
case IEEE80211_IOC_WME:
ireq->i_val = (ic->ic_flags & IEEE80211_F_WME) != 0;
@@ -1267,8 +1276,8 @@
case IEEE80211_IOC_WPAKEY:
error = ieee80211_ioctl_getkey(ic, ireq);
break;
- case IEEE80211_IOC_CHANLIST:
- error = ieee80211_ioctl_getchanlist(ic, ireq);
+ case IEEE80211_IOC_CHANINFO:
+ error = ieee80211_ioctl_getchaninfo(ic, ireq);
break;
case IEEE80211_IOC_BSSID:
if (ireq->i_len != IEEE80211_ADDR_LEN)
@@ -1929,7 +1938,9 @@
rsn->rsn_ucastkeylen = ireq->i_val;
break;
case IEEE80211_IOC_DRIVER_CAPS:
- ic->ic_caps = ireq->i_val; /* NB: for testing */
+ /* NB: for testing */
+ ic->ic_caps = (((u_int16_t) ireq->i_val) << 16) |
+ ((u_int16_t) ireq->i_len);
break;
case IEEE80211_IOC_KEYMGTALGS:
/* XXX check */
==== //depot/projects/wifi/sys/net80211/ieee80211_ioctl.h#7 (text+ko) ====
@@ -247,6 +247,17 @@
};
/*
+ * Get the active channel list info.
+ */
+struct ieee80211req_chaninfo {
+ u_int ic_nchans;
+ struct ieee80211_chaninfo {
+ u_int16_t ic_freq; /* setting in Mhz */
+ u_int16_t ic_flags; /* see below */
+ } ic_chans[256];
+};
+
+/*
* Retrieve the WPA/RSN information element for an associated station.
*/
struct ieee80211req_wpaie {
@@ -377,7 +388,8 @@
#define IEEE80211_IOC_WPAIE 39 /* WPA information element */
#define IEEE80211_IOC_STA_STATS 40 /* per-station statistics */
#define IEEE80211_IOC_MACCMD 41 /* MAC ACL operation */
-/* 42-44 available */
+#define IEEE80211_IOC_CHANINFO 42 /* channel info list */
+/* 43-44 available */
#define IEEE80211_IOC_STA_INFO 45 /* station/neighbor info */
#ifndef IEEE80211_CHAN_ANY
More information about the p4-projects
mailing list