The function below is responsible for returning the delay value that is used by the qdisc. If no distribution is specified it is uniform, this is why I didn't see a uniform.dist
file in /usr/lib/tc
where the other distribution tables are.
mu
== latency
sigma
== jitter
You can see from the code below that if you don't specify a distribution then it uses the uniform one by default. return ((rnd % (2 * sigma)) + mu) - sigma;
in this case rnd
is our correlated random number from get_crandom
so we take the jitter value sigma
and multiply it by 2, then we modulo rnd
by this value and add mu
our base latency
and then subtract sigma
to center the jitter
/* tabledist - return a pseudo-randomly distributed value with mean mu and
* std deviation sigma. Uses table lookup to approximate the desired
* distribution, and a uniformly-distributed pseudo-random source.
*/
static s64 tabledist(s64 mu, s32 sigma,
struct crndstate *state,
const struct disttable *dist)
{
s64 x;
long t;
u32 rnd;
if (sigma == 0)
return mu;
rnd = get_crandom(state);
/* default uniform distribution */
if (dist == NULL)
return ((rnd % (2 * sigma)) + mu) - sigma;
t = dist->table[rnd % dist->size];
x = (sigma % NETEM_DIST_SCALE) * t;
if (x >= 0)
x += NETEM_DIST_SCALE/2;
else
x -= NETEM_DIST_SCALE/2;
return x / NETEM_DIST_SCALE + (sigma / NETEM_DIST_SCALE) * t + mu;
}
Tests were run with correlation set to 1%, 25%, 50%, 75%, 99%, 100%. Each time 4 pings were sent to trigger calls to the function.
=================================================
function: init_crandom
$$vars: rho=? state=?
$$locals:
$$parms: rho=? state=?
=================================================
=================================================
function: init_crandom
$$vars: rho=? state=?
$$locals:
$$parms: rho=? state=?
=================================================
=================================================
function: init_crandom
$$vars: rho=? state=?
$$locals:
$$parms: rho=? state=?
=================================================
=================================================
function: get_crandom
$$vars: state=0xffff8a8ef4c0ddec value=? rho=? answer=?
$$locals: value=? rho=? answer=?
$$parms: state=0xffff8a8ef4c0ddec
rho: 28f5c29
last: 3bcfa65a
=================================================
=================================================
function: get_crandom
$$vars: state=0xffff8a8ef4c0ddec value=? rho=? answer=?
$$locals: value=? rho=? answer=?
$$parms: state=0xffff8a8ef4c0ddec
rho: 28f5c29
last: 48c2c949
=================================================
=================================================
function: get_crandom
$$vars: state=0xffff8a8ef4c0ddec value=? rho=? answer=?
$$locals: value=? rho=? answer=?
$$parms: state=0xffff8a8ef4c0ddec
rho: 28f5c29
last: 3745499e
=================================================
=================================================
function: get_crandom
$$vars: state=0xffff8a8ef4c0ddec value=? rho=? answer=?
$$locals: value=? rho=? answer=?
$$parms: state=0xffff8a8ef4c0ddec
rho: 28f5c29
last: 13e3b871
=================================================
=================================================
function: get_crandom
$$vars: state=0xffff8a8ef4c0ddec value=? rho=? answer=?
$$locals: value=? rho=? answer=?
$$parms: state=0xffff8a8ef4c0ddec
rho: 28f5c29
last: 76ac697
=================================================
=================================================
function: get_crandom
$$vars: state=0xffff8a8ef4c0ddec value=? rho=? answer=?
$$locals: value=? rho=? answer=?
$$parms: state=0xffff8a8ef4c0ddec
rho: 28f5c29
last: e83435f7
=================================================
=================================================
function: get_crandom
$$vars: state=0xffff8a8ef4c0ddec value=? rho=? answer=?
$$locals: value=? rho=? answer=?
$$parms: state=0xffff8a8ef4c0ddec
rho: 28f5c29
last: f78f366c
=================================================
=================================================
function: get_crandom
$$vars: state=0xffff8a8ef4c0ddec value=? rho=? answer=?
$$locals: value=? rho=? answer=?
$$parms: state=0xffff8a8ef4c0ddec
rho: 28f5c29
last: 5529c9b3
=================================================
=================================================
function: init_crandom
$$vars: rho=? state=?
$$locals:
$$parms: rho=? state=?
=================================================
=================================================
function: init_crandom
$$vars: rho=? state=?
$$locals:
$$parms: rho=? state=?
=================================================
=================================================
function: init_crandom
$$vars: rho=? state=?
$$locals:
$$parms: rho=? state=?
=================================================
=================================================
function: get_crandom
$$vars: state=0xffff8a8ef4c0ddec value=? rho=? answer=?
$$locals: value=? rho=? answer=?
$$parms: state=0xffff8a8ef4c0ddec
rho: 40000000
last: d6d9ba4f
=================================================
=================================================
function: get_crandom
$$vars: state=0xffff8a8ef4c0ddec value=? rho=? answer=?
$$locals: value=? rho=? answer=?
$$parms: state=0xffff8a8ef4c0ddec
rho: 40000000
last: f0dcb307
=================================================
=================================================
function: get_crandom
$$vars: state=0xffff8a8ef4c0ddec value=? rho=? answer=?
$$locals: value=? rho=? answer=?
$$parms: state=0xffff8a8ef4c0ddec
rho: 40000000
last: dbc4e409
=================================================
=================================================
function: get_crandom
$$vars: state=0xffff8a8ef4c0ddec value=? rho=? answer=?
$$locals: value=? rho=? answer=?
$$parms: state=0xffff8a8ef4c0ddec
rho: 40000000
last: edbd0fca
=================================================
=================================================
function: get_crandom
$$vars: state=0xffff8a8ef4c0ddec value=? rho=? answer=?
$$locals: value=? rho=? answer=?
$$parms: state=0xffff8a8ef4c0ddec
rho: 40000000
last: 3d2c94ff
=================================================
=================================================
function: get_crandom
$$vars: state=0xffff8a8ef4c0ddec value=? rho=? answer=?
$$locals: value=? rho=? answer=?
$$parms: state=0xffff8a8ef4c0ddec
rho: 40000000
last: 14166356
=================================================
=================================================
function: get_crandom
$$vars: state=0xffff8a8ef4c0ddec value=? rho=? answer=?
$$locals: value=? rho=? answer=?
$$parms: state=0xffff8a8ef4c0ddec
rho: 40000000
last: 210522f6
=================================================
=================================================
function: get_crandom
$$vars: state=0xffff8a8ef4c0ddec value=? rho=? answer=?
$$locals: value=? rho=? answer=?
$$parms: state=0xffff8a8ef4c0ddec
rho: 40000000
last: 5e7d59e1
=================================================
=================================================
function: init_crandom
$$vars: rho=? state=?
$$locals:
$$parms: rho=? state=?
=================================================
=================================================
function: init_crandom
$$vars: rho=? state=?
$$locals:
$$parms: rho=? state=?
=================================================
=================================================
function: init_crandom
$$vars: rho=? state=?
$$locals:
$$parms: rho=? state=?
=================================================
=================================================
function: get_crandom
$$vars: state=0xffff8a8ef4c0ddec value=? rho=? answer=?
$$locals: value=? rho=? answer=?
$$parms: state=0xffff8a8ef4c0ddec
rho: 80000000
last: c2035747
=================================================
=================================================
function: get_crandom
$$vars: state=0xffff8a8ef4c0ddec value=? rho=? answer=?
$$locals: value=? rho=? answer=?
$$parms: state=0xffff8a8ef4c0ddec
rho: 80000000
last: b2ea4fe4
=================================================
=================================================
function: get_crandom
$$vars: state=0xffff8a8ef4c0ddec value=? rho=? answer=?
$$locals: value=? rho=? answer=?
$$parms: state=0xffff8a8ef4c0ddec
rho: 80000000
last: a11e00ed
=================================================
=================================================
function: get_crandom
$$vars: state=0xffff8a8ef4c0ddec value=? rho=? answer=?
$$locals: value=? rho=? answer=?
$$parms: state=0xffff8a8ef4c0ddec
rho: 80000000
last: cfde1190
=================================================
=================================================
function: get_crandom
$$vars: state=0xffff8a8ef4c0ddec value=? rho=? answer=?
$$locals: value=? rho=? answer=?
$$parms: state=0xffff8a8ef4c0ddec
rho: 80000000
last: 9acfc11d
=================================================
=================================================
function: get_crandom
$$vars: state=0xffff8a8ef4c0ddec value=? rho=? answer=?
$$locals: value=? rho=? answer=?
$$parms: state=0xffff8a8ef4c0ddec
rho: 80000000
last: 95f5eb55
=================================================
=================================================
function: get_crandom
$$vars: state=0xffff8a8ef4c0ddec value=? rho=? answer=?
$$locals: value=? rho=? answer=?
$$parms: state=0xffff8a8ef4c0ddec
rho: 80000000
last: 4fe4aa66
=================================================
=================================================
function: get_crandom
$$vars: state=0xffff8a8ef4c0ddec value=? rho=? answer=?
$$locals: value=? rho=? answer=?
$$parms: state=0xffff8a8ef4c0ddec
rho: 80000000
last: 8b290eb5
=================================================
=================================================
function: init_crandom
$$vars: rho=? state=?
$$locals:
$$parms: rho=? state=?
=================================================
=================================================
function: init_crandom
$$vars: rho=? state=?
$$locals:
$$parms: rho=? state=?
=================================================
=================================================
function: init_crandom
$$vars: rho=? state=?
$$locals:
$$parms: rho=? state=?
=================================================
=================================================
function: get_crandom
$$vars: state=0xffff8a8ef4c0ddec value=? rho=? answer=?
$$locals: value=? rho=? answer=?
$$parms: state=0xffff8a8ef4c0ddec
rho: bfffffff
last: 928fe7ef
=================================================
=================================================
function: get_crandom
$$vars: state=0xffff8a8ef4c0ddec value=? rho=? answer=?
$$locals: value=? rho=? answer=?
$$parms: state=0xffff8a8ef4c0ddec
rho: bfffffff
last: 942b9d60
=================================================
=================================================
function: get_crandom
$$vars: state=0xffff8a8ef4c0ddec value=? rho=? answer=?
$$locals: value=? rho=? answer=?
$$parms: state=0xffff8a8ef4c0ddec
rho: bfffffff
last: 73ea02a1
=================================================
=================================================
function: get_crandom
$$vars: state=0xffff8a8ef4c0ddec value=? rho=? answer=?
$$locals: value=? rho=? answer=?
$$parms: state=0xffff8a8ef4c0ddec
rho: bfffffff
last: 8b064505
=================================================
=================================================
function: get_crandom
$$vars: state=0xffff8a8ef4c0ddec value=? rho=? answer=?
$$locals: value=? rho=? answer=?
$$parms: state=0xffff8a8ef4c0ddec
rho: bfffffff
last: 9377e451
=================================================
=================================================
function: get_crandom
$$vars: state=0xffff8a8ef4c0ddec value=? rho=? answer=?
$$locals: value=? rho=? answer=?
$$parms: state=0xffff8a8ef4c0ddec
rho: bfffffff
last: 975bb960
=================================================
=================================================
function: get_crandom
$$vars: state=0xffff8a8ef4c0ddec value=? rho=? answer=?
$$locals: value=? rho=? answer=?
$$parms: state=0xffff8a8ef4c0ddec
rho: bfffffff
last: 78c0ef08
=================================================
=================================================
function: get_crandom
$$vars: state=0xffff8a8ef4c0ddec value=? rho=? answer=?
$$locals: value=? rho=? answer=?
$$parms: state=0xffff8a8ef4c0ddec
rho: bfffffff
last: 5d262fa3
=================================================
=================================================
function: init_crandom
$$vars: rho=? state=?
$$locals:
$$parms: rho=? state=?
=================================================
=================================================
function: init_crandom
$$vars: rho=? state=?
$$locals:
$$parms: rho=? state=?
=================================================
=================================================
function: init_crandom
$$vars: rho=? state=?
$$locals:
$$parms: rho=? state=?
=================================================
=================================================
function: get_crandom
$$vars: state=0xffff8a8ef4c0ddec value=? rho=? answer=?
$$locals: value=? rho=? answer=?
$$parms: state=0xffff8a8ef4c0ddec
rho: fd70a3d6
last: 91b511ae
=================================================
=================================================
function: get_crandom
$$vars: state=0xffff8a8ef4c0ddec value=? rho=? answer=?
$$locals: value=? rho=? answer=?
$$parms: state=0xffff8a8ef4c0ddec
rho: fd70a3d6
last: 90691e05
=================================================
=================================================
function: get_crandom
$$vars: state=0xffff8a8ef4c0ddec value=? rho=? answer=?
$$locals: value=? rho=? answer=?
$$parms: state=0xffff8a8ef4c0ddec
rho: fd70a3d6
last: 9099f5f3
=================================================
=================================================
function: get_crandom
$$vars: state=0xffff8a8ef4c0ddec value=? rho=? answer=?
$$locals: value=? rho=? answer=?
$$parms: state=0xffff8a8ef4c0ddec
rho: fd70a3d6
last: 8f736b78
=================================================
=================================================
function: get_crandom
$$vars: state=0xffff8a8ef4c0ddec value=? rho=? answer=?
$$locals: value=? rho=? answer=?
$$parms: state=0xffff8a8ef4c0ddec
rho: fd70a3d6
last: 8e5da66e
=================================================
=================================================
function: get_crandom
$$vars: state=0xffff8a8ef4c0ddec value=? rho=? answer=?
$$locals: value=? rho=? answer=?
$$parms: state=0xffff8a8ef4c0ddec
rho: fd70a3d6
last: 8e1e3d54
=================================================
=================================================
function: get_crandom
$$vars: state=0xffff8a8ef4c0ddec value=? rho=? answer=?
$$locals: value=? rho=? answer=?
$$parms: state=0xffff8a8ef4c0ddec
rho: fd70a3d6
last: 8dfd6c8d
=================================================
=================================================
function: get_crandom
$$vars: state=0xffff8a8ef4c0ddec value=? rho=? answer=?
$$locals: value=? rho=? answer=?
$$parms: state=0xffff8a8ef4c0ddec
rho: fd70a3d6
last: 8d4e075b
=================================================
=================================================
function: init_crandom
$$vars: rho=? state=?
$$locals:
$$parms: rho=? state=?
=================================================
=================================================
function: init_crandom
$$vars: rho=? state=?
$$locals:
$$parms: rho=? state=?
=================================================
=================================================
function: init_crandom
$$vars: rho=? state=?
$$locals:
$$parms: rho=? state=?
=================================================
=================================================
function: get_crandom
$$vars: state=0xffff8a8ef4c0ddec value=? rho=? answer=?
$$locals: value=? rho=? answer=?
$$parms: state=0xffff8a8ef4c0ddec
rho: ffffffff
last: 60c38809
=================================================
=================================================
function: get_crandom
$$vars: state=0xffff8a8ef4c0ddec value=? rho=? answer=?
$$locals: value=? rho=? answer=?
$$parms: state=0xffff8a8ef4c0ddec
rho: ffffffff
last: 60c38809
=================================================
=================================================
function: get_crandom
$$vars: state=0xffff8a8ef4c0ddec value=? rho=? answer=?
$$locals: value=? rho=? answer=?
$$parms: state=0xffff8a8ef4c0ddec
rho: ffffffff
last: 60c38809
=================================================
=================================================
function: get_crandom
$$vars: state=0xffff8a8ef4c0ddec value=? rho=? answer=?
$$locals: value=? rho=? answer=?
$$parms: state=0xffff8a8ef4c0ddec
rho: ffffffff
last: 60c38809
=================================================
=================================================
function: get_crandom
$$vars: state=0xffff8a8ef4c0ddec value=? rho=? answer=?
$$locals: value=? rho=? answer=?
$$parms: state=0xffff8a8ef4c0ddec
rho: ffffffff
last: 60c38809
=================================================
=================================================
function: get_crandom
$$vars: state=0xffff8a8ef4c0ddec value=? rho=? answer=?
$$locals: value=? rho=? answer=?
$$parms: state=0xffff8a8ef4c0ddec
rho: ffffffff
last: 60c38809
=================================================
=================================================
function: get_crandom
$$vars: state=0xffff8a8ef4c0ddec value=? rho=? answer=?
$$locals: value=? rho=? answer=?
$$parms: state=0xffff8a8ef4c0ddec
rho: ffffffff
last: 60c38809
=================================================
=================================================
function: get_crandom
$$vars: state=0xffff8a8ef4c0ddec value=? rho=? answer=?
$$locals: value=? rho=? answer=?
$$parms: state=0xffff8a8ef4c0ddec
rho: ffffffff
last: 60c38809
=================================================
function
Each point of
correlation % == .00000001
increasesrho
by1
Testing shows that although
tc
doesn't reflect values forcorrelation
past 5 decimal places it appears that is supports much more precision.