Network programming sk_buff上的ip_hdr()是否保证工作?

Network programming sk_buff上的ip_hdr()是否保证工作?,network-programming,linux-kernel,ip,netfilter,Network Programming,Linux Kernel,Ip,Netfilter,在内核模块代码中处理sk_buff时,我看到许多代码示例都使用了这两种方法 (struct iphdr *)skb_network_header(skb) //skb is an instance of (struct sk_buff*) 或者函数ip_hdr(),它实际上是相同的(调用skb_network_头并进行转换)。这安全吗?如果我们对sk_buff的来源没有任何假设,那么我可以做一个检查来确保网络协议确实是IP协议吗 编辑:这可能是一个sku buff,唯一可能的网络协议是IP,但

在内核模块代码中处理sk_buff时,我看到许多代码示例都使用了这两种方法

(struct iphdr *)skb_network_header(skb) //skb is an instance of (struct sk_buff*)
或者函数ip_hdr(),它实际上是相同的(调用skb_network_头并进行转换)。这安全吗?如果我们对sk_buff的来源没有任何假设,那么我可以做一个检查来确保网络协议确实是IP协议吗


编辑:这可能是一个sku buff,唯一可能的网络协议是IP,但我仍然希望看到一个“证据”或解释。例如,如果我在Linux内核中实现自己的协议,而网络协议头可能是其他东西,该怎么办?如何确保网络传输协议确实是IP?

skb指套接字缓冲区,用于表示和管理Linux内核中的数据包的数据结构。
并且Linux网络系统的实现设计为独立于特定协议。
将为您提供更多详细信息。

回答您的问题:

调用skb_network_header()的调用方应该保证他知道协议。证明:您可以找到许多对skb_网络头()的引用,包括arp_hdr()、ipv6_hdr()、ip_hdr()等。调用arp_hdr()将网络头转换为APHRDR的调用方将保证协议是arp。

回答我自己,因为当时我找到了更完整的答案

可以通过sk_buff结构的“protocol”字段确保协议是IP。例如:

if (skb->protocol != htons(ETH_P_IP)) return ERROR_NOT_IP; //ERROR_NOT_IP defined by me

struct iphdr* ip_header = ip_hdr(skb); //Now that we know the protocol we can use ip_hdr()