Lines Matching +full:software +full:- +full:controlled

5  * Codel - The Controlled-Delay Active Queue Management algorithm
7 * Copyright (C) 2011-2012 Kathleen Nichols <nichols@pollere.com>
8 * Copyright (C) 2011-2012 Van Jacobson <van@pollere.net>
22 * derived from this software without specific prior written permission.
25 * software may be distributed under the terms of the GNU General
29 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
39 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
56 params->interval = MS2TIME(100); in codel_params_init()
57 params->target = MS2TIME(5); in codel_params_init()
58 params->ce_threshold = CODEL_DISABLED_THRESHOLD; in codel_params_init()
59 params->ce_threshold_mask = 0; in codel_params_init()
60 params->ce_threshold_selector = 0; in codel_params_init()
61 params->ecn = false; in codel_params_init()
71 stats->maxpacket = 0; in codel_stats_init()
76 * new_invsqrt = (invsqrt / 2) * (3 - count * invsqrt^2)
82 u32 invsqrt = ((u32)vars->rec_inv_sqrt) << REC_INV_SQRT_SHIFT; in codel_Newton_step()
84 u64 val = (3LL << 32) - ((u64)vars->count * invsqrt2); in codel_Newton_step()
87 val = (val * invsqrt) >> (32 - 2 + 1); in codel_Newton_step()
89 vars->rec_inv_sqrt = val >> REC_INV_SQRT_SHIFT; in codel_Newton_step()
118 vars->first_above_time = 0; in codel_should_drop()
123 vars->ldelay = now - skb_time_func(skb); in codel_should_drop()
125 if (unlikely(skb_len > stats->maxpacket)) in codel_should_drop()
126 stats->maxpacket = skb_len; in codel_should_drop()
128 if (codel_time_before(vars->ldelay, params->target) || in codel_should_drop()
129 *backlog <= params->mtu) { in codel_should_drop()
130 /* went below - stay below for at least interval */ in codel_should_drop()
131 vars->first_above_time = 0; in codel_should_drop()
135 if (vars->first_above_time == 0) { in codel_should_drop()
139 vars->first_above_time = now + params->interval; in codel_should_drop()
140 } else if (codel_time_after(now, vars->first_above_time)) { in codel_should_drop()
161 vars->dropping = false; in codel_dequeue()
167 if (vars->dropping) { in codel_dequeue()
169 /* sojourn time below target - leave dropping state */ in codel_dequeue()
170 vars->dropping = false; in codel_dequeue()
171 } else if (codel_time_after_eq(now, vars->drop_next)) { in codel_dequeue()
180 while (vars->dropping && in codel_dequeue()
181 codel_time_after_eq(now, vars->drop_next)) { in codel_dequeue()
182 vars->count++; /* dont care of possible wrap in codel_dequeue()
186 if (params->ecn && INET_ECN_set_ce(skb)) { in codel_dequeue()
187 stats->ecn_mark++; in codel_dequeue()
188 vars->drop_next = in codel_dequeue()
189 codel_control_law(vars->drop_next, in codel_dequeue()
190 params->interval, in codel_dequeue()
191 vars->rec_inv_sqrt); in codel_dequeue()
194 stats->drop_len += skb_len_func(skb); in codel_dequeue()
196 stats->drop_count++; in codel_dequeue()
204 vars->dropping = false; in codel_dequeue()
207 vars->drop_next = in codel_dequeue()
208 codel_control_law(vars->drop_next, in codel_dequeue()
209 params->interval, in codel_dequeue()
210 vars->rec_inv_sqrt); in codel_dequeue()
217 if (params->ecn && INET_ECN_set_ce(skb)) { in codel_dequeue()
218 stats->ecn_mark++; in codel_dequeue()
220 stats->drop_len += skb_len_func(skb); in codel_dequeue()
222 stats->drop_count++; in codel_dequeue()
229 vars->dropping = true; in codel_dequeue()
231 * assume that the drop rate that controlled the queue on the in codel_dequeue()
234 delta = vars->count - vars->lastcount; in codel_dequeue()
236 codel_time_before(now - vars->drop_next, in codel_dequeue()
237 16 * params->interval)) { in codel_dequeue()
238 vars->count = delta; in codel_dequeue()
245 vars->count = 1; in codel_dequeue()
246 vars->rec_inv_sqrt = ~0U >> REC_INV_SQRT_SHIFT; in codel_dequeue()
248 vars->lastcount = vars->count; in codel_dequeue()
249 vars->drop_next = codel_control_law(now, params->interval, in codel_dequeue()
250 vars->rec_inv_sqrt); in codel_dequeue()
253 if (skb && codel_time_after(vars->ldelay, params->ce_threshold)) { in codel_dequeue()
256 if (params->ce_threshold_mask) { in codel_dequeue()
260 (((u8)dsfield & params->ce_threshold_mask) == in codel_dequeue()
261 params->ce_threshold_selector)); in codel_dequeue()
264 stats->ce_mark++; in codel_dequeue()