dpdk l2forward example + hyperscan

简介: 1.如何实现端口过滤 2.如何实现协议过滤 dpdk收包nb_rx = rte_eth_rx_burst(portid, 0, pkts_burst, MAX_PKT_BURST); 解析包的五元组 l2fwd_parse_ipv4_5tuple(m, &tuple); 判断五元组中port与协议与给定值是否相同 if (tuple.
1. GITHUB路径
https://github.com/MiterV1/dpdk-hyperscan

1.如何实现端口过滤
2.如何实现协议过滤

dpdk收包
nb_rx = rte_eth_rx_burst(portid, 0, pkts_burst, MAX_PKT_BURST); 解析包的五元组 l2fwd_parse_ipv4_5tuple(m, &tuple); 判断五元组中port与协议与给定值是否相同

if (tuple.port_src == get_ui_port_filter_src_port() || tuple.port_dst == get_ui_port_filter_dst_port()) {
    dump_pcap_write(dump_fd, m);
    continue;
}

if (tuple.proto == proto) {
    dump_pcap_write(dump_fd, m);
    continue;
}

相同则将包数据写到pcap文件中

3.如何实现应用过滤

先计算五元组的hash值,先在hash表中查看是否包含该hash项
如果有该hash项则说明为某条应用流,直接dump到pcap文件
m_data.hash = rte_hash_hash(m_data.handle, &tuple);
m_data.tuple = &tuple;

int ret = rte_hash_lookup_with_hash(m_data.handle, &tuple, m_data.hash);
if (ret > 0) {
    dump_pcap_write(dump_fd, m);

    如果在hash表中未找到该hash项,那么说明需要对该数据包进行匹配,使用hyperscan提取其中的特征信息
    if (hs_scan_stream(g_streams[m_data.hash % 4096], rte_pktmbuf_mtod(m, char *),
            rte_pktmbuf_data_len(m), 0, g_scratch, eventHandler, &m_data) != HS_SUCCESS) {
        fprintf(stderr, "hs_scan_stream error.\n");
    }
    
    调用scan_stream函数对数据包匹配之前编译的规则信息,如果匹配成功则调用eventHandler函数
    该函数将添加该流信息到流表中,用于后续的流表匹配
static int eventHandler(unsigned int id, unsigned long long from,
                        unsigned long long to, unsigned int flags, void *ctx)
{
    printf("Match for pattern \"%d\" at offset %llu\n", id, to);

    struct matched_data *mdata = (struct matched_data *)ctx;
    rte_hash_add_key_with_hash(mdata->handle, mdata->tuple, mdata->hash);

    return 0;
}


4. GTK3.0 GUI界面

使用GTK3.0添加前端界面与后端程序进行交互,效果如图所示:
gui


4. 源码安装相关

工程目录如下所示:
dpdk  hyperscan  l2fwd-hyperscan

1. 安装hyperscan
sudo apt-get install cmake
sudo apt-get install libboost-all-dev
sudo apt-get install ragel
sudo apt-get install libpcap-dev
sudo apt-get install sqlite3

cmake CMakeLists.txt
make
2. 安装并编译DPDK
3. 绑定网卡

4. 编译工具
    export RTE_SDK=你的DPDK路径到x86_64-native-linuxapp-gcc级别:例如/home/user/work/dpdk/x86_64-native-linuxapp-gcc
    export HYPERSCAN_SDK=你的hyperscan路径:例如/home/user/work/hyperscan
    cd l2fwd-hyperscan
    cd src
    make

5. 启动工具
    cd ../
    ./l2fwd-hyperscan -c 1 -n 1 -- -p 1
目录
相关文章
|
网络性能优化 网络协议 网络虚拟化
|
存储 缓存 网络协议
DPDK入门(环境搭建以及小demo)
DPDK入门(环境搭建以及小demo)
1193 0
|
应用服务中间件 测试技术 nginx
dpdk环境搭建及运行helloworld测试
dpdk环境搭建及运行helloworld测试
578 0
|
Linux API 调度
深入了解DPDK:如何优化网络包处理性能(上)
深入了解DPDK:如何优化网络包处理性能
深入了解DPDK:如何优化网络包处理性能(上)
|
12月前
|
XML 小程序 前端开发
小程序制作教程
小程序制作教程
729 3
小程序制作教程
|
存储 安全 Linux
从零开始学习DPDK:掌握这些常用库函数就够了(上)
从零开始学习DPDK:掌握这些常用库函数就够了
|
存储 机器学习/深度学习 人工智能
深入浅出 AI 智能体(AI Agent)|技术干货
随着人工智能技术的发展,智能体(AI Agents)逐渐成为人与大模型交互的主要方式。智能体能执行任务、解决问题,并提供个性化服务。其关键组成部分包括规划、记忆和工具使用,使交互更加高效、自然。智能体的应用涵盖专业领域问答、资讯整理、角色扮演等场景,极大地提升了用户体验与工作效率。借助智能体开发平台,用户可以轻松打造定制化AI应用,推动AI技术在各领域的广泛应用与深度融合。
26056 1
|
Linux 编译器 C语言
Linux中的pkg-config:简化库依赖管理的利器
**pkg-config**是Linux下管理库依赖的工具,它通过读取库的`.pc`文件提供编译和链接参数。使用`pkg-config --cflags --libs <library>`获取编译和链接选项,例如`gcc -o test test.c $(pkg-config --cflags --libs glib-2.0)`。能进行版本检查、参数提取、依赖管理和路径搜索。列出所有包用`pkg-config --list-all`。最佳实践包括确保库正确安装、检查版本、配置`PKG_CONFIG_PATH`及使用构建工具。
|
关系型数据库 MySQL Linux
关系型数据库mysql的跨平台支持
【6月更文挑战第12天】
553 1
|
网络协议 测试技术 API
20个基于DPDL开源项目,带你冲破内核瓶颈(下)
20个基于DPDL开源项目,带你冲破内核瓶颈(下)