确定数据包是来自 sk_buff 的网络 header 的 ipv4 还是 ipv6

Determining if a packet is ipv4 or ipv6 from sk_buff's network header

我有 'struct sk_buff' 类型的 SKB,我试图确定数据包是 IPv4 还是 IPv6 类型。基本上我需要源 IP 地址,但不知道如何检查 iph 或 ipv6h 中的 'version' 字段,或者不知道它是否是检查 'version' 值的可靠方法。

网络 header 在我机器上的 sk_buff 实现中是:

union {
        struct iphdr    *iph;
        struct ipv6hdr  *ipv6h;
        struct arphdr   *arph;
        unsigned char   *raw;
} nh;

并且iphdr和ipv6hdr有通常的定义。

如何从sk_buff中的IP网络header判断IP版本?

出于这个原因,无论是 ipv4 还是 ipv6,IP 版本号都编码在数据包的前 4 位中。使用 ipv4 指针 (ipv) 并检查 version 字段。

nf_ct_l3num(skb->nfct)可以告诉你是IPv4还是IPv6,在这个skb的conntrack初始化之后。