- vlib_buffer_t *b0;
-
- vlib_get_next_frame (vm, node, next_index, to_next, n_left_to_next);
-
- while (n_left_to_next > 0)
- {
- /* prefetch one line / 2 entries ahead */
- if ((((uword) ep) & (CLIB_CACHE_LINE_BYTES - 1)) == 0)
- CLIB_PREFETCH ((ep + 2), CLIB_CACHE_LINE_BYTES, LOAD);
- /* Pick up buffer from the wheel */
- bi0 = ep->buffer_index;
-
- to_next[0] = bi0;
- to_next += 1;
- n_left_to_next -= 1;
-
- next0 = ep->output_next_index;
-
- /* verify speculative enqueue, maybe switch current next frame */
- vlib_validate_buffer_enqueue_x1 (vm, node, next_index,
- to_next, n_left_to_next,
- bi0, next0);
- /* Advance to the next ring entry */
- wp->head++;
- if (wp->head == wp->wheel_size)
- wp->head = 0;
- wp->cursize--;
- ep = wp->entries + wp->head;
- n_tx_packets++;
-
- if (is_trace)
- {
- b0 = vlib_get_buffer (vm, bi0);
- if (b0->flags & VLIB_BUFFER_IS_TRACED)
- {
- nsim_tx_trace_t *t =
- vlib_add_trace (vm, node, b0, sizeof (*t));
- t->expired = now;
- t->next_index = next0;
- }
- }
-
- /* Out of ring entries? */
- if (PREDICT_FALSE (wp->cursize == 0))
- break;
- }
-
- vlib_put_next_frame (vm, node, next_index, n_left_to_next);
-
- /* If the current entry hasn't expired, we're done */
- if (ep->tx_time > now)
- break;
+ /* prefetch one line / 2 entries ahead */
+ if ((((uword) ep) & (CLIB_CACHE_LINE_BYTES - 1)) == 0)
+ clib_prefetch_load ((ep + 2));
+
+ ep = wp->entries + wp->head;
+ from[0] = ep->buffer_index;
+ next[0] = ep->output_next_index;
+
+ wp->head++;
+ if (wp->head == wp->wheel_size)
+ wp->head = 0;
+
+ from += 1;
+ next += 1;
+ n_tx_packets++;