Linux Audio

Check our new training course

Loading...
v3.5.6
  1/*
  2 * net/sched/sch_tbf.c	Token Bucket Filter queue.
  3 *
  4 *		This program is free software; you can redistribute it and/or
  5 *		modify it under the terms of the GNU General Public License
  6 *		as published by the Free Software Foundation; either version
  7 *		2 of the License, or (at your option) any later version.
  8 *
  9 * Authors:	Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>
 10 *		Dmitry Torokhov <dtor@mail.ru> - allow attaching inner qdiscs -
 11 *						 original idea by Martin Devera
 12 *
 13 */
 14
 15#include <linux/module.h>
 16#include <linux/types.h>
 17#include <linux/kernel.h>
 18#include <linux/string.h>
 19#include <linux/errno.h>
 20#include <linux/skbuff.h>
 21#include <net/netlink.h>
 
 22#include <net/pkt_sched.h>
 23
 24
 25/*	Simple Token Bucket Filter.
 26	=======================================
 27
 28	SOURCE.
 29	-------
 30
 31	None.
 32
 33	Description.
 34	------------
 35
 36	A data flow obeys TBF with rate R and depth B, if for any
 37	time interval t_i...t_f the number of transmitted bits
 38	does not exceed B + R*(t_f-t_i).
 39
 40	Packetized version of this definition:
 41	The sequence of packets of sizes s_i served at moments t_i
 42	obeys TBF, if for any i<=k:
 43
 44	s_i+....+s_k <= B + R*(t_k - t_i)
 45
 46	Algorithm.
 47	----------
 48
 49	Let N(t_i) be B/R initially and N(t) grow continuously with time as:
 50
 51	N(t+delta) = min{B/R, N(t) + delta}
 52
 53	If the first packet in queue has length S, it may be
 54	transmitted only at the time t_* when S/R <= N(t_*),
 55	and in this case N(t) jumps:
 56
 57	N(t_* + 0) = N(t_* - 0) - S/R.
 58
 59
 60
 61	Actually, QoS requires two TBF to be applied to a data stream.
 62	One of them controls steady state burst size, another
 63	one with rate P (peak rate) and depth M (equal to link MTU)
 64	limits bursts at a smaller time scale.
 65
 66	It is easy to see that P>R, and B>M. If P is infinity, this double
 67	TBF is equivalent to a single one.
 68
 69	When TBF works in reshaping mode, latency is estimated as:
 70
 71	lat = max ((L-B)/R, (L-M)/P)
 72
 73
 74	NOTES.
 75	------
 76
 77	If TBF throttles, it starts a watchdog timer, which will wake it up
 78	when it is ready to transmit.
 79	Note that the minimal timer resolution is 1/HZ.
 80	If no new packets arrive during this period,
 81	or if the device is not awaken by EOI for some previous packet,
 82	TBF can stop its activity for 1/HZ.
 83
 84
 85	This means, that with depth B, the maximal rate is
 86
 87	R_crit = B*HZ
 88
 89	F.e. for 10Mbit ethernet and HZ=100 the minimal allowed B is ~10Kbytes.
 90
 91	Note that the peak rate TBF is much more tough: with MTU 1500
 92	P_crit = 150Kbytes/sec. So, if you need greater peak
 93	rates, use alpha with HZ=1000 :-)
 94
 95	With classful TBF, limit is just kept for backwards compatibility.
 96	It is passed to the default bfifo qdisc - if the inner qdisc is
 97	changed the limit is not effective anymore.
 98*/
 99
100struct tbf_sched_data {
101/* Parameters */
102	u32		limit;		/* Maximal length of backlog: bytes */
103	u32		buffer;		/* Token bucket depth/rate: MUST BE >= MTU/B */
104	u32		mtu;
105	u32		max_size;
106	struct qdisc_rate_table	*R_tab;
107	struct qdisc_rate_table	*P_tab;
 
 
108
109/* Variables */
110	long	tokens;			/* Current number of B tokens */
111	long	ptokens;		/* Current number of P tokens */
112	psched_time_t	t_c;		/* Time check-point */
113	struct Qdisc	*qdisc;		/* Inner qdisc, default - bfifo queue */
114	struct qdisc_watchdog watchdog;	/* Watchdog timer */
115};
116
117#define L2T(q, L)   qdisc_l2t((q)->R_tab, L)
118#define L2T_P(q, L) qdisc_l2t((q)->P_tab, L)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
119
120static int tbf_enqueue(struct sk_buff *skb, struct Qdisc *sch)
121{
122	struct tbf_sched_data *q = qdisc_priv(sch);
123	int ret;
124
125	if (qdisc_pkt_len(skb) > q->max_size)
 
 
126		return qdisc_reshape_fail(skb, sch);
127
128	ret = qdisc_enqueue(skb, q->qdisc);
129	if (ret != NET_XMIT_SUCCESS) {
130		if (net_xmit_drop_count(ret))
131			sch->qstats.drops++;
132		return ret;
133	}
134
135	sch->q.qlen++;
136	return NET_XMIT_SUCCESS;
137}
138
139static unsigned int tbf_drop(struct Qdisc *sch)
140{
141	struct tbf_sched_data *q = qdisc_priv(sch);
142	unsigned int len = 0;
143
144	if (q->qdisc->ops->drop && (len = q->qdisc->ops->drop(q->qdisc)) != 0) {
145		sch->q.qlen--;
146		sch->qstats.drops++;
147	}
148	return len;
149}
150
 
 
 
 
 
151static struct sk_buff *tbf_dequeue(struct Qdisc *sch)
152{
153	struct tbf_sched_data *q = qdisc_priv(sch);
154	struct sk_buff *skb;
155
156	skb = q->qdisc->ops->peek(q->qdisc);
157
158	if (skb) {
159		psched_time_t now;
160		long toks;
161		long ptoks = 0;
162		unsigned int len = qdisc_pkt_len(skb);
163
164		now = psched_get_time();
165		toks = psched_tdiff_bounded(now, q->t_c, q->buffer);
166
167		if (q->P_tab) {
168			ptoks = toks + q->ptokens;
169			if (ptoks > (long)q->mtu)
170				ptoks = q->mtu;
171			ptoks -= L2T_P(q, len);
172		}
173		toks += q->tokens;
174		if (toks > (long)q->buffer)
175			toks = q->buffer;
176		toks -= L2T(q, len);
177
178		if ((toks|ptoks) >= 0) {
179			skb = qdisc_dequeue_peeked(q->qdisc);
180			if (unlikely(!skb))
181				return NULL;
182
183			q->t_c = now;
184			q->tokens = toks;
185			q->ptokens = ptoks;
186			sch->q.qlen--;
187			qdisc_unthrottled(sch);
188			qdisc_bstats_update(sch, skb);
189			return skb;
190		}
191
192		qdisc_watchdog_schedule(&q->watchdog,
193					now + max_t(long, -toks, -ptoks));
194
195		/* Maybe we have a shorter packet in the queue,
196		   which can be sent now. It sounds cool,
197		   but, however, this is wrong in principle.
198		   We MUST NOT reorder packets under these circumstances.
199
200		   Really, if we split the flow into independent
201		   subflows, it would be a very good solution.
202		   This is the main idea of all FQ algorithms
203		   (cf. CSZ, HPFQ, HFSC)
204		 */
205
206		sch->qstats.overlimits++;
207	}
208	return NULL;
209}
210
211static void tbf_reset(struct Qdisc *sch)
212{
213	struct tbf_sched_data *q = qdisc_priv(sch);
214
215	qdisc_reset(q->qdisc);
216	sch->q.qlen = 0;
217	q->t_c = psched_get_time();
218	q->tokens = q->buffer;
219	q->ptokens = q->mtu;
220	qdisc_watchdog_cancel(&q->watchdog);
221}
222
223static const struct nla_policy tbf_policy[TCA_TBF_MAX + 1] = {
224	[TCA_TBF_PARMS]	= { .len = sizeof(struct tc_tbf_qopt) },
225	[TCA_TBF_RTAB]	= { .type = NLA_BINARY, .len = TC_RTAB_SIZE },
226	[TCA_TBF_PTAB]	= { .type = NLA_BINARY, .len = TC_RTAB_SIZE },
 
 
 
 
227};
228
229static int tbf_change(struct Qdisc *sch, struct nlattr *opt)
230{
231	int err;
232	struct tbf_sched_data *q = qdisc_priv(sch);
233	struct nlattr *tb[TCA_TBF_PTAB + 1];
234	struct tc_tbf_qopt *qopt;
235	struct qdisc_rate_table *rtab = NULL;
236	struct qdisc_rate_table *ptab = NULL;
237	struct Qdisc *child = NULL;
238	int max_size, n;
 
 
 
 
239
240	err = nla_parse_nested(tb, TCA_TBF_PTAB, opt, tbf_policy);
241	if (err < 0)
242		return err;
243
244	err = -EINVAL;
245	if (tb[TCA_TBF_PARMS] == NULL)
246		goto done;
247
248	qopt = nla_data(tb[TCA_TBF_PARMS]);
249	rtab = qdisc_get_rtab(&qopt->rate, tb[TCA_TBF_RTAB]);
250	if (rtab == NULL)
251		goto done;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
252
253	if (qopt->peakrate.rate) {
254		if (qopt->peakrate.rate > qopt->rate.rate)
255			ptab = qdisc_get_rtab(&qopt->peakrate, tb[TCA_TBF_PTAB]);
256		if (ptab == NULL)
 
 
 
 
257			goto done;
258	}
259
260	for (n = 0; n < 256; n++)
261		if (rtab->data[n] > qopt->buffer)
262			break;
263	max_size = (n << qopt->rate.cell_log) - 1;
264	if (ptab) {
265		int size;
266
267		for (n = 0; n < 256; n++)
268			if (ptab->data[n] > qopt->mtu)
269				break;
270		size = (n << qopt->peakrate.cell_log) - 1;
271		if (size < max_size)
272			max_size = size;
273	}
274	if (max_size < 0)
 
 
 
 
 
 
 
275		goto done;
 
276
277	if (q->qdisc != &noop_qdisc) {
278		err = fifo_set_limit(q->qdisc, qopt->limit);
279		if (err)
280			goto done;
281	} else if (qopt->limit > 0) {
282		child = fifo_create_dflt(sch, &bfifo_qdisc_ops, qopt->limit);
283		if (IS_ERR(child)) {
284			err = PTR_ERR(child);
285			goto done;
286		}
287	}
288
289	sch_tree_lock(sch);
290	if (child) {
291		qdisc_tree_decrease_qlen(q->qdisc, q->qdisc->q.qlen);
292		qdisc_destroy(q->qdisc);
293		q->qdisc = child;
294	}
295	q->limit = qopt->limit;
296	q->mtu = qopt->mtu;
 
 
 
297	q->max_size = max_size;
298	q->buffer = qopt->buffer;
 
 
 
299	q->tokens = q->buffer;
300	q->ptokens = q->mtu;
301
302	swap(q->R_tab, rtab);
303	swap(q->P_tab, ptab);
304
305	sch_tree_unlock(sch);
306	err = 0;
307done:
308	if (rtab)
309		qdisc_put_rtab(rtab);
310	if (ptab)
311		qdisc_put_rtab(ptab);
312	return err;
313}
314
315static int tbf_init(struct Qdisc *sch, struct nlattr *opt)
316{
317	struct tbf_sched_data *q = qdisc_priv(sch);
318
319	if (opt == NULL)
320		return -EINVAL;
321
322	q->t_c = psched_get_time();
323	qdisc_watchdog_init(&q->watchdog, sch);
324	q->qdisc = &noop_qdisc;
325
326	return tbf_change(sch, opt);
327}
328
329static void tbf_destroy(struct Qdisc *sch)
330{
331	struct tbf_sched_data *q = qdisc_priv(sch);
332
333	qdisc_watchdog_cancel(&q->watchdog);
334
335	if (q->P_tab)
336		qdisc_put_rtab(q->P_tab);
337	if (q->R_tab)
338		qdisc_put_rtab(q->R_tab);
339
340	qdisc_destroy(q->qdisc);
341}
342
343static int tbf_dump(struct Qdisc *sch, struct sk_buff *skb)
344{
345	struct tbf_sched_data *q = qdisc_priv(sch);
346	struct nlattr *nest;
347	struct tc_tbf_qopt opt;
348
349	sch->qstats.backlog = q->qdisc->qstats.backlog;
350	nest = nla_nest_start(skb, TCA_OPTIONS);
351	if (nest == NULL)
352		goto nla_put_failure;
353
354	opt.limit = q->limit;
355	opt.rate = q->R_tab->rate;
356	if (q->P_tab)
357		opt.peakrate = q->P_tab->rate;
358	else
359		memset(&opt.peakrate, 0, sizeof(opt.peakrate));
360	opt.mtu = q->mtu;
361	opt.buffer = q->buffer;
362	if (nla_put(skb, TCA_TBF_PARMS, sizeof(opt), &opt))
363		goto nla_put_failure;
 
 
 
 
 
 
 
364
365	nla_nest_end(skb, nest);
366	return skb->len;
367
368nla_put_failure:
369	nla_nest_cancel(skb, nest);
370	return -1;
371}
372
373static int tbf_dump_class(struct Qdisc *sch, unsigned long cl,
374			  struct sk_buff *skb, struct tcmsg *tcm)
375{
376	struct tbf_sched_data *q = qdisc_priv(sch);
377
378	tcm->tcm_handle |= TC_H_MIN(1);
379	tcm->tcm_info = q->qdisc->handle;
380
381	return 0;
382}
383
384static int tbf_graft(struct Qdisc *sch, unsigned long arg, struct Qdisc *new,
385		     struct Qdisc **old)
386{
387	struct tbf_sched_data *q = qdisc_priv(sch);
388
389	if (new == NULL)
390		new = &noop_qdisc;
391
392	sch_tree_lock(sch);
393	*old = q->qdisc;
394	q->qdisc = new;
395	qdisc_tree_decrease_qlen(*old, (*old)->q.qlen);
396	qdisc_reset(*old);
397	sch_tree_unlock(sch);
398
399	return 0;
400}
401
402static struct Qdisc *tbf_leaf(struct Qdisc *sch, unsigned long arg)
403{
404	struct tbf_sched_data *q = qdisc_priv(sch);
405	return q->qdisc;
406}
407
408static unsigned long tbf_get(struct Qdisc *sch, u32 classid)
409{
410	return 1;
411}
412
413static void tbf_put(struct Qdisc *sch, unsigned long arg)
414{
415}
416
417static void tbf_walk(struct Qdisc *sch, struct qdisc_walker *walker)
418{
419	if (!walker->stop) {
420		if (walker->count >= walker->skip)
421			if (walker->fn(sch, 1, walker) < 0) {
422				walker->stop = 1;
423				return;
424			}
425		walker->count++;
426	}
427}
428
429static const struct Qdisc_class_ops tbf_class_ops = {
430	.graft		=	tbf_graft,
431	.leaf		=	tbf_leaf,
432	.get		=	tbf_get,
433	.put		=	tbf_put,
434	.walk		=	tbf_walk,
435	.dump		=	tbf_dump_class,
436};
437
438static struct Qdisc_ops tbf_qdisc_ops __read_mostly = {
439	.next		=	NULL,
440	.cl_ops		=	&tbf_class_ops,
441	.id		=	"tbf",
442	.priv_size	=	sizeof(struct tbf_sched_data),
443	.enqueue	=	tbf_enqueue,
444	.dequeue	=	tbf_dequeue,
445	.peek		=	qdisc_peek_dequeued,
446	.drop		=	tbf_drop,
447	.init		=	tbf_init,
448	.reset		=	tbf_reset,
449	.destroy	=	tbf_destroy,
450	.change		=	tbf_change,
451	.dump		=	tbf_dump,
452	.owner		=	THIS_MODULE,
453};
454
455static int __init tbf_module_init(void)
456{
457	return register_qdisc(&tbf_qdisc_ops);
458}
459
460static void __exit tbf_module_exit(void)
461{
462	unregister_qdisc(&tbf_qdisc_ops);
463}
464module_init(tbf_module_init)
465module_exit(tbf_module_exit)
466MODULE_LICENSE("GPL");
v3.15
  1/*
  2 * net/sched/sch_tbf.c	Token Bucket Filter queue.
  3 *
  4 *		This program is free software; you can redistribute it and/or
  5 *		modify it under the terms of the GNU General Public License
  6 *		as published by the Free Software Foundation; either version
  7 *		2 of the License, or (at your option) any later version.
  8 *
  9 * Authors:	Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>
 10 *		Dmitry Torokhov <dtor@mail.ru> - allow attaching inner qdiscs -
 11 *						 original idea by Martin Devera
 12 *
 13 */
 14
 15#include <linux/module.h>
 16#include <linux/types.h>
 17#include <linux/kernel.h>
 18#include <linux/string.h>
 19#include <linux/errno.h>
 20#include <linux/skbuff.h>
 21#include <net/netlink.h>
 22#include <net/sch_generic.h>
 23#include <net/pkt_sched.h>
 24
 25
 26/*	Simple Token Bucket Filter.
 27	=======================================
 28
 29	SOURCE.
 30	-------
 31
 32	None.
 33
 34	Description.
 35	------------
 36
 37	A data flow obeys TBF with rate R and depth B, if for any
 38	time interval t_i...t_f the number of transmitted bits
 39	does not exceed B + R*(t_f-t_i).
 40
 41	Packetized version of this definition:
 42	The sequence of packets of sizes s_i served at moments t_i
 43	obeys TBF, if for any i<=k:
 44
 45	s_i+....+s_k <= B + R*(t_k - t_i)
 46
 47	Algorithm.
 48	----------
 49
 50	Let N(t_i) be B/R initially and N(t) grow continuously with time as:
 51
 52	N(t+delta) = min{B/R, N(t) + delta}
 53
 54	If the first packet in queue has length S, it may be
 55	transmitted only at the time t_* when S/R <= N(t_*),
 56	and in this case N(t) jumps:
 57
 58	N(t_* + 0) = N(t_* - 0) - S/R.
 59
 60
 61
 62	Actually, QoS requires two TBF to be applied to a data stream.
 63	One of them controls steady state burst size, another
 64	one with rate P (peak rate) and depth M (equal to link MTU)
 65	limits bursts at a smaller time scale.
 66
 67	It is easy to see that P>R, and B>M. If P is infinity, this double
 68	TBF is equivalent to a single one.
 69
 70	When TBF works in reshaping mode, latency is estimated as:
 71
 72	lat = max ((L-B)/R, (L-M)/P)
 73
 74
 75	NOTES.
 76	------
 77
 78	If TBF throttles, it starts a watchdog timer, which will wake it up
 79	when it is ready to transmit.
 80	Note that the minimal timer resolution is 1/HZ.
 81	If no new packets arrive during this period,
 82	or if the device is not awaken by EOI for some previous packet,
 83	TBF can stop its activity for 1/HZ.
 84
 85
 86	This means, that with depth B, the maximal rate is
 87
 88	R_crit = B*HZ
 89
 90	F.e. for 10Mbit ethernet and HZ=100 the minimal allowed B is ~10Kbytes.
 91
 92	Note that the peak rate TBF is much more tough: with MTU 1500
 93	P_crit = 150Kbytes/sec. So, if you need greater peak
 94	rates, use alpha with HZ=1000 :-)
 95
 96	With classful TBF, limit is just kept for backwards compatibility.
 97	It is passed to the default bfifo qdisc - if the inner qdisc is
 98	changed the limit is not effective anymore.
 99*/
100
101struct tbf_sched_data {
102/* Parameters */
103	u32		limit;		/* Maximal length of backlog: bytes */
 
 
104	u32		max_size;
105	s64		buffer;		/* Token bucket depth/rate: MUST BE >= MTU/B */
106	s64		mtu;
107	struct psched_ratecfg rate;
108	struct psched_ratecfg peak;
109
110/* Variables */
111	s64	tokens;			/* Current number of B tokens */
112	s64	ptokens;		/* Current number of P tokens */
113	s64	t_c;			/* Time check-point */
114	struct Qdisc	*qdisc;		/* Inner qdisc, default - bfifo queue */
115	struct qdisc_watchdog watchdog;	/* Watchdog timer */
116};
117
118
119/* Time to Length, convert time in ns to length in bytes
120 * to determinate how many bytes can be sent in given time.
121 */
122static u64 psched_ns_t2l(const struct psched_ratecfg *r,
123			 u64 time_in_ns)
124{
125	/* The formula is :
126	 * len = (time_in_ns * r->rate_bytes_ps) / NSEC_PER_SEC
127	 */
128	u64 len = time_in_ns * r->rate_bytes_ps;
129
130	do_div(len, NSEC_PER_SEC);
131
132	if (unlikely(r->linklayer == TC_LINKLAYER_ATM)) {
133		do_div(len, 53);
134		len = len * 48;
135	}
136
137	if (len > r->overhead)
138		len -= r->overhead;
139	else
140		len = 0;
141
142	return len;
143}
144
145/*
146 * Return length of individual segments of a gso packet,
147 * including all headers (MAC, IP, TCP/UDP)
148 */
149static unsigned int skb_gso_mac_seglen(const struct sk_buff *skb)
150{
151	unsigned int hdr_len = skb_transport_header(skb) - skb_mac_header(skb);
152	return hdr_len + skb_gso_transport_seglen(skb);
153}
154
155/* GSO packet is too big, segment it so that tbf can transmit
156 * each segment in time
157 */
158static int tbf_segment(struct sk_buff *skb, struct Qdisc *sch)
159{
160	struct tbf_sched_data *q = qdisc_priv(sch);
161	struct sk_buff *segs, *nskb;
162	netdev_features_t features = netif_skb_features(skb);
163	int ret, nb;
164
165	segs = skb_gso_segment(skb, features & ~NETIF_F_GSO_MASK);
166
167	if (IS_ERR_OR_NULL(segs))
168		return qdisc_reshape_fail(skb, sch);
169
170	nb = 0;
171	while (segs) {
172		nskb = segs->next;
173		segs->next = NULL;
174		qdisc_skb_cb(segs)->pkt_len = segs->len;
175		ret = qdisc_enqueue(segs, q->qdisc);
176		if (ret != NET_XMIT_SUCCESS) {
177			if (net_xmit_drop_count(ret))
178				sch->qstats.drops++;
179		} else {
180			nb++;
181		}
182		segs = nskb;
183	}
184	sch->q.qlen += nb;
185	if (nb > 1)
186		qdisc_tree_decrease_qlen(sch, 1 - nb);
187	consume_skb(skb);
188	return nb > 0 ? NET_XMIT_SUCCESS : NET_XMIT_DROP;
189}
190
191static int tbf_enqueue(struct sk_buff *skb, struct Qdisc *sch)
192{
193	struct tbf_sched_data *q = qdisc_priv(sch);
194	int ret;
195
196	if (qdisc_pkt_len(skb) > q->max_size) {
197		if (skb_is_gso(skb) && skb_gso_mac_seglen(skb) <= q->max_size)
198			return tbf_segment(skb, sch);
199		return qdisc_reshape_fail(skb, sch);
200	}
201	ret = qdisc_enqueue(skb, q->qdisc);
202	if (ret != NET_XMIT_SUCCESS) {
203		if (net_xmit_drop_count(ret))
204			sch->qstats.drops++;
205		return ret;
206	}
207
208	sch->q.qlen++;
209	return NET_XMIT_SUCCESS;
210}
211
212static unsigned int tbf_drop(struct Qdisc *sch)
213{
214	struct tbf_sched_data *q = qdisc_priv(sch);
215	unsigned int len = 0;
216
217	if (q->qdisc->ops->drop && (len = q->qdisc->ops->drop(q->qdisc)) != 0) {
218		sch->q.qlen--;
219		sch->qstats.drops++;
220	}
221	return len;
222}
223
224static bool tbf_peak_present(const struct tbf_sched_data *q)
225{
226	return q->peak.rate_bytes_ps;
227}
228
229static struct sk_buff *tbf_dequeue(struct Qdisc *sch)
230{
231	struct tbf_sched_data *q = qdisc_priv(sch);
232	struct sk_buff *skb;
233
234	skb = q->qdisc->ops->peek(q->qdisc);
235
236	if (skb) {
237		s64 now;
238		s64 toks;
239		s64 ptoks = 0;
240		unsigned int len = qdisc_pkt_len(skb);
241
242		now = ktime_to_ns(ktime_get());
243		toks = min_t(s64, now - q->t_c, q->buffer);
244
245		if (tbf_peak_present(q)) {
246			ptoks = toks + q->ptokens;
247			if (ptoks > q->mtu)
248				ptoks = q->mtu;
249			ptoks -= (s64) psched_l2t_ns(&q->peak, len);
250		}
251		toks += q->tokens;
252		if (toks > q->buffer)
253			toks = q->buffer;
254		toks -= (s64) psched_l2t_ns(&q->rate, len);
255
256		if ((toks|ptoks) >= 0) {
257			skb = qdisc_dequeue_peeked(q->qdisc);
258			if (unlikely(!skb))
259				return NULL;
260
261			q->t_c = now;
262			q->tokens = toks;
263			q->ptokens = ptoks;
264			sch->q.qlen--;
265			qdisc_unthrottled(sch);
266			qdisc_bstats_update(sch, skb);
267			return skb;
268		}
269
270		qdisc_watchdog_schedule_ns(&q->watchdog,
271					   now + max_t(long, -toks, -ptoks));
272
273		/* Maybe we have a shorter packet in the queue,
274		   which can be sent now. It sounds cool,
275		   but, however, this is wrong in principle.
276		   We MUST NOT reorder packets under these circumstances.
277
278		   Really, if we split the flow into independent
279		   subflows, it would be a very good solution.
280		   This is the main idea of all FQ algorithms
281		   (cf. CSZ, HPFQ, HFSC)
282		 */
283
284		sch->qstats.overlimits++;
285	}
286	return NULL;
287}
288
289static void tbf_reset(struct Qdisc *sch)
290{
291	struct tbf_sched_data *q = qdisc_priv(sch);
292
293	qdisc_reset(q->qdisc);
294	sch->q.qlen = 0;
295	q->t_c = ktime_to_ns(ktime_get());
296	q->tokens = q->buffer;
297	q->ptokens = q->mtu;
298	qdisc_watchdog_cancel(&q->watchdog);
299}
300
301static const struct nla_policy tbf_policy[TCA_TBF_MAX + 1] = {
302	[TCA_TBF_PARMS]	= { .len = sizeof(struct tc_tbf_qopt) },
303	[TCA_TBF_RTAB]	= { .type = NLA_BINARY, .len = TC_RTAB_SIZE },
304	[TCA_TBF_PTAB]	= { .type = NLA_BINARY, .len = TC_RTAB_SIZE },
305	[TCA_TBF_RATE64]	= { .type = NLA_U64 },
306	[TCA_TBF_PRATE64]	= { .type = NLA_U64 },
307	[TCA_TBF_BURST] = { .type = NLA_U32 },
308	[TCA_TBF_PBURST] = { .type = NLA_U32 },
309};
310
311static int tbf_change(struct Qdisc *sch, struct nlattr *opt)
312{
313	int err;
314	struct tbf_sched_data *q = qdisc_priv(sch);
315	struct nlattr *tb[TCA_TBF_MAX + 1];
316	struct tc_tbf_qopt *qopt;
 
 
317	struct Qdisc *child = NULL;
318	struct psched_ratecfg rate;
319	struct psched_ratecfg peak;
320	u64 max_size;
321	s64 buffer, mtu;
322	u64 rate64 = 0, prate64 = 0;
323
324	err = nla_parse_nested(tb, TCA_TBF_MAX, opt, tbf_policy);
325	if (err < 0)
326		return err;
327
328	err = -EINVAL;
329	if (tb[TCA_TBF_PARMS] == NULL)
330		goto done;
331
332	qopt = nla_data(tb[TCA_TBF_PARMS]);
333	if (qopt->rate.linklayer == TC_LINKLAYER_UNAWARE)
334		qdisc_put_rtab(qdisc_get_rtab(&qopt->rate,
335					      tb[TCA_TBF_RTAB]));
336
337	if (qopt->peakrate.linklayer == TC_LINKLAYER_UNAWARE)
338			qdisc_put_rtab(qdisc_get_rtab(&qopt->peakrate,
339						      tb[TCA_TBF_PTAB]));
340
341	buffer = min_t(u64, PSCHED_TICKS2NS(qopt->buffer), ~0U);
342	mtu = min_t(u64, PSCHED_TICKS2NS(qopt->mtu), ~0U);
343
344	if (tb[TCA_TBF_RATE64])
345		rate64 = nla_get_u64(tb[TCA_TBF_RATE64]);
346	psched_ratecfg_precompute(&rate, &qopt->rate, rate64);
347
348	if (tb[TCA_TBF_BURST]) {
349		max_size = nla_get_u32(tb[TCA_TBF_BURST]);
350		buffer = psched_l2t_ns(&rate, max_size);
351	} else {
352		max_size = min_t(u64, psched_ns_t2l(&rate, buffer), ~0U);
353	}
354
355	if (qopt->peakrate.rate) {
356		if (tb[TCA_TBF_PRATE64])
357			prate64 = nla_get_u64(tb[TCA_TBF_PRATE64]);
358		psched_ratecfg_precompute(&peak, &qopt->peakrate, prate64);
359		if (peak.rate_bytes_ps <= rate.rate_bytes_ps) {
360			pr_warn_ratelimited("sch_tbf: peakrate %llu is lower than or equals to rate %llu !\n",
361					peak.rate_bytes_ps, rate.rate_bytes_ps);
362			err = -EINVAL;
363			goto done;
364		}
365
366		if (tb[TCA_TBF_PBURST]) {
367			u32 pburst = nla_get_u32(tb[TCA_TBF_PBURST]);
368			max_size = min_t(u32, max_size, pburst);
369			mtu = psched_l2t_ns(&peak, pburst);
370		} else {
371			max_size = min_t(u64, max_size, psched_ns_t2l(&peak, mtu));
372		}
373	} else {
374		memset(&peak, 0, sizeof(peak));
 
 
 
 
375	}
376
377	if (max_size < psched_mtu(qdisc_dev(sch)))
378		pr_warn_ratelimited("sch_tbf: burst %llu is lower than device %s mtu (%u) !\n",
379				    max_size, qdisc_dev(sch)->name,
380				    psched_mtu(qdisc_dev(sch)));
381
382	if (!max_size) {
383		err = -EINVAL;
384		goto done;
385	}
386
387	if (q->qdisc != &noop_qdisc) {
388		err = fifo_set_limit(q->qdisc, qopt->limit);
389		if (err)
390			goto done;
391	} else if (qopt->limit > 0) {
392		child = fifo_create_dflt(sch, &bfifo_qdisc_ops, qopt->limit);
393		if (IS_ERR(child)) {
394			err = PTR_ERR(child);
395			goto done;
396		}
397	}
398
399	sch_tree_lock(sch);
400	if (child) {
401		qdisc_tree_decrease_qlen(q->qdisc, q->qdisc->q.qlen);
402		qdisc_destroy(q->qdisc);
403		q->qdisc = child;
404	}
405	q->limit = qopt->limit;
406	if (tb[TCA_TBF_PBURST])
407		q->mtu = mtu;
408	else
409		q->mtu = PSCHED_TICKS2NS(qopt->mtu);
410	q->max_size = max_size;
411	if (tb[TCA_TBF_BURST])
412		q->buffer = buffer;
413	else
414		q->buffer = PSCHED_TICKS2NS(qopt->buffer);
415	q->tokens = q->buffer;
416	q->ptokens = q->mtu;
417
418	memcpy(&q->rate, &rate, sizeof(struct psched_ratecfg));
419	memcpy(&q->peak, &peak, sizeof(struct psched_ratecfg));
420
421	sch_tree_unlock(sch);
422	err = 0;
423done:
 
 
 
 
424	return err;
425}
426
427static int tbf_init(struct Qdisc *sch, struct nlattr *opt)
428{
429	struct tbf_sched_data *q = qdisc_priv(sch);
430
431	if (opt == NULL)
432		return -EINVAL;
433
434	q->t_c = ktime_to_ns(ktime_get());
435	qdisc_watchdog_init(&q->watchdog, sch);
436	q->qdisc = &noop_qdisc;
437
438	return tbf_change(sch, opt);
439}
440
441static void tbf_destroy(struct Qdisc *sch)
442{
443	struct tbf_sched_data *q = qdisc_priv(sch);
444
445	qdisc_watchdog_cancel(&q->watchdog);
 
 
 
 
 
 
446	qdisc_destroy(q->qdisc);
447}
448
449static int tbf_dump(struct Qdisc *sch, struct sk_buff *skb)
450{
451	struct tbf_sched_data *q = qdisc_priv(sch);
452	struct nlattr *nest;
453	struct tc_tbf_qopt opt;
454
455	sch->qstats.backlog = q->qdisc->qstats.backlog;
456	nest = nla_nest_start(skb, TCA_OPTIONS);
457	if (nest == NULL)
458		goto nla_put_failure;
459
460	opt.limit = q->limit;
461	psched_ratecfg_getrate(&opt.rate, &q->rate);
462	if (tbf_peak_present(q))
463		psched_ratecfg_getrate(&opt.peakrate, &q->peak);
464	else
465		memset(&opt.peakrate, 0, sizeof(opt.peakrate));
466	opt.mtu = PSCHED_NS2TICKS(q->mtu);
467	opt.buffer = PSCHED_NS2TICKS(q->buffer);
468	if (nla_put(skb, TCA_TBF_PARMS, sizeof(opt), &opt))
469		goto nla_put_failure;
470	if (q->rate.rate_bytes_ps >= (1ULL << 32) &&
471	    nla_put_u64(skb, TCA_TBF_RATE64, q->rate.rate_bytes_ps))
472		goto nla_put_failure;
473	if (tbf_peak_present(q) &&
474	    q->peak.rate_bytes_ps >= (1ULL << 32) &&
475	    nla_put_u64(skb, TCA_TBF_PRATE64, q->peak.rate_bytes_ps))
476		goto nla_put_failure;
477
478	return nla_nest_end(skb, nest);
 
479
480nla_put_failure:
481	nla_nest_cancel(skb, nest);
482	return -1;
483}
484
485static int tbf_dump_class(struct Qdisc *sch, unsigned long cl,
486			  struct sk_buff *skb, struct tcmsg *tcm)
487{
488	struct tbf_sched_data *q = qdisc_priv(sch);
489
490	tcm->tcm_handle |= TC_H_MIN(1);
491	tcm->tcm_info = q->qdisc->handle;
492
493	return 0;
494}
495
496static int tbf_graft(struct Qdisc *sch, unsigned long arg, struct Qdisc *new,
497		     struct Qdisc **old)
498{
499	struct tbf_sched_data *q = qdisc_priv(sch);
500
501	if (new == NULL)
502		new = &noop_qdisc;
503
504	sch_tree_lock(sch);
505	*old = q->qdisc;
506	q->qdisc = new;
507	qdisc_tree_decrease_qlen(*old, (*old)->q.qlen);
508	qdisc_reset(*old);
509	sch_tree_unlock(sch);
510
511	return 0;
512}
513
514static struct Qdisc *tbf_leaf(struct Qdisc *sch, unsigned long arg)
515{
516	struct tbf_sched_data *q = qdisc_priv(sch);
517	return q->qdisc;
518}
519
520static unsigned long tbf_get(struct Qdisc *sch, u32 classid)
521{
522	return 1;
523}
524
525static void tbf_put(struct Qdisc *sch, unsigned long arg)
526{
527}
528
529static void tbf_walk(struct Qdisc *sch, struct qdisc_walker *walker)
530{
531	if (!walker->stop) {
532		if (walker->count >= walker->skip)
533			if (walker->fn(sch, 1, walker) < 0) {
534				walker->stop = 1;
535				return;
536			}
537		walker->count++;
538	}
539}
540
541static const struct Qdisc_class_ops tbf_class_ops = {
542	.graft		=	tbf_graft,
543	.leaf		=	tbf_leaf,
544	.get		=	tbf_get,
545	.put		=	tbf_put,
546	.walk		=	tbf_walk,
547	.dump		=	tbf_dump_class,
548};
549
550static struct Qdisc_ops tbf_qdisc_ops __read_mostly = {
551	.next		=	NULL,
552	.cl_ops		=	&tbf_class_ops,
553	.id		=	"tbf",
554	.priv_size	=	sizeof(struct tbf_sched_data),
555	.enqueue	=	tbf_enqueue,
556	.dequeue	=	tbf_dequeue,
557	.peek		=	qdisc_peek_dequeued,
558	.drop		=	tbf_drop,
559	.init		=	tbf_init,
560	.reset		=	tbf_reset,
561	.destroy	=	tbf_destroy,
562	.change		=	tbf_change,
563	.dump		=	tbf_dump,
564	.owner		=	THIS_MODULE,
565};
566
567static int __init tbf_module_init(void)
568{
569	return register_qdisc(&tbf_qdisc_ops);
570}
571
572static void __exit tbf_module_exit(void)
573{
574	unregister_qdisc(&tbf_qdisc_ops);
575}
576module_init(tbf_module_init)
577module_exit(tbf_module_exit)
578MODULE_LICENSE("GPL");