Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 15 May 2006 00:38:54 +0900
From:      Hajimu UMEMOTO <ume@freebsd.org>
To:        "Kevin Oberman" <oberman@es.net>
Cc:        Daniel O'Connor <doconnor@gsoft.com.au>, freebsd-mobile@freebsd.org, ktsin@acm.org, Yann Golanski <yann@kierun.org>
Subject:   Re: Ath0, netgear WG311T problem. [SOLVED] 
Message-ID:  <yger72wpqep.wl%ume@mahoroba.org>
In-Reply-To: <20060511161457.0F61145042@ptavv.es.net>
References:  <200605111637.40473.doconnor@gsoft.com.au> <20060511161457.0F61145042@ptavv.es.net>

next in thread | previous in thread | raw e-mail | index | archive | help
--Multipart_Mon_May_15_00:38:53_2006-1
Content-Type: text/plain; charset=US-ASCII

Hi,

>>>>> On Thu, 11 May 2006 09:14:57 -0700
>>>>> "Kevin Oberman" <oberman@es.net> said:

> > monitoring software to give me signal strength and things like that.
> > Any recommendations on either?
> 
> ifconfig ath0 scan? :)
> I see there is a gkrellm plugin in ports but I've never used it.

oberman> The gkrellm plugin only works for a few devices at this time and ath is
oberman> not one of them. It works for my old Prism 2.5 card, but not my new
oberman> Atheros. :-{

oberman> Maybe an interface to the 802.11 layer would make this plugin work for
oberman> all modern wireless cards. I really prefer gkrellm to the standard Gnome
oberman> monitoring tools.

oberman> Looks like Hajimu UMEMOTO has done much of the FreeBSD work on this
oberman> plugin. I cc'd him on this, but I have no idea if he has time or
oberman> interest.

Are you mean grekkmwireless2?  If so, please try the attached patch.
If okay, I'll send it to the author.

Sincerely,


--Multipart_Mon_May_15_00:38:53_2006-1
Content-Type: text/x-patch; charset=US-ASCII
Content-Disposition: attachment; filename="patch-scan"
Content-Transfer-Encoding: 7bit

Index: wireless.c
diff -u wireless.c.orig wireless.c
--- wireless.c.orig	Sat Dec  6 22:19:55 2003
+++ wireless.c	Mon May 15 00:18:15 2006
@@ -94,6 +94,37 @@
 #if defined(__FreeBSD__) || defined(__NetBSD__)
 /* FreeBSD & NetBSD specific */
 
+#if defined(__FreeBSD__) && __FreeBSD_version >= 600034
+static gint
+find_scan_card(void) {
+  gint ret = FALSE;
+  struct ifaddrs *res = NULL, *ifa = NULL;
+  struct ifmediareq ifmr;
+  int s;
+
+  if (getifaddrs(&res) != 0)
+    return ret;
+  if ((s = socket(PF_INET, SOCK_DGRAM, 0)) < 0) {
+    freeifaddrs(res);
+    return ret;
+  }
+  for (ifa = res; ifa; ifa = ifa->ifa_next) {
+    memset(&ifmr, 0, sizeof(ifmr));
+    strncpy(ifmr.ifm_name, ifa->ifa_name, sizeof(ifmr.ifm_name));
+    if (ioctl(s, SIOCGIFMEDIA, (caddr_t)&ifmr) < 0)
+      continue;
+    if (!(ifmr.ifm_status & IFM_AVALID))
+      continue;
+    if (IFM_TYPE(ifmr.ifm_active) != IFM_IEEE80211)
+      continue;
+    if (found_wcard(ifa->ifa_name) != NULL)
+      ret = TRUE;
+  }
+  close(s);
+  freeifaddrs(res);
+  return ret;
+}
+#else
 static int
 find_wi_card(void) {
   /* possible interfaces */
@@ -162,18 +193,55 @@
   return ret;
 }
 #endif /* !defined(__NetBSD__) */
+#endif /* defined(__FreeBSD__) && __FreeBSD_version >= 600034 */
 
 static gint 
 find_wlancard(void) {
   gint ret = FALSE;
- 
+
+#if defined(__FreeBSD__) && __FreeBSD_version >= 600034
+  ret = find_scan_card();
+#else
   ret = find_wi_card();
 #if !defined(__NetBSD__)
   ret = find_an_card() || ret;
 #endif /* !defined(__NetBSD__) */
+#endif /* defined(__FreeBSD__) && __FreeBSD_version >= 600034 */
   return ret;
 }
 
+#if defined(__FreeBSD__) && __FreeBSD_version >= 600034
+static int
+get_scan_link_quality(wcard_t *card, float *quality, float *level, float *noise) {
+  int s;
+  uint8_t buf[24 * 1024];
+  struct ieee80211req ireq;
+  struct ieee80211req_scan_result *sr;
+
+  /* open a socket for ioctl's */
+  if ((s = socket(AF_INET, SOCK_DGRAM, 0)) == -1) return FALSE;
+
+  memset(&ireq, 0, sizeof(ireq));
+  strncpy(ireq.i_name, card->ifname, sizeof(ireq.i_name));
+  ireq.i_type = IEEE80211_IOC_SCAN_RESULTS;
+  ireq.i_data = buf;
+  ireq.i_len = sizeof(buf);
+  if (ioctl(s, SIOCG80211, &ireq) < 0) {
+    close(s);
+    return FALSE;
+  }
+  close(s);
+  if (ireq.i_len < sizeof(struct ieee80211req_scan_result))
+    return FALSE;
+
+  sr = (struct ieee80211req_scan_result *) buf;
+  *quality = sr->isr_intval;
+  *level = sr->isr_rssi;
+  *noise = sr->isr_noise;
+  return TRUE;
+}
+#endif /* defined(__FreeBSD__) && __FreeBSD_version >= 600034 */
+
 static int
 get_wi_link_quality(wcard_t *card, float *quality, float *level, float *noise) {
   /* wireless info request struct */
@@ -257,6 +325,13 @@
 
 static int
 get_link_quality(wcard_t *card, float *quality, float *level, float *noise) {
+#if defined(__FreeBSD__) && __FreeBSD_version >= 600034
+  if (strncmp(card->ifname, "an", 2) == 0 && isnumber(card->ifname[2]))
+    return get_an_link_quality(card,quality,level,noise);
+  else if (strncmp(card->ifname, "wi", 2) == 0 && isnumber(card->ifname[2]))
+    return get_wi_link_quality(card,quality,level,noise);
+  return get_scan_link_quality(card,quality,level,noise);
+#else
   switch (card->ifname[0]) { 
 #if !defined(__NetBSD__)
     case 'a': /* an card */
@@ -266,6 +341,7 @@
       return get_wi_link_quality(card,quality,level,noise);
   }
   return FALSE;
+#endif
 }
 
 static int
Index: wireless.h
diff -u wireless.h.orig wireless.h
--- wireless.h.orig	Sat Dec  6 22:19:55 2003
+++ wireless.h	Sun May 14 23:45:09 2006
@@ -24,6 +24,11 @@
   #include <sys/socket.h>
   #include <sys/sockio.h>
   #include <net/if.h>
+#if __FreeBSD_version >= 600034
+  #include <net/if_media.h>
+  #include <net80211/ieee80211_ioctl.h>
+  #include <ifaddrs.h>
+#endif
   #if __FreeBSD_version >= 470000
     #include <dev/wi/if_wavelan_ieee.h>
   #else

--Multipart_Mon_May_15_00:38:53_2006-1
Content-Type: text/plain; charset=US-ASCII


--
Hajimu UMEMOTO @ Internet Mutual Aid Society Yokohama, Japan
ume@mahoroba.org  ume@{,jp.}FreeBSD.org
http://www.imasy.org/~ume/

--Multipart_Mon_May_15_00:38:53_2006-1--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?yger72wpqep.wl%ume>