lkml.org 
[lkml]   [2004]   [Jan]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Date
    Subject[PATCH] Re: [2.6.0, pktgen] divide-by-zero


    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@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2005-03-22 14:00    [W:0.023 / U:31.252 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site