patch-2.4.26 linux-2.4.26/net/sched/sch_tbf.c
Next file: linux-2.4.26/net/sctp/Config.in
Previous file: linux-2.4.26/net/sched/sch_red.c
Back to the patch index
Back to the overall index
- Lines: 235
- Date:
2004-04-14 06:05:41.000000000 -0700
- Orig file:
linux-2.4.25/net/sched/sch_tbf.c
- Orig date:
2004-02-18 05:36:32.000000000 -0800
diff -urN linux-2.4.25/net/sched/sch_tbf.c linux-2.4.26/net/sched/sch_tbf.c
@@ -62,7 +62,7 @@
Algorithm.
----------
-
+
Let N(t_i) be B/R initially and N(t) grow continuously with time as:
N(t+delta) = min{B/R, N(t) + delta}
@@ -146,15 +146,15 @@
if (sch->reshape_fail == NULL || sch->reshape_fail(skb, sch))
#endif
kfree_skb(skb);
-
+
return NET_XMIT_DROP;
}
-
+
if ((ret = q->qdisc->enqueue(skb, q->qdisc)) != 0) {
sch->stats.drops++;
return ret;
- }
-
+ }
+
sch->q.qlen++;
sch->stats.bytes += skb->len;
sch->stats.packets++;
@@ -165,10 +165,10 @@
{
struct tbf_sched_data *q = (struct tbf_sched_data *)sch->data;
int ret;
-
+
if ((ret = q->qdisc->ops->requeue(skb, q->qdisc)) == 0)
- sch->q.qlen++;
-
+ sch->q.qlen++;
+
return ret;
}
@@ -176,7 +176,7 @@
{
struct tbf_sched_data *q = (struct tbf_sched_data *)sch->data;
unsigned int len;
-
+
if ((len = q->qdisc->ops->drop(q->qdisc)) != 0) {
sch->q.qlen--;
sch->stats.drops++;
@@ -196,7 +196,7 @@
{
struct tbf_sched_data *q = (struct tbf_sched_data *)sch->data;
struct sk_buff *skb;
-
+
skb = q->qdisc->dequeue(q->qdisc);
if (skb) {
@@ -204,7 +204,7 @@
long toks;
long ptoks = 0;
unsigned int len = skb->len;
-
+
PSCHED_GET_TIME(now);
toks = PSCHED_TDIFF_SAFE(now, q->t_c, q->buffer, 0);
@@ -248,13 +248,13 @@
This is the main idea of all FQ algorithms
(cf. CSZ, HPFQ, HFSC)
*/
-
+
if (q->qdisc->ops->requeue(skb, q->qdisc) != NET_XMIT_SUCCESS) {
- /* When requeue fails skb is dropped */
+ /* When requeue fails skb is dropped */
sch->q.qlen--;
sch->stats.drops++;
- }
-
+ }
+
sch->flags |= TCQ_F_THROTTLED;
sch->stats.overlimits++;
}
@@ -279,24 +279,24 @@
struct Qdisc *q = qdisc_create_dflt(dev, &bfifo_qdisc_ops);
struct rtattr *rta;
int ret;
-
+
if (q) {
rta = kmalloc(RTA_LENGTH(sizeof(struct tc_fifo_qopt)), GFP_KERNEL);
if (rta) {
rta->rta_type = RTM_NEWQDISC;
- rta->rta_len = RTA_LENGTH(sizeof(struct tc_fifo_qopt));
+ rta->rta_len = RTA_LENGTH(sizeof(struct tc_fifo_qopt));
((struct tc_fifo_qopt *)RTA_DATA(rta))->limit = limit;
-
+
ret = q->ops->change(q, rta);
kfree(rta);
-
+
if (ret == 0)
return q;
}
qdisc_destroy(q);
}
- return NULL;
+ return NULL;
}
static int tbf_change(struct Qdisc* sch, struct rtattr *opt)
@@ -340,7 +340,7 @@
}
if (max_size < 0)
goto done;
-
+
if (q->qdisc == &noop_qdisc) {
if ((child = tbf_create_dflt_qdisc(sch->dev, qopt->limit)) == NULL)
goto done;
@@ -370,19 +370,19 @@
{
int err;
struct tbf_sched_data *q = (struct tbf_sched_data *)sch->data;
-
+
if (opt == NULL)
return -EINVAL;
-
+
MOD_INC_USE_COUNT;
-
+
PSCHED_GET_TIME(q->t_c);
init_timer(&q->wd_timer);
q->wd_timer.function = tbf_watchdog;
q->wd_timer.data = (unsigned long)sch;
q->qdisc = &noop_qdisc;
-
+
if ((err = tbf_change(sch, opt)) != 0) {
MOD_DEC_USE_COUNT;
}
@@ -399,7 +399,7 @@
qdisc_put_rtab(q->P_tab);
if (q->R_tab)
qdisc_put_rtab(q->R_tab);
-
+
qdisc_destroy(q->qdisc);
q->qdisc = &noop_qdisc;
@@ -412,10 +412,10 @@
unsigned char *b = skb->tail;
struct rtattr *rta;
struct tc_tbf_qopt opt;
-
+
rta = (struct rtattr*)b;
RTA_PUT(skb, TCA_OPTIONS, 0, NULL);
-
+
opt.limit = q->limit;
opt.rate = q->R_tab->rate;
if (q->P_tab)
@@ -439,11 +439,10 @@
{
struct tbf_sched_data *q = (struct tbf_sched_data*)sch->data;
- if (cl != 1) /* only one class */
+ if (cl != 1) /* only one class */
return -ENOENT;
-
- tcm->tcm_parent = TC_H_ROOT;
- tcm->tcm_handle = 1;
+
+ tcm->tcm_handle |= TC_H_MIN(1);
tcm->tcm_info = q->qdisc->handle;
return 0;
@@ -457,12 +456,12 @@
if (new == NULL)
new = &noop_qdisc;
- sch_tree_lock(sch);
+ sch_tree_lock(sch);
*old = xchg(&q->qdisc, new);
qdisc_reset(*old);
sch->q.qlen = 0;
sch_tree_unlock(sch);
-
+
return 0;
}
@@ -481,7 +480,7 @@
{
}
-static int tbf_change_class(struct Qdisc *sch, u32 classid, u32 parentid,
+static int tbf_change_class(struct Qdisc *sch, u32 classid, u32 parentid,
struct rtattr **tca, unsigned long *arg)
{
return -ENOSYS;
@@ -494,11 +493,9 @@
static void tbf_walk(struct Qdisc *sch, struct qdisc_walker *walker)
{
- struct tbf_sched_data *q = (struct tbf_sched_data *)sch->data;
-
if (!walker->stop) {
- if (walker->count >= walker->skip)
- if (walker->fn(sch, (unsigned long)q, walker) < 0) {
+ if (walker->count >= walker->skip)
+ if (walker->fn(sch, 1, walker) < 0) {
walker->stop = 1;
return;
}
@@ -545,7 +542,7 @@
return register_qdisc(&tbf_qdisc_ops);
}
-void cleanup_module(void)
+void cleanup_module(void)
{
unregister_qdisc(&tbf_qdisc_ops);
}
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)