[2.6.0, pktgen] divide-by-zero

4 messages, 4 authors, 2004-01-19 · open the first message on its own page

[2.6.0, pktgen] divide-by-zero

From: Lennert Buytenhek <hidden>
Date: 2003-12-31 11:17:06

Hi,

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 ?


cheers,
Lennert

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

From: Jörn Engel <hidden>
Date: 2004-01-18 15:48:28

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.

Jörn

-- 
Time? What's that? Time is only worth what you do with it.
-- Theo de Raadt
--- old/net/core/pktgen.c	2003-11-26 21:44:47.000000000 +0100
+++ new/net/core/pktgen.c	2004-01-18 16:27:10.000000000 +0100
@@ -720,7 +720,9 @@
 
 	{
 		char *p = info->result;
-		__u64 pps = (__u32)(info->sofar * 1000) / ((__u32)(total) / 1000);
+		__u32 safe_total = (__u32)(total) / 1000;
+		safe_total += 1 - (!!safe_total); /* avoid divide-by-zero */
+		__u64 pps = (__u32)(info->sofar * 1000) / safe_total;
 		__u64 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,

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

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


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

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

From: David S. Miller <hidden>
Date: 2004-01-19 17:32:34

On Mon, 19 Jan 2004 00:15:41 +0100
Robert Olsson [off-list ref] wrote:
 I suggest the patch below to get integer precision at very short time 
 intervals too.
Applied, thanks Robert.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help