在内核模块代码中处理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?
答案 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()