DPDK头文件格式介绍
DPDK是一个C语言的库,负责处理控制面下发流表讯息,而HydraInfo的头文件格式是经过DPDK的适配,能直接被引用在用户的DPDK c文件中的,以下为当中生成的内容。
必然生成项
#include "rte_flow.h"
struct hydra_flow_action {
enum hydra_action_type action_type;
void* action_data;
size_t action_data_size;
};
struct hydra_flow_item {
enum hydra_item_type item_type;
void* item_data;
size_t item_data_size;
};
- rte_flow头文件:用于支持DPDK枚举类型。
- hydra_flow_action:为DPDK流表下发提供action讯息。
- hydra_flow_item:为DPDK流表下发提供key(即item)讯息。
Group、Action、Item枚举
Group枚举示例代码如下所示。
enum hydra_group_type {
HYDRA_TABLE_INVALID = 0x0000,
HYDRA_TABLE_MY_CONTROL_MY_TABLE,
};
default action枚举的示例代码如下所示。
enum hydra_default_action_type {
DEFAULT_FLOW_ACTION_TYPE_UPCALL = 359,
DEFAULT_FLOW_ACTION_TYPE_CT = 357,
DEFAULT_FLOW_ACTION_TYPE_INNER_RSS = 364,
};
action枚举的示例代码如下所示。
enum hydra_action_type {
HYDRA_ACTION_INVALID = 0x1000,
HYDRA_ACTION_COUNT,
HYDRA_ACTION_CUSTOM_ACTION,
};
item枚举的示例代码如下所示。
enum hydra_item_type {
HYDRA_ITEM_INVALID = 0x2000,
HYDRA_ITEM_MY_CONTROL_MY_TABLE_HDR_IPV6,
HYDRA_ITEM_MY_CONTROL_MY_TABLE_IDX2_2BIT_2,
HYDRA_ITEM_MY_CONTROL_MY_TABLE_H,
HYDRA_ITEM_MY_CONTROL_MY_TABLE_HDR_IPV4,
HYDRA_ITEM_MY_CONTROL_MY_TABLE_IDX6_4BIT_8,
};
- HydraGroup枚举数量与table keyword数量一致,用于流表之间的跳转。
- HydraDefaultAction枚举数量当前为3个,用于支撑非DPDK action的内置action。
- HydraAction枚举数量与非DPDK的action keyword数量一致,用于支撑非DPDK action。
- HydraItem枚举数量会和table的非DPDK matchField数量一致,用于支撑非DPDK key。
- 变量取名规则:HYDRA_ITEM_<ControlName>_<TableName>_<MatchFieldName>
- 常量取名规则:HYDRA_ITEM_<ControlName>_<TableName>_IDX<Index>_<BitWidth>BIT_<value>
表Key信息
int table_patterns_my_control_my_table [6] = {
HYDRA_ITEM_MY_CONTROL_MY_TABLE_HDR_IPV6,
HYDRA_ITEM_MY_CONTROL_MY_TABLE_IDX2_2BIT_2,
RTE_FLOW_ITEM_TYPE_TCP,
HYDRA_ITEM_MY_CONTROL_MY_TABLE_H,
HYDRA_ITEM_MY_CONTROL_MY_TABLE_HDR_IPV4,
HYDRA_ITEM_MY_CONTROL_MY_TABLE_IDX6_4BIT_8,
};
每个table都会有一个table_patterns前缀的int的数组,告知用户需要表项包含哪些matchField。非DPDK的matchField会使用HydraItemType枚举中的宏,而DPAK的matchField会复用DPDK预设的宏,如RTE_FLOW_ITEM_TYPE_TCP。
表Action讯息
int table_actions_my_control_my_table [7] = {
HYDRA_ACTION_CT,
HYDRA_ACTION_COUNT,
RTE_FLOW_ACTION_TYPE_SET_IPV6_SRC,
RTE_FLOW_ACTION_TYPE_SET_IPV6_DST,
RTE_FLOW_ACTION_TYPE_SET_UDP_SRC,
RTE_FLOW_ACTION_TYPE_SET_UDP_DST,
HYDRA_ACTION_CUSTOMACTION,
};
每个table都会有一个table_actions前缀的int的数组,告知用户表项可使用哪些action,非DPDK的matchField会使用HydraActionType枚举中的宏,而DPDK的matchField会复用DPDK预设的宏,如RTE_FLOW_ACTION_TYPE_SET_IPV6_SRC。
HydraStruct讯息
typedef struct {
int32_t a;
uint32_t b;
int32_t c;
uint32_t d;
} hydra_struct_str_t;
结构体的合法数值取值范围与用户在DSL数据面定义的大小一致,若不保持一致则会导致截断与溢出。示例如下:
- DSL数据面定义
struct s { bit<10> a; // 合法取值范围为[0,1023] } - DPDK控制面的合法取值
hydra_struct_s.a = 1023; // 合法取值范围为[0,1023]
- DPDK控制面的非法取值
hydra_struct_s.a = 1024;
HydraAction讯息
每个action都会生成一个hydra_action_data前缀的数据结构。例如以下为相关的DSL代码。
action action_z(bit<8> data_a, bit<8> data_b) {}
其对应的生成结果如下所示。
typedef struct hydra_action_data_action_z {
uint8_t data_a: 8;
uint8_t data_b: 8;
} __attribute__((packed)) hydra_action_data_action_z;
父主题: HydraInfo