在之前的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访问标题。
只是写一个类似上面的功能,或者我需要做更多的事情吗?
谢谢。
答案 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);