trace功能
在使能trace功能后,发现dpdk-input的feature节点是没有开启trace的,因为
查看代码\vpp-1701\vnet\vnet\devices\dpdk\node.c
关键函数是
static_always_inline u32
dpdk_device_input (dpdk_main_t * dm, dpdk_device_t * xd,
vlib_node_runtime_t * node, u32 cpu_index, u16 queue_id)
{
......
while (n_buffers > 0)
{
......
vlib_get_next_frame (vm, node, next_index, to_next, n_left_to_next);
while (n_buffers > 8 && n_left_to_next > 4)
{
}
while (n_buffers > 0 && n_left_to_next > 0)
{
/* Do we have any driver RX features configured on the interface? */
vnet_feature_start_device_input_x1 (xd->vlib_sw_if_index, &next0,
b0, l3_offset0);
vlib_validate_buffer_enqueue_x1 (vm, node, next_index,
to_next, n_left_to_next,
bi0, next0);
n_buffers--;
mb_index++;
}
vlib_put_next_frame (vm, node, next_index, n_left_to_next);
}
if (PREDICT_FALSE (vec_len (xd->d_trace_buffers[cpu_index]) > 0))
{
dpdk_rx_trace (dm, node, xd, queue_id, xd->d_trace_buffers[cpu_index],
vec_len (xd->d_trace_buffers[cpu_index]));
vlib_set_trace_count (vm, node, n_trace -
vec_len (xd->d_trace_buffers[cpu_index]));
}
vlib_increment_combined_counter
(vnet_get_main ()->interface_main.combined_sw_if_counters
+ VNET_INTERFACE_COUNTER_RX,
cpu_index, xd->vlib_sw_if_index, mb_index, n_rx_bytes);
dpdk_worker_t *dw = vec_elt_at_index (dm->workers, cpu_index);
dw->aggregate_rx_packets += mb_index;
return mb_index;
}
dpdk_rx_trace开始使能node trace,注意上面函数dpdk_rx_trace函数的执行位置。
if (PREDICT_FALSE (vec_len (xd->d_trace_buffers[cpu_index]) > 0))
{
dpdk_rx_trace (dm, node, xd, queue_id, xd->d_trace_buffers[cpu_index],
vec_len (xd->d_trace_buffers[cpu_index]));
vlib_set_trace_count (vm, node, n_trace -
vec_len (xd->d_trace_buffers[cpu_index]));
}
在dpdk-input node 后添加feature node 后,vlib_put_next_frame (vm, node, next_index, n_left_to_next)中 next_index,会是feature node的索引,
而dpdk_rx_trace里的下一节点索引还是默认的,所以feature node 就不会trace了