diff --git a/src/madwifi.c b/src/madwifi.c
index f0230f9b2e4cf13b413d92cc1a5b4d634c589b9f..8b3266dc80c706cd9552beb2d9ef4009effa9ed6 100644 (file)
--- a/src/madwifi.c
+++ b/src/madwifi.c
if (vals[i] == 0)
continue;
- ssnprintf (ti2, sizeof (ti2), "antenna%i", i);
+ ssnprintf (ti2, sizeof (ti2), "%i", i);
submit_counter (dev, "ath_stat", name, ti2,
(counter_t) vals[i]);
}
@@ -636,16 +636,25 @@ process_stat_struct (int which, const void *ptr, const char *dev, const char *ma
}
-static void
+static int
process_athstats (int sk, const char *dev)
{
struct ifreq ifr;
struct ath_stats stats;
+ int status;
sstrncpy (ifr.ifr_name, dev, sizeof (ifr.ifr_name));
ifr.ifr_data = (void *) &stats;
- if (ioctl (sk, SIOCGATHSTATS, &ifr) < 0)
- return;
+ status = ioctl (sk, SIOCGATHSTATS, &ifr);
+ if (status < 0)
+ {
+ /* Silent, because not all interfaces support all ioctls. */
+ DEBUG ("madwifi plugin: Sending IO-control "
+ "SIOCGATHSTATS to device %s "
+ "failed with status %i.",
+ dev, status);
+ return (status);
+ }
/* These stats are handled as a special case, because they are
eight values each */
/* All other ath statistics */
process_stat_struct (ATH_STAT, &stats, dev, NULL, "ath_stat", "ast_misc");
+ return (0);
}
-static void
+static int
process_80211stats (int sk, const char *dev)
{
struct ifreq ifr;
struct ieee80211_stats stats;
+ int status;
+
sstrncpy (ifr.ifr_name, dev, sizeof (ifr.ifr_name));
ifr.ifr_data = (void *) &stats;
- if (ioctl(sk, SIOCG80211STATS, &ifr) < 0)
- return;
+ status = ioctl(sk, SIOCG80211STATS, &ifr);
+ if (status < 0)
+ {
+ /* Silent, because not all interfaces support all ioctls. */
+ DEBUG ("madwifi plugin: Sending IO-control "
+ "SIOCG80211STATS to device %s "
+ "failed with status %i.",
+ dev, status);
+ return (status);
+ }
process_stat_struct (IFA_STAT, &stats, dev, NULL, "ath_stat", "is_misc");
+ return (0);
}
-static void
+static int
process_station (int sk, const char *dev, struct ieee80211req_sta_info *si)
{
struct iwreq iwr;
static char mac[DATA_MAX_NAME_LEN];
struct ieee80211req_sta_stats stats;
const struct ieee80211_nodestats *ns = &stats.is_stats;
+ int status;
macaddr_to_str (mac, sizeof (mac), si->isi_macaddr);
iwr.u.data.pointer = (void *) &stats;
iwr.u.data.length = sizeof (stats);
memcpy(stats.is_u.macaddr, si->isi_macaddr, IEEE80211_ADDR_LEN);
- if (ioctl(sk, IEEE80211_IOCTL_STA_STATS, &iwr) < 0)
- return;
+ status = ioctl(sk, IEEE80211_IOCTL_STA_STATS, &iwr);
+ if (status < 0)
+ {
+ /* Silent, because not all interfaces support all ioctls. */
+ DEBUG ("madwifi plugin: Sending IO-control "
+ "IEEE80211_IOCTL_STA_STATS to device %s "
+ "failed with status %i.",
+ dev, status);
+ return (status);
+ }
/* These two stats are handled as a special case as they are
a pair of 64bit values */
/* All other node statistics */
process_stat_struct (NOD_STAT, ns, dev, mac, "node_stat", "ns_misc");
+ return (0);
}
-static void
+static int
process_stations (int sk, const char *dev)
{
uint8_t buf[24*1024];
status = ioctl (sk, IEEE80211_IOCTL_STA_INFO, &iwr);
if (status < 0)
{
- ERROR ("madwifi plugin: Sending IO-control "
+ /* Silent, because not all interfaces support all ioctls. */
+ DEBUG ("madwifi plugin: Sending IO-control "
"IEEE80211_IOCTL_STA_INFO to device %s "
"failed with status %i.",
dev, status);
- return;
+ return (status);
}
len = iwr.u.data.length;
if (item_watched (STAT_ATH_NODES))
submit_gauge (dev, "ath_nodes", NULL, NULL, nodes);
+ return (0);
}
-static void
+static int
process_device (int sk, const char *dev)
{
- process_athstats (sk, dev);
- process_80211stats (sk, dev);
- process_stations (sk, dev);
+ int num_success = 0;
+ int status;
+
+ status = process_athstats (sk, dev);
+ if (status == 0)
+ num_success++;
+
+ status = process_80211stats (sk, dev);
+ if (status == 0)
+ num_success++;
+
+ status = process_stations (sk, dev);
+ if (status == 0)
+ num_success++;
+
+ return ((num_success == 0) ? -1 : 0);
}
static int
sysfs_iterate(int sk)
{
struct dirent *de;
+ DIR *nets;
+ int status;
+ int num_success;
+ int num_fail;
- DIR *nets = opendir ("/sys/class/net/");
+ nets = opendir ("/sys/class/net/");
if (nets == NULL)
{
WARNING ("madwifi plugin: opening /sys/class/net failed");
return (-1);
}
+ num_success = 0;
+ num_fail = 0;
while ((de = readdir (nets)))
- if (check_devname (de->d_name) &&
- (ignorelist_match (ignorelist, de->d_name) == 0))
- process_device (sk, de->d_name);
+ {
+ if (check_devname (de->d_name) == 0)
+ continue;
+
+ if (ignorelist_match (ignorelist, de->d_name) != 0)
+ continue;
+
+ status = process_device (sk, de->d_name);
+ if (status != 0)
+ {
+ ERROR ("madwifi plugin: Processing interface "
+ "%s failed.", de->d_name);
+ num_fail++;
+ }
+ else
+ {
+ num_success++;
+ }
+ } /* while (readdir) */
closedir(nets);
- return 0;
+ if ((num_success == 0) && (num_fail != 0))
+ return (-1);
+ return (0);
}
static int
char buffer[1024];
char *device, *dummy;
FILE *fh;
+ int status;
+ int num_success;
+ int num_fail;
if ((fh = fopen ("/proc/net/dev", "r")) == NULL)
{
return (-1);
}
+ num_success = 0;
+ num_fail = 0;
while (fgets (buffer, sizeof (buffer), fh) != NULL)
{
dummy = strchr(buffer, ':');
if (device[0] == 0)
continue;
- if (ignorelist_match (ignorelist, device) == 0)
- process_device (sk, device);
- }
+ if (ignorelist_match (ignorelist, device) != 0)
+ continue;
+
+ status = process_device (sk, device);
+ if (status != 0)
+ {
+ ERROR ("madwifi plugin: Processing interface "
+ "%s failed.", device);
+ num_fail++;
+ }
+ else
+ {
+ num_success++;
+ }
+ } /* while (fgets) */
fclose(fh);
+
+ if ((num_success == 0) && (num_fail != 0))
+ return (-1);
return 0;
}