Skip to content
  • David Johnson's avatar
    Fixup the last commit so newer-style linux shaping with netem works. · 72fb9e3a
    David Johnson authored
    I didn't know this initially, but it turns out that with newer netems,
    you can't add another netem qdisc instance (nor an htb instance)
    inside another netem instance.  The linux maintainers removed
    "classful" qdisc support from the netem qdisc (which makes it
    possible for another qdisc to be "nested" inside a netem qdisc)
    because 1) netem couldn't even nest an instance of itself inside
    itself -- which isn't stricly necessary for us because we can do
    both delay and plr in one netem instance), and 2) because apparently
    non-work-conserving qdiscs already didn't work inside netem (a
    work-conserving qdisc is one that always has a packet ready when its
    underlying device is ready to transmit a packet -- thus, a
    bandwidth-shaping qdisc that might not have a packet ready because
    it's slowing down the send rate is non-work-conserving), and 3) to
    support code cleanups.
    
    So -- what this means for us is that by using modern netem, we are now
    doing bandwidth shaping first, then plr and delay.  With our old
    custom kernel modules, we were doing plr, delay, then bandwidth.
    
    I talked this strategy over with Jon (because adding classful support
    back to netem is nontrivial and defeats the point of trying to use
    what's in the kernel directly without patching it more), and we believe
    it's ok to do -- one because it doesn't always change the shaped rate
    from the old way we used to do things, and second because using these
    params *in tandem* to do link shaping is kind of a poor man's way
    of actually modeling real link behavior -- a la flexlab.
    
    So we'll just document it for users, call it beta for now, and test
    it against the old way and BSD.  If it looks reasonable, we'll stick
    with it; otherwise we'll look at reviving the old style.
    72fb9e3a