}
#define foreach_span_error \
-_(HITS, "SPAN incomming packets processed")
+_(HITS, "SPAN incoming packets processed")
typedef enum
{
vnet_main_t *vnm = &vnet_main;
u32 *to_mirror_next = 0;
u32 i;
+ span_interface_t *si0;
+ span_mirror_t *sm0;
- span_interface_t *si0 = vec_elt_at_index (sm->interfaces, sw_if_index0);
- span_mirror_t *sm0 = &si0->mirror_rxtx[sf][rxtx];
+ if (sw_if_index0 >= vec_len (sm->interfaces))
+ return;
+
+ si0 = vec_elt_at_index (sm->interfaces, sw_if_index0);
+ sm0 = &si0->mirror_rxtx[sf][rxtx];
if (sm0->num_mirror_ports == 0)
return;
if (mirror_frames[i] == 0)
{
if (sf == SPAN_FEAT_L2)
- mirror_frames[i] = vlib_get_frame_to_node (vnm->vlib_main, l2output_node.index);
+ mirror_frames[i] = vlib_get_frame_to_node (vnm->vlib_main,
+ l2output_node.index);
else
mirror_frames[i] = vnet_get_frame_to_sw_interface (vnm, i);
}
span_trace_t *t = vlib_add_trace (vm, node, b0, sizeof (*t));
t->src_sw_if_index = sw_if_index0;
t->mirror_sw_if_index = i;
- }
- }
+#if 0
+ /* Enable this path to allow packet trace of SPAN packets.
+ Note that all SPAN packets will show up on the trace output
+ with the first SPAN packet (since they are in the same frame)
+ thus making trace output of the original packet confusing */
+ mirror_frames[i]->flags |= VLIB_FRAME_TRACE;
+ c0->flags |= VLIB_BUFFER_IS_TRACED;
+#endif
+ }
+ }
}));
/* *INDENT-ON* */
}
break;
case SPAN_FEAT_DEVICE:
default:
- vnet_feature_next (sw_if_index0, &next0, b0);
- vnet_feature_next (sw_if_index1, &next1, b1);
+ vnet_feature_next (&next0, b0);
+ vnet_feature_next (&next1, b1);
break;
}
break;
case SPAN_FEAT_DEVICE:
default:
- vnet_feature_next (sw_if_index0, &next0, b0);
+ vnet_feature_next (&next0, b0);
break;
}