如何在dpdk数据包中显示或做eDNS?

How to display or do eDNS in dpdk packets?

我正在使用 l2fwd-dpdk 应用程序,我可以从中提取 5 元组,并且可以查看 DNS 数据包是否存在。

现在我想使用 dpdk 对 DNS 数据包进行分类,但我失败了。 这是我的代码。

 struct rte_udp_hdr *udp_hdr;
 struct dnshdr *dns_hdr;

 if (rte_be_to_cpu_16(udp_hdr->dst_port) == 53)
 {  
 printf("DNS Packet");
 char *dns_hdr = (char *)udp_hdr + sizeof(rte_udp_hdr);
 }

我要分开

并分别保存。有什么办法吗,我也可以放心地使用 cpp 包装器。

截至 21.08 DPDK 不包含任何 header 或类型转换为 DNS 数据包的结构。因此,解决@wildplasser 提到的问题的最简单方法是声明您的自定义 DNS header 并使用它。在你的代码片段中,你已经有了 struct dnshdr *dns_hdr; 所以更简单的方法是修改你现有的代码以反映

 struct rte_udp_hdr *udp_hdr;
 struct dnshdr *dns_hdr;

/* use DPDK mtod API to get the start of ethernet frame */
/* check for packet size, ether type, IP protocol */
/* update udp_hdr to position in the packet */

 if (rte_be_to_cpu_16(udp_hdr->dst_port) == 53)
 {  
 printf("DNS Packet");
 struct dnshdr *dns_hdr = (struct dnshdr *)((char *)udp_hdr + sizeof(rte_udp_hdr));
 }

注意:可能的结构定义代码片段是

typedef struct {
    uint16_t id;
    uint16_t rd:1;
    uint16_t tc:1;
    uint16_t aa:1;
    uint16_t opcode:4;
    uint16_t qr:1;
    uint16_t rcode:4;
    uint16_t zero:3;
    uint16_t ra:1;
    uint16_t qcount;    /* question count */
    uint16_t ancount;   /* Answer record count */
    uint16_t nscount;   /* Name Server (Autority Record) Count */ 
    uint16_t adcount;   /* Additional Record Count */
} custom_dnshdr;

custom_dnshdr *dns_hdr = (custom_dnshdr *) ((char *)udp_hdr + sizeof(rte_udp_hdr));