---
title: DPDK头文件格式介绍
description: "DPDK 是一个C语言的库，负责处理控制面下发流表信息，而HydraInfo的头文件格式是经过 DPDK 的适配，能直接被引用在用户的 DPDK C文件中的，以下为当中生成的内容。"
url: https://www.hikunpeng.com/document/detail/zh/flexda/devguide/dpak_dev0059.html
sourcePath: /source/zh/flexda/devguide/dpak_dev0059.html
indexId: eadb84211201fa96896929c1a67731296441f4ff620233d091273d22b4a084fd44
---
# 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数量一致，用于流表之间的跳转。
  取名规则为HYDRA_TABLE_<ControlName>_<TableName>

- HydraDefaultAction枚举数量当前为3个，用于支持非DPDKaction的内置action。
  取名规则为HYDRA_DEFAULT_ACTION_<ActionName>

- HydraAction枚举数量与非DPDK的action keyword数量一致，用于支撑非DPDKaction。
  取名规则为HYDRA_ACTION_<ActionName>

- HydraItem枚举数量会和table的非DPDKmatchField数量一致，用于支撑非DPDKkey。

  - 变量取名规则：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枚举中的宏，而DPDK的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 的action会使用HydraActionType枚举中的宏，而 DPDK 的action会复用 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;
```
