Skip to content

Commit

Permalink
pktgen: increasing transmission granularity
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Daniel Turull authored and David S. Miller committed Jun 12, 2010
1 parent 0c78a92 commit 43d28b6
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 4 deletions.
5 changes: 5 additions & 0 deletions Documentation/networking/pktgen.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
===============
Expand Down Expand Up @@ -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/
Expand Down
42 changes: 38 additions & 4 deletions net/core/pktgen.c
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,7 @@
#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)
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit 43d28b6

Please sign in to comment.