当前位置: 首页>行业 >

全球球精选!探究分段场景下vlib_buf在收发包的处理

来源: 腾讯云 | 时间: 2023-03-10 03:02:25 |

在使用vpp老版本copy报文的时候,经常遇到mbuf泄露的问题,根本原因是在vlib_buffer分段场景下没有将rte_mbuf进行串联,导致dpdk发包时造成了泄漏。最新的版本已经彻底解决了此问题。下面来分析一下:


(相关资料图)

rte_mbuf、vlib_buf 关系及内存分布

首先,先来了解一下dpdk plugins。在plugins目录下除dpdk_plugin.so外,其他模块是不能直接访问dpdk相关函数的,vpp支持dpdk以静态和动态库的方式,具体在dpdk目录下CMakeLists.txt可以看到查询dpdk库。如下:

find_path(DPDK_INCLUDE_DIR PATH_SUFFIXES dpdk NAMES rte_config.h)vpp_plugin_find_library(dpdk DPDK_LIB "libdpdk.a")if (NOT DPDK_INCLUDE_DIR)  message(WARNING "-- DPDK headers not found - dpdk plugin disabled")  return()endif()if (NOT DPDK_LIB)  vpp_plugin_find_library(dpdk DPDK_SHLIB "libdpdk.so")  set(DPDK_IS_SHARED_LIB 1)  message(WARNING "-- linking dpdk plugin against DPDK shared libs")endif()

可以通过ldd命令确认当前使用静态库还是动态库.没有搜到libdpdk.so,就是使用的静态库方式。

ldd /usr/lib/x86_64-linux-gnu/vpp_plugins/dpdk_plugin.so        linux-vdso.so.1 (0x00007ffd901cb000)        libnuma.so.1 => /usr/lib/x86_64-linux-gnu/libnuma.so.1 (0x00007fbf050a0000)        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fbf04caf000)        /lib64/ld-linux-x86-64.so.2 (0x00007fbf0a3c4000)

vpp其他模块是无法访问到dpdk相关的函数的,是因为vpp启动时以dlopen动态加载的so库,使用需要使用需要dlsym函数负责动态加载符号(函数),第一个参数是句柄(由dlopen时返回的),第二个参数就是给定的函数名称。类似如下:

//链接并打开动态库void *handle = dlopen(dlib_path, RTLD_GLOBAL | RTLD_NOW);//获取add函数//注意:函数指针接收的add函数有几个参数和什么返回类型要一致 CalculatorFuncPointer add_func = dlsym(handle, "add"); int add_ret = add_func(10, 20);

vpp为提供使用dlsym的接口,但是可以使用另外一种方式,就是注册钩子函数来解决。可以参考线程创建的钩子函数:

static vlib_thread_callbacks_t callbacks = {  .vlib_launch_thread_cb = &dpdk_launch_thread,  .vlib_thread_set_lcore_cb = &dpdk_thread_set_lcore,};static clib_error_t *dpdk_thread_init (vlib_main_t * vm){  vlib_thread_cb_register (vm, &callbacks);  return 0;}VLIB_INIT_FUNCTION (dpdk_thread_init);

RteMbuf内存分布图如下:详细请阅读以前文章:vlib ----buffer pool 内存初始化(2)

分段场景下的串联关系如下(两段链表方式):

曾经遇到过使用dpdk来申请报文缓存地址,在ring队列中将rte_mbuf的内存地址写异常的问题,就是通过这种反相推理找到确认被踩的情况。

使用dpdk-收包接口函数

vpp默认以polling的方式来从dpdk绑定的网卡来收包,具体收包节点在src\plugins\dpdk\device\node.c文件。下面vpp从网卡收包节点的定义及节点函数说明。

VLIB_NODE_FN (dpdk_input_node) (vlib_main_t * vm, vlib_node_runtime_t * node,                vlib_frame_t * f){  dpdk_main_t *dm = &dpdk_main;  dpdk_device_t *xd;  uword n_rx_packets = 0;  vnet_device_input_runtime_t *rt = (void *) node->runtime_data;  vnet_device_and_queue_t *dq;  u32 thread_index = node->thread_index;  /*轮询此cpu上的所有设备的输入或者中断。会存在一个cpu绑多个接口的情况   * Poll all devices on this cpu for input/interrupts.   */  /* *INDENT-OFF* */  foreach_device_and_queue (dq, rt->devices_and_queues)    {      xd = vec_elt_at_index(dm->devices, dq->dev_instance);      n_rx_packets += dpdk_device_input (vm, dm, xd, node, thread_index,                     dq->queue_id);    }  /* *INDENT-ON* */  return n_rx_packets;}/* *dpdk-input节点定义* */VLIB_REGISTER_NODE (dpdk_input_node) = {  .type = VLIB_NODE_TYPE_INPUT,  .name = "dpdk-input",  .sibling_of = "device-input",  .flags = VLIB_NODE_FLAG_TRACE_SUPPORTED,  /* Will be enabled if/when hardware is detected. */  .state = VLIB_NODE_STATE_DISABLED,  .format_buffer = format_ethernet_header_with_length,  .format_trace = format_dpdk_rx_trace,  .n_errors = DPDK_N_ERROR,  .error_strings = dpdk_error_strings,};

在dpdk_device_input函数中调用dpdkpmd收包通用接口从网卡描述符收取报文,具体流程可以参考:DPDK 网卡收包流程。

下面分段报文的处理,需要通过rte_mbuf 串联关系讲vlib_buf也串联起来。

/*通过dpdk pmd接口从网卡收取报文 get up to DPDK_RX_BURST_SZ buffers from PMD */  while (n_rx_packets < DPDK_RX_BURST_SZ)    {      n = rte_eth_rx_burst (xd->port_id, queue_id,                ptd->mbufs + n_rx_packets,                DPDK_RX_BURST_SZ - n_rx_packets);      n_rx_packets += n;      if (n < 32)    break;    }/*处理从网卡描述符收到的报文。*/static_always_inline uworddpdk_process_rx_burst (vlib_main_t * vm, dpdk_per_thread_data_t * ptd,               uword n_rx_packets, int maybe_multiseg,               u16 * or_flagsp){....while (n_left)    {      /*通过rte_mbuf的的搭配vlib-buf头*/      b[0] = vlib_buffer_from_rte_mbuf (mb[0]);      /*前64字节赋值模板*/      vlib_buffer_copy_template (b[0], &bt);      or_flags |= dpdk_ol_flags_extract (mb, flags, 1);      flags += 1;      b[0]->current_data = mb[0]->data_off - RTE_PKTMBUF_HEADROOM;      n_bytes += b[0]->current_length = mb[0]->data_len;      /*多分段的场景,需要通过rte_mbuf 串联关系讲vlib_buf也串联起来*/      if (maybe_multiseg)    n_bytes += dpdk_process_subseq_segs (vm, b[0], mb[0], &bt);      /*跟踪记录node执行节点trace初始化*/      VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b[0]);      /* next */      mb += 1;      n_left -= 1;    }....}

使用dpdk 发包接口函数

对应的在plugins目录下dpdk模块文件中src\plugins\dpdk\device\device.c定义dpdk对应的设备类。

/*对应的通用的dpdk tx接口函数*/VNET_DEVICE_CLASS_TX_FN (dpdk_device_class) (vlib_main_t * vm,                         vlib_node_runtime_t * node,                         vlib_frame_t * f)/* *dpdk对应的设备类结构体描述* */VNET_DEVICE_CLASS (dpdk_device_class) = {  .name = "dpdk",  .admin_up_down_function = dpdk_interface_admin_up_down,  .subif_add_del_function = dpdk_subif_add_del_function,  .rx_redirect_to_node = dpdk_set_interface_next_node,  .mac_addr_change_function = dpdk_set_mac_address,  .mac_addr_add_del_function = dpdk_add_del_mac_address,  .format_flow = format_dpdk_flow,  .flow_ops_function = dpdk_flow_ops_fn,  .set_rss_queues_function = dpdk_interface_set_rss_queues,};

在对应发包函数中会对分段vlib_buf的连对应的mbuf进行串联,以保证在调用dpdk库中对应网卡的pmd驱动发包接口使用。

/*判断是否存在多段vlib_buf串联场景,将对应的mbuf也串联起来*/      dpdk_validate_rte_mbuf (vm, b[0], 1);      /*设置网卡tx 卸载功能*/      dpdk_buffer_tx_offload (xd, b[0], mb[0]);

所以我们其他模块操作分段vlib_buf时,并不需要将考虑将rte_mbufd的进行处理。比如vlib_buffer_copy中只是将vlib-buf头进行也串联。

在项目开发中遇到一个使用vlib_buffer_copy的问题,就是不会赋值current_config_index字段(用于获取当前节点的next0节点)进行复制。会导致报文走到其他的几点上。

总结

在使用vpp过程中,经常遇到rte_mbuf泄露的问题,而了解使用原理对分析问题很有帮助。本文以报文分段场景的处理为背景,学习了报文从哪来(dpdk-input),到哪去(dpdk tx)的实现逻辑。希望本文的介绍对你有所帮助。

关键词:

 

热文推荐

全球球精选!探究分段场景下vlib_buf在收发包的处理

在使用vpp老版本copy报文的时候,经常遇到mbuf泄露的问题,根本原因是在vlib_buffer分段场景下没有将rte_mbuf进行串联,导致dpdk发

2023-03-10

微速讯:60岁甲状腺癌手术能活多久_60岁甲状腺癌寿命

1、病情分析:虽然60岁了,但甲状腺癌预后良好。2、例如,乳头癌治疗后的20年生存率可超过90%。3、滤泡状癌的十年生存

2023-03-09

天天报道:图片转换器调整图片尺寸的方法是什么_图片转换器调整图片尺寸的方法

方法一。首先第一步打开软件,然后在界面左上角找到添加图片源文件的选项。单击后,我们就可以添加要处理的图像了。2 打开选择

2023-03-09

世界微动态丨北京首都机场股份(00694.HK)拟3月30日举行董事会审议及批准年度业绩

北京首都机场股份(00694 HK)拟3月30日举行董事会审议及批准年度业绩,首都机场,公司董事会,北京首都国际机场股份

2023-03-09

新资讯:Dynam Japan3月9日回购3.88万股 耗资20.64万港币

3月9日DynamJapan发布公告称,公司于2023年3月9日在香港交易所回购3 88万股,耗资20 64万港币,根据此次回购数量和耗资情况计算回购均价约为5

2023-03-09

【世界快播报】地磁场平面图_地磁场图片

1、地磁场,磁极南边就是地理北边,磁极北边就是地理南边。2、不过还存在一个磁偏角地磁场和地球南北极恰好相反,地理北极就是

2023-03-09

全球今日讯!成音节有哪些_成音节

1、ap(ple)ta(ble)possi(ble)ablepeo(ple)dou(ble)rif(fle)trou(b

2023-03-09

焦点速递!就市论市丨 “室温超导”刷屏,相关研究却遭质疑,离实际应用究竟多远?

今天早盘,A股超导概念开盘大涨。消息面上,纽约罗切斯特大学物理学家朗加·迪亚斯举行讲座,称自己的团队创造出了可在室温下工

2023-03-09

世界热头条丨最新公布!涉从化、天河、荔湾、番禺等9区

最新公布!涉从化、天河、荔湾、番禺等9区,配建,从化,荔湾,番禺,天河区,海珠区,白云区,广州市,住宅用地

2023-03-09

当前简讯:人力资源和社会保障部职业技能鉴定指导中心

1、两种证都不错。2、都是国家认可、上国家官网查询、全国通用的 你要是担心建议选:人力资源和社会保障部职业技能鉴定中心的

2023-03-09

【天天播资讯】期待!永安渠商旅文化街区项目又有新进度

期待!永安渠商旅文化街区项目又有新进度

2023-03-09

环球聚焦:守交规、保安全,他们为外卖骑手们送上“安全大餐”!

守交规、保安全,他们为外卖骑手们送上“安全大餐”!

2023-03-09

焦点!防静电漆多少钱一平方_防静电漆

1、防静电漆从名字中我们就可以知道它的主要作用就是防静电。2、将它涂在一些需要防止静电的产品表面,不只是防静电,还可以防

2023-03-09

【环球新视野】金城江公安分局女警学花艺

金城江讯3月6日,河池市公安局金城江分局举办迎“三八”节主题花艺培训活动,以浪漫和温馨的方式庆祝第113个“三八”国际妇女节。为让现场的女

2023-03-09

世界快消息!“强信心 开好局”高质量发展区县行|乌当区:聚焦“一主一特” 全力打造健康医药和电子信息制造产业集群

“强信心开好局”高质量发展区县行|乌当区:聚焦“一主一特”全力打造健康医药和电子信息制造产业集群

2023-03-08

天天短讯!少年音怎么练

1,呼吸的练习深呼吸一口气,然后把这口气沉到你的腹部,然后把这口气尽量憋住在腹部,时间越长越好,然后慢慢均匀吐气,这个必须经常练习的2

2023-03-08

全球信息:比房企还猛,一年买地超500亿元,万科龙湖前高管跳槽给地铁公司打工

地铁集团下属房企成为地产人的新去处。  日前,原龙湖集团贵阳公司总经理杨晟先加盟南宁轨道地产集团有限责任公司(下称“南宁轨道地产”)

2023-03-08

天天信息:回南天

1、回南天(简称回南)是对我国南方地区一种天气现象的称呼,通常指每年春天时,气温开始回暖而湿度开始回升的现象。2、华南属

2023-03-08

世界即时:宏碁确认服务器被入侵 黑客挂牌出售盗取的160GB数据

3月8日消息,电脑制造商宏碁公司确认,有人入侵了其一台服务器,并在网上出售声称是宏碁机密信息的160GB数据。“我们最近

2023-03-08

天天信息:成都市武侯区青年人才驿站申请条件

武侯区青年人才驿站申请条件:1 来蓉求职(笔试、面试、报道期间)的本科及以上学历应届毕业生;2 蓉漂计划、逐梦计划、返家乡等在校本科大学

2023-03-08

资讯

花式避暑添夏日趣味 热浪滚滚燃高温经济

防晒、遮阳、冰饮,冲冲冲!西瓜、外卖、空调,不能停!多地持续的高温天气不仅贡献了很多热搜,也助燃了夏日经济。这其中,既有人们熟悉的传

2022-08-08     
天津津门虎队教练于根伟:机会来了要冷静

天津津门虎队明天将迎来中超联赛第五轮比赛,未尝一胜的现实也让全队上下倍感压力。昨天,主教练于根伟在谈及全队问题时表示:球员们在完成

2022-06-20     
北京推出14条秋游文化线路

金秋时节,北京市文化和旅游局以赏银杏品文化为主题,推出14条“叶落的季节——漫步北京赏银杏品文化主题线路”,邀市民和游客以步行、骑行

2021-10-27     
基因编辑发力 培育高质量人源化供体猪

此次人体试验,仅仅验证了基因编辑猪克服异种器官移植的超急性排斥反应,还需解决延迟性排斥反应、消耗性血栓等问题。但通过这次试验,能更

2021-10-27     
中国经济高质量发展步伐稳健 长期向好基本面未变

在全球疫情走势和经济走势趋于复杂的背景下,中国经济巨轮将驶向何方,举世关注。2020年10月26日至29日,党的十九届五中全会在京举行,明确

2021-10-27     
南美解放者杯决赛允许近4.5万观众入场

南美洲足联主席多明格斯25日与今年解放者杯决赛对阵的两支俱乐部负责人会晤,宣布决赛现场观众人数增加到球场容量的75%,即近4 5万人。今年

2021-10-27