linux下wifi设备的实现逻辑

说起 Linux 对 WiFi 的支持和实现,给它最有力支持的莫过于 HP 公司的 Jean Tourrilhe。他为当时的Linux定义了一套无线的API,称之为 "Wireless Extension",即无线扩展。在 Linux kernel 2.0.30 和 2.1.17 时被采用。

逻辑图:

无线设备驱动  ----->  Linux内核  ----->  wireless-tools + libiw  ----->  wpa_supplicant  ----->  Linux GUI

无线扩展: 无线设备驱动的无线接口实现  +  Linux内核对无线扩展的支持  +  无线工具集,对应上面前3部分。


一)无线扩展:

1)用户接口:一组管理无线扩展的工具集( 基本库是libiw,工具包是wireless-tools)。
a)/proc/net/wireless
b)wireless-tools 的一些命令:iwconfig、iwevent、iwgetid、iwlist、iwpriv、iwspy、rfkill。

2)内核:修改内核来支持和定义无线扩展。
a) /proc/net/wireless
当查看它的时候,会去查询所有的驱动,如果驱动定义了get_wireless_stats,会显示其结果,否则忽略。
iwlan、bcm4329等设备驱动都有对它的支持 。
b) linux/wireless.h net/wireless/
c) ioctl
主参数是网络接口名,例如eth2,tiwan0。

3)设备驱动:要将无线扩展映射到实际的硬件管理上。
有个图:


二) wpa supplicant

WPA Supplicant软件包,带有一些无线设备启停脚本,后台程序wpa_supplicant,以及一些基本命令。无线安全模式,像WPA personal,是这里实现的。
命令有:wpa_action、wpa_cli、wpa_passphrase。

三) 上层的GUI。



参考:
1. Jean Tourrilhe的主页
Linux平台下,WiFi驱动的MAC层驱动是与具体的无线芯片和硬件相关的。由于每个无线芯片和硬件的驱动实现都有所不同,这里无法提供一个通用的示例。然而,我可以给出一个简单的示例来说明MAC层驱动的一般结构和功能。 ```c #include <linux/module.h> #include <linux/kernel.h> #include <linux/netdevice.h> #include <linux/etherdevice.h> static int mydrv_open(struct net_device *dev) { // 在此处进行设备初始化和相关操作 return 0; } static int mydrv_stop(struct net_device *dev) { // 在此处进行设备停止和相关操作 return 0; } static netdev_tx_t mydrv_start_xmit(struct sk_buff *skb, struct net_device *dev) { // 在此处处理发送数据包的逻辑 return NETDEV_TX_OK; } static const struct net_device_ops mydrv_netdev_ops = { .ndo_open = mydrv_open, .ndo_stop = mydrv_stop, .ndo_start_xmit = mydrv_start_xmit, }; static int __init mydrv_init(void) { struct net_device *dev; // 分配一个net_device结构体实例 dev = alloc_etherdev(sizeof(struct mydrv_priv)); if (!dev) { printk(KERN_ERR "Failed to allocate net_device\n"); return -ENOMEM; } // 设置驱动相关的信息 strcpy(dev->name, "mydrv"); dev->netdev_ops = &mydrv_netdev_ops; // 注册设备 if (register_netdev(dev) < 0) { printk(KERN_ERR "Failed to register net_device\n"); free_netdev(dev); return -ENODEV; } printk(KERN_INFO "mydrv initialized\n"); return 0; } static void __exit mydrv_exit(void) { struct net_device *dev = dev_get_by_name(&init_net, "mydrv"); if (dev) { unregister_netdev(dev); free_netdev(dev); } printk(KERN_INFO "mydrv exited\n"); } module_init(mydrv_init); module_exit(mydrv_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("Your Name"); MODULE_DESCRIPTION("A simple MAC layer driver for WiFi"); ``` 上述示例是一个简单的MAC层驱动,它实现了`mydrv_open()`、`mydrv_stop()`和`mydrv_start_xmit()`等函数来处理设备的打开、关闭和数据发送操作。它还通过`net_device_ops`结构体将这些函数与驱动关联起来。在初始化时,它分配一个`net_device`结构体实例,设置驱动相关的信息,并注册设备。在退出时,它注销设备并释放相关资源。 请注意,这只是一个示例,实际的驱动实现可能会更加复杂,涉及到更多的功能和操作。具体的驱动实现还需要根据硬件设备和无线芯片的特性进行相应的调整和修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值