summaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authormarcus <marcus@FreeBSD.org>2007-07-01 18:03:41 +0000
committermarcus <marcus@FreeBSD.org>2007-07-01 18:03:41 +0000
commit864ea060b26d844055dc41f41ace901f7c319a84 (patch)
tree73b5d7341faf8b334b56b0c9cbc7adaf1b1b0a6d /net
parent6b231cb881244e67db8e9408d6d3069e6110124f (diff)
downloadFreeBSD-ports-864ea060b26d844055dc41f41ace901f7c319a84.zip
FreeBSD-ports-864ea060b26d844055dc41f41ace901f7c319a84.tar.gz
* Add net80211 support as well as support for some other wireless interfaces.
* Only use the wi ioctls for WaveLAN interfaces * Fix a bug obtaining signal strength from WaveLAN interfaces Thanks to sam for helping out with the signal strength percentage calculation for net80211 interfaces.
Diffstat (limited to 'net')
-rw-r--r--net/gnome-netstatus/Makefile2
-rw-r--r--net/gnome-netstatus/files/patch-src_netstatus-sysdeps.c128
2 files changed, 122 insertions, 8 deletions
diff --git a/net/gnome-netstatus/Makefile b/net/gnome-netstatus/Makefile
index db67a21..260f544 100644
--- a/net/gnome-netstatus/Makefile
+++ b/net/gnome-netstatus/Makefile
@@ -8,7 +8,7 @@
PORTNAME= gnome-netstatus
PORTVERSION= 2.12.1
-PORTREVISION= 1
+PORTREVISION= 2
CATEGORIES= net gnome
MASTER_SITES= ${MASTER_SITE_GNOME}
MASTER_SITE_SUBDIR= sources/gnome-netstatus/2.12
diff --git a/net/gnome-netstatus/files/patch-src_netstatus-sysdeps.c b/net/gnome-netstatus/files/patch-src_netstatus-sysdeps.c
index de7d713..200ed74 100644
--- a/net/gnome-netstatus/files/patch-src_netstatus-sysdeps.c
+++ b/net/gnome-netstatus/files/patch-src_netstatus-sysdeps.c
@@ -1,6 +1,28 @@
---- src/netstatus-sysdeps.c.orig Tue Feb 13 04:39:19 2007
-+++ src/netstatus-sysdeps.c Tue Feb 13 17:16:29 2007
-@@ -430,11 +430,11 @@ static inline char *
+--- src/netstatus-sysdeps.c.orig 2007-02-13 04:39:19.000000000 -0500
++++ src/netstatus-sysdeps.c 2007-07-01 13:59:34.000000000 -0400
+@@ -37,12 +37,21 @@
+
+ #ifdef __FreeBSD__
+ #include <sys/types.h>
++#include <sys/param.h>
+ #include <sys/socket.h>
+ #include <sys/ioctl.h>
++#include <ifaddrs.h>
+ #include <net/if.h>
++#include <net/if_media.h>
+ #include <net/if_var.h>
+ #include <dev/an/if_aironet_ieee.h>
+ #include <dev/wi/if_wavelan_ieee.h>
++#include <net80211/ieee80211.h>
++#include <net80211/ieee80211_ioctl.h>
++#include <stdlib.h>
++#ifndef IEEE80211_ADDR_COPY
++#define IEEE80211_ADDR_COPY(dst, src) memcpy(dst, src, IEEE80211_ADDR_LEN)
++#endif
+ #endif
+
+ static inline gboolean
+@@ -430,11 +439,11 @@ static inline char *
get_an_data (const char *iface,
int *signal_strength)
{
@@ -14,12 +36,12 @@
int level;
char *error = NULL;
gboolean rssimap_valid = FALSE;
-@@ -486,11 +486,11 @@ get_wi_data (const char *iface,
+@@ -486,11 +495,11 @@ get_wi_data (const char *iface,
level = (int) wreq.wi_val[1];
#ifdef WI_RID_READ_APS
- if (signal_strength <= 0)
-+ if (*signal_strength <= 0)
++ if (level <= 0)
{
/* we fail to get signal strength by usual means, try another way */
static time_t last_scan;
@@ -28,7 +50,7 @@
time_t now;
now = time (NULL);
-@@ -510,15 +510,15 @@ get_wi_data (const char *iface,
+@@ -510,15 +519,15 @@ get_wi_data (const char *iface,
if (nstations > 0)
{
w = (struct wi_apinfo *)(((char *) &wreq.wi_val) + sizeof (int));
@@ -47,7 +69,77 @@
}
}
#endif
-@@ -548,6 +548,8 @@ netstatus_sysdeps_read_iface_wireless_de
+@@ -528,6 +537,69 @@ get_wi_data (const char *iface,
+ return error;
+ }
+
++static inline char *
++get_net80211_data (const char *iface,
++ int *signal_strength)
++{
++ struct ieee80211req_sta_info *si;
++ struct ieee80211req ireq;
++ int level;
++ int s;
++ uint8_t mac[IEEE80211_ADDR_LEN];
++ int8_t noise;
++ char *error = NULL;
++ union {
++ struct ieee80211req_sta_req info;
++ char buf[1024];
++ } u_info;
++
++ memset (&u_info, 0, sizeof (u_info));
++ memset (&ireq, 0, sizeof (ireq));
++
++ strlcpy (ireq.i_name, iface, sizeof (ireq.i_name));
++ ireq.i_type = IEEE80211_IOC_BSSID;
++ ireq.i_data = mac;
++ ireq.i_len = IEEE80211_ADDR_LEN;
++
++ s = socket (AF_INET, SOCK_DGRAM, 0);
++ if (s == -1)
++ {
++ error = g_strdup_printf (_("Could not connect to interface, '%s'"), iface);
++ return error;
++ }
++
++ if (ioctl (s, SIOCG80211, &ireq) == -1)
++ {
++ error = g_strdup_printf (_("Could not get MAC for interface, '%s'"), iface);
++ close (s);
++ return error;
++ }
++
++ IEEE80211_ADDR_COPY (u_info.info.is_u.macaddr, mac);
++ ireq.i_type = IEEE80211_IOC_STA_INFO;
++ ireq.i_data = (caddr_t) &u_info;
++ ireq.i_len = sizeof (u_info);
++
++ if (ioctl (s, SIOCG80211, &ireq) == -1)
++ {
++ error = g_strdup_printf (_("Could not send ioctl to interface, '%s'"), iface);
++ close (s);
++ return error;
++ }
++
++ close (s);
++
++ si = &u_info.info.info[0];
++ noise = si->isi_noise;
++ if (noise == 0)
++ noise = -95;
++ level = (int) abs (rint ((si->isi_rssi / (si->isi_rssi/2. + noise)) * 100.0));
++ level = CLAMP (level, 0, 100);
++
++ memcpy (signal_strength, &level, sizeof (signal_strength));
++ return error;
++}
++
+ char *
+ netstatus_sysdeps_read_iface_wireless_details (const char *iface,
+ gboolean *is_wireless,
+@@ -548,8 +620,12 @@ netstatus_sysdeps_read_iface_wireless_de
g_strncasecmp (iface, "wi", 2) &&
g_strncasecmp (iface, "ath", 3) &&
g_strncasecmp (iface, "ndis", 4) &&
@@ -55,4 +147,26 @@
+ g_strncasecmp (iface, "ral", 3) &&
g_strncasecmp (iface, "ipw", 3) &&
g_strncasecmp (iface, "iwi", 3) &&
++ g_strncasecmp (iface, "rum", 3) &&
++ g_strncasecmp (iface, "ray", 3) &&
g_strncasecmp (iface, "acx", 3))
+ return error_message;
+
+@@ -558,11 +634,16 @@ netstatus_sysdeps_read_iface_wireless_de
+ error_message = get_an_data (iface, signal_strength);
+ *is_wireless = TRUE;
+ }
+- else
++ else if (g_strncasecmp (iface, "wi", 2) == 0)
+ {
+ error_message = get_wi_data (iface, signal_strength);
+ *is_wireless = TRUE;
+ }
++ else
++ {
++ error_message = get_net80211_data (iface, signal_strength);
++ *is_wireless = TRUE;
++ }
+
+ return error_message;
+ }
OpenPOWER on IntegriCloud