学习Linux-4.12内核网路协议栈(1.4)——协议栈的初始化(proto_init)

这篇文章主要分析proto_init过程,它完成协议相关proc文件的创建


3241 static __net_initdata struct pernet_operations proto_net_ops = {
3242     .init = proto_init_net,
3243     .exit = proto_exit_net,
3244 };

3246 static int __init proto_init(void)
3247 {
3248     return register_pernet_subsys(&proto_net_ops);
3249 }
3250
3251 subsys_initcall(proto_init);

 948 int register_pernet_subsys(struct pernet_operations *ops)
 949 {
 950     int error;
 951     mutex_lock(&net_mutex);
 952     error =  register_pernet_operations(first_device, ops);
 953     mutex_unlock(&net_mutex);
 954     return error;
 955 }
 956 EXPORT_SYMBOL_GPL(register_pernet_subsys);

该函数的主要作用是将一个网络协议模块添加到每一个网络命令空间中,然后再执行其ops->init程序进行初始化,一般其ops->init会在其对应的proc目录下,生成一个网络协议模块对应的proc文件或proc目录,并执行一些协议初始化相关的函数。

关于register_pernet_subsys函数可以参考这篇文章


3227 static __net_init int proto_init_net(struct net *net)
3228 {
3229     if (!proc_create("protocols", S_IRUGO, net->proc_net, &proto_seq_fops))
3230         return -ENOMEM;
3231
3232     return 0;
3233 }
3234
3235 static __net_exit void proto_exit_net(struct net *net)
3236 {
3237     remove_proc_entry("protocols", net->proc_net);
3238 }

proto_init_net和proto_exit_net只进行了protocols  proc文件的创建,里面可以查看协议相关的一些信息:


## cat /proc/net/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
PPPOE      552      0      -1   NI       0   no   pppoe       n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n
SCTPv6    1048      1       0   no       0   yes  sctp        y  y  y  y  y  y  y  y  y  y  y  y  n  y  y  y  y  y  y
SCTP       928      0       0   no       0   yes  sctp        y  y  y  y  y  y  y  y  y  y  y  y  n  y  y  y  y  y  y
PACKET     896     26      -1   NI       0   no   kernel      n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n
PINGv6     752      0      -1   NI       0   yes  kernel      y  y  y  n  n  y  n  n  y  y  y  y  n  y  y  y  y  y  n
RAWv6      752      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  744      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      744      3      15   NI       0   yes  kernel      y  y  y  n  y  n  y  n  y  y  y  y  n  n  y  y  y  y  n
TCPv6     1392      1       6   no     304   yes  kernel      y  y  y  y  y  y  y  y  y  y  y  y  y  n  y  y  y  y  y
UNIX       640     46      -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   624      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
PING       592      0      -1   NI       0   yes  kernel      y  y  y  n  n  y  n  n  y  y  y  y  n  y  y  y  y  y  n
RAW        600      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        624     27      15   NI       0   yes  kernel      y  y  y  n  y  n  y  n  y  y  y  y  y  n  y  y  y  y  n
TCP       1272     15       6   no     304   yes  kernel      y  y  y  y  y  y  y  y  y  y  y  y  y  n  y  y  y  y  y
NETLINK    600      9      -1   NI       0   no   kernel      n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n  n

看来没什么实质性的操作 , 还是接下来看看inet_init函数吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值