Date: Sat, 31 Jul 2004 13:25:29 +0400 From: Roman Bogorodskiy <bogorodskiy@inbox.ru> To: FreeBSD-gnats-submit@FreeBSD.org Subject: ports/69839: [ maintainer ] sysutils/torsmo: add network interfaces monitoring support Message-ID: <E1Bqq7M-000Dze-00.bogorodskiy-inbox-ru@mx1.mail.ru> Resent-Message-ID: <200407310930.i6V9UR9J094502@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 69839 >Category: ports >Synopsis: [ maintainer ] sysutils/torsmo: add network interfaces monitoring support >Confidential: no >Severity: non-critical >Priority: medium >Responsible: freebsd-ports-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: maintainer-update >Submitter-Id: current-users >Arrival-Date: Sat Jul 31 09:30:26 GMT 2004 >Closed-Date: >Last-Modified: >Originator: Roman Bogorodskiy >Release: FreeBSD 5.2.1-RELEASE-p9 i386 >Organization: >Environment: System: FreeBSD lame.novel.ru 5.2.1-RELEASE-p9 FreeBSD 5.2.1-RELEASE-p9 #9: Sat Jul 31 09:32:50 MSD 2004 root@lame.novel.ru:/usr/obj/usr/src/sys/NOV i386 >Description: Network interfaces monitoring seems to work with this patch. PS I was going to submit network monitoring and ACPI temperature/fans speed monitoring together, but I'm not be able to do this becouse I have VT8235 chipset which is not supported by viapm(4). >How-To-Repeat: >Fix: diff -ruN torsmo.orig/files/freebsd.c torsmo/files/freebsd.c --- torsmo.orig/files/freebsd.c Sat Jul 31 12:16:25 2004 +++ torsmo/files/freebsd.c Sat Jul 31 12:44:43 2004 @@ -22,6 +22,8 @@ #include <sys/socket.h> #include <net/if.h> #include <net/if_mib.h> +#include <sys/socket.h> +#include <ifaddrs.h> void net_init(); @@ -138,111 +140,60 @@ } } -void net_init() -{ -/* XXX */ -#if 0 - struct ifmibdata tempndata; - int numifaces; - size_t len2; - int mib[5], datamib[6]; - int i; - - mib[0] = CTL_NET; - mib[1] = PF_LINK; - mib[2] = NETLINK_GENERIC; - mib[3] = IFMIB_SYSTEM; - mib[4] = IFMIB_IFCOUNT; - - datamib[0] = CTL_NET; - datamib[1] = PF_LINK; - datamib[2] = NETLINK_GENERIC; - datamib[3] = IFMIB_IFDATA; - datamib[4] = 1; - datamib[5] = IFDATA_GENERAL; - - len = sizeof(struct ifmibdata); - len2 = sizeof(numifaces); - - if(sysctl(mib, 5, &numifaces, &len2, NULL, 0) < 0) - fprintf( stderr, "wmnet: failed to perform sysctl" ); - - for(i = 1; i <= numifaces; i++) - { - datamib[4] = i; - if(sysctl(datamib, 6, &tempndata, &len, NULL, 0) < 0) - { - fprintf( stderr, "wmnet: failed to get device(%d) data", i ); - break; - } - - } - - - /* calculate and allocate mem for ifmibdata containing the if stats */ - data = malloc(len); - -#endif -} - void update_net_stats() { -#if 0 - static int rep; - unsigned int i; - char buf[256]; + struct net_stat *ns; double delta; + long long r, t, last_recv, last_trans; /* get delta */ delta = current_update_time - last_update_time; if (delta <= 0.0001) return; - net_init(); - - /* read each interface */ - for (i=0; i<16; i++) { - struct net_stat *ns; - char *s, *p; - long long r, t, last_recv, last_trans; - int datamib[6]; - - ns = get_net_stat(s); - last_recv = ns->recv; - last_trans = ns->trans; - - datamib[0] = CTL_NET; - datamib[1] = PF_LINK; - datamib[2] = NETLINK_GENERIC; - datamib[3] = IFMIB_IFDATA; - datamib[4] = i; - datamib[5] = IFDATA_GENERAL; - - if (sysctl(datamib, 6, data, &len, NULL, 0) < 0 ) { - perror("sysctl"); - } - - r = data->ifmd_data.ifi_ipackets; - t = data->ifmd_data.ifi_opackets; - - if (r < ns->last_read_recv) - ns->recv += ((long long) 4294967295U - ns->last_read_recv) + r; - else - ns->recv += (r - ns->last_read_recv); - ns->last_read_recv = r; - - if (t < ns->last_read_trans) - ns->trans += ((long long) 4294967295U - ns->last_read_trans) + t; - else - ns->trans += (t - ns->last_read_trans); - ns->last_read_trans = t; - - /* calculate speeds */ - ns->recv_speed = (ns->recv - last_recv) / delta; - ns->trans_speed = (ns->trans - last_trans) / delta; - } + struct ifaddrs *ifap, *ifa; + struct if_data *ifd; + + if (getifaddrs(&ifap) < 0) + return; -#endif + for (ifa = ifap; ifa; ifa = ifa->ifa_next) { + ns = get_net_stat((const char *)ifa->ifa_name); + + if (ifa->ifa_flags & IFF_UP) { + last_recv = ns->recv; + last_trans = ns->trans; + + if (ifa->ifa_addr->sa_family != AF_LINK) + continue; + + ifd = (struct if_data *)ifa->ifa_data; + r = ifd->ifi_ibytes; + t = ifd->ifi_obytes; + + if (r < ns->last_read_recv) + ns->recv += ((long long) 4294967295U - ns->last_read_recv) + r; + else + ns->recv += (r - ns->last_read_recv); + + ns->last_read_recv = r; + + if (t < ns->last_read_trans) + ns->trans += ((long long) 4294967295U - ns->last_read_trans) + t; + else + ns->trans += (t - ns->last_read_trans); + + ns->last_read_trans = t; + + + /* calculate speeds */ + ns->recv_speed = (ns->recv - last_recv) / delta; + ns->trans_speed = (ns->trans - last_trans) / delta; + } + } + + freeifaddrs(ifap); } + int get_total_processes() { /* It's easier to use kvm here than sysctl */ >Release-Note: >Audit-Trail: >Unformatted:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?E1Bqq7M-000Dze-00.bogorodskiy-inbox-ru>