鲲鹏社区首页
中文
注册
开发者
我要评分
获取效率
正确性
完整性
易理解
在线提单
论坛求助

架构模型

开发模型

图1 OVS控制面板开发数据模型
  • hook函数:hook.h中定义的钩子函数,需要用户使用C语言代码开发实现。
  • libapi接口:libapi.h中flexda_custom_api_t结构体,属性为编程框架实现提供调用的接口。
    • 接口详情请参见硬件流表编辑接口报文头提取接口内存管理接口
    • 初始化hook函数(flexda_custom_init)入参flexda_custom_api_t api中保存了编程框架实现提供调用的所有接口的地址。保存为全局变量后,可以在其他hook函数的实现代码中调用。
    • libapi.h中同时定义了方便调用libapi接口的静态内联函数,如果定位了全局变量flexda_custom_api_t g_api并且其中正确保存了编程框架提供的接口地址,则可以使用。

初始化流程

图2 OVS控制面初始化流程
图3 OVS控制面反初始化流程

OVS启动流程中会尝试链接“/usr/lib64/”路径下的custom_openvswitch_plugin.so动态库。

  • 如链接成功,则会将用户实现的hook函数挂载在初始化、反初始化和流表卸载流程中;否则执行生态默认卸载逻辑。
  • 之后会将提供用户调用的libapi作为传参,调用flexda_custom_init,执行用户自定义的全局初始化。

流表下发流程

图4 OVS控制面流表卸载流程

报文命中OpenVSwitch触发流表下发时会进入OVS控制面流程,流程中将实现以下功能:

  • 流表归一:同一报文命中的多个软件流表(跳表情况)合并为一条硬件流表。

    由编程框架实现,将报文首次触发下发的入口端口信息、每次触发卸载时的action等数据保存在以该报文为索引的报文上下文中。

    在报文命中action没有跳表且有出口端口的软件流表时,将记录的软件流表action拼接后,调用用户自定义下发逻辑。

    流表归一当前不支持以下场景:同一报文顺序命中三条(跳转两次)及以上软件流表,且在最后命中的两条以外的流表包含修改报文的action。

  • 自定义下发:对硬件流表的key(item),action,attribute做自定义的修改后调用DPDK硬件流表卸载接口。

    由用户OVS控制面代码实现,编程框架会按流程顺序调用执行。

    在下发硬件流表前,根据自定义报文上下文和其他报文信息,对下发的key、action、attr进行编辑组装。

    • 硬件流表key初始状态为空,最大长度为15。
    • 硬件流表action初始状态为拼接好的软件流表action,最大长度为13。
    • 硬件流表attribute初始状态group为1,其他成员值为0。