DPDK的rte_flow_item
和rte_flow_action
是一起组成流表的。
流表中的每个规则都包含了一个匹配规则和一个操作指令。匹配规则由一个或多个rte_flow_item
对象组成,每个对象匹配数据包的一个协议头或相关字段。操作指令由一个或多个rte_flow_action
对象组成,每个对象定义了对匹配到的数据包要采取的操作,例如将数据包转发至某个端口,丢弃数据包等。
在DPDK中,创建一个流表需要以下操作(示例代码):
首先初始化一个rte_eth_dev
结构体并启动设备:
struct rte_eth_dev* dev = &rte_eth_devices[0];
rte_eth_dev_start(dev->data->port_id);
接着定义匹配规则rte_flow_item
和操作指令rte_flow_action
:
// 定义需要匹配的IPv4地址、L4协议、TCP/UDP端口
struct rte_flow_item_ipv4 pattern_ipv4 = {...};
struct rte_flow_item_tcp pattern_tcp = {...};
struct rte_flow_action_port_id action_port = {...};
struct rte_flow_action_queue action_queue = {...};
然后创建rte_flow_item
和rte_flow_action
数组,将上述的匹配规则和操作指令加入到相应的数组中:
// 创建匹配规则数组
struct rte_flow_item pattern[] = {
{ .type = RTE_FLOW_ITEM_TYPE_ETH }, // 匹配以太网头
{ .type = RTE_FLOW_ITEM_TYPE_IPV4,...}, // 匹配IPv4头和地址
{ .type = RTE_FLOW_ITEM_TYPE_TCP,...}, // 匹配TCP头和端口号
{ .type = RTE_FLOW_ITEM_TYPE_END }, // 终止匹配规则数组
};
// 创建操作指令数组
struct rte_flow_action actions[] = {
{.type = RTE_FLOW_ACTION_TYPE_PORT_ID, ...}, // 指定转发端口号
{.type = RTE_FLOW_ACTION_TYPE_QUEUE, ...}, // 指定队列号
{.type = RTE_FLOW_ACTION_TYPE_END}, // 终止操作指令数组
};
最后调用rte_flow_create
函数创建流表:
struct rte_flow_error error;
struct rte_flow_attr attr = {
.ingress = 1,
.egress = 0,
.priority = 0,
.transfer = 0,
.handle_asap = 0,
.group = 0,
.egress_mask = 0,
};
struct rte_flow* flow_handle = rte_flow_create(dev->data->port_id, &attr, pattern, actions, &error);
在上述示例代码中,我们创建了一个匹配以太网、IPv4、TCP头和端口号的规则数组和一个操作指令数组,然后调用rte_flow_create
函数创建了一个流表。这个流表可以根据匹配规则rte_flow_item
和操作指令rte_flow_action
来对数据包进行转发或其他处理。
Dpdk/网络协议栈/vpp/OvS/DDos/NFV/虚拟化 视频教程学习地址: https://ke.qq.com/course/5066203?flowToken=1043068