-
- /* process 4 pkts */
- vlib_node_increment_counter (vm, l2learn_node.index,
- L2LEARN_ERROR_L2LEARN, 4);
-
- l2fib_lookup_4 (msm->mac_table, &cached_key, &cached_result,
- h0->src_address,
- h1->src_address,
- h2->src_address,
- h3->src_address,
- vnet_buffer (b0)->l2.bd_index,
- vnet_buffer (b1)->l2.bd_index,
- vnet_buffer (b2)->l2.bd_index,
- vnet_buffer (b3)->l2.bd_index,
- &key0, &key1, &key2, &key3,
- &bucket0, &bucket1, &bucket2, &bucket3,
- &result0, &result1, &result2, &result3);
-
- l2learn_process (node, msm, &em->counters[node_counter_base_index],
- b0, sw_if_index0, &key0, &cached_key,
- &bucket0, &result0, &next0, timestamp);
-
- l2learn_process (node, msm, &em->counters[node_counter_base_index],
- b1, sw_if_index1, &key1, &cached_key,
- &bucket1, &result1, &next1, timestamp);
-
- l2learn_process (node, msm, &em->counters[node_counter_base_index],
- b2, sw_if_index2, &key2, &cached_key,
- &bucket2, &result2, &next2, timestamp);
-
- l2learn_process (node, msm, &em->counters[node_counter_base_index],
- b3, sw_if_index3, &key3, &cached_key,
- &bucket3, &result3, &next3, timestamp);
-
- /* verify speculative enqueues, maybe switch current next frame */
- /* if next0==next1==next_index then nothing special needs to be done */
- vlib_validate_buffer_enqueue_x4 (vm, node, next_index,
- to_next, n_left_to_next,
- bi0, bi1, bi2, bi3,
- next0, next1, next2, next3);
- }
-
- while (n_left_from > 0 && n_left_to_next > 0)
- {
- u32 bi0;
- vlib_buffer_t *b0;
- u32 next0;
- u32 sw_if_index0;
- ethernet_header_t *h0;
- l2fib_entry_key_t key0;
- l2fib_entry_result_t result0;
- u32 bucket0;
-
- /* speculatively enqueue b0 to the current next frame */
- bi0 = from[0];
- to_next[0] = bi0;
- from += 1;
- to_next += 1;
- n_left_from -= 1;
- n_left_to_next -= 1;
-
- b0 = vlib_get_buffer (vm, bi0);
-
- sw_if_index0 = vnet_buffer (b0)->sw_if_index[VLIB_RX];
-
- h0 = vlib_buffer_get_current (b0);
-
- if (do_trace && PREDICT_FALSE (b0->flags & VLIB_BUFFER_IS_TRACED))