[Bug 194453] [dummynet] pipe config bw parameter is limited to 2Gbits per second

bugzilla-noreply at freebsd.org bugzilla-noreply at freebsd.org
Fri Oct 24 22:15:29 UTC 2014


https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=194453

rizzo at iet.unipi.it changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |rizzo at iet.unipi.it

--- Comment #6 from rizzo at iet.unipi.it ---
(In reply to Hiren Panchasara from comment #5)
> (In reply to boba from comment #4)
> > (In reply to Hiren Panchasara from comment #2)
> > > (In reply to boba from comment #0)
> > > > It's impossible to create "pipe" with bandwidth higher than 2Gbits per
> > > > second. Possible due to "signed" type of variable.
> > > > 
> > > > # ipfw pipe 1 config bw 2700mbit/s
> > > > ipfw: bandwidth too large
> > > 
> > > I think you are right that its overflowing because of "signed" type.
> > > 
> > > A simple change like this may fix the problem:
> > > 
> > > Index: dummynet.c
> > > ===================================================================
> > > --- dummynet.c  (revision 270969)
> > > +++ dummynet.c  (working copy)
> > > @@ -546,7 +546,7 @@
> > >                 if_name[namelen] = '\0';
> > >                 *bandwidth = 0;
> > >         } else {        /* read bandwidth value */
> > > -               int bw;
> > > +               uint32_t bw;
> > >                 char *end = NULL;
> > >  
> > >                 bw = strtoul(arg, &end, 0);
> > 
> > This patch will not work at all because of following check few lines after
> > it:
> > 
> >                 if (bw < 0)
> >                         errx(EX_DATAERR, "bandwidth too large");
> 
> This patch is incomplete. But the check above is needed exactly for the
> reason of catching overflowing values. 
> 
> Afaik, a couple of things need to be done to make the patch complete:
> 1) make sure whatever datatype we use for bandwidth is uniform across entire
> dummynet codebase. i.e. in struct dn_link inside netinet/ip_dummynet.h
> 
> 2) It currently only handles Mb/s and b/s and not Gb/s while setting
> bandwidth.
> 
> If someone else doesn't beat me to it, I'll try to spend some time next week
> on this.

I think it is a waste of time to work on just extending the input range
unless one revises the internals so that dummynet can do shaping
with reasonable accuracy in the Gbit/s range.

By that i mean the following:
First of all change the internals of dummynet to opportunistically
check the timer whenever there is traffic, rather than relying on
a one-tick granularity. When dummynet was first implemented the timer
was the 8254, reading it took forever, and 250-1000us granularity was
adequate for the <10Mbit/s range it was meant to emulate.

Second, the default parameters (1ms, 50 slots queue) limit the capacity of
a pipe to some 600 Mbit/s with 1500-byte packets. Probably the code should
print warnings if queue_capacity/tick is too far from the desired rate.

Third, the bandwidth value is internally multiplied by other factor
in the execution of the scheduling algorithms. If you bump the data type
from 31 to 32 or 64 bits, you also need to check that the other computations
do not overflow.

In any case if you decide to go through this route please pass the code
by me for review before committing. -- luigi

-- 
You are receiving this mail because:
You are the assignee for the bug.


More information about the freebsd-net mailing list