我们如何在DPDK 18.11.9中访问已接收数据包的有效负载

问题描述

我在dpdk-stable-18.11.9上运行Ubuntu 18.04我有一个外部卡正在连续生成UDP数据包(速率:40Gbps),我想在单端口NIC(ConnectX®- 4个Lx EN 10/25/40 / 50GbE以太网适配器卡(单端口)。

我在skeleton中看到了DPDK SDK的示例,并使用了rte_eth_rx_burst(port_id,queue_id,pkts_burst,MAX_PKT_BURST)函数来接收数据包。在调试模式下,我可以在pkts_burst中看到属性,但是我无法访问数据包有效载荷。

如何访问数据包有效负载?有什么功能可以帮助我?

解决方法

为了访问接收到的数据包的以太网有效负载,请使用DPDK API rte_pktmbuf_mtod()

    for (i = 0; i < nb_rx; i++) {
        /* access payload of rcv'd pkt at ethernet header */
        eth_hdr = rte_pktmbuf_mtod(pkt,struct ether_hdr *);
    }

但是,如果目的不只是以太网头,那么您可以参考下面的ipv4示例代码片段。

#include <linux/if_vlan.h>

在主处理循环中

uint16_t i,nb_rx,len;
uint16_t ether_type;
struct ether_hdr *eth_hdr;
struct vlan_hdr *vh;
uint16_t *proto;
struct ipv4_hdr *ip_hdr;
struct rte_mbuf *pkts_burst[MAX_PKT_BURST];

/* rcv burst of pkts from interface,on success returns no. of pkts rcv'd  */
nb_rx = rte_eth_rx_burst(port_id,queue_id,pkts_burst,MAX_PKT_BURST)

/* Loop through rcv'd pkts */
for (i = 0; i < nb_rx; i++) {
    /* update len on each iteration to 0 */
    len = 0;

    /* access payload of rcv'd pkt at ethernet header */
    eth_hdr = rte_pktmbuf_mtod(pkts_burst[i],struct ether_hdr *);

    if (rte_cpu_to_be_16(ETHER_TYPE_VLAN) == eth_hdr->ether_type) {
        len = sizeof(struct ether_hdr);
        vh = (struct vlan_hdr *)(eth_hdr + 1);

        proto = vh->eth_proto;
        if (rte_cpu_to_be_16(ETHER_TYPE_VLAN) == *proto) {
            len += sizeof(struct vlan_hdr);
            proto = vh->eth_proto;
        }

         /* free up non ipv4 packets */
         if (rte_cpu_to_be_16(ETHER_TYPE_IPv4) != *proto)
             rte_pktmbuf_free(pkt);
    }

    /* access IP header of rcv'd pkt */
    ip_hdr = (struct ipv4_hdr *)(rte_pktmbuf_mtod(pkts_burst[i],char *) + len);   

    /* process packets which are ipv4 */
}