wext: Emit event stream entries correctly when compat.
Three major portions to this change: 1) Add IW_EV_COMPAT_LCP_LEN, IW_EV_COMPAT_POINT_OFF, and IW_EV_COMPAT_POINT_LEN helper defines. 2) Delete iw_stream_check_add_*(), they are unused. 3) Add iw_request_info argument to iwe_stream_add_*(), and use it to size the event and pointer lengths correctly depending upon whether IW_REQUEST_FLAG_COMPAT is set or not. 4) The mechanical transformations to the drivers and wireless stack bits to get the iw_request_info passed down into the routines modified in #3. Also, explicit references to IW_EV_LCP_LEN are replaced with iwe_stream_lcp_len(info). With a lot of help and bug fixes from Masakazu Mokuno. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -1793,6 +1793,7 @@ static int prism2_ioctl_siwscan(struct net_device *dev,
|
||||
|
||||
#ifndef PRISM2_NO_STATION_MODES
|
||||
static char * __prism2_translate_scan(local_info_t *local,
|
||||
struct iw_request_info *info,
|
||||
struct hfa384x_hostscan_result *scan,
|
||||
struct hostap_bss_info *bss,
|
||||
char *current_ev, char *end_buf)
|
||||
@@ -1823,7 +1824,7 @@ static char * __prism2_translate_scan(local_info_t *local,
|
||||
iwe.cmd = SIOCGIWAP;
|
||||
iwe.u.ap_addr.sa_family = ARPHRD_ETHER;
|
||||
memcpy(iwe.u.ap_addr.sa_data, bssid, ETH_ALEN);
|
||||
current_ev = iwe_stream_add_event(current_ev, end_buf, &iwe,
|
||||
current_ev = iwe_stream_add_event(info, current_ev, end_buf, &iwe,
|
||||
IW_EV_ADDR_LEN);
|
||||
|
||||
/* Other entries will be displayed in the order we give them */
|
||||
@@ -1832,7 +1833,8 @@ static char * __prism2_translate_scan(local_info_t *local,
|
||||
iwe.cmd = SIOCGIWESSID;
|
||||
iwe.u.data.length = ssid_len;
|
||||
iwe.u.data.flags = 1;
|
||||
current_ev = iwe_stream_add_point(current_ev, end_buf, &iwe, ssid);
|
||||
current_ev = iwe_stream_add_point(info, current_ev, end_buf,
|
||||
&iwe, ssid);
|
||||
|
||||
memset(&iwe, 0, sizeof(iwe));
|
||||
iwe.cmd = SIOCGIWMODE;
|
||||
@@ -1847,8 +1849,8 @@ static char * __prism2_translate_scan(local_info_t *local,
|
||||
iwe.u.mode = IW_MODE_MASTER;
|
||||
else
|
||||
iwe.u.mode = IW_MODE_ADHOC;
|
||||
current_ev = iwe_stream_add_event(current_ev, end_buf, &iwe,
|
||||
IW_EV_UINT_LEN);
|
||||
current_ev = iwe_stream_add_event(info, current_ev, end_buf,
|
||||
&iwe, IW_EV_UINT_LEN);
|
||||
}
|
||||
|
||||
memset(&iwe, 0, sizeof(iwe));
|
||||
@@ -1864,8 +1866,8 @@ static char * __prism2_translate_scan(local_info_t *local,
|
||||
if (chan > 0) {
|
||||
iwe.u.freq.m = freq_list[chan - 1] * 100000;
|
||||
iwe.u.freq.e = 1;
|
||||
current_ev = iwe_stream_add_event(current_ev, end_buf, &iwe,
|
||||
IW_EV_FREQ_LEN);
|
||||
current_ev = iwe_stream_add_event(info, current_ev, end_buf,
|
||||
&iwe, IW_EV_FREQ_LEN);
|
||||
}
|
||||
|
||||
if (scan) {
|
||||
@@ -1884,8 +1886,8 @@ static char * __prism2_translate_scan(local_info_t *local,
|
||||
| IW_QUAL_NOISE_UPDATED
|
||||
| IW_QUAL_QUAL_INVALID
|
||||
| IW_QUAL_DBM;
|
||||
current_ev = iwe_stream_add_event(current_ev, end_buf, &iwe,
|
||||
IW_EV_QUAL_LEN);
|
||||
current_ev = iwe_stream_add_event(info, current_ev, end_buf,
|
||||
&iwe, IW_EV_QUAL_LEN);
|
||||
}
|
||||
|
||||
memset(&iwe, 0, sizeof(iwe));
|
||||
@@ -1895,13 +1897,13 @@ static char * __prism2_translate_scan(local_info_t *local,
|
||||
else
|
||||
iwe.u.data.flags = IW_ENCODE_DISABLED;
|
||||
iwe.u.data.length = 0;
|
||||
current_ev = iwe_stream_add_point(current_ev, end_buf, &iwe, "");
|
||||
current_ev = iwe_stream_add_point(info, current_ev, end_buf, &iwe, "");
|
||||
|
||||
/* TODO: add SuppRates into BSS table */
|
||||
if (scan) {
|
||||
memset(&iwe, 0, sizeof(iwe));
|
||||
iwe.cmd = SIOCGIWRATE;
|
||||
current_val = current_ev + IW_EV_LCP_LEN;
|
||||
current_val = current_ev + iwe_stream_lcp_len(info);
|
||||
pos = scan->sup_rates;
|
||||
for (i = 0; i < sizeof(scan->sup_rates); i++) {
|
||||
if (pos[i] == 0)
|
||||
@@ -1909,11 +1911,11 @@ static char * __prism2_translate_scan(local_info_t *local,
|
||||
/* Bit rate given in 500 kb/s units (+ 0x80) */
|
||||
iwe.u.bitrate.value = ((pos[i] & 0x7f) * 500000);
|
||||
current_val = iwe_stream_add_value(
|
||||
current_ev, current_val, end_buf, &iwe,
|
||||
info, current_ev, current_val, end_buf, &iwe,
|
||||
IW_EV_PARAM_LEN);
|
||||
}
|
||||
/* Check if we added any event */
|
||||
if ((current_val - current_ev) > IW_EV_LCP_LEN)
|
||||
if ((current_val - current_ev) > iwe_stream_lcp_len(info))
|
||||
current_ev = current_val;
|
||||
}
|
||||
|
||||
@@ -1924,15 +1926,15 @@ static char * __prism2_translate_scan(local_info_t *local,
|
||||
iwe.cmd = IWEVCUSTOM;
|
||||
sprintf(buf, "bcn_int=%d", le16_to_cpu(scan->beacon_interval));
|
||||
iwe.u.data.length = strlen(buf);
|
||||
current_ev = iwe_stream_add_point(current_ev, end_buf, &iwe,
|
||||
buf);
|
||||
current_ev = iwe_stream_add_point(info, current_ev, end_buf,
|
||||
&iwe, buf);
|
||||
|
||||
memset(&iwe, 0, sizeof(iwe));
|
||||
iwe.cmd = IWEVCUSTOM;
|
||||
sprintf(buf, "resp_rate=%d", le16_to_cpu(scan->rate));
|
||||
iwe.u.data.length = strlen(buf);
|
||||
current_ev = iwe_stream_add_point(current_ev, end_buf, &iwe,
|
||||
buf);
|
||||
current_ev = iwe_stream_add_point(info, current_ev, end_buf,
|
||||
&iwe, buf);
|
||||
|
||||
if (local->last_scan_type == PRISM2_HOSTSCAN &&
|
||||
(capabilities & WLAN_CAPABILITY_IBSS)) {
|
||||
@@ -1940,8 +1942,8 @@ static char * __prism2_translate_scan(local_info_t *local,
|
||||
iwe.cmd = IWEVCUSTOM;
|
||||
sprintf(buf, "atim=%d", le16_to_cpu(scan->atim));
|
||||
iwe.u.data.length = strlen(buf);
|
||||
current_ev = iwe_stream_add_point(current_ev, end_buf,
|
||||
&iwe, buf);
|
||||
current_ev = iwe_stream_add_point(info, current_ev,
|
||||
end_buf, &iwe, buf);
|
||||
}
|
||||
}
|
||||
kfree(buf);
|
||||
@@ -1950,16 +1952,16 @@ static char * __prism2_translate_scan(local_info_t *local,
|
||||
memset(&iwe, 0, sizeof(iwe));
|
||||
iwe.cmd = IWEVGENIE;
|
||||
iwe.u.data.length = bss->wpa_ie_len;
|
||||
current_ev = iwe_stream_add_point(
|
||||
current_ev, end_buf, &iwe, bss->wpa_ie);
|
||||
current_ev = iwe_stream_add_point(info, current_ev, end_buf,
|
||||
&iwe, bss->wpa_ie);
|
||||
}
|
||||
|
||||
if (bss && bss->rsn_ie_len > 0 && bss->rsn_ie_len <= MAX_WPA_IE_LEN) {
|
||||
memset(&iwe, 0, sizeof(iwe));
|
||||
iwe.cmd = IWEVGENIE;
|
||||
iwe.u.data.length = bss->rsn_ie_len;
|
||||
current_ev = iwe_stream_add_point(
|
||||
current_ev, end_buf, &iwe, bss->rsn_ie);
|
||||
current_ev = iwe_stream_add_point(info, current_ev, end_buf,
|
||||
&iwe, bss->rsn_ie);
|
||||
}
|
||||
|
||||
return current_ev;
|
||||
@@ -1969,6 +1971,7 @@ static char * __prism2_translate_scan(local_info_t *local,
|
||||
/* Translate scan data returned from the card to a card independant
|
||||
* format that the Wireless Tools will understand - Jean II */
|
||||
static inline int prism2_translate_scan(local_info_t *local,
|
||||
struct iw_request_info *info,
|
||||
char *buffer, int buflen)
|
||||
{
|
||||
struct hfa384x_hostscan_result *scan;
|
||||
@@ -1999,13 +2002,14 @@ static inline int prism2_translate_scan(local_info_t *local,
|
||||
if (memcmp(bss->bssid, scan->bssid, ETH_ALEN) == 0) {
|
||||
bss->included = 1;
|
||||
current_ev = __prism2_translate_scan(
|
||||
local, scan, bss, current_ev, end_buf);
|
||||
local, info, scan, bss, current_ev,
|
||||
end_buf);
|
||||
found++;
|
||||
}
|
||||
}
|
||||
if (!found) {
|
||||
current_ev = __prism2_translate_scan(
|
||||
local, scan, NULL, current_ev, end_buf);
|
||||
local, info, scan, NULL, current_ev, end_buf);
|
||||
}
|
||||
/* Check if there is space for one more entry */
|
||||
if ((end_buf - current_ev) <= IW_EV_ADDR_LEN) {
|
||||
@@ -2023,7 +2027,7 @@ static inline int prism2_translate_scan(local_info_t *local,
|
||||
bss = list_entry(ptr, struct hostap_bss_info, list);
|
||||
if (bss->included)
|
||||
continue;
|
||||
current_ev = __prism2_translate_scan(local, NULL, bss,
|
||||
current_ev = __prism2_translate_scan(local, info, NULL, bss,
|
||||
current_ev, end_buf);
|
||||
/* Check if there is space for one more entry */
|
||||
if ((end_buf - current_ev) <= IW_EV_ADDR_LEN) {
|
||||
@@ -2070,7 +2074,7 @@ static inline int prism2_ioctl_giwscan_sta(struct net_device *dev,
|
||||
}
|
||||
local->scan_timestamp = 0;
|
||||
|
||||
res = prism2_translate_scan(local, extra, data->length);
|
||||
res = prism2_translate_scan(local, info, extra, data->length);
|
||||
|
||||
if (res >= 0) {
|
||||
data->length = res;
|
||||
@@ -2103,7 +2107,7 @@ static int prism2_ioctl_giwscan(struct net_device *dev,
|
||||
* Jean II */
|
||||
|
||||
/* Translate to WE format */
|
||||
res = prism2_ap_translate_scan(dev, extra);
|
||||
res = prism2_ap_translate_scan(dev, info, extra);
|
||||
if (res >= 0) {
|
||||
printk(KERN_DEBUG "Scan result translation succeeded "
|
||||
"(length=%d)\n", res);
|
||||
|
||||
Reference in New Issue
Block a user