ports/69839: [ maintainer ] sysutils/torsmo: add network interfaces monitoring support

Roman Bogorodskiy bogorodskiy at inbox.ru
Sat Jul 31 09:30:55 UTC 2004


>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 at 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:



More information about the freebsd-ports-bugs mailing list