Networking sk_buff中的ARP头完全错误(linux内核模块)

Networking sk_buff中的ARP头完全错误(linux内核模块),networking,kernel,c,arp,Networking,Kernel,C,Arp,我正在尝试从nfho函数中的skb中提取ARP头。这是我的密码: int is_arp(struct sk_buff *skb) { struct arphdr *hdr = arp_hdr(skb); if(hdr->ar_pln != 4 || ar_hln != 6 || hdr->ar_hrd != ARPHRD_ETHER) { printk("%d %d\n", pln, hln); return NOT_ARP;

我正在尝试从
nfho
函数中的
skb
中提取ARP头。这是我的密码:

int is_arp(struct sk_buff *skb) {
    struct arphdr *hdr = arp_hdr(skb);
    if(hdr->ar_pln != 4 || ar_hln != 6 || hdr->ar_hrd != ARPHRD_ETHER) {
        printk("%d   %d\n", pln, hln);
        return NOT_ARP;
        }
    return ARP_PACKET;
}
函数
arp\u hdr()
嵌入到内核中。。。我仍然得到了错误的值,相比之下,如果我在用Wireshark进行嗅探时打印ip长度(4字节…当然是IPV4)和硬件长度(嗯…mac地址6是必须的),一些数据包绕过了我的钩子,即使它显示了错误的值


有人能告诉我问题出在哪里吗?

你的函数犯了一个逻辑错误,非正式地称为“乞求问题”。返回值应该指示“是否为ARP?”

但是如果你不知道这是不是真的(因为这是需要确认或反驳的命题),你怎么能从数据包中提取ARP报头呢


arp\u hdr
函数只是
skb\u network\u header
的包装器,它将指针投射到arp header类型。

您的函数犯了一个逻辑错误,非正式地称为“乞求问题”。返回值应该指示“是否为ARP?”

但是如果你不知道这是不是真的(因为这是需要确认或反驳的命题),你怎么能从数据包中提取ARP报头呢


arp\u hdr
函数只是
skb\u network\u header
的一个包装,它将指针投射到arp header类型。

这与在。。。。。。如果数据包不符合ARP协议的条款,那么指向的那些值将恰好被破坏。否则,当获取skb格式的数据包时,如何识别数据包是否为ARP数据包?ARP堆栈首先只接收具有ETH_ARP ethertype的帧。(这并不意味着它们不是垃圾或被截断的有效负载。)这与ARP验证在。。。。。。如果数据包不符合ARP协议的条款,那么指向的那些值将恰好被破坏。否则,当获取skb格式的数据包时,如何识别数据包是否为ARP数据包?ARP堆栈首先只接收具有ETH_ARP ethertype的帧。(这并不意味着它们不是垃圾或被截断的有效载荷。)