Linux 确定数据包是来自sku buff'的ipv4还是ipv6;s网络头

Linux 确定数据包是来自sku buff'的ipv4还是ipv6;s网络头,linux,networking,linux-kernel,Linux,Networking,Linux Kernel,我有“struct sk_buff”类型的SKB,我试图确定数据包是IPv4还是IPv6类型。基本上我需要源IP地址,但不知道如何检查iph或ipv6h中的“版本”字段,或者不知道这是否是检查“版本”值的可靠方法 我的机器上的sk_buff实现中的网络头是: union { struct iphdr *iph; struct ipv6hdr *ipv6h; struct arphdr *arph; unsigned ch

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

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

union {
        struct iphdr    *iph;
        struct ipv6hdr  *ipv6h;
        struct arphdr   *arph;
        unsigned char   *raw;
} nh;
iphdr和ipv6hdr有通常的定义


如何从sk_buff中的IP网络头确定IP版本?

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

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

nf\u ct\u l3num(skb->nfct)
可以在初始化此skb的conntrack后告诉您它是ipv4还是IPv6

nf\u ct\u l3num(skb->nfct)
可以在初始化此skb的conntrack后告诉您它是IPv4还是IPv6