本文参看代码版本为2.6.35.8
inet_init 分析
1,proto_register():分别注册变量tcp_prot,udp_prot,raw_prot。不负责的听说这里是注册到了私有链表,仅用于/proc。2,sock_register(inet_family_ops),在全局数组net_family里面注册inet_family_ops。
static const struct net_proto_family inet_family_ops = {
.family = PF_INET,
.create = inet_create, //创建socket时需要调用的函数
.owner = THIS_MODULE,
};
3,inet_add_protocol():分别注册变量icmp_protocol udp_protocol tcp_protocol,在全局数组inet_protos里面,填充IPPROTO_ICMP IPPROTO_TCP IPPROTO_UDP对应区域。猜测该数组用于ip层向上送数据时,被查找以确定正确的四层接收函数。tcp_protocol定义如下:
static const struct net_protocol tcp_protocol = {
.handler = tcp_v4_rcv, //最为重要的传输层接收函数
.err_handler = tcp_v4_err,
.gso_send_check = tcp_v4_gso