Date: Wed, 17 Oct 2007 00:47:47 +0900 From: Hajimu UMEMOTO <ume@freebsd.org> To: ktsin@acm.org Cc: freebsd-current@freebsd.org, Szilveszter Adam <sziszi@bsd.hu> Subject: Re: [Fwd: gkrellmwireless-2.0.2_7 failed on amd64 7] Message-ID: <ygek5pnjc2k.wl%ume@mahoroba.org> In-Reply-To: <46DDCF48.4060805@errno.com> References: <1188892560.28297.27.camel@pav.hide.vol.cz> <20070904203225.GA1895@baranyfelhocske.buza.adamsfamily.xx> <46DDCF48.4060805@errno.com>
next in thread | previous in thread | raw e-mail | index | archive | help
--Multipart_Wed_Oct_17_00:47:47_2007-1 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Hi, >>>>> On Tue, 04 Sep 2007 14:34:00 -0700 >>>>> Sam Leffler <sam@errno.com> said: sam> Szilveszter Adam wrote: > On Tue, Sep 04, 2007 at 09:56:00AM +0200, Pav Lucistnik wrote: > =20 >> Hey list, >> >> a bunch of ports broke on recent CURRENT, similar to the log below. >> Who's responsible for this change - who should I nag to fix the ports? >> =20 > > The commit that caused this is=20 > > http://lists.freebsd.org/pipermail/cvs-all/2007-July/226628.html > > by thompsa.=20 > > The log says that the ioctls that used to be used by wicontrol were > removed. It seems that several applications relied on this interface > (even in the case of non-wi cards/chips) probably because this used to > be one of the first such interfaces on FreeBSD and then just continued > working (TM). Unfortunately some =F6of the affected apps are esentially > abandoned (eg wmwifi) so I have no idea if the port maintainer can fix > them alone. But it would be nice, because now it is really hard to find > any wlan signal monitoring apps for FreeBSD apart from Gnome/KDE applets. > =20 sam> The old wi ioctl's have been deprecated for a very long time. There a= re=20 sam> replacements that should be used instead. The easiest thing to do is = sam> crib code from ifconfig. The gkrellmwireless2 port has a code to support new ioctls, already. So, just stop treating wi as special should be okay. Please replace files/patch-ume-scan with the attached patch and try it. The patch is compilable on CURRENT. However, I cannot test it, actually. Sincerely, --Multipart_Wed_Oct_17_00:47:47_2007-1 Content-Type: text/x-patch; type=patch; charset=US-ASCII Content-Disposition: attachment; filename="patch-ume-scan.diff" Content-Transfer-Encoding: 7bit Index: wireless.c diff -u -p wireless.c.orig wireless.c --- wireless.c.orig 2002-12-07 00:01:13.000000000 +0900 +++ wireless.c 2007-10-04 02:52:24.000000000 +0900 @@ -93,6 +93,37 @@ wcard_t *found_wcard(gchar *interface) { #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 */ @@ -161,18 +192,56 @@ find_an_card(void) { 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 */ + +#if !defined(__FreeBSD__) || __FreeBSD_version < 700052 static int get_wi_link_quality(wcard_t *card, float *quality, float *level, float *noise) { /* wireless info request struct */ @@ -210,6 +279,7 @@ get_wi_link_quality(wcard_t *card, float return TRUE; } +#endif /* !defined(__FreeBSD__) || __FreeBSD_version < 700052 */ #if !defined(__NetBSD__) static int @@ -256,6 +326,15 @@ get_an_link_quality(wcard_t *card, float 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); +#if !defined(__FreeBSD__) || __FreeBSD_version < 700052 + else if (strncmp(card->ifname, "wi", 2) == 0 && isnumber(card->ifname[2])) + return get_wi_link_quality(card,quality,level,noise); +#endif /* !defined(__FreeBSD__) || __FreeBSD_version < 700052 */ + return get_scan_link_quality(card,quality,level,noise); +#else switch (card->ifname[0]) { #if !defined(__NetBSD__) case 'a': /* an card */ @@ -265,6 +344,7 @@ get_link_quality(wcard_t *card, float *q return get_wi_link_quality(card,quality,level,noise); } return FALSE; +#endif } #endif Index: wireless.h diff -u wireless.h.orig wireless.h --- wireless.h.orig 2002-12-07 00:01:13.000000000 +0900 +++ wireless.h 2007-10-04 02:33:03.000000000 +0900 @@ -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_Wed_Oct_17_00:47:47_2007-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_Wed_Oct_17_00:47:47_2007-1--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?ygek5pnjc2k.wl%ume>