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



在以前的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访问标头。

仅写类似的函数,就像上述技巧一样,还是我需要做更多的事情?

谢谢。

我之前做过类似的事情。

快速答案:是的,您应该这样实现类似的助手功能。我建议您查看内核源网/ipv4/udp.c中的代码,实现协议所需的相关功能(例如,udp_send_skb(),...

您还应该定义与任何现有的传输协议ID不冲突的协议ID,并将您的新协议注册到INET。net/ipv4/af_inet中的示例代码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);