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 % == .00000001increasesrhoby1Testing shows that although
tcdoesn't reflect values forcorrelationpast 5 decimal places it appears that is supports much more precision.