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´t have any way to know which are lower, medium or higher priority 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 = (struct prio_sched_data *)sch->data; struct Qdisc *qdisc; int ret;
qdisc = q->queues[prio_classify(skb, sch)];
if ((ret = qdisc->enqueue(skb, qdisc)) == 0) { sch->stats.bytes += skb->len; sch->stats.packets++; sch->q.qlen++; return 0; } sch->stats.drops++; return ret; }
As you see in:
qdisc = q->queues[prio_classify(skb, sch)];
each queue is an independent queue. Then if high priority packets are dropped is because the high priority queue has overflow, not because some (unique?) queue is full from low priority packets.
Also, in drop-tail queues, as its name imply and prio is, never a already enqueue packet is dropped to make room for a new one. Packets are dropped from the tail.
Best regards,
Leonardo Balliache