关闭

Linux内核--网络栈实现分析(四)--网络层之IP协议(上)

发表于:2012-12-26 10:05

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:闫明    来源:51Testing软件测试网采编

  注:标题中的”(上)“,”(下)“表示分析过程基于数据包的传递方向:”(上)“表示分析是从底层向上分析、”(下)“表示分析是从上向下分析。

  简单分析了链路层之后,上升到网络层来分析,看看链路层是如何为其上层--网络层服务的。其实在驱动程序层和网络层直接还有一层是接口层,叫做驱动程序接口层,用来整合不同的网络设备。接口层的内容会在上下层中提及。这里我们分析网络IP协议的实现原理。

  其实现的文件主要是net/inet/ip.c文件中

  我们首先分析下ip_init()初始化函数

  这个函数是如何被调用的呢?

  下面是调用的过程:

  首先是在系统启动过程main.c中调用了sock_init()函数

void sock_init(void)//网络栈初始化
{
 int i;

 printk("Swansea University Computer Society NET3.019\n");

 /*
  * Initialize all address (protocol) families.
  */
 
 for (i = 0; i < NPROTO; ++i) pops[i] = NULL;

 /*
  * Initialize the protocols module.
  */

 proto_init();

#ifdef CONFIG_NET
 /*
  * Initialize the DEV module.
  */

 dev_init();
 
 /*
  * And the bottom half handler
  */

 bh_base[NET_BH].routine= net_bh;//设置NET 下半部分的处理函数为net_bh
 enable_bh(NET_BH);
#endif 
}

  然后调用了proto_init()函数

void proto_init(void)
{
 extern struct net_proto protocols[]; /* Network protocols 全局变量,定义在protocols.c中*/
 struct net_proto *pro;

 /* Kick all configured protocols. */
 pro = protocols;
 while (pro->name != NULL) //对所有的定义的域进行初始化
 {
  (*pro->init_func)(pro);
  pro++;
 }
 /* We're all done... */
}

  而protocols全局变量协议向量表的定义中对INET域中协议的初始化函数设置为inet_proto_init()

/*
 * Protocol Table
 */
 
struct net_proto protocols[] = {
#ifdef CONFIG_UNIX
  { "UNIX", unix_proto_init },
#endif
#if defined(CONFIG_IPX)||defined(CONFIG_ATALK) 
  { "802.2", p8022_proto_init },
  { "SNAP", snap_proto_init },
#endif
#ifdef CONFIG_AX25 
  { "AX.25", ax25_proto_init },
#endif 
#ifdef CONFIG_INET
  { "INET", inet_proto_init },
#endif
#ifdef  CONFIG_IPX
  { "IPX", ipx_proto_init },
#endif
#ifdef CONFIG_ATALK
  { "DDP", atalk_proto_init },
#endif
  { NULL, NULL  }
};

51/512345>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号