bsd-airtools and 5.1-REL
Benjamin Close
cisbjc at cs.unisa.edu.au
Tue Jun 24 23:42:04 PDT 2003
Marcin Kot wrote:
>Hi,
>
>Has anyone been able to get bsd-airtools to work in 5.1-release? Each time i
>try dstumbler it outputs this error:
>'error: unable to ioctl device socket: Input/output error'. I'm using a
>orinoco wavelan silver wireless card.
>
Hi All,
Well found some more spare time. The attached patch gets dstumbler
working with FreeBSD -current (and most likely 5.1R) on an Orinoco card.
If anyone has a prism based card and can test the patch works with them,
it would be great. To apply:
cd /usr/ports/net/bsd-airtools
make configure
cd work/bsd-airtools/dstumbler
patch < bsd-airtools-dstumbler.diff
cd ../../../
make install
Many thanks to Warner for such easy to follow code in wicontrol.
Cheers,
Benjamin
-------------- next part --------------
diff -ur /usr/ports/net/bsd-airtools/work/bsd-airtools/dstumbler/dstumbler.h ./dstumbler.h
--- /usr/ports/net/bsd-airtools/work/bsd-airtools/dstumbler/dstumbler.h Wed Jun 25 16:01:18 2003
+++ ./dstumbler.h Wed Jun 25 16:01:05 2003
@@ -48,6 +48,7 @@
#include <sys/termios.h>
#include <dev/wi/if_wavelan_ieee.h>
+#include <net/if_ieee80211.h>
#ifdef __OpenBSD__
#include <curses.h>
@@ -237,7 +238,9 @@
#ifdef __FreeBSD__
#define htole16(x) (x)
#define le16toh(x) (x)
+#if __FreeBSD_version > 500112
#define O_SYNC O_FSYNC
+#endif
#else
#ifdef __OpenBSD__
#define le16toh(x) letoh16(x)
diff -ur /usr/ports/net/bsd-airtools/work/bsd-airtools/dstumbler/wistat.c ./wistat.c
--- /usr/ports/net/bsd-airtools/work/bsd-airtools/dstumbler/wistat.c Sat Jan 12 01:35:43 2002
+++ ./wistat.c Wed Jun 25 16:04:27 2003
@@ -119,13 +119,12 @@
int
wi_parse_scan_ap(const char *iface, struct aps_s *aps, int num)
{
- static int scanbuf_len;
- static u_char scanbuf[1596];
+ static int ap_count = 0;
+ static struct wi_apinfo *ap_info;
+ static struct wi_req wreq;
- int i, offset;
- struct wi_req wreq;
+ struct wi_apinfo *w;
struct wi_scan_p2_hdr *res_h;
- struct wi_scan_res *res;
if(nodevice || monmode || !scanmode)
return -1;
@@ -147,41 +146,33 @@
if(res_h->wi_reason == 0)
return -1;
- offset = 4;
}
- else
- offset = 0;
-
- memcpy((char *)scanbuf, (char *)wreq.wi_val + offset,
- (wreq.wi_len * 2) - offset);
- scanbuf_len = ((wreq.wi_len * 2) - offset) /
- (prism2 ? WI_PRISM2_RES_SIZE : WI_WAVELAN_RES_SIZE);
+ ap_count = *(int *)wreq.wi_val;
+ ap_info = (struct wi_apinfo *)(((char *)&wreq.wi_val) + sizeof(int));
setscanreq(iface);
}
- if(num >= scanbuf_len)
+ if(num >= ap_count)
return -1;
- res = (struct wi_scan_res *)((char *)scanbuf +
- ((prism2 ? WI_PRISM2_RES_SIZE : WI_WAVELAN_RES_SIZE) * num));
-
- strncpy(aps->ssid, res->wi_ssid, le16toh(res->wi_ssid_len));
- aps->ssid[le16toh(res->wi_ssid_len)] = '\0';
+ w = ap_info + num;
- aps->chan = le16toh(res->wi_chan);
- aps->quality[2] = MAX(le16toh(res->wi_noise), 27);
- aps->quality[1] = MAX(le16toh(res->wi_signal), 27);
+ strncpy(aps->ssid, w->name, le16toh(w->namelen));
+ aps->ssid[le16toh(w->namelen)] = '\0';
+ aps->chan = le16toh(w->channel);
+ aps->quality[2] = MAX(le16toh(w->noise), 27);
+ aps->quality[1] = MAX(le16toh(w->signal), 27);
aps->quality[0] = aps->quality[1] - aps->quality[2];
- memcpy(aps->bssid, res->wi_bssid, MACSIZE);
- aps->interval = le16toh(res->wi_interval);
+ memcpy(aps->bssid, w->bssid, MACSIZE);
+ aps->interval = le16toh(w->interval);
- if(le16toh(res->wi_capinfo) & WI_CAPINFO_ESS)
+ if(le16toh(w->capinfo) & IEEE80211_CAPINFO_ESS)
aps->adhoc = 2;
- if(le16toh(res->wi_capinfo) & WI_CAPINFO_IBSS)
+ if(le16toh(w->capinfo) & WI_CAPINFO_IBSS)
aps->adhoc = 1;
- if(le16toh(res->wi_capinfo) & WI_CAPINFO_PRIV)
+ if(le16toh(w->capinfo) & IEEE80211_CAPINFO_PRIVACY)
aps->weped = 1;
else
aps->weped = 2;
@@ -192,15 +183,14 @@
*/
if(prism2)
{
- for(i = 0; res->wi_srates[i] != 0; i++)
- aps->srate = MAX(aps->srate, (res->wi_srates[i] & WI_VAR_SRATES_MASK));
+ aps->srate = w->rate;
}
/*
* if we've reached the end of the list of aps, return a 0 so it won't call
* us for more aps.. otherwise, keep on going.
*/
- return(num >= scanbuf_len - 1 ? 0 : 1);
+ return (num >= ap_count-1 ? 0 : 1);
}
/*
@@ -298,7 +288,7 @@
wreq.wi_val[0] = htole16(*((int *)mem));
break;
case WI_RID_OWN_SSID:
- wreq.wi_len = MIN((strlen(mem) + 1) / 2, len);
+ wreq.wi_len = 18;
wreq.wi_val[0] = htole16(strlen(mem));
memcpy((char *)&wreq.wi_val[1], mem, strlen(mem));
break;
@@ -314,7 +304,7 @@
break;
case WI_RID_SCAN_REQ:
wreq.wi_len = (prism2 ? 3 : 1);
- wreq.wi_type = WI_RID_SCAN_REQ;
+ wreq.wi_type =(prism2 ? WI_RID_SCAN_REQ : WI_RID_SCAN_APS );
if(prism2)
{
More information about the freebsd-mobile
mailing list