netdev
[Top] [All Lists]

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

To: Jörn Engel <joern@xxxxxxxxxxxxxxxxxxxx>
Subject: [PATCH] Re: [2.6.0, pktgen] divide-by-zero
From: Robert Olsson <Robert.Olsson@xxxxxxxxxxx>
Date: Mon, 19 Jan 2004 00:15:41 +0100
Cc: Lennert Buytenhek <buytenh@xxxxxxx>, linux-kernel@xxxxxxxxxxxxxxx, netdev@xxxxxxxxxxx
In-reply-to: <20040118154802.GE10397@xxxxxxxxxxxxxxxxxxxx>
References: <20031231111316.GA10218@xxxxxxx> <20040118154802.GE10397@xxxxxxxxxxxxxxxxxxxx>
Sender: netdev-bounce@xxxxxxxxxxx

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


<Prev in Thread] Current Thread [Next in Thread>