歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> Linux內核

Linux內核--網絡協議棧深入分析(四)--套接字內核初始化和創建過程

本文分析基於Linux Kernel 3.2.1

更多請查看 Linux內核--網絡內核實現分析

1、系統初始化過程中會調用sock_init函數進行套接字的初始化,主要是進行緩存的初始化

  1. static int __init sock_init(void)  
  2. {  
  3.     int err;  
  4.   
  5.     /* 
  6.      *      初始化.sock緩存 
  7.      */  
  8.   
  9.     sk_init();  
  10.   
  11.     /* 
  12.      *      初始化sk_buff緩存 
  13.      */  
  14.     skb_init();  
  15.   
  16.     /* 
  17.      *      初始化協議模塊緩存 
  18.      */  
  19.   
  20.     init_inodecache();  
  21.         //注冊文件系統類型   
  22.     err = register_filesystem(&sock_fs_type);  
  23.     if (err)  
  24.         goto out_fs;  
  25.     sock_mnt = kern_mount(&sock_fs_type);  
  26.     if (IS_ERR(sock_mnt)) {  
  27.         err = PTR_ERR(sock_mnt);  
  28.         goto out_mount;  
  29.     }  
  30.   
  31.     /* The real protocol initialization is performed in later initcalls. 
  32.      */  
  33.   
  34. #ifdef CONFIG_NETFILTER   
  35.     netfilter_init();  
  36. #endif   
  37.   
  38. #ifdef CONFIG_NETWORK_PHY_TIMESTAMPING   
  39.     skb_timestamping_init();  
  40. #endif   
  41.   
  42. out:  
  43.     return err;  
  44.   
  45. out_mount:  
  46.     unregister_filesystem(&sock_fs_type);  
  47. out_fs:  
  48.     goto out;  
  49. }  

2、INET協議族的初始化函數

  1. static int __init inet_init(void)  
  2. {  
  3.     struct sk_buff *dummy_skb;  
  4.     struct inet_protosw *q;  
  5.     struct list_head *r;  
  6.     int rc = -EINVAL;  
  7.   
  8.     BUILD_BUG_ON(sizeof(struct inet_skb_parm) > sizeof(dummy_skb->cb));  
  9.   
  10.     sysctl_local_reserved_ports = kzalloc(65536 / 8, GFP_KERNEL);  
  11.     if (!sysctl_local_reserved_ports)  
  12.         goto out;  
  13.   
  14.     //下面注冊傳輸層協議操作集   
  15.     rc = proto_register(&tcp_prot, 1);  
  16.     if (rc)  
  17.         goto out_free_reserved_ports;  
  18.   
  19.     rc = proto_register(&udp_prot, 1);  
  20.     if (rc)  
  21.         goto out_unregister_tcp_proto;  
  22.   
  23.     rc = proto_register(&raw_prot, 1);  
  24.     if (rc)  
  25.         goto out_unregister_udp_proto;  
  26.   
  27.     rc = proto_register(&ping_prot, 1);  
  28.     if (rc)  
  29.         goto out_unregister_raw_proto;  
  30.   
  31.     //注冊INET協議族的handler   
  32.     (void)sock_register(&inet_family_ops);  
  33.   
  34. #ifdef CONFIG_SYSCTL   
  35.     ip_static_sysctl_init();  
  36. #endif   
  37.   
  38.     /* 
  39.      *  Add all the base protocols. 
  40.      */  
  41.     //將INET協議族協議數據包接收函數添加到系統中   
  42.     if (inet_add_protocol(&icmp_protocol, IPPROTO_ICMP) < 0)  
  43.         printk(KERN_CRIT "inet_init: Cannot add ICMP protocol\n");  
  44.     if (inet_add_protocol(&udp_protocol, IPPROTO_UDP) < 0)  
  45.         printk(KERN_CRIT "inet_init: Cannot add UDP protocol\n");  
  46.     if (inet_add_protocol(&tcp_protocol, IPPROTO_TCP) < 0)  
  47.         printk(KERN_CRIT "inet_init: Cannot add TCP protocol\n");  
  48. #ifdef CONFIG_IP_MULTICAST   
  49.     if (inet_add_protocol(&igmp_protocol, IPPROTO_IGMP) < 0)  
  50.         printk(KERN_CRIT "inet_init: Cannot add IGMP protocol\n");  
  51. #endif   
  52.   
  53.     /* Register the socket-side information for inet_create. */  
  54.     for (r = &inetsw[0]; r < &inetsw[SOCK_MAX]; ++r)  
  55.         INIT_LIST_HEAD(r);  
  56.     //將inetsw_array中的元素按套接字類型注冊到inetsw鏈表數組中   
  57.     for (q = inetsw_array; q < &inetsw_array[INETSW_ARRAY_LEN]; ++q)  
  58.         inet_register_protosw(q);  
  59.   
  60.     /* 
  61.      *  Set the ARP module up 
  62.      */  
  63.   
  64.     arp_init();  
  65.   
  66.     /* 
  67.      *  Set the IP module up 
  68.      */  
  69.   
  70.     ip_init();  
  71.   
  72.     tcp_v4_init();  
  73.   
  74.     /* Setup TCP slab cache for open requests. */  
  75.     tcp_init();  
  76.   
  77.     /* Setup UDP memory threshold */  
  78.     udp_init();  
  79.   
  80.     /* Add UDP-Lite (RFC 3828) */  
  81.     udplite4_register();  
  82.   
  83.     ping_init();  
  84.   
  85.     /* 
  86.      *  Set the ICMP layer up 
  87.      */  
  88.   
  89.     if (icmp_init() < 0)  
  90.         panic("Failed to create the ICMP control socket.\n");  
  91.   
  92.     /* 
  93.      *  Initialise the multicast router 
  94.      */  
  95. #if defined(CONFIG_IP_MROUTE)   
  96.     if (ip_mr_init())  
  97.         printk(KERN_CRIT "inet_init: Cannot init ipv4 mroute\n");  
  98. #endif   
  99.     /* 
  100.      *  Initialise per-cpu ipv4 mibs 
  101.      */  
  102.   
  103.     if (init_ipv4_mibs())  
  104.         printk(KERN_CRIT "inet_init: Cannot init ipv4 mibs\n");  
  105.   
  106.     ipv4_proc_init();  
  107.   
  108.     ipfrag_init();  
  109.   
  110.     dev_add_pack(&ip_packet_type);  
  111.   
  112.     rc = 0;  
  113. out:  
  114.     return rc;  
  115. out_unregister_raw_proto:  
  116.     proto_unregister(&raw_prot);  
  117. out_unregister_udp_proto:  
  118.     proto_unregister(&udp_prot);  
  119. out_unregister_tcp_proto:  
  120.     proto_unregister(&tcp_prot);  
  121. out_free_reserved_ports:  
  122.     kfree(sysctl_local_reserved_ports);  
  123.     goto out;  
  124. }  
Copyright © Linux教程網 All Rights Reserved