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

2009年11月11日 | 由 helight | 800字 | 阅读大约需要2分钟 | 归档于 kernel | 标签 #kernel

在内核中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));