You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DPDK克隆DNS查询报文出现IP/UDP长度异常及报文畸形问题求助

DPDK克隆修改DNS报文后出现长度与格式异常问题

使用dpdk-stable-19.11.10版本构建标准DNS查询报文,通过路由器(DUT)发送至DNS服务器/响应器时出现如下差异:

  • 直接构建报文发送无异常;
  • 通过rte_memcpy存储报文后用rte_pktmbuf_clone克隆,再通过rte_pktmbuf_mtod_offset修改L2-L7各层头部并重新计算报文长度发送时,DNS服务器端收到的报文出现Bogus IP length、bad UDP length及DNS畸形报文异常。

已通过ol_flags开启硬件校验和卸载,无相关问题。

直接构建报文的代码

m = rte_pktmbuf_alloc(info->q[qid].tx_mp);

dns_qhdr = rte_pktmbuf_mtod(m, struct dns_question_t *);
(.....dns question header)
pkt_size += sizeof(struct dns_question_t);

query_name = (unsigned char *)rte_pktmbuf_prepend(m, (strlen(dns_application_data) + 1));
prev_str_len = (strlen(dns_application_data) + 1);
memset(query_name, 0, prev_str_len);
strncpy((query_name), dns_application_data, (strlen(dns_application_data)));
pkt_size += (strlen(dns_application_data) + 1);

dns_hdr = (struct dns_new_hdr_t *)rte_pktmbuf_prepend(m, (uint16_t)sizeof(struct dns_new_hdr_t));
(.....dns header)
pkt_size +=  sizeof(struct dns_new_hdr_t);

udp_hdr = (struct udphdr *)rte_pktmbuf_prepend(m, (uint16_t)sizeof(struct udphdr));
l4_len = L4_UDP_HDR_SIZE + pkt_size;
udp_hdr->len = htons(l4_len);

ip_hdr = (struct iphdr *)rte_pktmbuf_prepend(m, (uint16_t)sizeof(struct iphdr));
ip_hdr->tot_len = htons(pkt_size + L3_IPV4_HDR_SIZE);

eth_hdr = (struct ethernet_hdr *)rte_pktmbuf_prepend(m, (uint16_t)sizeof(struct ethernet_hdr));

m->data_len = m->pkt_len = pkt_size;
rte_memcpy((struct rte_mbuf *)(store_packets[streams]), m, mbuf_len);
send_mbuf(m, port, qid); // calling `rte_eth_tx_burst` to send packets

克隆修改报文的代码

pkt_size = 0;
dns_hdr = (struct dns_new_hdr_t *) rte_pktmbuf_mtod_offset(m, struct dns_new_hdr_t *,sizeof(struct ethernet_hdr) + L3_IPV4_HDR_SIZE  + sizeof(struct udphdr));

unsigned char *query_name = (unsigned char*) rte_pktmbuf_mtod_offset(m, struct dns_qhdr *,sizeof(struct ethernet_hdr) + L3_IPV4_HDR_SIZE + sizeof(struct udphdr) + sizeof(struct dns_new_hdr_t));
prev_str_len = (strlen(dns_application_data) + 1);
memset(query_name, 0, prev_str_len);
strncpy((query_name), dns_application_data, (strlen(dns_application_data)));


dns_qhdr = (struct dns_question_t *) rte_pktmbuf_mtod_offset(m, struct dns_question_t*,(sizeof(struct ethernet_hdr) +  L3_IPV4_HDR_SIZE + sizeof(struct udphdr) + sizeof(struct dns_new_hdr_t) + prev_str_len));

pkt_size += sizeof(struct ethernet_hdr) +  L3_IPV4_HDR_SIZE + L4_UDP_HDR_SIZE +  sizeof(struct dns_new_hdr_t) + sizeof(struct dns_question_t) + prev_str_len;

ip_hdr = rte_pktmbuf_mtod_offset(m, struct iphdr *, (sizeof(struct ethernet_hdr)));
ip_hdr->tot_len = htons(pkt_size - sizeof(struct ethernet_hdr));

udp_hdr = (struct udphdr *)  rte_pktmbuf_mtod_offset(m, struct udphdr *,sizeof(struct ethernet_hdr) + sizeof(struct iphdr));
l4_len = sizeof(struct dns_question_t) + sizeof(struct dns_new_hdr_t) + prev_str_len + L4_UDP_HDR_SIZE;
udp_hdr->len = htons(l4_len);

m->data_len = m->pkt_len = pkt_size;
rte_eth_tx_burst();

已确保IPv4和UDP长度依赖DNS查询报文内容,在最后更新了相关长度值,且重新计算报文大小并设置m->data_len和m->pkt_len为pkt_size,克隆修改后发送的报文本应与直接构建的一致,但仍出现异常。

内容的提问来源于stack exchange,提问作者Das

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 18:06:41