sk_buff上的ip_hdr()是否可以正常工作?

时间:2013-05-18 21:48:43

标签: 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_header和强制转换)。这样安全吗?如果我们对sk_buff的来源没有任何假设,我是否可以做以确保网络协议确实是IP?

编辑:可能有一个sk_buff唯一可能的网络协议是IP,但我仍然希望看到“证明”或解释。如果我在Linux内核中实现自己的协议,例如网络协议头可能是其他什么呢?如何确保网络传输协议确实是IP?

2 个答案:

答案 0 :(得分:0)

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

提出您的问题:
调用skb_network_header()的调用者应该保证他知道protocal。证明:你可以找到许多对skb_network_header()的引用,包括arp_hdr(),ipv6_hdr(),ip_hdr()等。调用arp_hdr()将网络头转换为aprhdr的调用者将保证protocal是ARP。 / p>

答案 1 :(得分:0)

回答自己,因为当时我找到了更全面的答案。

可以通过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()