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

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个,用于支撑非DPDK action的内置action。

    取名规则为HYDRA_DEFAULT_ACTION_<ActionName>

  • HydraAction枚举数量与非DPDK的action keyword数量一致,用于支撑非DPDK action。

    取名规则为HYDRA_ACTION_<ActionName>

  • 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;