inet_init
是 Linux 内核中用于初始化 TCP/IP 协议栈的函数。它在内核启动时被调用,完成各种协议和数据结构的注册和初始化。
主要功能:
- 注册 TCP、UDP、ICMP 等协议。
- 初始化 ARP、IP 和其他网络协议模块。
- 设置 socket 操作和协议处理。
前后调用关系链:
start_kernel()
└── rest_init()
└── kernel_init()
└── do_basic_setup()
└── do_initcalls()
└── inet_init()
├── proto_register(&tcp_prot, 1)
├── proto_register(&udp_prot, 1)
├── proto_register(&raw_prot, 1)
├── proto_register(&ping_prot, 1)
├── sock_register(&inet_family_ops)
├── inet_add_protocol(&icmp_protocol, IPPROTO_ICMP)
├── inet_add_protocol(&udp_protocol, IPPROTO_UDP)
├── inet_add_protocol(&tcp_protocol, IPPROTO_TCP)
├── arp_init()
├── ip_init()
├── tcp_v4_init()
├── udp_init()
├── ping_init()
├── icmp_init()
└── init_ipv4_mibs()
再来看源代码:
static int __init inet_init(void)
{
struct sk_buff *dummy_skb;
struct inet_protosw *q;
struct list_head *r;
int rc = -EINVAL;
BUILD_BUG_ON(sizeof(struct inet_skb_parm) > sizeof(dummy_skb->cb));
sysctl_local_reserved_ports = kzalloc(65536 / 8, GFP_KERNEL);
if (!sysctl_local_reserved_ports)
goto out;
rc = proto_register(&tcp_prot, 1);
if (rc)
goto out_free_reserved_ports;
rc = proto_register(&udp_prot, 1);
if (rc)
goto out_unregister_tcp_proto;
rc = proto_register(&raw_prot, 1);
if (rc)
goto out_unregister_udp_proto;
rc = proto_register(&ping_prot, 1