Loading net/sched/sch_netem.c +28 −19 Original line number Diff line number Diff line Loading @@ -110,6 +110,13 @@ struct netem_sched_data { CLG_GILB_ELL, } loss_model; enum { TX_IN_GAP_PERIOD = 1, TX_IN_BURST_PERIOD, LOST_IN_GAP_PERIOD, LOST_IN_BURST_PERIOD, } _4_state_model; /* Correlated Loss Generation models */ struct clgstate { /* state of the Markov chain */ Loading Loading @@ -205,43 +212,45 @@ static bool loss_4state(struct netem_sched_data *q) * probabilities outgoing from the current state, then decides the * next state and if the next packet has to be transmitted or lost. * The four states correspond to: * 1 => successfully transmitted packets within a gap period * 4 => isolated losses within a gap period * 3 => lost packets within a burst period * 2 => successfully transmitted packets within a burst period * TX_IN_GAP_PERIOD => successfully transmitted packets within a gap period * LOST_IN_BURST_PERIOD => isolated losses within a gap period * LOST_IN_GAP_PERIOD => lost packets within a burst period * TX_IN_GAP_PERIOD => successfully transmitted packets within a burst period */ switch (clg->state) { case 1: case TX_IN_GAP_PERIOD: if (rnd < clg->a4) { clg->state = 4; clg->state = LOST_IN_BURST_PERIOD; return true; } else if (clg->a4 < rnd && rnd < clg->a1 + clg->a4) { clg->state = 3; clg->state = LOST_IN_GAP_PERIOD; return true; } else if (clg->a1 + clg->a4 < rnd) clg->state = 1; } else if (clg->a1 + clg->a4 < rnd) { clg->state = TX_IN_GAP_PERIOD; } break; case 2: case TX_IN_BURST_PERIOD: if (rnd < clg->a5) { clg->state = 3; clg->state = LOST_IN_GAP_PERIOD; return true; } else clg->state = 2; } else { clg->state = TX_IN_BURST_PERIOD; } break; case 3: case LOST_IN_GAP_PERIOD: if (rnd < clg->a3) clg->state = 2; clg->state = TX_IN_BURST_PERIOD; else if (clg->a3 < rnd && rnd < clg->a2 + clg->a3) { clg->state = 1; clg->state = TX_IN_GAP_PERIOD; } else if (clg->a2 + clg->a3 < rnd) { clg->state = 3; clg->state = LOST_IN_GAP_PERIOD; return true; } break; case 4: clg->state = 1; case LOST_IN_BURST_PERIOD: clg->state = TX_IN_GAP_PERIOD; break; } Loading Loading
net/sched/sch_netem.c +28 −19 Original line number Diff line number Diff line Loading @@ -110,6 +110,13 @@ struct netem_sched_data { CLG_GILB_ELL, } loss_model; enum { TX_IN_GAP_PERIOD = 1, TX_IN_BURST_PERIOD, LOST_IN_GAP_PERIOD, LOST_IN_BURST_PERIOD, } _4_state_model; /* Correlated Loss Generation models */ struct clgstate { /* state of the Markov chain */ Loading Loading @@ -205,43 +212,45 @@ static bool loss_4state(struct netem_sched_data *q) * probabilities outgoing from the current state, then decides the * next state and if the next packet has to be transmitted or lost. * The four states correspond to: * 1 => successfully transmitted packets within a gap period * 4 => isolated losses within a gap period * 3 => lost packets within a burst period * 2 => successfully transmitted packets within a burst period * TX_IN_GAP_PERIOD => successfully transmitted packets within a gap period * LOST_IN_BURST_PERIOD => isolated losses within a gap period * LOST_IN_GAP_PERIOD => lost packets within a burst period * TX_IN_GAP_PERIOD => successfully transmitted packets within a burst period */ switch (clg->state) { case 1: case TX_IN_GAP_PERIOD: if (rnd < clg->a4) { clg->state = 4; clg->state = LOST_IN_BURST_PERIOD; return true; } else if (clg->a4 < rnd && rnd < clg->a1 + clg->a4) { clg->state = 3; clg->state = LOST_IN_GAP_PERIOD; return true; } else if (clg->a1 + clg->a4 < rnd) clg->state = 1; } else if (clg->a1 + clg->a4 < rnd) { clg->state = TX_IN_GAP_PERIOD; } break; case 2: case TX_IN_BURST_PERIOD: if (rnd < clg->a5) { clg->state = 3; clg->state = LOST_IN_GAP_PERIOD; return true; } else clg->state = 2; } else { clg->state = TX_IN_BURST_PERIOD; } break; case 3: case LOST_IN_GAP_PERIOD: if (rnd < clg->a3) clg->state = 2; clg->state = TX_IN_BURST_PERIOD; else if (clg->a3 < rnd && rnd < clg->a2 + clg->a3) { clg->state = 1; clg->state = TX_IN_GAP_PERIOD; } else if (clg->a2 + clg->a3 < rnd) { clg->state = 3; clg->state = LOST_IN_GAP_PERIOD; return true; } break; case 4: clg->state = 1; case LOST_IN_BURST_PERIOD: clg->state = TX_IN_GAP_PERIOD; break; } Loading