c linux-kernel wifi linux-device-driver 802.11

¿Cómo funciona nl80211 library & cfg80211?



linux-kernel wifi (3)

Quiero aprender cómo funcionan nl80211 y cfg80211 en detalle. Flujo de función, cómo nl80211 interactúa con herramientas de red como wpa_supplicant , iw .

Por favor sugiero algunos enlaces o libros útiles para referirme.


Para poder controlar los controladores inalámbricos desde el espacio de usuario, se utilizan algunos procesos de comunicación IPC entre kernel y espacio de usuario.

  • Al principio se usaba ioctl con API dependientes del vendedor.
  • En 1996, Jean Tourrilhes crea extensiones inalámbricas (WE o WEXT).

La extensión inalámbrica (WE) es una API genérica que permite a un controlador exponer a la configuración del espacio de usuario y las estadísticas específicas de LAN inalámbricas comunes.

  • En 2006, John Linville crea mac80211 y Johannes Berg crea cfg80211 y nl80211 . Juntos, está destinado a reemplazar las extensiones inalámbricas.

    +-------------+ | | | Userspace | | | +-------------+ ^ - - - | - - - - | nl80211 v +-------------+ | | | cfg80211 | | | +-------------+ +-------------+ | | | mac80211 | | driver | | | +-------------+

Un punto importante es que nl80211 / cfg80211 / mac80211 ya no usan ioctl, usan netlink .

Por lo tanto, las herramientas como iw , hostapd o wpa_supplicant usan algunas bibliotecas de netlink (como libnl o libnl-tiny ) y el encabezado público de la interfaz de netlink, que por supuesto es nl80211.h .

No hay demasiada documentación, pero te aconsejo que leas la libnl y luego el código fuente iw (porque iw use libnl).


Una imagen un poco más detallada de cómo nl80211 y cfg80211 funcionan con otras partes del sistema ( user space , kernel y hardware ).

  • nl80211 es la interfaz entre el software de espacio de usuario ( iw , wpa_supplicant , etc.) y el kernel ( cfg80211 y mac80211 kernel modules, y controladores específicos).
  • Los controladores y el hardware de WiFi podrían ser Full-MAC o Soft-MAC (ver Wireless_network_interface_controller ).
  • cfg80211_ops es un conjunto de operaciones que los controladores Full-MAC y el módulo mac80211 registran en el módulo cfg80211 .
  • ieee80211_ops es un conjunto de operaciones que los controladores de Soft-MAC registran en el módulo mac80211 .


Ver mi respuesta a ¿Cómo aprender la estructura de los controladores inalámbricos de Linux (mac80211)?

En wpa_supplicant , puede seguir el código en src/drivers/driver_nl80211.c . Este es un controlador wpa_supplicant (no es un controlador del kernel, sino una abstracción utilizada en el código wpa_supplicant ) que utiliza libnl para comunicarse con el módulo kernel cfg80211 . Cuando wpa_supplicant emite un escaneo, por ejemplo, se llama a wpa_driver_nl80211_scan . Construye el mensaje netlink con un comando llamado NL80211_CMD_TRIGGER_SCAN y con todos los parámetros requeridos para el escaneo.