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