Подтвердить что ты не робот

Как узнать структуру драйверов беспроводной сети Linux (mac80211)?

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

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

4b9b3361

Ответ 1

Вы можете посмотреть здесь Johannes Berg (mac80211 supporter): http://wireless.kernel.org/en/developers/Documentation/mac80211?action=AttachFile&do=get&target=mac80211.pdf

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

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

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