Linux内核网络设备(net_device)篇

Linux内核网络设备篇
在进入Linux网络协议栈学习之前,首先我们要对重要的网络设备对象做介绍,不了解它就一头扎进去分析代码流程,就会遇到晦涩难懂的障碍。
网络设备在Linux内核中定义为struct net_device类型对象,也就是我们常说的网络接口(即一个网卡),通俗来讲,我们在Linux系统中执行ifconfig -a 命令所列出来的每个网络接口对象在内核中都对应一个net_device类型对象。为什么我们要分析这个对象呢?它在整个内核中衔接了网络设备驱动和内核协议栈,有了它Linux内核才能做到分层设计、独立解耦,使得每一层各司其职,清晰优雅。注意:这里的网络设备也就是网络接口,即net_device类型对象。
#1. 内核协议栈层次结构
在这里插入图片描述
图1-1
从上图中可以看出,网络设备对象(net_device)处于协议栈和网络设备驱动之间,它贯穿了整个数据包的收发过程。
在这里插入图片描述
图1-2
net_device表示一个网络设备对象(可以是物理网卡或虚拟网卡,比如eth0、wlan0、usb0、tun0、vlan.x接口、veth0、ppp0、…),由网络驱动程序创建它。
net_device对象和数据包关联非常紧密(skb->dev 指向 net_device对象),贯穿整个协议栈的收发报文流程。
netdev_ops接口对象同样由具体网络驱动程序初始化,用于操作具体网络设备。
在内核协议栈中,通过操作net_device对象的netdev_ops接口来控制这块网口,协议栈从此不关心它指向什么类型的网口,协议栈与驱动之间分层解耦。
#2. 网络设备的创建和注册流程
在这里插入图片描述
图2-1
由上图可以看出,net_device对象由网络驱动设备来创建和注册,PCIE、USB、SDIO等设备驱动在枚举(探测)到外设时,会创建网络接口与该外设进行绑定,作为网卡使用。
网络设备驱动主要使用如下几个函数:

alloc_netdev_mqs() 创建一个net_device类型网络接口对象(外加具体网口需要的私有结构体数据),指定网口名称。
register_netdevice(),register_netdev() 将网络接口注册添加到内核协议栈中。
free_netdev() 移除网络接口。
unregister_netdevice(),unregister_netdev() 去注册网络接口。

#3. 网络设备的管理操作
##3.1. 对网络设备进行UP/DOWN操作
在这里插入图片描述
图3-1
ifconfig wlan0 up最终会调用网络设备接口的ndo_open()回调函数。
ifconfig wlan0 down最终会调用网络设备接口的ndo_stop()回调函数。
##3.2. 网路设备的管理操作ioctl
在这里插入图片描述
图3-2
网络设备驱动一般会提供一个私有操作流程(不同的设备驱动可以自定义具体的操作),所以内核协议栈的ioctl定义一个命令字的边界值,即SIOCDEVPRIVATE值,小于它的命令字为内核保留的通用cmd值,大于等于它则由具体网络设备驱动自定义实现。所以上面的SIOCDEVPRIVATE+1就是bcm WiFi驱动自定的,因此提供了一个应用程序与内核网络驱动交互渠道。

本文转载自:
Linux内核网络设备介绍

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值