+ while (n_left >= 4)
+ {
+ // Prefetch next iteration
+ if (n_left >= 8)
+ {
+ vlib_buffer_t **pb = b + 4;
+
+ vlib_prefetch_buffer_header (pb[0], LOAD);
+ vlib_prefetch_buffer_header (pb[1], LOAD);
+ vlib_prefetch_buffer_header (pb[2], LOAD);
+ vlib_prefetch_buffer_header (pb[3], LOAD);
+
+ CLIB_PREFETCH (pb[0]->data, CLIB_CACHE_LINE_BYTES, LOAD);
+ CLIB_PREFETCH (pb[1]->data, CLIB_CACHE_LINE_BYTES, LOAD);
+ CLIB_PREFETCH (pb[2]->data, CLIB_CACHE_LINE_BYTES, LOAD);
+ CLIB_PREFETCH (pb[3]->data, CLIB_CACHE_LINE_BYTES, LOAD);
+ }
+
+ VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b[0]);
+ VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b[1]);
+ VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b[2]);
+ VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b[3]);
+
+ if (lb_alg == BOND_LB_L2)
+ {
+ h[0] = bond_lb_l2 (vm, node, bif, b[0], n_slaves);
+ h[1] = bond_lb_l2 (vm, node, bif, b[1], n_slaves);
+ h[2] = bond_lb_l2 (vm, node, bif, b[2], n_slaves);
+ h[3] = bond_lb_l2 (vm, node, bif, b[3], n_slaves);
+ }
+ else if (lb_alg == BOND_LB_L34)
+ {
+ h[0] = bond_lb_l34 (vm, node, bif, b[0], n_slaves);
+ h[1] = bond_lb_l34 (vm, node, bif, b[1], n_slaves);
+ h[2] = bond_lb_l34 (vm, node, bif, b[2], n_slaves);
+ h[3] = bond_lb_l34 (vm, node, bif, b[3], n_slaves);
+ }
+ else if (lb_alg == BOND_LB_L23)
+ {
+ h[0] = bond_lb_l23 (vm, node, bif, b[0], n_slaves);
+ h[1] = bond_lb_l23 (vm, node, bif, b[1], n_slaves);
+ h[2] = bond_lb_l23 (vm, node, bif, b[2], n_slaves);
+ h[3] = bond_lb_l23 (vm, node, bif, b[3], n_slaves);
+ }
+ else if (lb_alg == BOND_LB_RR)
+ {
+ h[0] = bond_lb_round_robin (vm, node, bif, b[0], n_slaves);
+ h[1] = bond_lb_round_robin (vm, node, bif, b[1], n_slaves);
+ h[2] = bond_lb_round_robin (vm, node, bif, b[2], n_slaves);
+ h[3] = bond_lb_round_robin (vm, node, bif, b[3], n_slaves);
+ }
+ else if (lb_alg == BOND_LB_BC)
+ {
+ h[0] = bond_lb_broadcast (vm, node, bif, b[0], n_slaves);
+ h[1] = bond_lb_broadcast (vm, node, bif, b[1], n_slaves);
+ h[2] = bond_lb_broadcast (vm, node, bif, b[2], n_slaves);
+ h[3] = bond_lb_broadcast (vm, node, bif, b[3], n_slaves);
+ }
+ else
+ {
+ ASSERT (0);
+ }
+
+ n_left -= 4;
+ b += 4;
+ h += 4;
+ }
+
+ while (n_left > 0)
+ {
+ VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b[0]);
+
+ if (bif->lb == BOND_LB_L2)
+ h[0] = bond_lb_l2 (vm, node, bif, b[0], n_slaves);
+ else if (bif->lb == BOND_LB_L34)
+ h[0] = bond_lb_l34 (vm, node, bif, b[0], n_slaves);
+ else if (bif->lb == BOND_LB_L23)
+ h[0] = bond_lb_l23 (vm, node, bif, b[0], n_slaves);
+ else if (bif->lb == BOND_LB_RR)
+ h[0] = bond_lb_round_robin (vm, node, bif, b[0], n_slaves);
+ else if (bif->lb == BOND_LB_BC)
+ h[0] = bond_lb_broadcast (vm, node, bif, b[0], n_slaves);
+ else
+ {
+ ASSERT (0);
+ }
+
+ n_left -= 1;
+ b += 1;
+ }