- // Prefetch next iteration
- {
- vlib_buffer_t *p4, *p5, *p6, *p7;
-
- p4 = vlib_get_buffer (vm, from[4]);
- p5 = vlib_get_buffer (vm, from[5]);
- p6 = vlib_get_buffer (vm, from[6]);
- p7 = vlib_get_buffer (vm, from[7]);
-
- vlib_prefetch_buffer_header (p4, STORE);
- vlib_prefetch_buffer_header (p5, STORE);
- vlib_prefetch_buffer_header (p6, STORE);
- vlib_prefetch_buffer_header (p7, STORE);
-
- CLIB_PREFETCH (p4->data, CLIB_CACHE_LINE_BYTES, LOAD);
- CLIB_PREFETCH (p5->data, CLIB_CACHE_LINE_BYTES, LOAD);
- CLIB_PREFETCH (p6->data, CLIB_CACHE_LINE_BYTES, LOAD);
- CLIB_PREFETCH (p7->data, CLIB_CACHE_LINE_BYTES, LOAD);
- }
-
- bi0 = from[0];
- bi1 = from[1];
- bi2 = from[2];
- bi3 = from[3];
-
- b0 = vlib_get_buffer (vm, bi0);
- b1 = vlib_get_buffer (vm, bi1);
- b2 = vlib_get_buffer (vm, bi2);
- b3 = vlib_get_buffer (vm, bi3);
-
- VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b0);
- VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b1);
- VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b2);
- VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b3);
-
- sw_if_index = vnet_buffer (b0)->sw_if_index[VLIB_TX];
- sw_if_index1 = vnet_buffer (b1)->sw_if_index[VLIB_TX];
- sw_if_index2 = vnet_buffer (b2)->sw_if_index[VLIB_TX];
- sw_if_index3 = vnet_buffer (b3)->sw_if_index[VLIB_TX];
-
- port =
- (bond_load_balance_table[bif->lb]).load_balance (vm, node, bif, b0);
- port1 =
- (bond_load_balance_table[bif->lb]).load_balance (vm, node, bif, b1);
- port2 =
- (bond_load_balance_table[bif->lb]).load_balance (vm, node, bif, b2);
- port3 =
- (bond_load_balance_table[bif->lb]).load_balance (vm, node, bif, b3);
-
- sif_if_index = *vec_elt_at_index (bif->active_slaves, port);
- sif_if_index1 = *vec_elt_at_index (bif->active_slaves, port1);
- sif_if_index2 = *vec_elt_at_index (bif->active_slaves, port2);
- sif_if_index3 = *vec_elt_at_index (bif->active_slaves, port3);
-
- vnet_buffer (b0)->sw_if_index[VLIB_TX] = sif_if_index;
- vnet_buffer (b1)->sw_if_index[VLIB_TX] = sif_if_index1;
- vnet_buffer (b2)->sw_if_index[VLIB_TX] = sif_if_index2;
- vnet_buffer (b3)->sw_if_index[VLIB_TX] = sif_if_index3;
-
- f = vnet_get_frame_to_sw_interface (vnm, sif_if_index);
- f1 = vnet_get_frame_to_sw_interface (vnm, sif_if_index1);
- f2 = vnet_get_frame_to_sw_interface (vnm, sif_if_index2);
- f3 = vnet_get_frame_to_sw_interface (vnm, sif_if_index3);
-
- to_next = vlib_frame_vector_args (f);
- to_next1 = vlib_frame_vector_args (f1);
- to_next2 = vlib_frame_vector_args (f2);
- to_next3 = vlib_frame_vector_args (f3);
-
- to_next += f->n_vectors;
- to_next1 += f1->n_vectors;
- to_next2 += f2->n_vectors;
- to_next3 += f3->n_vectors;
-
- to_next[0] = vlib_get_buffer_index (vm, b0);
- to_next1[0] = vlib_get_buffer_index (vm, b1);
- to_next2[0] = vlib_get_buffer_index (vm, b2);
- to_next3[0] = vlib_get_buffer_index (vm, b3);
-
- f->n_vectors++;
- f1->n_vectors++;
- f2->n_vectors++;
- f3->n_vectors++;
-
- vnet_put_frame_to_sw_interface (vnm, sif_if_index, f);
- vnet_put_frame_to_sw_interface (vnm, sif_if_index1, f1);
- vnet_put_frame_to_sw_interface (vnm, sif_if_index2, f2);
- vnet_put_frame_to_sw_interface (vnm, sif_if_index3, f3);
-
- if (PREDICT_FALSE (n_trace > 0))
- {
- vlib_trace_buffer (vm, node, next0, b0, 0 /* follow_chain */ );
- vlib_set_trace_count (vm, node, --n_trace);
- t0 = vlib_add_trace (vm, node, b0, sizeof (*t0));
- eth = (ethernet_header_t *) vlib_buffer_get_current (b0);
- t0->ethernet = *eth;
- t0->sw_if_index = sw_if_index;
- t0->bond_sw_if_index = vnet_buffer (b0)->sw_if_index[VLIB_TX];
-
- if (PREDICT_TRUE (n_trace > 0))
- {
- vlib_trace_buffer (vm, node, next1, b1, 0 /* follow_chain */ );
- vlib_set_trace_count (vm, node, --n_trace);
- t0 = vlib_add_trace (vm, node, b1, sizeof (*t0));
- eth = (ethernet_header_t *) vlib_buffer_get_current (b1);
- t0->ethernet = *eth;
- t0->sw_if_index = sw_if_index1;
- t0->bond_sw_if_index = vnet_buffer (b1)->sw_if_index[VLIB_TX];
-
- if (PREDICT_TRUE (n_trace > 0))
- {
- vlib_trace_buffer (vm, node, next2, b2,
- 0 /* follow_chain */ );
- vlib_set_trace_count (vm, node, --n_trace);
- t0 = vlib_add_trace (vm, node, b2, sizeof (*t0));
- eth = (ethernet_header_t *) vlib_buffer_get_current (b2);
- t0->ethernet = *eth;
- t0->sw_if_index = sw_if_index2;
- t0->bond_sw_if_index =
- vnet_buffer (b2)->sw_if_index[VLIB_TX];
-
- if (PREDICT_TRUE (n_trace > 0))
- {
- vlib_trace_buffer (vm, node, next3, b3,
- 0 /* follow_chain */ );
- vlib_set_trace_count (vm, node, --n_trace);
- t0 = vlib_add_trace (vm, node, b3, sizeof (*t0));
- eth =
- (ethernet_header_t *) vlib_buffer_get_current (b3);
- t0->ethernet = *eth;
- t0->sw_if_index = sw_if_index3;
- t0->bond_sw_if_index =
- vnet_buffer (b3)->sw_if_index[VLIB_TX];
- }
- }
- }
- }