如何在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);
}
我要分开
- 旗帜
- R数据
- Class
- TTL
并分别保存。有什么办法吗,我也可以放心地使用 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));
我正在使用 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);
}
我要分开
- 旗帜
- R数据
- Class
- TTL
并分别保存。有什么办法吗,我也可以放心地使用 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));