Как узнать структуру беспроводных драйверов Linux (mac80211)? - PullRequest
14 голосов
/ 23 августа 2011

Существует так много структур в беспроводном драйвере Linux mac80211.Такие вещи, как struct net_device, struct ieee80211_hw, struct ieee80211_vif и struct ieee80211_local и так далее.Так много структур, что я не понимаю, какую информацию они содержат и когда они были инициализированы.

Как я могу узнать о них и всей архитектуре беспроводных драйверов?

1 Ответ

42 голосов
/ 03 августа 2013

Вы можете проверить слайды Йоханнеса Берга (сопровождающий mac80211) здесь: http://wireless.kernel.org/en/developers/Documentation/mac80211?action=AttachFile&do=get&target=mac80211.pdf

Они могут быть несколько устаревшими, но должны дать вам место для начала.

Высокоуровневое описание стека ядра Linux WiFi:

  1. Важно понимать, что есть 2 пути, по которым пользовательское пространство взаимодействует с ядром, когда мы говорим о WiFi:
    • Путь данных : полученные данные передаются от беспроводного драйвера к ядру netdev (обычно с использованием netif_rx()). Оттуда ядро ​​сети пропустит его через код стека TCP / IP и поставит его в очередь на соответствующих сокетах, из которых процесс пользовательского пространства будет читать его. На пути Tx пакеты будут отправлены от ядра netdev к беспроводному драйверу, используя обратный вызов ndo_start_xmit(). Драйвер регистрирует (как и другие сетевые устройства, такие как драйвер Ethernet) набор обратных вызовов операций, используя struct net_device_ops.
    • Путь управления : Этот путь определяет, как пользовательское пространство управляет интерфейсом / устройством WiFi и выполняет такие операции, как сканирование / аутентификация / ассоциация, Интерфейс пользователя основан на netlink и называется nl80211 (см. include/uapi/linux/nl80211.h). Вы можете отправлять команды и получать события в ответ .
  2. Когда вы отправляете команду nl80211, она первоначально обрабатывается модулем ядра cfg80211 (его код находится под net/wireless, а обработчики - net/wireless/nl80211.c). cfg80211 обычно вызывает водителя более низкого уровня. В случае Полное оборудование MAC конкретный драйвер HW находится прямо под cfg80211. Драйвер ниже cfg80211 регистрирует набор операций с cfg80211 с помощью cfg80211_ops struct. Например, см. Драйвер brcmfmac (drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c)
  3. Для Программного обеспечения MAC есть mac80211, который является модулем ядра, реализующим уровень MAC 802.11. В этом случае cfg80211 будет разговаривать с mac80211, который, в свою очередь, будет использовать аппаратный драйвер нижнего уровня. Примером этого является iwlwifi (для чипов Intel).
  4. mac80211 регистрируется с cfg80211 с использованием cfg80211_ops (см. net/mac80211/cfg.c). Конкретный драйвер HW регистрируется с mac80211, используя ieee80211_ops struct (например, drivers/net/wireless/iwlwifi/mvm/mac80211.c).
  5. Инициализация новой сетевой карты, которую вы подключили, происходит снизу вверх по стеку. Специальный драйвер HW будет вызывать mac80211 ieee80211_allow_hw() обычно после проверки HW. ieee80211_alloc_hw() получает размер структуры личных данных, используемой драйвером HW. Он по очереди вызывает cfg80211 wiphy_new(), который фактически выделяет пространство, достаточное для структуры wiphy, ieee80211_local struct (которая используется mac80211) и личные данные драйвера HW (расслоение видно в коде ieee80211_alloc_hw) , ieee80211_hw - это встроенная структура в ieee80211_local, которая «видна» драйверу HW. Все они (wiphy, ieee80211_local, ieee80211_hw) представляют собой одно физическое подключенное устройство.
  6. Поверх одного физического устройства (также называемого phy) вы можете настроить несколько виртуальных интерфейсов. По сути, это то, что вы знаете как wlan0 или wlan1, которыми вы управляете с помощью ifconfig. Каждый такой виртуальный интерфейс представлен ieee80211_vif. Эта структура также содержит в конце частные структуры, к которым обращается драйвер HW. Несколько интерфейсов могут использоваться для запуска чего-то вроде станции на wlan0 и точки доступа на wlan1 (это возможно в зависимости от возможностей HW).
...