如何解决我们如何在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 */
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。