我在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中看到属性,但不能访问数据包有效负载。
如何访问数据包负载?哪个函数对我有帮助?
发布于 2020-08-13 23:42:43
为了访问接收到的包的以太网有效载荷,使用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 */
}https://stackoverflow.com/questions/63392719
复制相似问题