网络子系统-2.6.26
作者:guolele
首先讲这问题就要先了解几个网络子系统比较重要的数据结构和函数。Struct net_device ,register_netdev(),unregister_netdev(),struct sk_buff
还有一个,就是网卡驱动是工作在数据链路层的。
Linux设备驱动模型,每一个驱动硬件都是以一个数据结构表示,网卡就是以struct net_device这个结构表示。
而收发的数据就是通过struct sk_buff结构传递到上一层,上一层是协议层。
这里内核描述说这个结构是个错误,因为它把IO数据混淆为高级数据,所以它必须知道每个数据结构被用在INET模块
驱动的任务就是在模块加载时先填充完这个数据结构,然后在最后调用register_netdev函数时会调用struct net_device 里的init函数指针,而这个init函数就是完成最后的初始化工作,网卡驱动就结束了。
Init主要做几个工作,就是注册中断,设置芯片工作模式, 通知协层,可以开始传输数据包了。
等有数据传来就会产生中断,中断处理函数里会先把数据整理到struct sk_buff,再交给协议层去处理,具体操作就是调用netif_rx。
要传送数据时,也类似,只是不用最后交给协议层。
下面再讲讲struct sk_buff 这个数据结构,
大概就这样传给协议层了