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
相关产品推荐
相关产品推荐

