在linux内核代码中为新协议定义头的位置

时间:2016-06-22 11:43:32

标签: header network-programming kernel

在之前的Linux内核中,sk_buff结构中曾经存在不同标头的并集。这被逐步淘汰,因为这被认为是多余的(我猜测,如果我错了,请纠正我) http://vger.kernel.org/~davem/skb_redundancy.html

现在我想添加一个新的传输协议及其自己的标头。我需要一个像udp_hdr

这样的函数

static inline struct udphdr *udp_hdr(const struct sk_buff *skb) { return (struct udphdr *)skb_transport_header(skb); }

所以我可以轻松地从sk_buff访问标题。

只是写一个类似上面的功能,或者我需要做更多的事情吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

我以前做过类似的事情。

快速回答:是的,你应该实现这样的辅助功能。 我建议您查看内核源代码net / ipv4 / udp.c中的代码,实现协议所需的相关函数(例如.udp_rcv(),udp_send_skb(),...)。

此外,您应该定义一个与任何现有传输协议ID都不冲突的协议ID。并将新协议注册到inet。 net / ipv4 / af_inet.c中的示例代码 inet_add_protocol(& udp_protocol,IPPROTO_UDP);

通过注册协议,IP层可以确定哪个传输层接收处理程序(例如,UDP情况下为.udp_rcv),以便在IP头中使用协议ID进行调用。 net / ipv4 / ip_input.c中的示例代码ip_local_deliver_finish()

205                 ipprot = rcu_dereference(inet_protos[protocol]);
206                 if (ipprot) {
207                         int ret;
208 
                        ... ...
216                         ret = ipprot->handler(skb);