内核中ipv4分析—协议族的初始化

在内核中ipv4的初始化工作是由这个函数来做的。

static int __init inet_init(void)

而这个函数一开始要做的事就是注册协议族。如下:

rc = proto_register(&tcp_prot, 1);//注册tcp的协议族
。。。
rc = proto_register(&udp_prot, 1);//注册udp的协议族
。。。
rc = proto_register(&raw_prot, 1);//注册raw原始协议族
。。。

这些协议族都注册到proto_list这个链表上了,

static LIST_HEAD(proto_list);

关于已经注册的协议族的信息可以在/proc/net/protocols中查看。
如下,在我的系统中已经注册的协议族有PACKET,RAWv6,UDPLITEv6,UDPv6,TCPv6 ,UNIX,UDP-Lite,
RAW,UDP ,TCP,NETLINK
这里表示了这些协议族的使用情况和使用的内存分配方式,以及已经实现的方法。

而这些信息都是由net/core/sock.c 中的proto_seq_printf函数打印输出到protocols文件中的。原型如下:

static void proto_seq_printf(struct seq_file *seq, struct proto *proto)

在proc系统下对应的文件是/proc/net/protocols

helight@zhwen:/proc/net$ cat protocols
protocol size sockets memory press maxhdr slab module cl co di ac io in de sh ss gs se re sp bi br ha uh gp em
PACKET 520 0 -1 NI 0 no kernel n n n n n n n n n n n n n n n n n n n
RAWv6 680 0 -1 NI 0 yes kernel y y y n y y y n y y y y n y y y y n n
UDPLITEv6 664 0 -1 NI 0 yes kernel y y y n y y y n y y y y n n y y y y n
UDPv6 664 0 1 NI 0 yes kernel y y y n y n y n y y y y n n y y y y n
TCPv6 1332 1 31 no 304 yes kernel y y y y y y y y y y n y n n y y y y y
UNIX 452 326 -1 NI 0 yes kernel n n n n n n n n n n n n n n n n n n n
UDP-Lite 536 0 -1 NI 0 yes kernel y y y n y y y n y y y y y n y y y y n
RAW 516 0 -1 NI 0 yes kernel y y y n y y y n y y y y n y y y y n n
UDP 536 3 1 NI 0 yes kernel y y y n y n y n y y y y y n y y y y n
TCP 1204 21 31 no 304 yes kernel y y y y y y y y y y n y n n y y y y y
NETLINK 460 6 -1 NI 0 no kernel n n n n n n n n n n n n n n n n n n n

其中这里的cl co di ac io in de sh ss gs se re sp bi br ha uh gp em分别表示以下函数的实现。

proto_method_implemented(proto->close),
proto_method_implemented(proto->connect),
proto_method_implemented(proto->disconnect),
proto_method_implemented(proto->accept),
proto_method_implemented(proto->ioctl),
proto_method_implemented(proto->init),
proto_method_implemented(proto->destroy),
proto_method_implemented(proto->shutdown),
proto_method_implemented(proto->setsockopt),
proto_method_implemented(proto->getsockopt),
proto_method_implemented(proto->sendmsg),
proto_method_implemented(proto->recvmsg),
proto_method_implemented(proto->sendpage),
proto_method_implemented(proto->bind),
proto_method_implemented(proto->backlog_rcv),
proto_method_implemented(proto->hash),
proto_method_implemented(proto->unhash),
proto_method_implemented(proto->get_port),
proto_method_implemented(proto->enter_memory_pressure));

感觉有意思?来鼓励一下!
打赏黑光技术

2 thoughts on “内核中ipv4分析—协议族的初始化

Leave a Reply

Your email address will not be published. Required fields are marked *