Blame sysdeps/linux/netload.c

Packit Service 407539
/* Copyright (C) 1998-99 Martin Baulig
Packit Service 407539
   This file is part of LibGTop 1.0.
Packit Service 407539
Packit Service 407539
   Contributed by Martin Baulig <martin@home-of-linux.org>, October 1998.
Packit Service 407539
Packit Service 407539
   LibGTop is free software; you can redistribute it and/or modify it
Packit Service 407539
   under the terms of the GNU General Public License as published by
Packit Service 407539
   the Free Software Foundation; either version 2 of the License,
Packit Service 407539
   or (at your option) any later version.
Packit Service 407539
Packit Service 407539
   LibGTop is distributed in the hope that it will be useful, but WITHOUT
Packit Service 407539
   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
Packit Service 407539
   FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
Packit Service 407539
   for more details.
Packit Service 407539
Packit Service 407539
   You should have received a copy of the GNU General Public License
Packit Service 407539
   along with LibGTop; see the file COPYING. If not, write to the
Packit Service 407539
   Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Packit Service 407539
   Boston, MA 02110-1301, USA.
Packit Service 407539
*/
Packit Service 407539
Packit Service 407539
#include <config.h>
Packit Service 407539
Packit Service 407539
#include <glibtop.h>
Packit Service 407539
#include <glibtop/error.h>
Packit Service 407539
#include <glibtop/netload.h>
Packit Service 407539
Packit Service 407539
#include "glibtop_private.h"
Packit Service 407539
Packit Service 407539
#include <errno.h>
Packit Service 407539
#include <string.h>
Packit Service 407539
Packit Service 407539
#include <sys/types.h>
Packit Service 407539
#include <sys/socket.h>
Packit Service 407539
#include <sys/ioctl.h>
Packit Service 407539
Packit Service 407539
#if !defined (__GLIBC__) || __GNU_LIBRARY__ > 1
Packit Service 407539
/* GNU LibC */
Packit Service 407539
#include <net/if.h>
Packit Service 407539
#include <netinet/ip_icmp.h>
Packit Service 407539
#include <netinet/in.h>
Packit Service 407539
#include <netinet/ip.h>
Packit Service 407539
#include <netinet/tcp.h>
Packit Service 407539
#include <netinet/udp.h>
Packit Service 407539
#include <net/if.h>
Packit Service 407539
#elif defined (__GLIBC__) /* Libc 5 */
Packit Service 407539
#include <linux/if.h>
Packit Service 407539
#include <linux/in.h>
Packit Service 407539
#include <linux/ip.h>
Packit Service 407539
#include <linux/icmp.h>
Packit Service 407539
#include <linux/tcp.h>
Packit Service 407539
#include <linux/udp.h>
Packit Service 407539
#endif
Packit Service 407539
Packit Service 407539
Packit Service 407539
#ifdef HAVE_IFADDRS_H
Packit Service 407539
/* needed for IPV6 support */
Packit Service 407539
Packit Service 407539
#include <ifaddrs.h>
Packit Service 407539
Packit Service 407539
#ifndef IN6_IS_ADDR_GLOBAL
Packit Service 407539
#define IN6_IS_ADDR_GLOBAL(a) \
Packit Service 407539
   (((((__const uint8_t *) (a))[0] & 0xff) == 0x3f   \
Packit Service 407539
     || (((__const uint8_t *) (a))[0] & 0xff) == 0x20))
Packit Service 407539
#endif
Packit Service 407539
#endif /* HAVE_IFADDRS_H */
Packit Service 407539
Packit Service 407539
Packit Service 407539
#define _GLIBTOP_IP_FW_ACCTIN	0x1000	/* Account incoming packets only. */
Packit Service 407539
#define _GLIBTOP_IP_FW_ACCTOUT	0x2000	/* Account outgoing packets only. */
Packit Service 407539
Packit Service 407539
static const unsigned long _glibtop_sysdeps_netload =
Packit Service 407539
(1L << GLIBTOP_NETLOAD_ERRORS_IN) +
Packit Service 407539
(1L << GLIBTOP_NETLOAD_ERRORS_OUT) +
Packit Service 407539
(1L << GLIBTOP_NETLOAD_COLLISIONS);
Packit Service 407539
Packit Service 407539
static const unsigned long _glibtop_sysdeps_netload_data =
Packit Service 407539
(1L << GLIBTOP_NETLOAD_ADDRESS) +
Packit Service 407539
(1L << GLIBTOP_NETLOAD_SUBNET) +
Packit Service 407539
(1L << GLIBTOP_NETLOAD_MTU);
Packit Service 407539
Packit Service 407539
static const unsigned long _glibtop_sysdeps_netload_bytes =
Packit Service 407539
(1L << GLIBTOP_NETLOAD_BYTES_IN) +
Packit Service 407539
(1L << GLIBTOP_NETLOAD_BYTES_OUT) +
Packit Service 407539
(1L << GLIBTOP_NETLOAD_BYTES_TOTAL);
Packit Service 407539
Packit Service 407539
static const unsigned long _glibtop_sysdeps_netload_packets =
Packit Service 407539
(1L << GLIBTOP_NETLOAD_PACKETS_IN) +
Packit Service 407539
(1L << GLIBTOP_NETLOAD_PACKETS_OUT) +
Packit Service 407539
(1L << GLIBTOP_NETLOAD_PACKETS_TOTAL);
Packit Service 407539
Packit Service 407539
static const unsigned long _glibtop_sysdeps_netload_total =
Packit Service 407539
(1L << GLIBTOP_NETLOAD_PACKETS_TOTAL) +
Packit Service 407539
(1L << GLIBTOP_NETLOAD_BYTES_TOTAL);
Packit Service 407539
Packit Service 407539
static const unsigned long _glibtop_sysdeps_netload_in =
Packit Service 407539
(1L << GLIBTOP_NETLOAD_PACKETS_TOTAL) +
Packit Service 407539
(1L << GLIBTOP_NETLOAD_BYTES_TOTAL) +
Packit Service 407539
(1L << GLIBTOP_NETLOAD_PACKETS_IN) +
Packit Service 407539
(1L << GLIBTOP_NETLOAD_BYTES_IN);
Packit Service 407539
Packit Service 407539
static const unsigned long _glibtop_sysdeps_netload_out =
Packit Service 407539
(1L << GLIBTOP_NETLOAD_PACKETS_TOTAL) +
Packit Service 407539
(1L << GLIBTOP_NETLOAD_BYTES_TOTAL) +
Packit Service 407539
(1L << GLIBTOP_NETLOAD_PACKETS_OUT) +
Packit Service 407539
(1L << GLIBTOP_NETLOAD_BYTES_OUT);
Packit Service 407539
Packit Service 407539
static const unsigned long _glibtop_sysdeps_netload_6 =
Packit Service 407539
(1L << GLIBTOP_NETLOAD_ADDRESS6) +
Packit Service 407539
(1L << GLIBTOP_NETLOAD_PREFIX6) +
Packit Service 407539
(1L << GLIBTOP_NETLOAD_SCOPE6);
Packit Service 407539
Packit Service 407539
/* Init function. */
Packit Service 407539
Packit Service 407539
void
Packit Service 407539
_glibtop_init_netload_s (glibtop *server)
Packit Service 407539
{
Packit Service 407539
    server->sysdeps.netload = _glibtop_sysdeps_netload |
Packit Service 407539
	_glibtop_sysdeps_netload_data |
Packit Service 407539
	_glibtop_sysdeps_netload_bytes |
Packit Service 407539
	_glibtop_sysdeps_netload_packets;
Packit Service 407539
}
Packit Service 407539
Packit Service 407539
Packit Service 407539
#ifdef HAVE_IFADDRS_H
Packit Service 407539
Packit Service 407539
static void get_ipv6(glibtop *server, glibtop_netload *buf,
Packit Service 407539
		     const char *interface)
Packit Service 407539
{
Packit Service 407539
	struct ifaddrs *ifa0, *ifr6;
Packit Service 407539
Packit Service 407539
	if(getifaddrs (&ifa0) != 0)
Packit Service 407539
	{
Packit Service 407539
		glibtop_warn_r(server, "getifaddrs failed : %s", g_strerror(errno));
Packit Service 407539
		return;
Packit Service 407539
	}
Packit Service 407539
Packit Service 407539
	for (ifr6 = ifa0; ifr6; ifr6 = ifr6->ifa_next) {
Packit Service 407539
		if (strcmp (ifr6->ifa_name, interface) == 0
Packit Service 407539
		    && ifr6->ifa_addr != NULL
Packit Service 407539
		    && ifr6->ifa_addr->sa_family == AF_INET6)
Packit Service 407539
			break;
Packit Service 407539
	}
Packit Service 407539
Packit Service 407539
	if(!ifr6) goto free_ipv6;
Packit Service 407539
Packit Service 407539
	memcpy(buf->address6,
Packit Service 407539
	       &((struct sockaddr_in6 *) ifr6->ifa_addr)->sin6_addr,
Packit Service 407539
	       16);
Packit Service 407539
Packit Service 407539
	memcpy(buf->prefix6,
Packit Service 407539
	       &((struct sockaddr_in6 *) ifr6->ifa_netmask)->sin6_addr,
Packit Service 407539
	       16);
Packit Service 407539
Packit Service 407539
Packit Service 407539
	if (IN6_IS_ADDR_LINKLOCAL (buf->address6))
Packit Service 407539
		buf->scope6 = GLIBTOP_IF_IN6_SCOPE_LINK;
Packit Service 407539
Packit Service 407539
	else if (IN6_IS_ADDR_SITELOCAL (buf->address6))
Packit Service 407539
		buf->scope6 = GLIBTOP_IF_IN6_SCOPE_SITE;
Packit Service 407539
Packit Service 407539
	else if (IN6_IS_ADDR_GLOBAL (buf->address6)
Packit Service 407539
		 || IN6_IS_ADDR_MC_ORGLOCAL (buf->address6)
Packit Service 407539
		 || IN6_IS_ADDR_V4COMPAT (buf->address6)
Packit Service 407539
		 || IN6_IS_ADDR_MULTICAST (buf->address6)
Packit Service 407539
		 || IN6_IS_ADDR_UNSPECIFIED (buf->address6)
Packit Service 407539
		)
Packit Service 407539
		buf->scope6 = GLIBTOP_IF_IN6_SCOPE_GLOBAL;
Packit Service 407539
Packit Service 407539
	else if (IN6_IS_ADDR_LOOPBACK (buf->address6))
Packit Service 407539
		buf->scope6 = GLIBTOP_IF_IN6_SCOPE_HOST;
Packit Service 407539
Packit Service 407539
	else
Packit Service 407539
		buf->scope6 = GLIBTOP_IF_IN6_SCOPE_UNKNOWN;
Packit Service 407539
Packit Service 407539
	buf->flags |= _glibtop_sysdeps_netload_6;
Packit Service 407539
Packit Service 407539
 free_ipv6:
Packit Service 407539
	freeifaddrs(ifa0);
Packit Service 407539
}
Packit Service 407539
Packit Service 407539
#endif /* HAVE_IFADDRS_H */
Packit Service 407539
Packit Service 407539
Packit Service 407539
Packit Service 407539
Packit Service 407539
static gboolean
Packit Service 407539
read_value(glibtop *server,
Packit Service 407539
	   const char *device,
Packit Service 407539
	   const char *filename,
Packit Service 407539
	   guint64 *value)
Packit Service 407539
{
Packit Service 407539
    char buffer[BUFSIZ];
Packit Service 407539
Packit Service 407539
    if(try_file_to_buffer(buffer,
Packit Service 407539
    			  sizeof buffer,
Packit Service 407539
			  "/sys/class/net/%s/statistics/%s",
Packit Service 407539
			  device,
Packit Service 407539
			  filename))
Packit Service 407539
    {
Packit Service 407539
	glibtop_warn_io_r(server,
Packit Service 407539
			  "Failed to open \"/sys/class/net/%s/statistics/%s\"",
Packit Service 407539
			  device,
Packit Service 407539
			  filename);
Packit Service 407539
Packit Service 407539
	return FALSE;
Packit Service 407539
    }
Packit Service 407539
Packit Service 407539
    *value = strtoull(buffer, NULL, 10);
Packit Service 407539
    return TRUE;
Packit Service 407539
}
Packit Service 407539
Packit Service 407539
Packit Service 407539
Packit Service 407539
Packit Service 407539
static void
Packit Service 407539
linux_2_6_stats(glibtop *server,
Packit Service 407539
		   glibtop_netload *buf,
Packit Service 407539
		   const char *dev)
Packit Service 407539
{
Packit Service 407539
    if(read_value(server, dev, "rx_packets", &buf->packets_in))
Packit Service 407539
	buf->flags |= (1 << GLIBTOP_NETLOAD_PACKETS_IN);
Packit Service 407539
Packit Service 407539
    if(read_value(server, dev, "tx_packets", &buf->packets_out))
Packit Service 407539
	buf->flags |= (1 << GLIBTOP_NETLOAD_PACKETS_OUT);
Packit Service 407539
Packit Service 407539
    buf->packets_total = buf->packets_in + buf->packets_out;
Packit Service 407539
    buf->flags |= (1 << GLIBTOP_NETLOAD_PACKETS_TOTAL);
Packit Service 407539
Packit Service 407539
Packit Service 407539
    if(read_value(server, dev, "rx_bytes", &buf->bytes_in))
Packit Service 407539
	buf->flags |= (1 << GLIBTOP_NETLOAD_BYTES_IN);
Packit Service 407539
Packit Service 407539
    if(read_value(server, dev, "tx_bytes", &buf->bytes_out))
Packit Service 407539
	buf->flags |= (1 << GLIBTOP_NETLOAD_BYTES_OUT);
Packit Service 407539
Packit Service 407539
    buf->bytes_total = buf->bytes_in + buf->bytes_out;
Packit Service 407539
    buf->flags |= (1 << GLIBTOP_NETLOAD_BYTES_TOTAL);
Packit Service 407539
Packit Service 407539
Packit Service 407539
    if(read_value(server, dev, "rx_errors", &buf->errors_in))
Packit Service 407539
	buf->flags |= (1 << GLIBTOP_NETLOAD_ERRORS_IN);
Packit Service 407539
Packit Service 407539
    if(read_value(server, dev, "tx_errors", &buf->errors_out))
Packit Service 407539
	buf->flags |= (1 << GLIBTOP_NETLOAD_ERRORS_OUT);
Packit Service 407539
Packit Service 407539
    buf->errors_total = buf->errors_in + buf->errors_out;
Packit Service 407539
    buf->flags |= (1 << GLIBTOP_NETLOAD_ERRORS_TOTAL);
Packit Service 407539
Packit Service 407539
Packit Service 407539
    if(read_value(server, dev, "collisions", &buf->collisions))
Packit Service 407539
	buf->flags |= (1 << GLIBTOP_NETLOAD_COLLISIONS);
Packit Service 407539
}
Packit Service 407539
Packit Service 407539
Packit Service 407539
Packit Service 407539
Packit Service 407539
static void
Packit Service 407539
linux_2_0_stats(glibtop *server,
Packit Service 407539
		glibtop_netload *buf,
Packit Service 407539
		const char *interface)
Packit Service 407539
{
Packit Service 407539
    FILE *f;
Packit Service 407539
    char buffer[BUFSIZ];
Packit Service 407539
Packit Service 407539
    f = fopen ("/proc/net/ip_acct", "r");
Packit Service 407539
Packit Service 407539
    if (!f) {
Packit Service 407539
	glibtop_warn_io_r (server,
Packit Service 407539
			   "Failed to open \"/proc/net/ip_acct\"");
Packit Service 407539
	return;
Packit Service 407539
    }
Packit Service 407539
Packit Service 407539
    /* Skip over the header line. */
Packit Service 407539
    fgets (buffer, BUFSIZ-1, f);
Packit Service 407539
Packit Service 407539
    while (fgets (buffer, BUFSIZ-1, f)) {
Packit Service 407539
	unsigned long long flags, packets, bytes;
Packit Service 407539
	char *p, *dev;
Packit Service 407539
Packit Service 407539
	/* Skip over the network thing. */
Packit Service 407539
	dev = skip_token (buffer) + 1;
Packit Service 407539
	p = skip_token (dev);
Packit Service 407539
	*p++ = 0;
Packit Service 407539
Packit Service 407539
	if (strcmp (dev, interface))
Packit Service 407539
	    continue;
Packit Service 407539
Packit Service 407539
	p = skip_token (p);
Packit Service 407539
Packit Service 407539
	flags   = strtoull (p, &p, 16);
Packit Service 407539
Packit Service 407539
	p = skip_multiple_token (p, 2);
Packit Service 407539
Packit Service 407539
	packets = strtoull (p, &p, 0);
Packit Service 407539
	bytes   = strtoull (p, &p, 0);
Packit Service 407539
Packit Service 407539
	if (flags & _GLIBTOP_IP_FW_ACCTIN) {
Packit Service 407539
	    /* Incoming packets only. */
Packit Service 407539
Packit Service 407539
	    buf->packets_total += packets;
Packit Service 407539
	    buf->packets_in += packets;
Packit Service 407539
Packit Service 407539
	    buf->bytes_total += bytes;
Packit Service 407539
	    buf->bytes_in += bytes;
Packit Service 407539
Packit Service 407539
	    buf->flags |= _glibtop_sysdeps_netload_in;
Packit Service 407539
Packit Service 407539
	} else if (flags & _GLIBTOP_IP_FW_ACCTOUT) {
Packit Service 407539
	    /* Outgoing packets only. */
Packit Service 407539
Packit Service 407539
	    buf->packets_total += packets;
Packit Service 407539
	    buf->packets_out += packets;
Packit Service 407539
Packit Service 407539
	    buf->bytes_total += bytes;
Packit Service 407539
	    buf->bytes_out += bytes;
Packit Service 407539
Packit Service 407539
	    buf->flags |= _glibtop_sysdeps_netload_out;
Packit Service 407539
Packit Service 407539
	} else {
Packit Service 407539
	    /* Only have total values. */
Packit Service 407539
Packit Service 407539
	    buf->packets_total += packets;
Packit Service 407539
	    buf->bytes_total += bytes;
Packit Service 407539
Packit Service 407539
	    buf->flags |= _glibtop_sysdeps_netload_total;
Packit Service 407539
	}
Packit Service 407539
    }
Packit Service 407539
Packit Service 407539
    fclose (f);
Packit Service 407539
}
Packit Service 407539
Packit Service 407539
Packit Service 407539
Packit Service 407539
Packit Service 407539
static void
Packit Service 407539
linux_2_4_stats(glibtop *server,
Packit Service 407539
		glibtop_netload *buf,
Packit Service 407539
		const char *interface)
Packit Service 407539
{
Packit Service 407539
    char buffer [BUFSIZ], *p;
Packit Service 407539
    int have_bytes, fields;
Packit Service 407539
    FILE *f;
Packit Service 407539
Packit Service 407539
    /* Ok, either IP accounting is not enabled in the kernel or
Packit Service 407539
     * it was not enabled for the requested interface. */
Packit Service 407539
Packit Service 407539
    f = fopen ("/proc/net/dev", "r");
Packit Service 407539
    if (!f) {
Packit Service 407539
	glibtop_warn_io_r(server,
Packit Service 407539
			  "Failed to open \"/proc/net/dev\"");
Packit Service 407539
	return;
Packit Service 407539
    }
Packit Service 407539
Packit Service 407539
    /* Skip over the header line. */
Packit Service 407539
    fgets (buffer, BUFSIZ-1, f);
Packit Service 407539
    fgets (buffer, BUFSIZ-1, f);
Packit Service 407539
Packit Service 407539
    /* Starting with 2.1.xx (don't know exactly which version)
Packit Service 407539
     * /proc/net/dev contains both byte and package counters. */
Packit Service 407539
Packit Service 407539
    p = strchr (buffer, '|');
Packit Service 407539
    if (!p) {
Packit Service 407539
	fclose (f);
Packit Service 407539
	return;
Packit Service 407539
    }
Packit Service 407539
Packit Service 407539
    /* Do we already have byte counters ? */
Packit Service 407539
    have_bytes = strncmp (++p, "bytes", 5) == 0;
Packit Service 407539
Packit Service 407539
    /* Count remaining 'Receive' fields so we know where
Packit Service 407539
     * the first 'Transmit' field starts. */
Packit Service 407539
Packit Service 407539
    fields = 0;
Packit Service 407539
    while (*p != '|') {
Packit Service 407539
	if (!isspace (*p++)) continue;
Packit Service 407539
	while (isspace (*p++)) ;
Packit Service 407539
	fields++;
Packit Service 407539
    }
Packit Service 407539
Packit Service 407539
    /* Should never happen. */
Packit Service 407539
    if (fields < 2) {
Packit Service 407539
	fclose (f);
Packit Service 407539
	return;
Packit Service 407539
    }
Packit Service 407539
    fields--;
Packit Service 407539
Packit Service 407539
    while (fgets (buffer, BUFSIZ-1, f)) {
Packit Service 407539
	char *p, *dev;
Packit Service 407539
Packit Service 407539
	dev = buffer;
Packit Service 407539
	while (isspace (*dev)) dev++;
Packit Service 407539
Packit Service 407539
	p = strchr (dev, ':');
Packit Service 407539
	if (!p) continue;
Packit Service 407539
	*p++ = 0;
Packit Service 407539
Packit Service 407539
	/* If it's not a digit, then it's most likely an error
Packit Service 407539
	 * message like 'No statistics available'. */
Packit Service 407539
	while (isspace (*p)) p++;
Packit Service 407539
	if (!isdigit (*p)) continue;
Packit Service 407539
Packit Service 407539
	if (strcmp (dev, interface))
Packit Service 407539
	    continue;
Packit Service 407539
Packit Service 407539
	/* Ok, we've found the interface */
Packit Service 407539
Packit Service 407539
	/* Only read byte counts if we really have them. */
Packit Service 407539
Packit Service 407539
	if (have_bytes) {
Packit Service 407539
	    buf->bytes_in = strtoull (p, &p, 0);
Packit Service 407539
	    fields--;
Packit Service 407539
	}
Packit Service 407539
Packit Service 407539
	buf->packets_in = strtoull (p, &p, 0);
Packit Service 407539
	buf->errors_in  = strtoull (p, &p, 0);
Packit Service 407539
Packit Service 407539
	p = skip_multiple_token (p, fields);
Packit Service 407539
Packit Service 407539
	if (have_bytes)
Packit Service 407539
	    buf->bytes_out = strtoull (p, &p, 0);
Packit Service 407539
Packit Service 407539
	buf->packets_out = strtoull (p, &p, 0);
Packit Service 407539
	buf->errors_out  = strtoull (p, &p, 0);
Packit Service 407539
Packit Service 407539
	p = skip_multiple_token (p, 2);
Packit Service 407539
Packit Service 407539
	buf->collisions  = strtoull (p, &p, 0);
Packit Service 407539
Packit Service 407539
	/* Compute total valules. */
Packit Service 407539
Packit Service 407539
	buf->bytes_total = buf->bytes_in + buf->bytes_out;
Packit Service 407539
	buf->packets_total = buf->packets_in + buf->packets_out;
Packit Service 407539
Packit Service 407539
	/* And now the flags. */
Packit Service 407539
Packit Service 407539
	buf->flags |= _glibtop_sysdeps_netload;
Packit Service 407539
	buf->flags |= _glibtop_sysdeps_netload_packets;
Packit Service 407539
Packit Service 407539
	if (have_bytes)
Packit Service 407539
	    buf->flags |= _glibtop_sysdeps_netload_bytes;
Packit Service 407539
Packit Service 407539
	break; /* finished */
Packit Service 407539
    }
Packit Service 407539
Packit Service 407539
    fclose (f);
Packit Service 407539
}
Packit Service 407539
Packit Service 407539
Packit Service 407539
Packit Service 407539
Packit Service 407539
/* Provides network statistics. */
Packit Service 407539
Packit Service 407539
void
Packit Service 407539
glibtop_get_netload_s (glibtop *server, glibtop_netload *buf,
Packit Service 407539
		       const char *interface)
Packit Service 407539
{
Packit Service 407539
    int skfd;
Packit Service 407539
    memset (buf, 0, sizeof (glibtop_netload));
Packit Service 407539
Packit Service 407539
    skfd = socket (AF_INET, SOCK_DGRAM, 0);
Packit Service 407539
    if (skfd) {
Packit Service 407539
	struct ifreq ifr;
Packit Service 407539
Packit Service 407539
	g_strlcpy (ifr.ifr_name, interface, sizeof ifr.ifr_name);
Packit Service 407539
	if (!ioctl (skfd, SIOCGIFFLAGS, &ifr)) {
Packit Service 407539
	    const unsigned long long flags = ifr.ifr_flags;
Packit Service 407539
Packit Service 407539
	    buf->flags |= (1L << GLIBTOP_NETLOAD_IF_FLAGS);
Packit Service 407539
Packit Service 407539
	    if (flags & IFF_UP)
Packit Service 407539
		buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_UP);
Packit Service 407539
Packit Service 407539
	    if (flags & IFF_BROADCAST)
Packit Service 407539
		buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_BROADCAST);
Packit Service 407539
Packit Service 407539
	    if (flags & IFF_DEBUG)
Packit Service 407539
		buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_DEBUG);
Packit Service 407539
Packit Service 407539
	    if (flags & IFF_LOOPBACK)
Packit Service 407539
		buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_LOOPBACK);
Packit Service 407539
Packit Service 407539
	    if (flags & IFF_POINTOPOINT)
Packit Service 407539
		buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_POINTOPOINT);
Packit Service 407539
Packit Service 407539
	    if (flags & IFF_RUNNING)
Packit Service 407539
		buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_RUNNING);
Packit Service 407539
Packit Service 407539
	    if (flags & IFF_NOARP)
Packit Service 407539
		buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_NOARP);
Packit Service 407539
Packit Service 407539
	    if (flags & IFF_PROMISC)
Packit Service 407539
		buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_PROMISC);
Packit Service 407539
Packit Service 407539
	    if (flags & IFF_ALLMULTI)
Packit Service 407539
		buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_ALLMULTI);
Packit Service 407539
Packit Service 407539
	    if (flags & IFF_MULTICAST)
Packit Service 407539
		buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_MULTICAST);
Packit Service 407539
	    }
Packit Service 407539
Packit Service 407539
	g_strlcpy (ifr.ifr_name, interface, sizeof ifr.ifr_name);
Packit Service 407539
	if (!ioctl(skfd, /* SIOCGIWNAME */ 0x8B01, &ifr))
Packit Service 407539
		buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_WIRELESS);
Packit Service 407539
Packit Service 407539
	g_strlcpy (ifr.ifr_name, interface, sizeof ifr.ifr_name);
Packit Service 407539
	if (!ioctl (skfd, SIOCGIFADDR, &ifr)) {
Packit Service 407539
	    buf->address = ((struct sockaddr_in *) &ifr.ifr_addr)->sin_addr.s_addr;
Packit Service 407539
	    buf->flags |= (1L << GLIBTOP_NETLOAD_ADDRESS);
Packit Service 407539
	}
Packit Service 407539
Packit Service 407539
	g_strlcpy (ifr.ifr_name, interface, sizeof ifr.ifr_name);
Packit Service 407539
	if (!ioctl (skfd, SIOCGIFNETMASK, &ifr)) {
Packit Service 407539
	    buf->subnet = ((struct sockaddr_in *) &ifr.ifr_addr)->sin_addr.s_addr;
Packit Service 407539
	    buf->flags |= (1L << GLIBTOP_NETLOAD_SUBNET);
Packit Service 407539
	}
Packit Service 407539
Packit Service 407539
	g_strlcpy (ifr.ifr_name, interface, sizeof ifr.ifr_name);
Packit Service 407539
	if (!ioctl (skfd, SIOCGIFMTU, &ifr)) {
Packit Service 407539
	    buf->mtu = ifr.ifr_mtu;
Packit Service 407539
	    buf->flags |= (1L << GLIBTOP_NETLOAD_MTU);
Packit Service 407539
	}
Packit Service 407539
Packit Service 407539
	g_strlcpy (ifr.ifr_name, interface, sizeof ifr.ifr_name);
Packit Service 407539
	if (!ioctl (skfd, SIOCGIFHWADDR, &ifr)) {
Packit Service 407539
	    memcpy(buf->hwaddress, &ifr.ifr_hwaddr.sa_data, 8);
Packit Service 407539
	    buf->flags |= (1L << GLIBTOP_NETLOAD_HWADDRESS);
Packit Service 407539
	}
Packit Service 407539
Packit Service 407539
	close (skfd);
Packit Service 407539
    }
Packit Service 407539
Packit Service 407539
Packit Service 407539
    /*
Packit Service 407539
     * Statistics
Packit Service 407539
     */
Packit Service 407539
Packit Service 407539
    /* Linux 2.1.114 - don't know where exactly this was added, but
Packit Service 407539
	 * recent kernels have byte count in /proc/net/dev so we don't
Packit Service 407539
	 * need IP accounting.
Packit Service 407539
	 */
Packit Service 407539
Packit Service 407539
    if (server->os_version_code < LINUX_VERSION_CODE(2, 1, 14)) {
Packit Service 407539
	linux_2_0_stats(server, buf, interface);
Packit Service 407539
    }
Packit Service 407539
    else if (server->os_version_code > LINUX_VERSION_CODE(2, 6, 0)
Packit Service 407539
	     && has_sysfs()) {
Packit Service 407539
	linux_2_6_stats(server, buf, interface);
Packit Service 407539
    }
Packit Service 407539
    else {
Packit Service 407539
	/* 2.4 and 2.6 without /sys (?$£Z¥!) */
Packit Service 407539
	linux_2_4_stats(server, buf, interface);
Packit Service 407539
    }
Packit Service 407539
Packit Service 407539
#ifdef HAVE_IFADDRS_H
Packit Service 407539
    get_ipv6(server, buf, interface);
Packit Service 407539
#endif /* HAVE_IFADDRS_H */
Packit Service 407539
}
Packit Service 407539
Packit Service 407539
Packit Service 407539