All of lore.kernel.org
 help / color / mirror / Atom feed
* [NET_SCHED] BUG in qdisc TBF (token bucket filter)
@ 2004-03-03 12:31 Jesper Dangaard Brouer
  2004-03-05  6:47 ` Dmitry Torokhov
  2004-04-06 14:17 ` [NET_SCHED] BUG in qdisc TBF (token bucket filter) Jesper Dangaard Brouer
  0 siblings, 2 replies; 9+ messages in thread
From: Jesper Dangaard Brouer @ 2004-03-03 12:31 UTC (permalink / raw)
  To: linux-kernel

[-- Attachment #1: Type: TEXT/PLAIN, Size: 1849 bytes --]


BUG in qdisc TBF (token bucket filter).

 Problem in    : Kernel 2.4.22 (and newer, tested till 2.4.25-rc2)
 Problem NOT in: kernel 2.4.21 (and older)

Problem:
--------
 After I add an tbf qdisc to an htb class, then the htb class disappear
 from the output-listing "tc -s class ls dev ethX".

tc-versions:
 I have tested with different version of the "tc" utility.
 And different versions of the htb patch.

 "tc utility, iproute2-ss010824" (debian's iproute)
 "tc utility, iproute2-ss020116" (with htb3.6-020525)

I've not tested if the tfb qdisc and htb class still works, but only
that the output-listing is wrong.  (I'm running 2.4.21 on my
router/firewall to be on the safe side.)

Howto reproduce:
----------------
 #Removing previous 'root' handle/classification
 /sbin/tc qdisc del dev eth0 root
 #
 /sbin/tc qdisc add dev eth0 root handle 1: htb default 10
 #
 /sbin/tc class add dev eth0 parent 1: classid 1:10 htb rate 500kbit

 # output-listing of class'es
 tc -s class ls dev eth0
 #
 # output:
 class htb 1:10 root prio 0 rate 500Kbit ceil 500Kbit burst 2239b cburst 2239b
  Sent 812 bytes 6 pkts (dropped 0, overlimits 0)
  lended: 6 borrowed: 0 giants: 0
  tokens: 27239 ctokens: 27239

 # the tbf line
 /sbin/tc qdisc add dev eth0 parent 1:10 handle 4210: tbf rate 500kbit \
          latency 50ms burst 2239b

 # output-listing of class'es
 tc -s class ls dev eth0
 #
 # output:
 <NOTHING>

The output-listing of class'es returns, if I remove the tbf qdisc again.

Diff between file /net/sched/sch_tbf.c in kernel 2.4.21 and 2.4.22 is
attached.


Hilsen
  Jesper Brouer

--
-------------------------------------------------------------------
System Administrator
Dept. of Computer Science, University of Copenhagen
E-mail: hawk@diku.dk, Direct Tel.: 353 21464
-------------------------------------------------------------------

[-- Attachment #2: Type: TEXT/PLAIN, Size: 8633 bytes --]

--- linux-2.4.21/net/sched/sch_tbf.c	Fri Dec 21 18:42:06 2001
+++ linux-2.4.22/net/sched/sch_tbf.c	Mon Aug 25 13:44:44 2003
@@ -7,6 +7,8 @@
  *		2 of the License, or (at your option) any later version.
  *
  * Authors:	Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>
+ *		Dmitry Torokhov <dtor@mail.ru> - allow attaching inner qdiscs -
+ *						 original idea by Martin Devera
  *
  */
 
@@ -123,62 +125,63 @@
 	long	ptokens;		/* Current number of P tokens */
 	psched_time_t	t_c;		/* Time check-point */
 	struct timer_list wd_timer;	/* Watchdog timer */
+	struct Qdisc	*qdisc;		/* Inner qdisc, default - bfifo queue */
 };
 
 #define L2T(q,L)   ((q)->R_tab->data[(L)>>(q)->R_tab->rate.cell_log])
 #define L2T_P(q,L) ((q)->P_tab->data[(L)>>(q)->P_tab->rate.cell_log])
 
-static int
-tbf_enqueue(struct sk_buff *skb, struct Qdisc* sch)
+static int tbf_enqueue(struct sk_buff *skb, struct Qdisc* sch)
 {
 	struct tbf_sched_data *q = (struct tbf_sched_data *)sch->data;
+	int ret;
 
-	if (skb->len > q->max_size)
-		goto drop;
-	__skb_queue_tail(&sch->q, skb);
-	if ((sch->stats.backlog += skb->len) <= q->limit) {
-		sch->stats.bytes += skb->len;
-		sch->stats.packets++;
-		return 0;
-	}
-
-	/* Drop action: undo the things that we just did,
-	 * i.e. make tail drop
-	 */
-
-	__skb_unlink(skb, &sch->q);
-	sch->stats.backlog -= skb->len;
-
-drop:
-	sch->stats.drops++;
+	if (skb->len > q->max_size || sch->stats.backlog + skb->len > q->limit) {
+		sch->stats.drops++;
 #ifdef CONFIG_NET_CLS_POLICE
-	if (sch->reshape_fail==NULL || sch->reshape_fail(skb, sch))
+		if (sch->reshape_fail == NULL || sch->reshape_fail(skb, sch))
 #endif
-		kfree_skb(skb);
-	return NET_XMIT_DROP;
-}
-
-static int
-tbf_requeue(struct sk_buff *skb, struct Qdisc* sch)
-{
-	__skb_queue_head(&sch->q, skb);
+			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.backlog += skb->len;
+	sch->stats.bytes += skb->len;
+	sch->stats.packets++;
 	return 0;
 }
 
-static int
-tbf_drop(struct Qdisc* sch)
+static int tbf_requeue(struct sk_buff *skb, struct Qdisc* sch)
 {
-	struct sk_buff *skb;
+	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->stats.backlog += skb->len;
+	}
+	
+	return ret;
+}
 
-	skb = __skb_dequeue_tail(&sch->q);
-	if (skb) {
-		sch->stats.backlog -= skb->len;
+static unsigned int tbf_drop(struct Qdisc* sch)
+{
+	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.backlog -= len;
 		sch->stats.drops++;
-		kfree_skb(skb);
-		return 1;
 	}
-	return 0;
+	return len;
 }
 
 static void tbf_watchdog(unsigned long arg)
@@ -189,19 +192,19 @@
 	netif_schedule(sch->dev);
 }
 
-static struct sk_buff *
-tbf_dequeue(struct Qdisc* sch)
+static struct sk_buff *tbf_dequeue(struct Qdisc* sch)
 {
 	struct tbf_sched_data *q = (struct tbf_sched_data *)sch->data;
 	struct sk_buff *skb;
 	
-	skb = __skb_dequeue(&sch->q);
+	skb = q->qdisc->dequeue(q->qdisc);
 
 	if (skb) {
 		psched_time_t now;
 		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);
@@ -210,18 +213,19 @@
 			ptoks = toks + q->ptokens;
 			if (ptoks > (long)q->mtu)
 				ptoks = q->mtu;
-			ptoks -= L2T_P(q, skb->len);
+			ptoks -= L2T_P(q, len);
 		}
 		toks += q->tokens;
 		if (toks > (long)q->buffer)
 			toks = q->buffer;
-		toks -= L2T(q, skb->len);
+		toks -= L2T(q, len);
 
 		if ((toks|ptoks) >= 0) {
 			q->t_c = now;
 			q->tokens = toks;
 			q->ptokens = ptoks;
-			sch->stats.backlog -= skb->len;
+			sch->stats.backlog -= len;
+			sch->q.qlen--;
 			sch->flags &= ~TCQ_F_THROTTLED;
 			return skb;
 		}
@@ -245,20 +249,25 @@
 		   This is the main idea of all FQ algorithms
 		   (cf. CSZ, HPFQ, HFSC)
 		 */
-		__skb_queue_head(&sch->q, skb);
-
+		
+		if (q->qdisc->ops->requeue(skb, q->qdisc) != NET_XMIT_SUCCESS) {
+			/* When requeue fails skb is dropped */ 
+			sch->q.qlen--;
+			sch->stats.backlog -= len;
+			sch->stats.drops++;
+		}	
+		
 		sch->flags |= TCQ_F_THROTTLED;
 		sch->stats.overlimits++;
 	}
 	return NULL;
 }
 
-
-static void
-tbf_reset(struct Qdisc* sch)
+static void tbf_reset(struct Qdisc* sch)
 {
 	struct tbf_sched_data *q = (struct tbf_sched_data *)sch->data;
 
+	qdisc_reset(q->qdisc);
 	skb_queue_purge(&sch->q);
 	sch->stats.backlog = 0;
 	PSCHED_GET_TIME(q->t_c);
@@ -268,6 +277,31 @@
 	del_timer(&q->wd_timer);
 }
 
+static struct Qdisc *tbf_create_dflt_qdisc(struct net_device *dev, u32 limit)
+{
+	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)); 
+			((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;	
+}
+
 static int tbf_change(struct Qdisc* sch, struct rtattr *opt)
 {
 	int err = -EINVAL;
@@ -276,6 +310,7 @@
 	struct tc_tbf_qopt *qopt;
 	struct qdisc_rate_table *rtab = NULL;
 	struct qdisc_rate_table *ptab = NULL;
+	struct Qdisc *child = NULL;
 	int max_size,n;
 
 	if (rtattr_parse(tb, TCA_TBF_PTAB, RTA_DATA(opt), RTA_PAYLOAD(opt)) ||
@@ -308,8 +343,14 @@
 	}
 	if (max_size < 0)
 		goto done;
+	
+	if (q->qdisc == &noop_qdisc) {
+		if ((child = tbf_create_dflt_qdisc(sch->dev, qopt->limit)) == NULL)
+			goto done;
+	}
 
 	sch_tree_lock(sch);
+	if (child) q->qdisc = child;
 	q->limit = qopt->limit;
 	q->mtu = qopt->mtu;
 	q->max_size = max_size;
@@ -342,6 +383,8 @@
 	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;
@@ -359,6 +402,9 @@
 		qdisc_put_rtab(q->P_tab);
 	if (q->R_tab)
 		qdisc_put_rtab(q->R_tab);
+	
+	qdisc_destroy(q->qdisc);
+	q->qdisc = &noop_qdisc;
 
 	MOD_DEC_USE_COUNT;
 }
@@ -391,10 +437,93 @@
 	return -1;
 }
 
+static int tbf_dump_class(struct Qdisc *sch, unsigned long cl,
+	       		  struct sk_buff *skb, struct tcmsg *tcm)
+{
+	struct tbf_sched_data *q = (struct tbf_sched_data*)sch->data;
+
+	if (cl != 1) 	/* only one class */ 
+		return -ENOENT;
+    
+	tcm->tcm_parent = TC_H_ROOT;
+	tcm->tcm_handle = 1;
+	tcm->tcm_info = q->qdisc->handle;
+
+	return 0;
+}
+
+static int tbf_graft(struct Qdisc *sch, unsigned long arg, struct Qdisc *new,
+		     struct Qdisc **old)
+{
+	struct tbf_sched_data *q = (struct tbf_sched_data *)sch->data;
+
+	if (new == NULL)
+		new = &noop_qdisc;
+
+	sch_tree_lock(sch);	
+	*old = xchg(&q->qdisc, new);
+	qdisc_reset(*old);
+	sch_tree_unlock(sch);
+	
+	return 0;
+}
+
+static struct Qdisc *tbf_leaf(struct Qdisc *sch, unsigned long arg)
+{
+	struct tbf_sched_data *q = (struct tbf_sched_data *)sch->data;
+	return q->qdisc;
+}
+
+static unsigned long tbf_get(struct Qdisc *sch, u32 classid)
+{
+	return 1;
+}
+
+static void tbf_put(struct Qdisc *sch, unsigned long arg)
+{
+}
+
+static int tbf_change_class(struct Qdisc *sch, u32 classid, u32 parentid, 
+			struct rtattr **tca, unsigned long *arg)
+{
+	return -ENOSYS;
+}
+
+static int tbf_delete(struct Qdisc *sch, unsigned long arg)
+{
+	return -ENOSYS;
+}
+
+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) { 
+				walker->stop = 1;
+				return;
+			}
+		walker->count++;
+	}
+}
+
+static struct Qdisc_class_ops tbf_class_ops =
+{
+	.graft		= 	tbf_graft,
+	.leaf		=	tbf_leaf,
+	.get		=	tbf_get,
+	.put		=	tbf_put,
+	.change		=	tbf_change_class,
+	.delete		=	tbf_delete,
+	.walk		=	tbf_walk,
+	.dump		=	tbf_dump_class,
+};
+
 struct Qdisc_ops tbf_qdisc_ops =
 {
 	NULL,
-	NULL,
+	&tbf_class_ops,
 	"tbf",
 	sizeof(struct tbf_sched_data),
 

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [NET_SCHED] BUG in qdisc TBF (token bucket filter)
  2004-03-03 12:31 [NET_SCHED] BUG in qdisc TBF (token bucket filter) Jesper Dangaard Brouer
@ 2004-03-05  6:47 ` Dmitry Torokhov
  2004-03-05  6:47   ` [PATCH 1/2] NET: fix class reporting in TBF qdisc Dmitry Torokhov
  2004-03-05 15:40   ` Problems with WLAN orinoco_pci Matthias Jim Knopf
  2004-04-06 14:17 ` [NET_SCHED] BUG in qdisc TBF (token bucket filter) Jesper Dangaard Brouer
  1 sibling, 2 replies; 9+ messages in thread
From: Dmitry Torokhov @ 2004-03-05  6:47 UTC (permalink / raw)
  To: linux-kernel
  Cc: Jesper Dangaard Brouer, marek cervenka, linux-net, James Morris

On Wednesday 03 March 2004 07:31 am, Jesper Dangaard Brouer wrote:
> 
> BUG in qdisc TBF (token bucket filter).
> 
>  Problem in    : Kernel 2.4.22 (and newer, tested till 2.4.25-rc2)
>  Problem NOT in: kernel 2.4.21 (and older)
> 
> Problem:
> --------
>  After I add an tbf qdisc to an htb class, then the htb class disappear
>  from the output-listing "tc -s class ls dev ethX".
> 

Yeah, I botched class reporting in TBF, I am sending 2 patches as followups
to this message:

01-tbf-class-reporting.patch - actual fix
02-tbf-trailing-whitespace.patch - removes trailing whitespace from TBF code

The patches are against 2.6 but I am pretty sure they will apply to 2.4.

-- 
Dmitry

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 1/2] NET: fix class reporting in TBF qdisc
  2004-03-05  6:47 ` Dmitry Torokhov
@ 2004-03-05  6:47   ` Dmitry Torokhov
  2004-03-05  6:48     ` Dmitry Torokhov
  2004-03-05 15:40   ` Problems with WLAN orinoco_pci Matthias Jim Knopf
  1 sibling, 1 reply; 9+ messages in thread
From: Dmitry Torokhov @ 2004-03-05  6:47 UTC (permalink / raw)
  To: linux-kernel
  Cc: Jesper Dangaard Brouer, marek cervenka, linux-net, James Morris


===================================================================


ChangeSet@1.1648, 2004-03-05 01:02:36-05:00, dtor_core@ameritech.net
  NET: Fix class reporting in TBF qdisc


 sch_tbf.c |    9 +++------
 1 files changed, 3 insertions(+), 6 deletions(-)


===================================================================



diff -Nru a/net/sched/sch_tbf.c b/net/sched/sch_tbf.c
--- a/net/sched/sch_tbf.c	Fri Mar  5 01:26:33 2004
+++ b/net/sched/sch_tbf.c	Fri Mar  5 01:26:33 2004
@@ -434,8 +434,7 @@
 	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;
@@ -486,11 +485,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;
 			}

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 1/2] NET: fix class reporting in TBF qdisc
  2004-03-05  6:47   ` [PATCH 1/2] NET: fix class reporting in TBF qdisc Dmitry Torokhov
@ 2004-03-05  6:48     ` Dmitry Torokhov
  2004-03-05 20:57       ` Mike Fedyk
  0 siblings, 1 reply; 9+ messages in thread
From: Dmitry Torokhov @ 2004-03-05  6:48 UTC (permalink / raw)
  To: linux-kernel
  Cc: Jesper Dangaard Brouer, marek cervenka, linux-net, James Morris


===================================================================


ChangeSet@1.1649, 2004-03-05 01:18:18-05:00, dtor_core@ameritech.net
  NET: TBF trailing whitespace cleanup


 sch_tbf.c |   68 +++++++++++++++++++++++++++++++-------------------------------
 1 files changed, 34 insertions(+), 34 deletions(-)


===================================================================



diff -Nru a/net/sched/sch_tbf.c b/net/sched/sch_tbf.c
--- a/net/sched/sch_tbf.c	Fri Mar  5 01:26:58 2004
+++ b/net/sched/sch_tbf.c	Fri Mar  5 01:26:58 2004
@@ -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)); 
 			((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;
@@ -369,17 +369,17 @@
 static int tbf_init(struct Qdisc* sch, struct rtattr *opt)
 {
 	struct tbf_sched_data *q = (struct tbf_sched_data *)sch->data;
-	
+
 	if (opt == NULL)
 		return -EINVAL;
-	
+
 	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;
-	
+
 	return tbf_change(sch, opt);
 }
 
@@ -393,7 +393,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;
 }
@@ -404,10 +404,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)
@@ -427,13 +427,13 @@
 }
 
 static int tbf_dump_class(struct Qdisc *sch, unsigned long cl,
-	       		  struct sk_buff *skb, struct tcmsg *tcm)
+			  struct sk_buff *skb, struct tcmsg *tcm)
 {
 	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_handle |= TC_H_MIN(1);
 	tcm->tcm_info = q->qdisc->handle;
 
@@ -448,12 +448,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;
 }
 
@@ -473,7 +473,7 @@
 }
 
 static int tbf_change_class(struct Qdisc *sch, u32 classid, u32 parentid, 
-			struct rtattr **tca, unsigned long *arg)
+			    struct rtattr **tca, unsigned long *arg)
 {
 	return -ENOSYS;
 }
@@ -497,7 +497,7 @@
 
 static struct Qdisc_class_ops tbf_class_ops =
 {
-	.graft		= 	tbf_graft,
+	.graft		=	tbf_graft,
 	.leaf		=	tbf_leaf,
 	.get		=	tbf_get,
 	.put		=	tbf_put,
@@ -529,7 +529,7 @@
 	return register_qdisc(&tbf_qdisc_ops);
 }
 
-static void __exit tbf_module_exit(void) 
+static void __exit tbf_module_exit(void)
 {
 	unregister_qdisc(&tbf_qdisc_ops);
 }

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Problems with WLAN orinoco_pci
  2004-03-05  6:47 ` Dmitry Torokhov
  2004-03-05  6:47   ` [PATCH 1/2] NET: fix class reporting in TBF qdisc Dmitry Torokhov
@ 2004-03-05 15:40   ` Matthias Jim Knopf
  2004-03-05 23:00     ` Peter Williams
  1 sibling, 1 reply; 9+ messages in thread
From: Matthias Jim Knopf @ 2004-03-05 15:40 UTC (permalink / raw)
  To: linux-kernel

Hi!

My WLAN net goes down from time to time. I cannot ping the wlan/dsl-router
(T-Sinus 111) and the only thing that helps is re-load the kernel-driver
(ifconfig eth1 down; modprobe -r orinoco_pci;
 sleep 8; ifconfig eth1 up; iwconfig ...)

Changing speed (down to 1 Mb/s) does no better

Bisides this, I have annother problem: This f***ing router mentioned
above cannot handle at least one connection per second in the long run
(>30 minutes) and crashes in the way, that it still may be pinged, but
I cannot access the router's web-interface, nor can I get to the internet
and have to power-cyle it (official advice from the company selling it!)
I tried hard to see these problems as one, but it seems, they ARE
two (see logs)


Here is, what I can offer you as info:
WLAN is a Netgear PCI MA311 (using hermes, orinoco)

# iwconfig
eth1      IEEE 802.11-DS  ESSID:"WLAN"  Nickname:"jim"
          Mode:Managed  Frequency:2.437GHz  Access Point: 00:30:F1:xx:xx:xx
          Bit Rate:11Mb/s   Tx-Power=15 dBm   Sensitivity:1/3
          Retry min limit:8   RTS thr:off   Fragment thr:off
          Encryption key:xxxx-xxxx-xx   Security mode:open
          Power Management:off
          Link Quality:20/92  Signal level:-76 dBm  Noise level:-136 dBm
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:1
          Tx excessive retries:2  Invalid misc:0   Missed beacon:0

# ping -c 5 router
PING wlan-router (192.168.2.1): 56 data bytes
--- wlan-router ping statistics ---
5 packets transmitted, 0 packets received, 100% packet loss

# uname -a
Linux laura 2.4.22 #2 Sun Dec 21 17:14:01 MET 2003 i686 unknown

# lsmod
Module                  Size  Used by
orinoco_pci             3056   1  (autoclean)
orinoco                31808   0  (autoclean) [orinoco_pci]
hermes                  5232   0  (autoclean) [orinoco_pci orinoco]
[...]

---{ /var/log/warn }----------------------------------------------------------------------------
Mar  5 15:41:43 laura kernel: eth1: Error -110 writing Tx descriptor to BAP
Mar  5 15:42:15 laura last message repeated 59 times
Mar  5 15:42:22 laura last message repeated 12 times
[...]
Mar  5 15:44:34 laura kernel: eth1: error -110 reading info frame. Frame dropped.
Mar  5 15:44:34 laura kernel: eth1: Error -110 writing Tx descriptor to BAP
Mar  5 15:44:41 laura last message repeated 14 times
Mar  5 15:45:33 laura kernel: .....<7>orinoco_lock() called with hw_unavailable (dev=e3c82800)
Mar  5 15:45:33 laura kernel: ......<7>orinoco_lock() called with hw_unavailable (dev=e3c82800)
Mar  5 15:45:33 laura last message repeated 4 times
Mar  5 15:45:33 laura kernel: .....<7>orinoco_lock() called with hw_unavailable (dev=e3c82800)
Mar  5 15:45:33 laura kernel: ......<7>orinoco_lock() called with hw_unavailable (dev=e3c82800)
Mar  5 15:45:33 laura last message repeated 4 times
Mar  5 15:45:34 laura kernel: .........;
[...]
------------------------------------------------------------------------------------------------


Thanks in advance for any help you can give me!

Matthias


-- 
EOF



^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 1/2] NET: fix class reporting in TBF qdisc
  2004-03-05  6:48     ` Dmitry Torokhov
@ 2004-03-05 20:57       ` Mike Fedyk
  2004-03-06  4:33         ` Dmitry Torokhov
  0 siblings, 1 reply; 9+ messages in thread
From: Mike Fedyk @ 2004-03-05 20:57 UTC (permalink / raw)
  To: Dmitry Torokhov
  Cc: linux-kernel, Jesper Dangaard Brouer, marek cervenka, linux-net,
	James Morris

Dmitry Torokhov wrote:
> ===================================================================
> 
> 
> ChangeSet@1.1649, 2004-03-05 01:18:18-05:00, dtor_core@ameritech.net
>   NET: TBF trailing whitespace cleanup
> 
> 
>  sch_tbf.c |   68 +++++++++++++++++++++++++++++++-------------------------------
>  1 files changed, 34 insertions(+), 34 deletions(-)
> 
> 
> ===================================================================
> 
> 
> 
> diff -Nru a/net/sched/sch_tbf.c b/net/sched/sch_tbf.c
> --- a/net/sched/sch_tbf.c	Fri Mar  5 01:26:58 2004
> +++ b/net/sched/sch_tbf.c	Fri Mar  5 01:26:58 2004
> @@ -62,7 +62,7 @@
>  
>  	Algorithm.
>  	----------
> -	
> +

That's a lot of whitespace cleanup in there too.

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: Problems with WLAN orinoco_pci
  2004-03-05 15:40   ` Problems with WLAN orinoco_pci Matthias Jim Knopf
@ 2004-03-05 23:00     ` Peter Williams
  0 siblings, 0 replies; 9+ messages in thread
From: Peter Williams @ 2004-03-05 23:00 UTC (permalink / raw)
  To: jim999; +Cc: linux-kernel

Matthias Jim Knopf wrote:
> Hi!
> 
> My WLAN net goes down from time to time. I cannot ping the wlan/dsl-router
> (T-Sinus 111) and the only thing that helps is re-load the kernel-driver
> (ifconfig eth1 down; modprobe -r orinoco_pci;
>  sleep 8; ifconfig eth1 up; iwconfig ...)
> 
> Changing speed (down to 1 Mb/s) does no better
> 
> Bisides this, I have annother problem: This f***ing router mentioned
> above cannot handle at least one connection per second in the long run
> (>30 minutes) and crashes in the way, that it still may be pinged, but
> I cannot access the router's web-interface, nor can I get to the internet
> and have to power-cyle it (official advice from the company selling it!)
> I tried hard to see these problems as one, but it seems, they ARE
> two (see logs)
> 
> 
> Here is, what I can offer you as info:
> WLAN is a Netgear PCI MA311 (using hermes, orinoco)
> 
> # iwconfig
> eth1      IEEE 802.11-DS  ESSID:"WLAN"  Nickname:"jim"
>           Mode:Managed  Frequency:2.437GHz  Access Point: 00:30:F1:xx:xx:xx
>           Bit Rate:11Mb/s   Tx-Power=15 dBm   Sensitivity:1/3
>           Retry min limit:8   RTS thr:off   Fragment thr:off
>           Encryption key:xxxx-xxxx-xx   Security mode:open
>           Power Management:off
>           Link Quality:20/92  Signal level:-76 dBm  Noise level:-136 dBm
>           Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:1
>           Tx excessive retries:2  Invalid misc:0   Missed beacon:0
> 
> # ping -c 5 router
> PING wlan-router (192.168.2.1): 56 data bytes
> --- wlan-router ping statistics ---
> 5 packets transmitted, 0 packets received, 100% packet loss
> 
> # uname -a
> Linux laura 2.4.22 #2 Sun Dec 21 17:14:01 MET 2003 i686 unknown
> 
> # lsmod
> Module                  Size  Used by
> orinoco_pci             3056   1  (autoclean)
> orinoco                31808   0  (autoclean) [orinoco_pci]
> hermes                  5232   0  (autoclean) [orinoco_pci orinoco]
> [...]
> 
> ---{ /var/log/warn }----------------------------------------------------------------------------
> Mar  5 15:41:43 laura kernel: eth1: Error -110 writing Tx descriptor to BAP
> Mar  5 15:42:15 laura last message repeated 59 times
> Mar  5 15:42:22 laura last message repeated 12 times
> [...]
> Mar  5 15:44:34 laura kernel: eth1: error -110 reading info frame. Frame dropped.
> Mar  5 15:44:34 laura kernel: eth1: Error -110 writing Tx descriptor to BAP
> Mar  5 15:44:41 laura last message repeated 14 times
> Mar  5 15:45:33 laura kernel: .....<7>orinoco_lock() called with hw_unavailable (dev=e3c82800)
> Mar  5 15:45:33 laura kernel: ......<7>orinoco_lock() called with hw_unavailable (dev=e3c82800)
> Mar  5 15:45:33 laura last message repeated 4 times
> Mar  5 15:45:33 laura kernel: .....<7>orinoco_lock() called with hw_unavailable (dev=e3c82800)
> Mar  5 15:45:33 laura kernel: ......<7>orinoco_lock() called with hw_unavailable (dev=e3c82800)
> Mar  5 15:45:33 laura last message repeated 4 times
> Mar  5 15:45:34 laura kernel: .........;
> [...]
> ------------------------------------------------------------------------------------------------
> 
> 
> Thanks in advance for any help you can give me!

I'm having similar problems with a PCMCIA orinoco wlan device.  Works 
perfectly with various 2.4.X kernels but keeps (partially) dropping the 
connection with 2.6.X kernels.  By partially, I mean connections are 
lost and pings report target hosts as unreachable but netstat -r reports 
make it look like the connection is still valid.  Doing an ifup (without 
a preceding ifdown) seems to fix the problem.

If more information would be helpful or testing is required don't 
hesitate to ask.

Peter
-- 
Dr Peter Williams, Chief Scientist                peterw@aurema.com
Aurema Pty Limited                                Tel:+61 2 9698 2322
PO Box 305, Strawberry Hills NSW 2012, Australia  Fax:+61 2 9699 9174
79 Myrtle Street, Chippendale NSW 2008, Australia http://www.aurema.com


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 1/2] NET: fix class reporting in TBF qdisc
  2004-03-05 20:57       ` Mike Fedyk
@ 2004-03-06  4:33         ` Dmitry Torokhov
  0 siblings, 0 replies; 9+ messages in thread
From: Dmitry Torokhov @ 2004-03-06  4:33 UTC (permalink / raw)
  To: Mike Fedyk
  Cc: linux-kernel, Jesper Dangaard Brouer, marek cervenka, linux-net,
	James Morris

On Friday 05 March 2004 03:57 pm, Mike Fedyk wrote:
> Dmitry Torokhov wrote:
> > ===================================================================
> > 
> > 
> > ChangeSet@1.1649, 2004-03-05 01:18:18-05:00, dtor_core@ameritech.net
> >   NET: TBF trailing whitespace cleanup
> > 
> > 
> >  sch_tbf.c |   68 +++++++++++++++++++++++++++++++-------------------------------
> >  1 files changed, 34 insertions(+), 34 deletions(-)
> > 
> > 
> > ===================================================================
> > 
> > 
> > 
> > diff -Nru a/net/sched/sch_tbf.c b/net/sched/sch_tbf.c
> > --- a/net/sched/sch_tbf.c	Fri Mar  5 01:26:58 2004
> > +++ b/net/sched/sch_tbf.c	Fri Mar  5 01:26:58 2004
> > @@ -62,7 +62,7 @@
> >  
> >  	Algorithm.
> >  	----------
> > -	
> > +
> 
> That's a lot of whitespace cleanup in there too.
> 

It's only whitespace cleanup... See the changeset comment. Ahh, I see...
I have the same subject on both emails. Doh! Well, it was almost 2AM...

-- 
Dmitry

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [NET_SCHED] BUG in qdisc TBF (token bucket filter)
  2004-03-03 12:31 [NET_SCHED] BUG in qdisc TBF (token bucket filter) Jesper Dangaard Brouer
  2004-03-05  6:47 ` Dmitry Torokhov
@ 2004-04-06 14:17 ` Jesper Dangaard Brouer
  1 sibling, 0 replies; 9+ messages in thread
From: Jesper Dangaard Brouer @ 2004-04-06 14:17 UTC (permalink / raw)
  To: linux-kernel; +Cc: dtor

(...lets keep google updated ;-))

The error have been corrected in kernel 2.4.26-rc1, by

 Dmitry Torokhov:
  o [NET_SCHED]: Fix class reporting in TBF qdisc

--Hawk

On Wed, 3 Mar 2004, Jesper Dangaard Brouer wrote:

> BUG in qdisc TBF (token bucket filter).
>
>  Problem in    : Kernel 2.4.22 (and newer, tested till 2.4.25-rc2)
>  Problem NOT in: kernel 2.4.21 (and older)
>
> Problem:
> --------
>  After I add an tbf qdisc to an htb class, then the htb class disappear
>  from the output-listing "tc -s class ls dev ethX".
>
> tc-versions:
>  I have tested with different version of the "tc" utility.
>  And different versions of the htb patch.
>
>  "tc utility, iproute2-ss010824" (debian's iproute)
>  "tc utility, iproute2-ss020116" (with htb3.6-020525)
>
> I've not tested if the tfb qdisc and htb class still works, but only
> that the output-listing is wrong.  (I'm running 2.4.21 on my
> router/firewall to be on the safe side.)
>
> Howto reproduce:
> ----------------
>  #Removing previous 'root' handle/classification
>  /sbin/tc qdisc del dev eth0 root
>  #
>  /sbin/tc qdisc add dev eth0 root handle 1: htb default 10
>  #
>  /sbin/tc class add dev eth0 parent 1: classid 1:10 htb rate 500kbit
>
>  # output-listing of class'es
>  tc -s class ls dev eth0
>  #
>  # output:
>  class htb 1:10 root prio 0 rate 500Kbit ceil 500Kbit burst 2239b cburst 2239b
>   Sent 812 bytes 6 pkts (dropped 0, overlimits 0)
>   lended: 6 borrowed: 0 giants: 0
>   tokens: 27239 ctokens: 27239
>
>  # the tbf line
>  /sbin/tc qdisc add dev eth0 parent 1:10 handle 4210: tbf rate 500kbit \
>           latency 50ms burst 2239b
>
>  # output-listing of class'es
>  tc -s class ls dev eth0
>  #
>  # output:
>  <NOTHING>
>
> The output-listing of class'es returns, if I remove the tbf qdisc again.
>
> Diff between file /net/sched/sch_tbf.c in kernel 2.4.21 and 2.4.22 is
> attached.
>
>
> Hilsen
>   Jesper Brouer
>
> --
> -------------------------------------------------------------------
> System Administrator
> Dept. of Computer Science, University of Copenhagen
> E-mail: hawk@diku.dk, Direct Tel.: 353 21464
> -------------------------------------------------------------------
>

Hilsen
  Jesper Brouer

--
-------------------------------------------------------------------
System Administrator / Research Assistent
Dept. of Computer Science, University of Copenhagen
E-mail: hawk@diku.dk, Direct Tel.: 353 21464
-------------------------------------------------------------------

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2004-04-06 14:17 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-03-03 12:31 [NET_SCHED] BUG in qdisc TBF (token bucket filter) Jesper Dangaard Brouer
2004-03-05  6:47 ` Dmitry Torokhov
2004-03-05  6:47   ` [PATCH 1/2] NET: fix class reporting in TBF qdisc Dmitry Torokhov
2004-03-05  6:48     ` Dmitry Torokhov
2004-03-05 20:57       ` Mike Fedyk
2004-03-06  4:33         ` Dmitry Torokhov
2004-03-05 15:40   ` Problems with WLAN orinoco_pci Matthias Jim Knopf
2004-03-05 23:00     ` Peter Williams
2004-04-06 14:17 ` [NET_SCHED] BUG in qdisc TBF (token bucket filter) Jesper Dangaard Brouer

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.