linux Wireless基础知识(cfg80211 mac80211 nl80211) 简单了解

1. 基本概念

    • cfg80211:  用于对无线设备进行配置管理。与FullMAC, mac80211和nl80211一起工作。(Kernel态)

    • mac80211: 是一个driver开发者可用于为SoftMAC无线设备写驱动的框架 (Kernel态)。

    • nl80211: 用于对无线设备进行配置管理,它是一个基本Netlink的用户态协议(User态)

    • WNIC : Wireless Network Interface Controller, 它总是指望硬件执行协议(如IEEE802.11)描述的功能。

    • MLME: 即MAC(Media Access Control ) Layer Management Entity,它管理物理层MAC状态机。

    • SoftMAC: 其MLME由软件实现,mac80211为SoftMAC实现提供了一个driver API。 即:SoftMAC设备允许对硬件执行更好地控制,允许用软件实现对802.11的帧管理,包括解析和产生802.11无线帧。目前大多数802.11设备为SoftMAC,而FullMAC设备较少。

    • FullMAC:  其MLME由硬件管理,当写FullMAC无线驱动时,不需要使用mac80211。

    • wpa_supplicant: 是用户空间一个应用程序,主要发起MLME命令,然后处理相关结果。

    • 

2. cfg80211

    cfg80211是Linux 802.11配置API。cfg80211用于代码wext(Wireless-Extensions),nl80211用于配置一个cfg80211设备,且用于kernel与userspace间的通信。wext现处理维护状态,没有新的功能被增加,只是修改bug。如果需要通过wext操作,则需要定义CONFIG_CFG80211_WEXT。

      cfg80211 and nl80211: 基于消息机制,使用netlink接口

    wext: 基于ioctl机制

    • struct ieee80211_hw: 表示硬件信息和状态

    • ieee80211_alloc_hw:每个driver调用ieee80211_alloc_hw分配ieee80211_hw,且以ieee80211_ops为参数

    • ieee80211_register_hw:每个driver调用ieee80211_register_hw创建wlan0和 wmaster0,并进行各种初始化。

    • struct ieee80211_ops:每个driver实现它的成员函数,且它的成员函数都以struct ieee80211_hw做为第一个参数。在struct ieee80211_ops中定义了24个方法,以下7个方法必须实现:
       tx,
start,stop,add_interface,remove_interface,config和configure_filter。


3. mac80211

    它是一个driver开发者可用于为SoftMAC无线设备写驱动的框架,mac80211为SoftMAC设备实现了cfg80211回调函数,且mac80211通过cfg80211实现了向网络子系统注册和配置。配置由cfg80211通过nl80211和wext实现。

    mac80211在体系结构中的位置如下图所示:





4. socket

     



  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux中的MAC80211CFG80211是用于无线网络的子系统。它们提供了一组API,使开发人员能够在Linux内核中实现无线网络设备驱动程序。 MAC80211是一个实现IEEE 802.11标准的软件模块,它负责管理Linux内核中的无线网络设备。它为网络设备提供了一组接口,使它们能够与其他网络设备进行通信。MAC80211还负责处理无线帧和管理无线网络的连接。 CFG80211是一个用于配置802.11设备的API。它负责管理无线网络设备的配置,例如频率、信道和加密设置等。它还提供了一组接口,使用户空间应用程序能够与无线网络设备进行通信。 示例代码: 以下代码展示了如何使用CFG80211 API在Linux内核中配置无线网络设备。 ``` #include <linux/module.h> #include <linux/kernel.h> #include <linux/netdevice.h> #include <linux/wireless.h> #include <net/cfg80211.h> static struct cfg80211_ops my_cfg_ops = { .change_beacon = NULL, }; static struct cfg80211_device my_cfg_device = { .ops = &my_cfg_ops, }; static int __init my_init(void) { int ret; struct wireless_dev *wdev; wdev = kzalloc(sizeof(*wdev), GFP_KERNEL); if (!wdev) return -ENOMEM; wdev->wiphy = wiphy_new(&my_cfg_ops, sizeof(*wdev)); if (!wdev->wiphy) { kfree(wdev); return -ENOMEM; } wdev->wiphy->privid++; wdev->wiphy->dev.parent = NULL; wdev->wiphy->dev.release = NULL; wdev->wiphy->dev.groups = NULL; wdev->wiphy->dev.dma_mask = NULL; wdev->wiphy->dev.coherent_dma_mask = ~0; ret = wiphy_register(wdev->wiphy); if (ret) { wiphy_free(wdev->wiphy); kfree(wdev); return ret; } wdev->wiphy->dev.parent = wiphy_dev(wdev->wiphy); wdev->netdev = alloc_netdev_mqs(sizeof(struct net_device *), "my_dev", NET_NAME_UNKNOWN, ether_setup, 1, 1); if (!wdev->netdev) { wiphy_unregister(wdev->wiphy); wiphy_free(wdev->wiphy); kfree(wdev); return -ENOMEM; } wdev->wiphy->privid++; wdev->netdev->ieee80211_ptr = wdev; wdev->netdev->ieee80211_ptr->iftype = NL80211_IFTYPE_STATION; wdev->netdev->ieee80211_ptr->flags |= IEEE80211_STA_CONNECTION_POLL; ret = register_netdev(wdev->netdev); if (ret) { free_netdev(wdev->netdev); wiphy_unregister(wdev->wiphy); wiphy_free(wdev->wiphy); kfree(wdev); return ret; } my_cfg_device.wiphy = wdev->wiphy; ret = cfg80211_register_device(&my_cfg_device); if (ret) { unregister_netdev(wdev->netdev); free_netdev(wdev->netdev); wiphy_unregister(wdev->wiphy); wiphy_free(wdev->wiphy); kfree(wdev); return ret; } return 0; } static void __exit my_exit(void) { cfg80211_unregister_device(&my_cfg_device); unregister_netdev(wdev->netdev); free_netdev(wdev->netdev); wiphy_unregister(wdev->wiphy); wiphy_free(wdev->wiphy); kfree(wdev); } module_init(my_init); module_exit(my_exit); MODULE_LICENSE("GPL"); ``` 这段代码首先创建了一个无线设备和一个无线网络接口。然后,它将无线设备注册到CFG80211子系统中,并将无线网络接口注册到Linux内核中。最后,它将无线设备和无线网络接口添加到一个数据结构中,并将该数据结构注册到CFG80211子系统中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值