2

在处理内核模块代码中的 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?

4

2 回答 2

0

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

对于您的问题:
调用 skb_network_header() 的调用者应该保证他知道协议。证明:你可以找到很多对 skb_network_header() 的引用,包括 arp_hdr()、ipv6_hdr()、ip_hdr() 等。调用 arp_hdr() 将网络头转换为 aprhdr 的调用者,将保证协议是 AR​​P。

于 2013-05-20T06:58:44.517 回答
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()
于 2013-07-23T10:53:59.573 回答