summaryrefslogtreecommitdiffstats
path: root/net/sched/sch_sfq.c
diff options
context:
space:
mode:
authorPatrick McHardy <kaber@trash.net>2008-10-31 08:44:18 +0100
committerDavid S. Miller <davem@davemloft.net>2008-10-31 08:44:18 +0100
commit48a8f519e0fe22a5c98523286b2a120841a11dd5 (patch)
treeec70428b026091669bf1e23779f9cfdd1a1ca46f /net/sched/sch_sfq.c
parentpkt_sched: sch_generic: Add Qdisc_ops peek() method. (diff)
downloadlinux-48a8f519e0fe22a5c98523286b2a120841a11dd5.tar.xz
linux-48a8f519e0fe22a5c98523286b2a120841a11dd5.zip
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/sched/sch_sfq.c')
-rw-r--r--net/sched/sch_sfq.c12
1 files changed, 12 insertions, 0 deletions
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)
return NET_XMIT_CN;
}
+static struct sk_buff *
+sfq_peek(struct Qdisc *sch)
+{
+ struct sfq_sched_data *q = qdisc_priv(sch);
+ sfq_index a;
+ /* No active slots */
+ if (q->tail == SFQ_DEPTH)
+ return NULL;
+ a = q->next[q->tail];
+ return skb_peek(&q->qs[a]);
+}
static struct sk_buff *
sfq_dequeue(struct Qdisc *sch)
@@ -624,6 +635,7 @@ static struct Qdisc_ops sfq_qdisc_ops __read_mostly = {
.priv_size = sizeof(struct sfq_sched_data),
.enqueue = sfq_enqueue,
.dequeue = sfq_dequeue,
+ .peek = sfq_peek,
.requeue = sfq_requeue,
.drop = sfq_drop,
.init = sfq_init,