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

From: Robert Olsson
Date: Sun Jan 18 2004 - 18:37:11 EST




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
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/