* Dispatch an entire queue of pending packet chains * using the netisr. * VIMAGE: Assumes the vnet pointer has been set. */
| 546 | * VIMAGE: Assumes the vnet pointer has been set. |
| 547 | */ |
| 548 | static void |
| 549 | igmp_dispatch_queue(struct mbufq *mq, int limit, const int loop) |
| 550 | { |
| 551 | struct epoch_tracker et; |
| 552 | struct mbuf *m; |
| 553 | |
| 554 | NET_EPOCH_ENTER(et); |
| 555 | while ((m = mbufq_dequeue(mq)) != NULL) { |
| 556 | CTR3(KTR_IGMPV3, "%s: dispatch %p from %p", __func__, mq, m); |
| 557 | if (loop) |
| 558 | m->m_flags |= M_IGMP_LOOP; |
| 559 | netisr_dispatch(NETISR_IGMP, m); |
| 560 | if (--limit == 0) |
| 561 | break; |
| 562 | } |
| 563 | NET_EPOCH_EXIT(et); |
| 564 | } |
| 565 | |
| 566 | /* |
| 567 | * Filter outgoing IGMP report state by group. |
no test coverage detected