[LARTC] Question on prio qdisc

Leonardo Balliache leoball@opalsoft.net
Mon, 07 Jul 2003 14:08:01 -0400


Hi, Joseph:

At 06:45 a.m. 03/07/03 +0200, you wrote:

>Thank you Lars and Wing for your responses.
>
>I just ran another experiment using RED on the
>lowest priority flow as suggested by Wing. I had
>used RED before (on all flows) without success.
>In this experiment, specified a large queue size for the interface.
>In this case the result was roughly the same.
>I overloaded the interface with 9.5 Mb/s of
>flow with 8 Mb/s at the lowest priority, 1 Mb/s
>at the medium priority, and 0.5 Mb/s at the highest
>priority hoping that RED would discard lowest
>priority packets to make room for the higher priority
>packets. The result was that all flows suffered
>approximately the same packet loss rate (about 45%).
>The interface was an 802.11b interface at 11 Mb/s
>with the two nodes very close to each other so that
>link quality was very high. Apparently RED does not
>discard the lowest priority packets that are overloading
>the interface. The following script was
>used:

RED doesn=B4t have any way to know which are lower, medium or higher=
 priority=20
packets. To do what you want you need to use GRED.

>My next step will be to modify the enqueue function to call
>prio_drop() if there is not enough room to enqueue a new
>packet as you have both suggested. I will have to get some help
>for this from some of our engineers that can understand the code
>better than I could.

The enqueue code is here:

static int
prio_enqueue(struct sk_buff *skb, struct Qdisc* sch)
{
    struct prio_sched_data *q =3D (struct prio_sched_data *)sch->data;
    struct Qdisc *qdisc;
    int ret;

    qdisc =3D q->queues[prio_classify(skb, sch)];

    if ((ret =3D qdisc->enqueue(skb, qdisc)) =3D=3D 0) {
        sch->stats.bytes +=3D skb->len;
        sch->stats.packets++;
        sch->q.qlen++;
        return 0;
     }
     sch->stats.drops++;
     return ret;
}

As you see in:

         qdisc =3D q->queues[prio_classify(skb, sch)];

each queue is an independent queue. Then if high priority packets are=20
dropped is because the high priority queue has overflow, not because some=20
(unique?) queue is full from low priority packets.

Also, in drop-tail queues, as its name imply and prio is, never a already=20
enqueue packet is dropped to make room for a new one. Packets are dropped=20
from the tail.

Best regards,

Leonardo Balliache