本文主要将node节点之间的报文互转,这个功能在分片报文伪重组和重组、以及nat模块都有使用。在我们公司的业务开发中为了避免后续流程存在多核竞争资源的问题,也加入了handoff功能。主要用于session的管理。
/* 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)
enqueue和dequeue函数操作的结构体,以及存储报文索引的地方。
参数说明:
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
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);
}
本文分享自 DPDK VPP源码分析 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!