首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何访问DPDK 18.11.9中接收数据包的有效负载

如何访问DPDK 18.11.9中接收数据包的有效负载
EN

Stack Overflow用户
提问于 2020-08-13 18:02:55
回答 1查看 656关注 0票数 0

我在Ubuntu 18.04.I上运行dpdk-stable-18.11.9,外部卡不断生成UDP数据包(速率:40Gbps)。我希望在单端口NIC (ConnectX®-4 Lx EN 10/25/40/50GbE以太网适配卡单端口)中接收数据包。

我在DPDK SDK中看到了skeleton示例,并使用rte_eth_rx_burst(port_id,queue_id,pkts_burst, MAX_PKT_BURST)函数接收packets.In调试模式。我可以在pkts_burst中看到属性,但不能访问数据包有效负载。

如何访问数据包负载?哪个函数对我有帮助?

EN

回答 1

Stack Overflow用户

发布于 2020-08-13 23:42:43

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

代码语言:javascript
复制
    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示例代码片段。

代码语言:javascript
复制
#include <linux/if_vlan.h>

在主处理循环中

代码语言:javascript
复制
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 */
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63392719

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档