Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

pkt_sched: sch_generic: Add generic qdisc->ops->peek() implementation.

With feedback from Patrick McHardy.

Signed-off-by: Jarek Poplawski <jarkao2@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Jarek Poplawski and committed by
David S. Miller
99c0db26 48a8f519

+28
+12
net/sched/sch_api.c
··· 102 102 requeues once dequeued packet. It is used for non-standard or 103 103 just buggy devices, which can defer output even if netif_queue_stopped()=0. 104 104 105 + ---peek 106 + 107 + like dequeue but without removing a packet from the queue 108 + 105 109 ---reset 106 110 107 111 returns qdisc to initial state: purge all buffers, clear all ··· 153 149 qops->enqueue = noop_qdisc_ops.enqueue; 154 150 if (qops->requeue == NULL) 155 151 qops->requeue = noop_qdisc_ops.requeue; 152 + if (qops->peek == NULL) { 153 + if (qops->dequeue == NULL) { 154 + qops->peek = noop_qdisc_ops.peek; 155 + } else { 156 + rc = -EINVAL; 157 + goto out; 158 + } 159 + } 156 160 if (qops->dequeue == NULL) 157 161 qops->dequeue = noop_qdisc_ops.dequeue; 158 162
+16
net/sched/sch_generic.c
··· 320 320 .priv_size = 0, 321 321 .enqueue = noop_enqueue, 322 322 .dequeue = noop_dequeue, 323 + .peek = noop_dequeue, 323 324 .requeue = noop_requeue, 324 325 .owner = THIS_MODULE, 325 326 }; ··· 347 346 .priv_size = 0, 348 347 .enqueue = noop_enqueue, 349 348 .dequeue = noop_dequeue, 349 + .peek = noop_dequeue, 350 350 .requeue = noop_requeue, 351 351 .owner = THIS_MODULE, 352 352 }; ··· 413 411 return NULL; 414 412 } 415 413 414 + static struct sk_buff *pfifo_fast_peek(struct Qdisc* qdisc) 415 + { 416 + int prio; 417 + struct sk_buff_head *list = qdisc_priv(qdisc); 418 + 419 + for (prio = 0; prio < PFIFO_FAST_BANDS; prio++) { 420 + if (!skb_queue_empty(list + prio)) 421 + return skb_peek(list + prio); 422 + } 423 + 424 + return NULL; 425 + } 426 + 416 427 static int pfifo_fast_requeue(struct sk_buff *skb, struct Qdisc* qdisc) 417 428 { 418 429 qdisc->q.qlen++; ··· 472 457 .priv_size = PFIFO_FAST_BANDS * sizeof(struct sk_buff_head), 473 458 .enqueue = pfifo_fast_enqueue, 474 459 .dequeue = pfifo_fast_dequeue, 460 + .peek = pfifo_fast_peek, 475 461 .requeue = pfifo_fast_requeue, 476 462 .init = pfifo_fast_init, 477 463 .reset = pfifo_fast_reset,