VPP开启调试trace
创始人
2024-05-04 06:42:24
0

注册如下的命令trace add,开启记录报文信息,参数为节点名称和记录报文数量。

VLIB_CLI_COMMAND (add_trace_cli,static) = {.path = "trace add",.short_help = "trace add   [filter] [verbose]",.function = cli_add_trace_buffer,
};

命令行指定的节点需要支持trace功能,对应标志VLIB_NODE_FLAG_TRACE_SUPPORTED。

static clib_error_t *
cli_add_trace_buffer (vlib_main_t * vm,unformat_input_t * input, vlib_cli_command_t * cmd)
{if (vnet_trace_placeholder == 0)vec_validate_aligned (vnet_trace_placeholder, 2048,CLIB_CACHE_LINE_BYTES);node = vlib_get_node (vm, node_index);if ((node->flags & VLIB_NODE_FLAG_TRACE_SUPPORTED) == 0){ error = clib_error_create ("node '%U' doesn't support per-node ""tracing. There may be another way to ""initiate trace on this node.",format_vlib_node_name, vm, node_index);goto done;}u32 filter_table = classify_get_trace_chain ();if (filter && filter_table == ~0){         error = clib_error_create ("No packet trace filter configured...");goto done;}trace_update_capture_options (add, node_index, filter, verbose);

如果指定的trace报文数量为最大值,修改为50。遍历每个线程,找到线程中的vlib_trace_node_t结构(或者新分配),将指定的报文数量设置到limit成员。

void
trace_update_capture_options (u32 add, u32 node_index, u32 filter, u8 verbose)
{vlib_trace_main_t *tm;vlib_trace_node_t *tn;if (add == ~0)add = 50;foreach_vlib_main (){tm = &this_vlib_main->trace_main;tm->verbose = verbose;vec_validate (tm->nodes, node_index);tn = tm->nodes + node_index;/** Adding 0 makes no real sense, and there wa no other way* to explicilty zero-out the limits and count, so make* an "add 0" request really be "set to 0".*/if (add == 0)tn->limit = tn->count = 0;elsetn->limit += add;}

将每个线程的vlib_trace_main_t结构成员trace_enable设置为1。

  foreach_vlib_main (){tm = &this_vlib_main->trace_main;tm->trace_enable = 1;}vlib_enable_disable_pkt_trace_filter (! !filter);

dpdk-input

节点dpdk-input定义如下,其中指定了VLIB_NODE_FLAG_TRACE_SUPPORTED标志,因此可在trace add命令中使用。

VLIB_REGISTER_NODE (dpdk_input_node) = {.type = VLIB_NODE_TYPE_INPUT,.name = "dpdk-input",.sibling_of = "device-input",.flags = VLIB_NODE_FLAG_TRACE_SUPPORTED,

节点dpdk-input的报文处理函数中与trace相关代码如下,首先获取剩余的可用数量n_trace,如果没有开启trace,limit为零;或者已经trace结束,n_trace都为零。

static_always_inline u32
dpdk_device_input (vlib_main_t * vm, dpdk_main_t * dm, dpdk_device_t * xd,vlib_node_runtime_t * node, u32 thread_index, u16 queue_id)
{u32 *buffers;struct rte_mbuf **mb;/* packet trace if enabled */if (PREDICT_FALSE ((n_trace = vlib_get_trace_count (vm, node)))){n_left = n_rx_packets;buffers = ptd->buffers;mb = ptd->mbufs;next = ptd->next;

vlib_trace_buffer设置报文的trace标志等。之后,函数vlib_add_trace分配节点的vlib_trace_header_t结构,初始化dpdk_rx_trace_t结构成员。最后,记录以上使用的trace数量。

      while (n_trace && n_left){b0 = vlib_get_buffer (vm, buffers[0]);if (single_next == 0)next_index = next[0];if (PREDICT_TRUE(vlib_trace_buffer(vm, node, next_index, b0, /* follow_chain */ 0))){dpdk_rx_trace_t *t0 =vlib_add_trace (vm, node, b0, sizeof t0[0]);t0->queue_index = queue_id;t0->device_index = xd->device_index;t0->buffer_index = vlib_get_buffer_index (vm, b0);clib_memcpy_fast (&t0->mb, mb[0], sizeof t0->mb);clib_memcpy_fast (&t0->buffer, b0,sizeof b0[0] - sizeof b0->pre_data);clib_memcpy_fast (t0->buffer.pre_data, b0->data,sizeof t0->buffer.pre_data);clib_memcpy_fast (&t0->data, mb[0]->buf_addr + mb[0]->data_off,sizeof t0->data);n_trace--;}n_left--;buffers++;mb++;next++;}vlib_set_trace_count (vm, node, n_trace);}

首先判断当前进程是否开启了trace,为报文结构vlib_buffer_t设置标志VLIB_BUFFER_IS_TRACED,函数vlib_buffer_make_trace_handle获取trace_handle。

always_inline __clib_warn_unused_result int
vlib_trace_buffer (vlib_main_t * vm,vlib_node_runtime_t * r,u32 next_index, vlib_buffer_t * b, int follow_chain)
{         vlib_trace_main_t *tm = &vm->trace_main;vlib_trace_header_t **h; if (PREDICT_FALSE (tm->trace_enable == 0))return 0;vlib_trace_next_frame (vm, r, next_index);pool_get (tm->trace_buffer_pool, h);do      {b->flags |= VLIB_BUFFER_IS_TRACED;b->trace_handle = vlib_buffer_make_trace_handle(vm->thread_index, h - tm->trace_buffer_pool);}while (follow_chain && (b = vlib_get_next_buffer (vm, b)));

如下,trace_handle由当前线程索引,和trace_buffer_pool池索引组成。

always_inline u32
vlib_buffer_make_trace_handle (u32 thread, u32 pool_index)
{u32 rv;ASSERT (thread < 0xff);ASSERT (pool_index < 0x00FFFFFF);rv = (thread << 24) | (pool_index & 0x00FFFFFF);return rv;
} 

函数vlib_add_trace_inline分配vlib_trace_header_t结构以及n_data_bytes大小的内存。为了实现向量操作,n_data_bytes按照vlib_trace_header_t大小对其。分配(1+n_data_words)数量的vlib_trace_header_t结构,其中后者n_data_words乘以sizeof(vlib_trace_header_t)表示n_data_bytes分配的实际内存大小。

之后,记录当前时间等信息。返回vlib_trace_header_t的data成员在dpdk_device_input函数中初始化。

always_inline void *
vlib_add_trace_inline (vlib_main_t * vm,vlib_node_runtime_t * r, vlib_buffer_t * b,u32 n_data_bytes)
{vlib_trace_main_t *tm = &vm->trace_main;vlib_trace_header_t *h;u32 n_data_words, trace_index;trace_index = vlib_buffer_get_trace_index (b);if (PREDICT_FALSE (pool_is_free_index (tm->trace_buffer_pool, trace_index)))return vnet_trace_placeholder;n_data_bytes = round_pow2 (n_data_bytes, sizeof (h[0]));n_data_words = n_data_bytes / sizeof (h[0]);vec_add2_aligned (tm->trace_buffer_pool[trace_index], h, 1 + n_data_words,sizeof (h[0]));h->time = vm->cpu_time_last_node_dispatch;h->n_data = n_data_words;h->node_index = r->node_index;return h->data;

相关内容

热门资讯

孙杨参赛4项 涵盖短中长距离 转自:天津日报  本报讯(记者 李蓓)昨天,即将在本周末开赛的2025全国游泳冠军赛报项名单出炉。3...
齐鲁品牌文化数智平台共建项目启...   张志恒 王鑫 济南报道  5月13日举行的“新质山东 品筑未来”2025年山东最具影响力品牌暨《...
云湖兰山服务综合体运营 转自:贵州日报 本报讯 5月13日,观山湖区环百花湖旅居推介会暨云湖兰山启幕式在观山湖区朱昌...
守好健康证的“健康关” 人都没到场,证就办好了?近日,有记者走访发现,一些医疗机构的健康证体检项目“缺斤少两”,规章制度形同...
“我的论文不是AI写的”(图) 转自:天津日报  有网友反映,自己原创的论文经过系统检测之后,竟被指出AI生成内容比例过高。据媒体报...
应用机器人与3D打印术行颌骨截...   刘通 通讯员 崔子昂 李鲲济南报道  近日,山东大学齐鲁医院口腔科颌面外科陈安威、王涛、韩亦冰及...
美股周二收盘点评:通货膨胀率下... 来源:宏观对冲陈凯丰Kevin截至4月份的12个月里,消费者物价指数上涨了2.3%,而截至3月份的1...
纽约汇市:美元下跌 美国通胀率...   彭博一项衡量美元强弱的指数兑所有G10货币均走低,此前发布的美国4月份消费者价格涨幅低于预期。投...
要为丘陵山区等研制急需急用的装... □四川日报全媒体记者 阚莹莹  近日,四川省农业农村厅发布2025年“天府良机”薄弱环节关键技术装备...
亮出低空经济发展的未来 □四川日报全媒体记者 高杲 李欣忆7款“四川造”低空产品小鹰-700飞机  ●是目前唯一国产的上单翼...
聆听“沧海龙吟” 共赏民歌之美... 转自:天津日报  本报讯(记者 张帆 摄影 曹彤)昨天,由首都图书馆发起并联合天津图书馆、河北省图书...
彩桥即将合龙   5月12日,宜宾市屏山县岷江二桥工地施工繁忙,建设者对桥梁最后几榀钢拱架进行吊装作业。岷江二桥是...
第二十届西博会5月25日开幕 ●拟邀请匈牙利、老挝为主宾国,浙江、青海为主宾省●拟特邀阿联酋担任大会合作伙伴●据初步统计,西部各地...
各美其美 美美与共 □四川日报全媒体记者 吴晓铃  在古老的历史长河中,留下帕特农神庙、雅典卫城等文明遗产的希腊是西方文...
“公证日记” 转自:天津日报  智慧公证  曾经,办理继承公证需要集齐一沓证明材料,群众要跑好几个部门;如今,滨海...
武清区扎实推进兴业富农 绘就乡... 转自:天津日报  初夏时节,灿烂的阳光夹杂着阵阵微风,深情抚慰着大运河畔的武清区南蔡村镇丁家瞿阝村。...
如皋农商银行:双向奔赴谋发展 ... 4月27日,如皋农商银行举办“跨境人民币赋能外贸企业发展”专题培训会。会议邀请跨境人民币业务优质企业...
泰州农商银行联合海陵区供销总社... 日前,泰州农商银行与泰州市海陵区供销总社在城中街道联合举办“政银携手进社区 惠民助农促消费”系列活动...
将虾苗卖到“小龙虾之乡” □四川日报全媒体记者 陈丽霏  5月,鲜活肥美的小龙虾大量上市,中江县黄鹿镇也迎来了一年中最繁忙的时...
建圈强链 四川农业明确产业“路... 5月11日,四川省大邑县现代农业(粮食产业)园区,工人在试验田中开展小麦新品的测产工作。 李旭 摄(...