DPDK的中testpmd和pktgen的使用

本文详细解析了DPDK及pktgen工具的参数配置,包括如何指定CPU核、内存通道数量、虚拟网卡创建、端口绑定及混杂模式等关键操作。适用于网络性能测试与优化的专业人士。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

./testpmd -l 0-1 -n 1 --file-prefix=test --no-pci --vdev 'net_virtio_user2,mac=00:00:00:00:00:02,path=/var/run/openvswitch/vhost-user2' -- -i --forward-mode=io  --auto-start
    ./testpmd -l 0-1 -n 1 --vdev 'eth_vhost0,iface=/tmp/virtio/sock0' --vdev 'eth_vhost1,iface=/tmp/virtio/sock1' --file-prefix=test --no-pci -- -i  --forward-mode=io  --auto-start
    # -l 列出所使用的CPU核
    # -n 给出memory channels的数量
    # --socket-mem 限制用于每个socket的内存量(单位:M)
    # --vdev 创建vhost的socket文件用于进行网络连接,可以理解为虚拟网卡
    # --file-prefix hugepages字首,用于区分所使用的hugepage
    # testpmd的参数
    # --forward-mode=io 对两个端口情况从一个端口进来的包直接从另一个端口发出
 

pktgen -c 5 -n 3 --vdev='virtio_user0,path=/tmp/virtio/sock0' --vdev='virtio_user1,path=/tmp/virtio/sock1' -- -P -m "1.0,2.1"
    # DPDK的参数同上,--vdev在这里用来连接到socket文件
    # pktgen的参数
    # -P 在所有端口启用混杂模式
    # -m 定义CPU核到端口的绑定,在这里core5绑定到prot0,core6绑定到port1

     -c 是指选择的core的掩码,f等于1111也就是选择 1、2 、3、4 core;
    -m "2.0, 3.1" 是指一个矩阵模型,2.0是指,在2号lcore上绑定的端口0 , 3.1是指在lcore3上绑定端口1
    -P 使能网络混装模式,
    --file-prefix pg 设置/mnt/huge/内存分配模块的文件名前缀;

 

# 查看物理CPU个数
cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l

# 查看每个物理CPU中core的个数(即核数)
cat /proc/cpuinfo| grep "cpu cores"| uniq

# 查看逻辑CPU的个数
cat /proc/cpuinfo| grep "processor"| wc -l

DPDK (Data Plane Development Kit) 的 testpmd 工具中,构建 IP-in-IP (IP over IP, 或者称为隧道封装) 的报文通常涉及到以下几个步骤: 1. **初始化结构体**:首先,你需要创建一个包含IP头部一个内部IP头部的 `struct rte_ipv4_hdr` 结构体数组。每个元素将代表一个完整的IP-in-IP封装报文。 ```c struct rte_ipv4_hdr outer_hdr; struct rte_ipv4_hdr inner_hdr; ``` 2. **填充外层头部**:设置外层头部的数据,包括源地址、目的地址、协议类型(通常是IPv4,即0x0800),以及偏移量等字段。 ```c outer_hdr.src_addr = ...; // 源IP地址 outer_hdr.dst_addr = ...; // 目的IP地址 outer_hdr.protocol = IPPROTO_IP; // 外层协议(IPv4) outer_hdr.ip_len = sizeof(outer_hdr); // 外层头部长度 ``` 3. **填充内层头部**:如果需要创建第二层IP头部(比如为了嵌套更多的隧道),按照同样的方式填充内层IP头,替换掉外层的协议类型为17(UDP,因为IP-in-IP通常使用UDP作为封装协议)。 ```c inner_hdr.src_addr = ...; // 内部源IP地址 inner_hdr.dst_addr = ...; // 内部目的IP地址 inner_hdr.protocol = IPPROTO_UDP; // 内部协议 inner_hdr.ip_len = sizeof(inner_hdr); // 内部头部长度 ``` 4. **设置TTLID**:更新两层头部的TTL (Time To Live) 标识符字段。 5. **数据区总长度**:在头部之后添加实际的数据,并计算总长度(包括头部数据部分)。 6. **填充报文**:将填充好的头部复制到内存池中,然后分配足够的空间存放整个报文,包括头部数据。 7. **发送报文**:通过 DPDK 的 API,如 `rte_eth_tx_burst()` 将封装后的报文发送到网络。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值