sk_buff 中的 ARP headers 全部错误(linux 内核模块)

ARP headers out of sk_buff comes out all wrong(linux kernel module)

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

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_hdr() 嵌入在内核中...与打印 ip 长度(4 字节...当然是 IPV4)和硬件相比,我仍然得到错误的值长度(好吧... mac 地址 6 是必须的)在使用 Wireshark 嗅探时,一些数据包绕过了我的钩子,即使它显示了错误的值......

谁能告诉我这是什么问题?

您的函数犯了一个非正式的逻辑谬误 "begging the question"。 return 值应该表示 "is this ARP or not?"

但是如果你不知道这是否正确(因为这是要确认或反驳的命题),你怎么能从数据包中提取 ARP header?

arp_hdr 函数只是 skb_network_header 的包装器,它将指针转换为 arp header 类型。