dpdk flow 的简单使用

文章目录

    • 前言
    • 基本概念
    • 示例代码说明
    • 最后

前言

本文介绍dpdk flow api的简单使用。

dpdk flow 的使用过程和 iptables 差不多。即,数据包匹配上指定的规则后,执行对应的动作。

本文示例代码来自Basic RTE Flow Filtering Sample Application。

这篇内容还是“水”了点。随手笔记吧。


基本概念

总的来说:dpdk flow 可以对数据包的协议头等进行匹配。可能执行的动作是丢弃流量,将流量转移到指定队列等。

dpdk flow 有这些基本概念:

  1. Attributes: 数据流规则的属性,如其方向(入口或出口)和优先级。(这里面还有个group属性。 group 0是默认必经过的。如果想到其他group,需要执行JUMP操作。其他group中有不同的action。这些group可能被物理设备支持,或者以虚拟的方式支持。示例代码中没有显示使用group,可以暂时不管)
  2. Pattern item: 描述匹配的样式。即,什么样的包会命中样式。
  3. Actions: 当数据包与样式匹配时,执行的操作。

示例代码说明

下面这个示例代码来自“前言”中的链接。含义是,当port_id端口进入的数据包,满足src_ip/mask -> dst_ip/mask的pattern时,将其转移到rx_q队列上。

代码还是比较简单的。我简单介绍下。

  1. Attributes 在dpdk中的结构体是rte_flow_attrattr.ingress = 1; 表示 Pattern 将应用在入站流量上。
  2. Pattern 在dpdk中的结构是rte_flow_item。代码中填充了一个src_ip/mask -> dst_ip/mask样式。
  3. Actions 在dpdk中的结构是rte_flow_action。代码中填充了一个将流量转移到指定队列的动作。
  4. 相关函数:rte_flow_create则是在指定端口上,创建一个flow rule。

/*** create a flow rule that sends packets with matching src and dest ip* to selected queue.** @param port_id*   The selected port.* @param rx_q*   The selected target queue.* @param src_ip*   The src ip value to match the input packet.* @param src_mask*   The mask to apply to the src ip.* @param dest_ip*   The dest ip value to match the input packet.* @param dest_mask*   The mask to apply to the dest ip.* @param[out] error*   Perform verbose error reporting if not NULL.** @return*   A flow if the rule could be created else return NULL.*//* Function responsible for creating the flow rule. 8< */
struct rte_flow *generate_ipv4_flow(uint16_t port_id, uint16_t rx_q,uint32_t src_ip, uint32_t src_mask,uint32_t dest_ip, uint32_t dest_mask,struct rte_flow_error *error) {/* Declaring structs being used. 8< */struct rte_flow_attr attr;struct rte_flow_item pattern[MAX_PATTERN_NUM];struct rte_flow_action action[MAX_ACTION_NUM];struct rte_flow *flow = NULL;struct rte_flow_action_queue queue = {.index = rx_q};struct rte_flow_item_ipv4 ip_spec;struct rte_flow_item_ipv4 ip_mask;/* >8 End of declaring structs being used. */int res;memset(pattern, 0, sizeof(pattern));memset(action, 0, sizeof(action));/* Set the rule attribute, only ingress packets will be checked. 8< */memset(&attr, 0, sizeof(struct rte_flow_attr));attr.ingress = 1;/* >8 End of setting the rule attribute. *//** create the action sequence.* one action only,  move packet to queue*/action[0].type = RTE_FLOW_ACTION_TYPE_QUEUE;action[0].conf = &queue;action[1].type = RTE_FLOW_ACTION_TYPE_END;/** set the first level of the pattern (ETH).* since in this example we just want to get the* ipv4 we set this level to allow all.*//* Set this level to allow all. 8< */pattern[0].type = RTE_FLOW_ITEM_TYPE_ETH;/* >8 End of setting the first level of the pattern. *//** setting the second level of the pattern (IP).* in this example this is the level we care about* so we set it according to the parameters.*//* Setting the second level of the pattern. 8< */memset(&ip_spec, 0, sizeof(struct rte_flow_item_ipv4));memset(&ip_mask, 0, sizeof(struct rte_flow_item_ipv4));ip_spec.hdr.dst_addr = htonl(dest_ip);ip_mask.hdr.dst_addr = dest_mask;ip_spec.hdr.src_addr = htonl(src_ip);ip_mask.hdr.src_addr = src_mask;pattern[1].type = RTE_FLOW_ITEM_TYPE_IPV4;pattern[1].spec = &ip_spec;pattern[1].mask = &ip_mask;/* >8 End of setting the second level of the pattern. *//* The final level must be always type end. 8< */pattern[2].type = RTE_FLOW_ITEM_TYPE_END;/* >8 End of final level must be always type end. *//* Validate the rule and create it. 8< */res = rte_flow_validate(port_id, &attr, pattern, action, error);if (!res)flow = rte_flow_create(port_id, &attr, pattern, action, error);/* >8 End of validation the rule and create it. */return flow;
}
/* >8 End of function responsible for creating the flow rule. */

最后

我们现在已经了解了 dpdk flow 最简单的使用了。难度大概是 “1+1=2”。

如果想要在日常工作中使用dpdk flow, 难度大概是解二元一次方程,需要看更多的示例代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/19265.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

「读书感悟」我们为什么要睡觉?

书名&#xff1a;我们为什么要睡觉&#xff1f; 作者&#xff1a;马修沃克 我觉得这是一本每个人都必须看的书&#xff0c;尤其是在如今卷上天的社会&#xff0c;部分人沉迷于学习工作&#xff0c;经常奋斗到半夜甚至通宵&#xff0c;更有甚者会有&#xff1a;“睡觉是在…

创建特定结构的二维数组:技巧与示例

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言&#xff1a;二维数组的奇妙世界 二、方法一&#xff1a;直接初始化 1. 初始化一个…

利润而不是损失:谁信任你的游戏本地化

中国游戏市场巨大且前景广阔。这尤其适用于移动游戏&#xff1a;Statista预测&#xff0c;2024年。它的收入将达到346.6亿美元。然而&#xff0c;这种巨大的财务潜力也有其反面&#xff1a;游戏进入市场的次数越多&#xff0c;它们就越难以相互争夺玩家的注意力。此外&#xff…

Docker搭建Redis主从 + Redis哨兵模式(一主一从俩哨兵)

我这里是搭建一主一从&#xff0c;俩哨兵&#xff0c;准备两台服务器&#xff0c;分别安装docker 我这里有两台centos服务器 主服务器IP&#xff1a;192.168.252.134 从服务器IP&#xff1a;192.168.252.135 1.两台服务器分别拉取redis镜像 docker pull redis 2.查看镜像 d…

Nginx配置及优化

Nginx配置及优化 前言nginx.conf拆分理解上线 最近在配置Nginx的时候&#xff0c;偶尔一些细致的理论有些模糊&#xff0c;配置起来费了点功夫&#xff0c;今天来详细写一下我个人的理解&#xff0c;文章参考了一些官网和其他优秀博主的文章http://t.csdnimg.cn/GbID9。 前言 …

一款免费的软件媒体系统软件!!【送源码】

Jellyfin是一个免费的软件媒体系统&#xff0c;让您在管理和流媒体控制您的媒体。它是专有的Emby和Plex的替代品&#xff0c;通过多个应用程序从专用服务器向最终用户设备提供媒体。Jellvfin是Emby的3.5.2版本的后裔&#xff0c;并被移植到.NETCore框架中&#xff0c;以实现完全…

安卓赤拳配音v1.0.2Ai配音神器+百位主播音色

Ai配音神器 本人自用版本&#xff01;超级稳定&#xff01;百位主播音色 登陆即可用 链接&#xff1a;https://pan.baidu.com/s/1WVsrYZqLaPAriHMMLMdPBg?pwdz9ru 提取码&#xff1a;z9ru

Linux: network: tcp spurious retrans 的一个原因

最近分析问题的时候&#xff0c;从wireshark里看有&#xff1a;tcp spurious retrans 的包&#xff0c;309这个是307 的retransmission&#xff0c;而且在308 回复了ACK。那为什么会重传&#xff1f; 从网上找了一些&#xff0c;比如 https://www.packetsafari.com/blog/2021…

MySQL-innodb后台线程

文章目录 一、结构图二、后台线程①Master Thread②IO Thread③Purge Thread④Page Cleaner Thread 拓展知识 一、结构图 二、后台线程 InnoDB是多线程的模型&#xff0c;因此其后台有多个不同的后台线程&#xff0c;负责处理不同的任务 后台线程有&#xff1a; ①Master Thr…

Godot引擎小白入门指南

哈喽&#xff0c;大家好呀&#xff0c;淼淼有来和大家见面啦&#xff0c;前几期和大家讲了Godot引擎的优势&#xff0c;Godot引擎是一款开源的跨平台游戏引擎&#xff0c;具有易学易用、功能强大、社区活跃等特点&#xff0c;因此备受开发者青睐。对于初学者来说&#xff0c;掌…

洗地机哪个牌子最好用?十大名牌洗地机排行榜

作为一种新兴的智能家居产品&#xff0c;洗地机的市场规模已经突破了百亿大关。如此庞大的市场自然吸引了大量资本的涌入&#xff0c;许多品牌纷纷推出自己的洗地机产品&#xff0c;试图在这个竞争激烈的市场中占据一席之地。然而&#xff0c;面对如此多的品牌和型号&#xff0…

语音控制系统的安全挑战与防御策略(下)

3、通用攻击缓解策略 3.1 活性检测 活性检测已成为VCS中一种普遍的防御策略&#xff0c;主要设计用来确定语音命令是否来自真实的人类。这种方法背后的基本前提是&#xff0c;大多数恶意命令都是机器生成的。这些命令通常通过扬声器播放或直接通过音频文件&#xff08;如WAV文…

鸿蒙应用模型:【Stage模型开发】概述

Stage模型开发概述 基本概念 下图展示了Stage模型中的基本概念。 图1 Stage模型概念图 [AbilityStage] 每个Entry类型或者Feature类型的HAP在运行期都有一个AbilityStage类实例&#xff0c;当HAP中的代码首次被加载到进程中的时候&#xff0c;系统会先创建AbilityStage实例…

《TCP/IP网络编程》(第十二章)I/O复用(2)

下面是基于I/O复用的回声服务器端和客户端代码 Linux系统 服务器端代码 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> // POSIX标准定义的通用函数&#xff0c;如close() #include <arpa/inet.h> // 提…

零售抄表系统是什么?

1.零售抄表系统的简述 零售抄表系统是一种现代化自动化软件&#xff0c;用以监控和管理方法各种各样公共事业的消耗&#xff0c;如电力工程、水、天然气等。这类系统规避了传统的人工抄水表方法&#xff0c;提升了效率&#xff0c;降低了不正确&#xff0c;并且提供即时用户数…

Blazor入门-连接MySQL的简单例子:列出数据+简单查询

参考&#xff1a; ASP.NET Core 6.0 Blazor Server APP并使用MySQL数据库_blazor mysql-CSDN博客 https://blog.csdn.net/mzl87/article/details/129199352 本地环境&#xff1a;win10, visual studio 2022 community, mysql 8.0.33 (MySQL Community Server), net core 6.0 目…

c++ stack容器

在C中&#xff0c;std::stack 是一个标准模板库&#xff08;STL&#xff09;中的容器适配器&#xff0c;它提供了一种后进先出&#xff08;LIFO, Last In First Out&#xff09;的数据结构。std::stack 容器适配器基于底层容器&#xff08;默认是 std::deque&#xff0c;但也可…

方法的重写--5.29

当子类对父类的方法不满意时&#xff0c;可以进行重写&#xff0c;但是方法名字要与父类一样。 举例&#xff0c;我用people来举例&#xff0c;我是打工人&#xff0c;然后再创一个student类&#xff0c;重写方法我不是打工人&#xff0c;我是读书人。代码如下&#xff0c;发现…

宠物空气净化器:猫毛过敏者的终极解决方案,养猫不再是梦!

我有一位朋友&#xff0c;猫猫的深度爱好者。但是每当与猫咪接触的时候就会出现过敏反应&#xff0c;例如浑身发痒、打喷嚏、呼吸困难、起红疹等。对此&#xff0c;有专家给出权威的解释&#xff1a;引发铲屎官过敏的“罪魁祸首”是一种叫做Feld1的蛋白质成分&#xff0c;而这种…

电表自动抄表系统:智能时代的能源管理新方式

1.界定和功能 电表自动抄表系统是一种现代化电力计量技术&#xff0c;它利用先进的通讯技术和互联网&#xff0c;完成了远程控制、实时电磁能数据采集和处理。系统的主要作用包含全自动载入电表数据信息、实时检测电力应用情况、出现异常报案及其形成详尽能源使用报告&#xf…