我使用的是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包装。
发布于 2021-09-21 13:06:52
从21.08开始,DPDK不包含到DNS数据包的任何标头或结构。因此,解决@通配符中提到的问题的最简单方法是声明您的自定义DNS头并使用它。在您的代码片段中,您已经有了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));https://stackoverflow.com/questions/69268224
复制相似问题