ip层和4层的接口实现分析
2009-09-10 00:00:00 来源:WEB开发网首先来看一下基于3层的ipv4以及ipv6实现的一些4层的协议:
图片看不清楚?请点击这里查看原图(大图)。
这里要注意并没有IGMPV6,这是因为在ipv6中,它是作为iCMPv6的一部分实现的.
首先我们要知道输入数据包的ip头中的protocol域标识了,将要传递的4层协议.
我们这里主要介绍的是ip数据包从3层传递到4层的接口(也就是输入帧接口).而输出帧的处理,我前面的blog都已经有介绍,想了解的话,可以去看前面的blog.
先来看主要的数据结构,然后我们会分析ip_local_deliver_finish函数(也就是3层处理的出口函数).
在内核中,每一个4层协议都是一个net_protocol结构体,而内核会在启动的时候将所有的4层协议都注册到一个数组inet_protos中,然后根据数据包的ip头来得到相应的handle函数:
Java代码
struct net_protocol {
///协议的处理函数,也就是将要处理输入数据报的4层协议的处理函数.
int (*handler)(struct sk_buff *skb);
///协议的错误处理函数.
void (*err_handler)(struct sk_buff *skb, u32 info);
///gso相关的两个函数.
int (*gso_send_check)(struct sk_buff *skb);
struct sk_buff *(*gso_segment)(struct sk_buff *skb,
int features);
///主要是被ipsec所使用的两个域
unsigned int no_policy:1,
netns_ok:1;
};
更多精彩
赞助商链接