---
title: 架构模型
description: "图1 OVS控制面开发数据模型"
url: https://www.hikunpeng.com/document/detail/zh/flexda/devguide/dpak_dev0067.html
sourcePath: /source/zh/flexda/devguide/dpak_dev0067.html
indexId: 4c4066c8e41d2b0c74c277d6e74484cac10787b579087f15752073f29e15291444
---
# 架构模型

#### 开发模型

图1 OVS控制面开发数据模型

- hook函数：hook.h中定义的钩子函数，需要用户使用C语言代码开发实现。
  函数详情和调用时机，可参见《Data Acceleration Kit 26.1.RC1 FlexDA 编程框架 API参考》中的“Hook函数”章节。

- libapi接口：libapi.h中flexda_custom_api_t结构体，属性为编程框架实现提供调用的接口。

  - 接口详情可参见《Data Acceleration Kit 26.1.RC1 FlexDA 编程框架 API参考》中的“硬件流表编辑接口”、“报文头提取接口”和“内存管理接口”章节。
  - 初始化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。
