aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorPatrick McHardy <kaber@trash.net>2008-10-31 03:44:18 -0400
committerDavid S. Miller <davem@davemloft.net>2008-10-31 03:44:18 -0400
commit48a8f519e0fe22a5c98523286b2a120841a11dd5 (patch)
treeec70428b026091669bf1e23779f9cfdd1a1ca46f /net
parent90d841fd0a5e02affd4e2bbdde4f710c61599281 (diff)
pkt_sched: Add ->peek() methods for fifo, prio and SFQ qdiscs.
From: Patrick McHardy <kaber@trash.net> Just as a demonstration how easy adding a peek operation to the work-conserving qdiscs actually is. It doesn't need to keep or change any internal state in many cases thanks to the guarantee that the packet will either be dequeued or, if another packet arrives, the upper qdisc will immediately ->peek again to reevaluate the state. (This is only slightly modified Patrick's patch.) Signed-off-by: Jarek Poplawski <jarkao2@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r--net/sched/sch_fifo.c2
-rw-r--r--net/sched/sch_prio.c14
-rw-r--r--net/sched/sch_sfq.c12
3 files changed, 28 insertions, 0 deletions
diff --git a/net/sched/sch_fifo.c b/net/sched/sch_fifo.c
index 23d258bfe8ac..8825e8806f41 100644
--- a/net/sched/sch_fifo.c
+++ b/net/sched/sch_fifo.c
@@ -83,6 +83,7 @@ struct Qdisc_ops pfifo_qdisc_ops __read_mostly = {
83 .priv_size = sizeof(struct fifo_sched_data), 83 .priv_size = sizeof(struct fifo_sched_data),
84 .enqueue = pfifo_enqueue, 84 .enqueue = pfifo_enqueue,
85 .dequeue = qdisc_dequeue_head, 85 .dequeue = qdisc_dequeue_head,
86 .peek = qdisc_peek_head,
86 .requeue = qdisc_requeue, 87 .requeue = qdisc_requeue,
87 .drop = qdisc_queue_drop, 88 .drop = qdisc_queue_drop,
88 .init = fifo_init, 89 .init = fifo_init,
@@ -98,6 +99,7 @@ struct Qdisc_ops bfifo_qdisc_ops __read_mostly = {
98 .priv_size = sizeof(struct fifo_sched_data), 99 .priv_size = sizeof(struct fifo_sched_data),
99 .enqueue = bfifo_enqueue, 100 .enqueue = bfifo_enqueue,
100 .dequeue = qdisc_dequeue_head, 101 .dequeue = qdisc_dequeue_head,
102 .peek = qdisc_peek_head,
101 .requeue = qdisc_requeue, 103 .requeue = qdisc_requeue,
102 .drop = qdisc_queue_drop, 104 .drop = qdisc_queue_drop,
103 .init = fifo_init, 105 .init = fifo_init,
diff --git a/net/sched/sch_prio.c b/net/sched/sch_prio.c
index 504a78cdb718..3651da3e2802 100644
--- a/net/sched/sch_prio.c
+++ b/net/sched/sch_prio.c
@@ -120,6 +120,19 @@ prio_requeue(struct sk_buff *skb, struct Qdisc* sch)
120 return ret; 120 return ret;
121} 121}
122 122
123static struct sk_buff *prio_peek(struct Qdisc *sch)
124{
125 struct prio_sched_data *q = qdisc_priv(sch);
126 int prio;
127
128 for (prio = 0; prio < q->bands; prio++) {
129 struct Qdisc *qdisc = q->queues[prio];
130 struct sk_buff *skb = qdisc->ops->peek(qdisc);
131 if (skb)
132 return skb;
133 }
134 return NULL;
135}
123 136
124static struct sk_buff *prio_dequeue(struct Qdisc* sch) 137static struct sk_buff *prio_dequeue(struct Qdisc* sch)
125{ 138{
@@ -421,6 +434,7 @@ static struct Qdisc_ops prio_qdisc_ops __read_mostly = {
421 .priv_size = sizeof(struct prio_sched_data), 434 .priv_size = sizeof(struct prio_sched_data),
422 .enqueue = prio_enqueue, 435 .enqueue = prio_enqueue,
423 .dequeue = prio_dequeue, 436 .dequeue = prio_dequeue,
437 .peek = prio_peek,
424 .requeue = prio_requeue, 438 .requeue = prio_requeue,
425 .drop = prio_drop, 439 .drop = prio_drop,
426 .init = prio_init, 440 .init = prio_init,
diff --git a/net/sched/sch_sfq.c b/net/sched/sch_sfq.c
index fe1508ef0d3d..198b83d42ba8 100644
--- a/net/sched/sch_sfq.c
+++ b/net/sched/sch_sfq.c
@@ -391,8 +391,19 @@ sfq_requeue(struct sk_buff *skb, struct Qdisc *sch)
391 return NET_XMIT_CN; 391 return NET_XMIT_CN;
392} 392}
393 393
394static struct sk_buff *
395sfq_peek(struct Qdisc *sch)
396{
397 struct sfq_sched_data *q = qdisc_priv(sch);
398 sfq_index a;
394 399
400 /* No active slots */
401 if (q->tail == SFQ_DEPTH)
402 return NULL;
395 403
404 a = q->next[q->tail];
405 return skb_peek(&q->qs[a]);
406}
396 407
397static struct sk_buff * 408static struct sk_buff *
398sfq_dequeue(struct Qdisc *sch) 409sfq_dequeue(struct Qdisc *sch)
@@ -624,6 +635,7 @@ static struct Qdisc_ops sfq_qdisc_ops __read_mostly = {
624 .priv_size = sizeof(struct sfq_sched_data), 635 .priv_size = sizeof(struct sfq_sched_data),
625 .enqueue = sfq_enqueue, 636 .enqueue = sfq_enqueue,
626 .dequeue = sfq_dequeue, 637 .dequeue = sfq_dequeue,
638 .peek = sfq_peek,
627 .requeue = sfq_requeue, 639 .requeue = sfq_requeue,
628 .drop = sfq_drop, 640 .drop = sfq_drop,
629 .init = sfq_init, 641 .init = sfq_init,