@@ -209,77 +209,87 @@ l2flood_node_fn (vlib_main_t * vm,
209209 bi0 , L2FLOOD_NEXT_DROP );
210210 continue ;
211211 }
212-
213- vec_validate (msm -> clones [thread_index ], n_clones );
214- vec_reset_length (msm -> clones [thread_index ]);
215-
216- /*
217- * the header offset needs to be large enough to incorporate
218- * all the L3 headers that could be touched when doing BVI
219- * processing. So take the current l2 length plus 2 * IPv6
220- * headers (for tunnel encap)
221- */
222- n_cloned = vlib_buffer_clone (vm , bi0 ,
223- msm -> clones [thread_index ],
224- n_clones ,
225- (vnet_buffer (b0 )-> l2 .l2_len +
226- sizeof (udp_header_t ) +
227- 2 * sizeof (ip6_header_t )));
228-
229- if (PREDICT_FALSE (n_cloned != n_clones ))
212+ else if (n_clones > 1 )
230213 {
231- b0 -> error = node -> errors [L2FLOOD_ERROR_REPL_FAIL ];
232- }
214+ vec_validate (msm -> clones [thread_index ], n_clones );
215+ vec_reset_length (msm -> clones [thread_index ]);
216+
217+ /*
218+ * the header offset needs to be large enough to incorporate
219+ * all the L3 headers that could be touched when doing BVI
220+ * processing. So take the current l2 length plus 2 * IPv6
221+ * headers (for tunnel encap)
222+ */
223+ n_cloned = vlib_buffer_clone (vm , bi0 ,
224+ msm -> clones [thread_index ],
225+ n_clones ,
226+ (vnet_buffer (b0 )-> l2 .l2_len +
227+ sizeof (udp_header_t ) +
228+ 2 * sizeof (ip6_header_t )));
229+
230+ if (PREDICT_FALSE (n_cloned != n_clones ))
231+ {
232+ b0 -> error = node -> errors [L2FLOOD_ERROR_REPL_FAIL ];
233+ }
233234
234- /*
235- * for all but the last clone, these are not BVI bound
236- */
237- for (clone0 = 0 ; clone0 < n_cloned - 1 ; clone0 ++ )
238- {
239- member = msm -> members [thread_index ][clone0 ];
240- ci0 = msm -> clones [thread_index ][clone0 ];
241- c0 = vlib_get_buffer (vm , ci0 );
235+ /*
236+ * for all but the last clone, these are not BVI bound
237+ */
238+ for (clone0 = 0 ; clone0 < n_cloned - 1 ; clone0 ++ )
239+ {
240+ member = msm -> members [thread_index ][clone0 ];
241+ ci0 = msm -> clones [thread_index ][clone0 ];
242+ c0 = vlib_get_buffer (vm , ci0 );
242243
243- to_next [0 ] = ci0 ;
244- to_next += 1 ;
245- n_left_to_next -= 1 ;
244+ to_next [0 ] = ci0 ;
245+ to_next += 1 ;
246+ n_left_to_next -= 1 ;
246247
247- if (PREDICT_FALSE ((node -> flags & VLIB_NODE_FLAG_TRACE ) &&
248- (b0 -> flags & VLIB_BUFFER_IS_TRACED )))
249- {
250- ethernet_header_t * h0 ;
251- l2flood_trace_t * t ;
252-
253- if (c0 != b0 )
254- vlib_buffer_copy_trace_flag (vm , b0 , ci0 );
255-
256- t = vlib_add_trace (vm , node , c0 , sizeof (* t ));
257- h0 = vlib_buffer_get_current (c0 );
258- t -> sw_if_index = sw_if_index0 ;
259- t -> bd_index = vnet_buffer (c0 )-> l2 .bd_index ;
260- clib_memcpy (t -> src , h0 -> src_address , 6 );
261- clib_memcpy (t -> dst , h0 -> dst_address , 6 );
262- }
248+ if (PREDICT_FALSE ((node -> flags & VLIB_NODE_FLAG_TRACE ) &&
249+ (b0 -> flags & VLIB_BUFFER_IS_TRACED )))
250+ {
251+ ethernet_header_t * h0 ;
252+ l2flood_trace_t * t ;
253+
254+ if (c0 != b0 )
255+ vlib_buffer_copy_trace_flag (vm , b0 , ci0 );
256+
257+ t = vlib_add_trace (vm , node , c0 , sizeof (* t ));
258+ h0 = vlib_buffer_get_current (c0 );
259+ t -> sw_if_index = sw_if_index0 ;
260+ t -> bd_index = vnet_buffer (c0 )-> l2 .bd_index ;
261+ clib_memcpy (t -> src , h0 -> src_address , 6 );
262+ clib_memcpy (t -> dst , h0 -> dst_address , 6 );
263+ }
263264
264- /* Do normal L2 forwarding */
265- vnet_buffer (c0 )-> sw_if_index [VLIB_TX ] = member -> sw_if_index ;
265+ /* Do normal L2 forwarding */
266+ vnet_buffer (c0 )-> sw_if_index [VLIB_TX ] =
267+ member -> sw_if_index ;
266268
267- vlib_validate_buffer_enqueue_x1 (vm , node , next_index ,
268- to_next , n_left_to_next ,
269- ci0 , next0 );
270- if (PREDICT_FALSE (0 == n_left_to_next ))
271- {
272- vlib_put_next_frame (vm , node , next_index , n_left_to_next );
273- vlib_get_next_frame (vm , node , next_index ,
274- to_next , n_left_to_next );
269+ vlib_validate_buffer_enqueue_x1 (vm , node , next_index ,
270+ to_next , n_left_to_next ,
271+ ci0 , next0 );
272+ if (PREDICT_FALSE (0 == n_left_to_next ))
273+ {
274+ vlib_put_next_frame (vm , node , next_index ,
275+ n_left_to_next );
276+ vlib_get_next_frame (vm , node , next_index , to_next ,
277+ n_left_to_next );
278+ }
275279 }
280+ member = msm -> members [thread_index ][clone0 ];
281+ ci0 = msm -> clones [thread_index ][clone0 ];
282+ }
283+ else
284+ {
285+ /* one clone */
286+ ci0 = bi0 ;
287+ member = msm -> members [thread_index ][0 ];
276288 }
277289
278290 /*
279291 * the last clone that might go to a BVI
280292 */
281- member = msm -> members [thread_index ][clone0 ];
282- ci0 = msm -> clones [thread_index ][clone0 ];
283293 c0 = vlib_get_buffer (vm , ci0 );
284294
285295 to_next [0 ] = ci0 ;
0 commit comments