Re: bsd-airtools and 5.1-REL

Benjamin Close <[email protected]>
Newsgroups gmane.os.freebsd.devel.mobile
Message-ID <[email protected]>
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

_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-mobile
To unsubscribe, send any mail to "[email protected]"
bsd-airtools-dstumbler.diff (text/plain, 4 KB)
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)
       {
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.