]> git.proxmox.com Git - mirror_ubuntu-eoan-kernel.git/commitdiff
pktgen: increasing transmission granularity
authorDaniel Turull <daniel.turull@gmail.com>
Wed, 9 Jun 2010 22:49:57 +0000 (22:49 +0000)
committerDavid S. Miller <davem@davemloft.net>
Sat, 12 Jun 2010 01:37:09 +0000 (18:37 -0700)
This patch increases the granularity of the rate generated by pktgen.
The previous version of pktgen uses micro seconds (udelay) resolution when it
was delayed causing gaps in the rates. It is changed to nanosecond (ndelay).
Now any rate is possible.

Also it allows to set, the desired rate in Mb/s or packets per second.

The documentation has been updated.

Signed-off-by: Daniel Turull <daniel.turull@gmail.com>
Signed-off-by: Robert Olsson <robert.olsson@its.uu.se>
Signed-off-by: David S. Miller <davem@davemloft.net>
Documentation/networking/pktgen.txt
net/core/pktgen.c

index 61bb645d50e061d7450f3f75d8805d2ca9308501..75e4fd708ccb3804904515648e6bf9de7a7a39ae 100644 (file)
@@ -151,6 +151,8 @@ Examples:
 
  pgset stop                      aborts injection. Also, ^C aborts generator.
 
+ pgset "rate 300M"        set rate to 300 Mb/s
+ pgset "ratep 1000000"    set rate to 1Mpps
 
 Example scripts
 ===============
@@ -241,6 +243,9 @@ src6
 flows
 flowlen
 
+rate
+ratep
+
 References:
 ftp://robur.slu.se/pub/Linux/net-development/pktgen-testing/
 ftp://robur.slu.se/pub/Linux/net-development/pktgen-testing/examples/
index 1dacd7ba8dbb1d4c2e5e6e9f623b3806e202f0ee..6428653e9498aee2def19601fed77ddad9d5a1c0 100644 (file)
 #include <asm/dma.h>
 #include <asm/div64.h>         /* do_div */
 
-#define VERSION        "2.73"
+#define VERSION        "2.74"
 #define IP_NAME_SZ 32
 #define MAX_MPLS_LABELS 16 /* This is the max label stack depth */
 #define MPLS_STACK_BOTTOM htonl(0x00000100)
@@ -980,6 +980,40 @@ static ssize_t pktgen_if_write(struct file *file,
                        (unsigned long long) pkt_dev->delay);
                return count;
        }
+       if (!strcmp(name, "rate")) {
+               len = num_arg(&user_buffer[i], 10, &value);
+               if (len < 0)
+                       return len;
+
+               i += len;
+               if (!value)
+                       return len;
+               pkt_dev->delay = pkt_dev->min_pkt_size*8*NSEC_PER_USEC/value;
+               if (debug)
+                       printk(KERN_INFO
+                                "pktgen: Delay set at: %llu ns\n",
+                                       pkt_dev->delay);
+
+               sprintf(pg_result, "OK: rate=%lu", value);
+               return count;
+       }
+       if (!strcmp(name, "ratep")) {
+               len = num_arg(&user_buffer[i], 10, &value);
+               if (len < 0)
+                       return len;
+
+               i += len;
+               if (!value)
+                       return len;
+               pkt_dev->delay = NSEC_PER_SEC/value;
+               if (debug)
+                       printk(KERN_INFO
+                                "pktgen: Delay set at: %llu ns\n",
+                                       pkt_dev->delay);
+
+               sprintf(pg_result, "OK: rate=%lu", value);
+               return count;
+       }
        if (!strcmp(name, "udp_src_min")) {
                len = num_arg(&user_buffer[i], 10, &value);
                if (len < 0)
@@ -2142,15 +2176,15 @@ static void spin(struct pktgen_dev *pkt_dev, ktime_t spin_until)
        hrtimer_init_on_stack(&t.timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS);
        hrtimer_set_expires(&t.timer, spin_until);
 
-       remaining = ktime_to_us(hrtimer_expires_remaining(&t.timer));
+       remaining = ktime_to_ns(hrtimer_expires_remaining(&t.timer));
        if (remaining <= 0) {
                pkt_dev->next_tx = ktime_add_ns(spin_until, pkt_dev->delay);
                return;
        }
 
        start_time = ktime_now();
-       if (remaining < 100)
-               udelay(remaining);      /* really small just spin */
+       if (remaining < 100000)
+               ndelay(remaining);      /* really small just spin */
        else {
                /* see do_nanosleep */
                hrtimer_init_sleeper(&t, current);