Thread (4 messages) flat view 4 messages, 4 authors, 2004-01-19
STALE8285d

[PATCH] Re: [2.6.0, pktgen] divide-by-zero

From: Robert Olsson <hidden>
Date: 2004-01-18 23:34:46
Also in: lkml


Hello!

Jörn Engel writes:
 > On Wed, 31 December 2003 06:13:16 -0500, Lennert Buytenhek wrote:
 > > 
 > > When generating packets with pktgen with count=10, I get a divide-by-zero
 > > oops in inject().
 > > 
 > > Line 273 in net/core/pktgen.c seems unsafe:
 > > 	__u64 pps = (__u32)(info->sofar * 1000) / ((__u32)(total) / 1000);
 > > 
 > > What if total < 1000 ?
 > 
 > Since noone else seemed to care, try this patch.  Against -test11,
 > yeah, I'm lazy again.


 Sorry I missed Lennerts original posting... 

 I suggest the patch below to get integer precision at very short time 
 intervals too.

--- linux-2.6.1/net/core/pktgen.c.orig	Sun Jan 18 21:56:56 2004
+++ linux-2.6.1/net/core/pktgen.c	Sun Jan 18 23:15:03 2004
@@ -88,7 +88,7 @@
 #define cycles()	((u32)get_cycles())
 
 
-#define VERSION "pktgen version 1.3"
+#define VERSION "pktgen version 1.31"
 static char version[] __initdata = 
   "pktgen.c: v1.3: Packet Generator for packet performance testing.\n";
 
@@ -720,8 +720,18 @@
 
 	{
 		char *p = info->result;
-		__u64 pps = (__u32)(info->sofar * 1000) / ((__u32)(total) / 1000);
-		__u64 bps = pps * 8 * (info->pkt_size + 4); /* take 32bit ethernet CRC into account */
+		__u64 bps, pps = 0;
+
+		if (total > 1000)
+			pps = (__u32)(info->sofar * 1000) / ((__u32)(total) / 1000);
+		else if(total > 100)
+			pps = (__u32)(info->sofar * 10000) / ((__u32)(total) / 100);
+		else if(total > 10)
+			pps = (__u32)(info->sofar * 100000) / ((__u32)(total) / 10);
+		else if(total > 1)
+			pps = (__u32)(info->sofar * 1000000) / (__u32)total;
+
+		bps = pps * 8 * (info->pkt_size + 4); /* take 32bit ethernet CRC into account */
 		p += sprintf(p, "OK: %llu(c%llu+d%llu) usec, %llu (%dbyte,%dfrags) %llupps %lluMb/sec (%llubps)  errors: %llu",
 			     (unsigned long long) total,
 			     (unsigned long long) (total - idle),


Cheers.
						--ro
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help