您的位置:

mac80211详解

一、mac80211简介

mac80211是Linux内核提供的一个完整的IEEE 802.11协议栈实现,它是Linux内核嵌入式系统中Wi-Fi无线网络实现的必要组件。它提供了一个统一的接口让上层应用和驱动程序使用,使得Wi-Fi无线网络的实现更容易。它的核心部分包含了从数据链路层到物理层的基本功能,例如IEEE 802.11的接口、帧形成、发送、接收、解析、真实模拟和虚拟化等功能。它对DRIVER进行了重大改进,从而更有效地支持各种Wi-Fi芯片和无线设备,因此被广泛应用于Linux内核的Wi-Fi驱动程序中。

二、mac80211特点

mac80211的主要特点如下:

1、统一的上层或用户空间API接口

这意味着无论是使用工具还是从上层网络功能实现或用户空间,都是对相同的接口进行编程,这样在不同的设备和应用程序之间切换时,避免了诸如改编码和编译不兼容等问题。

2、内核态和用户态支持

mac80211允许以一种与其他Linux内核网络协议一样的方式使用它们,它还允许某些独特的外部用户空间资源,如wireshark,与设备驱动交互。此外,mac80211也允许用户空间程序直接与无线网络设备进行通信,从而提供了一种更灵活的操作方式。

3、软件定义的无线红色

mac80211提供一条分层架构,使得对一个给定的Wi-Fi设备编写用户空间程序,需要嵌入的代码更少,更灵活。因此,通过一个Wi-Fi卡和mac80211,可以快速实现软件定义的无线红色。

4、高度可重用性的代码库

mac80211是一个高度可重用的重要代码库。许多与无线网络协作相关的必要开发工作都可以在mac80211的框架、API接口和内部结构上直接实现,特别是针对最新的Wi-Fi硬件。

三、mac80211架构模型

mac80211的整体架构分为用户空间、内核空间、硬件空间三个部分。

![mac80211架构模型图](https://i.imgur.com/swBbLZt.png)

如上图,在用户空间,主要运行网络管理程序如wpa_supplicant和network-manager(以及其他工具),用户程序将与内核接口进行API,则渲染mac80211到内核空间的无线网络请求,并处理从内核返回的请求。

内核空间包含了ioctl、IEEE80211堆栈、DRIVER和设备,它提供了一种以模块化方式实现、可配置的协议栈。其中,DRIVER用于处理Wi-Fi设备与投递来自用户/网络空间的数据包之间的交互;IEEE80211堆栈定义了整个无线协议和将在此处执行的各种操作(如数据包收发、网络接口操作、事件处理等);字驱动程序增加了硬件层,负责实际的通信并与MAC层进行交互。所有这些组件都能实现开放式结构,用于满足应用程序、网络协议和驱动程序等各种需求。

硬件空间包括Wi-Fi芯片和无线适配器驱动程序(如acx)。无线适配器只是处理数据包的硬件,并负责与mac80211进行交互,以在内核空间中完成过程。

四、mac80211实例代码


/* 初始化mac80211 */
static int __init ieee80211_init(void)
{
    int err;

    ieee80211_bss_init();
    ieee80211_sta_init();
    ieee80211_crypto_init();
    ieee80211_mesh_init();
    ieee80211_scan_init();
    ieee80211_p2p_init();
    ieee80211_hw_core_init();
    ieee80211_rate_control_register_algs();
    ieee80211_led_init();
    ieee80211_vif_init();
    ieee80211_key_mgmt_register_algs();

    err = ieee80211_register_hw(&led80211_hw);
    if (err)
        goto out_key_mgmt;
    err = ieee80211_register_hw(&rtl8xxxu_hw);
    if (err)
        goto out_key_mgmt;
    ...
}

/* 驱动发布数据报文 */
static netdev_tx_t rtl8xxxu_start_xmit(struct sk_buff *skb,
                    struct net_device *dev)
{
    struct ieee80211_hw *hw = priv->hw;
    struct rtl8xxxu_priv *priv = wdev_priv(wdev);
    struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
    struct ieee80211_tx_control ctrl = {
        .sta = info->control.sta,
        .vif = info->control.vif,
        .duration = info->control.duration
    };
    struct packet_type pt;

    /* 设置数据帧数据 */
    set_tx_desc(priv, skb, &ctrl, tx_desc);

    pt.func = rtl8xxxu_rx_packet;
    pt.type = cpu_to_le16(ETH_P_ALL);
    err = rtl8xxxu_write(skb);
    if (err < 0) {
        dev_kfree_skb(skb);
        return NETDEV_TX_OK;
    }
    ieee80211_tx_status_irqsafe(hw, skb);
    return NETDEV_TX_OK;
}

五、总结

本文简单介绍了mac80211的特点和架构,并提供了相应的代码实例,以帮助读者快速了解和使用mac80211。mac80211的重要性在于它为Linux内核提供了一套完整的Wi-Fi无线网络实现,为嵌入式系统的Wi-Fi应用提供了充足的自由,为新一代软件无线电网络提供了良好的基础。