return __qdisc_dequeue_tail(sch, &sch->q);
 }
 
+static inline struct sk_buff *qdisc_peek_head(struct Qdisc *sch)
+{
+       return skb_peek(&sch->q);
+}
+
 static inline int __qdisc_requeue(struct sk_buff *skb, struct Qdisc *sch,
                                  struct sk_buff_head *list)
 {
 
        .priv_size      =       sizeof(struct fifo_sched_data),
        .enqueue        =       pfifo_enqueue,
        .dequeue        =       qdisc_dequeue_head,
+       .peek           =       qdisc_peek_head,
        .requeue        =       qdisc_requeue,
        .drop           =       qdisc_queue_drop,
        .init           =       fifo_init,
        .priv_size      =       sizeof(struct fifo_sched_data),
        .enqueue        =       bfifo_enqueue,
        .dequeue        =       qdisc_dequeue_head,
+       .peek           =       qdisc_peek_head,
        .requeue        =       qdisc_requeue,
        .drop           =       qdisc_queue_drop,
        .init           =       fifo_init,
 
        return ret;
 }
 
+static struct sk_buff *prio_peek(struct Qdisc *sch)
+{
+       struct prio_sched_data *q = qdisc_priv(sch);
+       int prio;
+
+       for (prio = 0; prio < q->bands; prio++) {
+               struct Qdisc *qdisc = q->queues[prio];
+               struct sk_buff *skb = qdisc->ops->peek(qdisc);
+               if (skb)
+                       return skb;
+       }
+       return NULL;
+}
 
 static struct sk_buff *prio_dequeue(struct Qdisc* sch)
 {
        .priv_size      =       sizeof(struct prio_sched_data),
        .enqueue        =       prio_enqueue,
        .dequeue        =       prio_dequeue,
+       .peek           =       prio_peek,
        .requeue        =       prio_requeue,
        .drop           =       prio_drop,
        .init           =       prio_init,
 
        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)
        .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,