在以前的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);