前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >vpp handoff功能--worker线程间报文互转

vpp handoff功能--worker线程间报文互转

作者头像
dpdk-vpp源码解读
发布2023-03-07 17:05:47
9920
发布2023-03-07 17:05:47
举报
文章被收录于专栏:DPDK VPP源码分析DPDK VPP源码分析

本文主要将node节点之间的报文互转,这个功能在分片报文伪重组和重组、以及nat模块都有使用。在我们公司的业务开发中为了避免后续流程存在多核竞争资源的问题,也加入了handoff功能。主要用于session的管理。

  • 申请node节点在全局frame队列的索引

我们可以阅读以下函数ip4_sv_reass_init_function完成IP报文伪重组功能中handoff使用,目的是从不同worker核过来的分片报文都一个worker来处理完发送出去。伪重组功能在nat模块、qos中报文基于五元组匹配及路由选路应用比较广泛。 下面函数是node节点fqm初始化函数说明:

代码语言:javascript
复制
/* node_index :表示为当前节点申请handoff相关的配置结构体vlib_frame_queue_main_t,
 *frame_queue_nelts:fqm->vlib_frame_queues[worker_index].elts[]数组存放元素的个数
 *。默认是64,这个数值应该必须是2的次幂。
 * 返回值:返回当前node对应fqm结构在全局vec结构vlib_thread_main.frame_queue_mains[fq_index]中的
 *下标fq_index;
 */
u32 vlib_frame_queue_main_init (u32 node_index, u32 frame_queue_nelts)
  • 对应结构体描述

vlib_frame_queue_main_init初始化函数完成下面所有申请及初始化工作:

enqueue和dequeue函数操作的结构体,以及存储报文索引的地方。

  • vlib_buffer_enqueue_to_thread入队处理逻辑
代码语言:javascript
复制
参数说明:
1、frame_queue_index:node节点对应vlib_frame_queue_main_t结构体在全局vlib_thread_main.
frame_queue_mains的索引。
2、buffer_indices:待处理的vlib_buffer的数组
3、thread_indices:待处理vlib_buffer的每个数组成员对应的worker index。
4、n_packets:待处理的vlib_buffer的数组长度。
5、drop_on_congestion:拥塞时是否丢弃。
static_always_inline u32
vlib_buffer_enqueue_to_thread (vlib_main_t * vm, u32 frame_queue_index,
             u32 * buffer_indices, u16 * thread_indices,
             u32 n_packets, int drop_on_congestion
  • vlib_frame_queue_dequeue出队调度逻辑

是在vlib_main_or_worker_loop函数中判断check_frame_queues置位的话,进入出队调度流程。出队调度流程比较简单,就是遍历全局线程vlib_thread_main.frame_queue_mains结构,对vlib_frame_queue_t *fq = fqm->vlib_frame_queues[thread_id];对fq->elts[],存储的报文进行处理,送到当前线程的node节点进行调度。

代码语言:javascript
复制
if (PREDICT_FALSE (vm->check_frame_queues +
           frame_queue_check_counter))
      {
        u32 processed = 0;

        if (vm->check_frame_queues)
    {
      frame_queue_check_counter = 100;
      vm->check_frame_queues = 0;
    }

        vec_foreach (fqm, tm->frame_queue_mains)
    processed += vlib_frame_queue_dequeue (vm, fqm);

        /* No handoff queue work found? */
        if (processed)
    frame_queue_check_counter = 100;
        else
    frame_queue_check_counter--;
      }
    if (PREDICT_FALSE (vec_len (vm->worker_thread_main_loop_callbacks)))
      clib_call_callbacks (vm->worker_thread_main_loop_callbacks, vm);
  }
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-09-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DPDK VPP源码分析 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 我们可以阅读以下函数ip4_sv_reass_init_function完成IP报文伪重组功能中handoff使用,目的是从不同worker核过来的分片报文都一个worker来处理完发送出去。伪重组功能在nat模块、qos中报文基于五元组匹配及路由选路应用比较广泛。 下面函数是node节点fqm初始化函数说明:
  • vlib_frame_queue_main_init初始化函数完成下面所有申请及初始化工作:
  • 是在vlib_main_or_worker_loop函数中判断check_frame_queues置位的话,进入出队调度流程。出队调度流程比较简单,就是遍历全局线程vlib_thread_main.frame_queue_mains结构,对vlib_frame_queue_t *fq = fqm->vlib_frame_queues[thread_id];对fq->elts[],存储的报文进行处理,送到当前线程的node节点进行调度。
相关产品与服务
NAT 网关
NAT 网关(NAT Gateway)提供 IP 地址转换服务,为腾讯云内资源提供高性能的 Internet 访问服务。通过 NAT 网关,在腾讯云上的资源可以更安全的访问 Internet,保护私有网络信息不直接暴露公网;您也可以通过 NAT 网关实现海量的公网访问,最大支持1000万以上的并发连接数;NAT 网关还支持 IP 级流量管控,可实时查看流量数据,帮助您快速定位异常流量,排查网络故障。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档