从sk_buff的网络头确定数据包是否为ipv4或ipv6

时间:2015-01-23 19:58:17

标签: linux networking linux-kernel

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

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

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

iphdr和ipv6hdr有通常的定义。

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

nf_ct_l3num(skb->nfct)可以告诉您是否已经初始化此skb的conntrack后它是IPv4还是IPv6。