Skip to contentSkip to conversation

divide-by-zero

2.6.0, pktgen Applied Lennert Buytenhek 5 participants 5 messages Dec 31, 2003 – Jan 19, 2004

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

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

#1 lore raw
Quoted 8 lines · Lennert Buytenhek

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

Signature · 16 lines
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,
#2 lore raw

Review

Quoted 1 line · Jörn Engel
(quoted diff) +1 -0
+		safe_total += 1 - (!!safe_total); /* avoid divide-by-zero */

That's a (binary ;-) order of magnitude more complicated than necessary:

Quoted 1 line
Quoted 1 line
(quoted diff) +1 -0
+		safe_total += !safe_total; /* avoid divide-by-zero */
Signature · 6 lines
Matthias Urlichs   |   {M:U} IT Design @ m-u-it.de   |  [email protected]
Disclaimer: The quote was selected randomly. Really. | http://smurf.noris.de
 - -
To believe that the nonexistence of God is a fact on the level of water
not running uphill, or the moon not having an atmosphere, requires far
more faith than I could ever muster. -- Arthur D. Hlavaty
#3 lore raw
In reply to Jörn Engel

Hello!

Quoted 5 lines · Jörn Engel
Quoted 4 lines · Lennert Buytenhek

When generating packets with pktgen with count=10, I get a divide-by-zero oops in inject().

Quoted 7 lines
Quoted 4 lines

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.

net/core/pktgen.c renamed from net/core/pktgen.c.orig +13 -3
@@ -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
#4 lore raw
Quoted 2 lines · On Mon, 19 Jan 2004 00:15:41 +0100 Robert Olsson <[email protected]>…

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

Applied, thanks Robert.