linux网络代码结构:四层
1、设备驱动,Linux/drivers/net/3c501.c
2、网络核心,linux/net/core/dev.c,struct net_device,
3、网络协议族,包括tcp/ip、ipx等协议,linux/net/ipv4
4、网络接口socket层,linux/net/socket.c
1->2: 第一层调用netif_rx()(net/core/dev.c 1214行) 通过*dev_base指向的设备链,把数据传递给第二层。
3->2: 网络接口核心层通过dev_queue_xmit()(net/core/dev.c,line975)这个函数向上层提供统一的发送接口,也就是说无论是IP,还是ARP协议,通过这个函数把要发送的数据传递给这一层,想发送数据的时候就调用这个函数就可以了。dev_queue_xmit()做的工作最后会落实到dev->hard_start_xmit(),而dev->hard_start_xmit()会调用实际的驱动程序来完成发送的任务。例如上面的例子中,调用dev->hard_start_xmit()实际就是调用了el_start_xmit()。
2->3: IP协议接收数据是通过ip_rcv()函数的,而ARP协议是通过arp_rcv()的,网络接口核心层只要通过这个数组就可以把数据交给上层函数了。
通过dev_add_pack注册第三层接收消息的函数。
3->4: 在linux/net/ipv4/protocol.c,往数组inet_protos[MAX_INET_PROTOS] 里面添加协议是通过函数inet_add_protocol()实现的,删除协议是通过 inet_del_protocol()实现的。在linux/net/ipv4/protocol.c的上部,我们可以看到其它协议层的处理函数是tcp_v4_rcv(), igmp_rcv(), udp_rcv(), icmp_rcv()。
4->3: ???
IP层处理方式:
1、本地
2、转发
3、不可能
dev_add_pack()是注册ip层内容的,及网络核心层在什么条件下把消息发给网络协议层;
inet_add_protocol()是注册传输层的,包含tcp、icmp、igmp;
socket_register()是注册socket的。
参考《linux网络接口的源码结构》:http://blog.csdn.net/wangbangjie/archive/2006/01/26/588809.aspx