- // Prefetch next iteration
- {
- vlib_buffer_t *b4, *b5, *b6, *b7;
-
- b4 = vlib_get_buffer (vm, from[4]);
- b5 = vlib_get_buffer (vm, from[5]);
- b6 = vlib_get_buffer (vm, from[6]);
- b7 = vlib_get_buffer (vm, from[7]);
-
- vlib_prefetch_buffer_header (b4, STORE);
- vlib_prefetch_buffer_header (b5, STORE);
- vlib_prefetch_buffer_header (b6, STORE);
- vlib_prefetch_buffer_header (b7, STORE);
-
- CLIB_PREFETCH (b4->data, CLIB_CACHE_LINE_BYTES, LOAD);
- CLIB_PREFETCH (b5->data, CLIB_CACHE_LINE_BYTES, LOAD);
- CLIB_PREFETCH (b6->data, CLIB_CACHE_LINE_BYTES, LOAD);
- CLIB_PREFETCH (b7->data, CLIB_CACHE_LINE_BYTES, LOAD);
- }
-
- next0 = 0;
- next1 = 0;
- next2 = 0;
- next3 = 0;
-
- bi0 = from[0];
- bi1 = from[1];
- bi2 = from[2];
- bi3 = from[3];
-
- to_next[0] = bi0;
- to_next[1] = bi1;
- to_next[2] = bi2;
- to_next[3] = bi3;
-
- from += 4;
- to_next += 4;
- n_left_from -= 4;
- n_left_to_next -= 4;
-
- b0 = vlib_get_buffer (vm, bi0);
- b1 = vlib_get_buffer (vm, bi1);
- b2 = vlib_get_buffer (vm, bi2);
- b3 = vlib_get_buffer (vm, bi3);
-
- vnet_feature_next (vnet_buffer (b0)->sw_if_index[VLIB_RX], &next0,
- b0);
- vnet_feature_next (vnet_buffer (b1)->sw_if_index[VLIB_RX], &next1,
- b1);
- vnet_feature_next (vnet_buffer (b2)->sw_if_index[VLIB_RX], &next2,
- b2);
- vnet_feature_next (vnet_buffer (b3)->sw_if_index[VLIB_RX], &next3,
- b3);
-
- eth = (ethernet_header_t *) vlib_buffer_get_current (b0);
- eth1 = (ethernet_header_t *) vlib_buffer_get_current (b1);
- eth2 = (ethernet_header_t *) vlib_buffer_get_current (b2);
- eth3 = (ethernet_header_t *) vlib_buffer_get_current (b3);
-
- sw_if_index = vnet_buffer (b0)->sw_if_index[VLIB_RX];
- sw_if_index1 = vnet_buffer (b1)->sw_if_index[VLIB_RX];
- sw_if_index2 = vnet_buffer (b2)->sw_if_index[VLIB_RX];
- sw_if_index3 = vnet_buffer (b3)->sw_if_index[VLIB_RX];
-
- // sw_if_index points to the physical interface
- sif = bond_get_slave_by_sw_if_index (sw_if_index);
- sif1 = bond_get_slave_by_sw_if_index (sw_if_index1);
- sif2 = bond_get_slave_by_sw_if_index (sw_if_index2);
- sif3 = bond_get_slave_by_sw_if_index (sw_if_index3);
-
- bond_sw_if_index_rewrite (vm, node, sif, eth, b0);
- bond_sw_if_index_rewrite (vm, node, sif1, eth1, b1);
- bond_sw_if_index_rewrite (vm, node, sif2, eth2, b2);
- bond_sw_if_index_rewrite (vm, node, sif3, eth3, b3);
-
- 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));
- t0->ethernet = *eth;
- t0->sw_if_index = sw_if_index;
- t0->bond_sw_if_index = vnet_buffer (b0)->sw_if_index[VLIB_RX];
-
- 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));
- t0->ethernet = *eth1;
- t0->sw_if_index = sw_if_index1;
- t0->bond_sw_if_index =
- vnet_buffer (b1)->sw_if_index[VLIB_RX];
-
- if (PREDICT_TRUE (n_trace > 0))
- {
- vlib_trace_buffer (vm, node, next1, b2,
- 0 /* follow_chain */ );
- vlib_set_trace_count (vm, node, --n_trace);
- t0 = vlib_add_trace (vm, node, b2, sizeof (*t0));
- t0->ethernet = *eth2;
- t0->sw_if_index = sw_if_index2;
- t0->bond_sw_if_index =
- vnet_buffer (b2)->sw_if_index[VLIB_RX];
-
- if (PREDICT_TRUE (n_trace > 0))
- {
- vlib_trace_buffer (vm, node, next1, b2,
- 0 /* follow_chain */ );
- vlib_set_trace_count (vm, node, --n_trace);
- t0 = vlib_add_trace (vm, node, b3, sizeof (*t0));
- t0->ethernet = *eth3;
- t0->sw_if_index = sw_if_index3;
- t0->bond_sw_if_index =
- vnet_buffer (b3)->sw_if_index[VLIB_RX];
- }
- }
- }
- }