¿Cómo funcionan la biblioteca nl80211 y cfg80211?

4 minutos de lectura

Avatar de usuario de Rafal
Rafael

quiero aprender como nl80211 y cfg80211 trabajar en detalle, tales como: flujo de funciones y cómo nl80211 interactúa con herramientas de red como wpa_supplicant y iw.

  • Esta pregunta está fuera de tema. Ver centro de ayuda

    – jugo de sig

    18 de marzo de 2017 a las 6:27


avatar de usuario de jmlemetayer
jmlemetayer

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

  • Primero ioctl con API dependientes del proveedor.
  • En 1996, Jean Tourrilhes crea extensiones inalámbricas (NOSOTROS o WEXT).

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

  • En 2006, John Linville crea mac80211 y Johannes Berg crea cfg80211 y nl80211. En conjunto, 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 enlace de red.

Entonces, herramientas como yo, hostapd o el wpa_supplicant use algunas bibliotecas de enlace de red (como libélula o libnl-pequeño) y el encabezado público de la interfaz de enlace de red que, por supuesto, es nl80211.h.

No hay tanta documentación, pero te aconsejo que leas el documentación de libnl y luego el codigo fuente (porque uso libnl).

  • nl80211 actúa como una interfaz entre el espacio del usuario y el espacio del núcleo… tengo dificultades para entender en qué punto el flujo de control pasa del espacio del usuario al espacio del núcleo

    – Rafael

    3 de febrero de 2014 a las 4:15

  • Has leído esto. Netlink se puede comparar con un socket entre el kernel y el espacio del usuario. De modo que el usuario puede usarlo de forma de solicitud-respuesta (por ejemplo, iw dev wlan0 link) y/o en forma de evento (p. ej. iw dev wlan0 event).

    – jmlemetayer

    3 de febrero de 2014 a las 10:33

  • gracias por el enlace, pero revisé esa página… para la interacción entre el usuario y el espacio del kernel, se crea un socket… pero cuando se trata de rastrear el código, no puedo rastrearlo desde el espacio del usuario hasta el espacio del kernel. …. si alguien puede ayudar, por favor responda pronto

    – Rafael

    4 de febrero de 2014 a las 4:58

  • Puedes buscar en el lista de correo de linux-wireless o incluso intenta preguntarles. Si recibiste una respuesta, publícala, estoy muy interesado y no tengo suficiente tiempo para hacerlo ahora.

    – jmlemetayer

    4 de febrero de 2014 a las 6:35

  • ^ El enlace está muerto, aquí hay una versión archivada: web.archive.org/web/20160316163624/http://…

    – Sinvergüenza

    29 de abril de 2019 a las 15:49

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

  • nl80211 es la interfaz entre el software de espacio de usuario (iw, wpa_supplicantetc.) y el kernel (cfg80211 y mac80211 módulos del núcleo y controladores específicos).
  • Los controladores WiFi y el hardware pueden ser Full-MAC o Soft-MAC (ver Controlador_de_interfaz_de_red_inalámbrica).
  • cfg80211_ops es un conjunto de operaciones que los controladores Full-MAC y mac80211 registro de módulo para cfg80211 módulo.
  • ieee80211_ops es un conjunto de operaciones que los controladores Soft-MAC registran para mac80211 módulo.

ingrese la descripción de la imagen aquí

  • lspci -k | grep -A 3 -i “red” me devuelve “Controlador del kernel en uso: iwlwifi”. Entonces modinfo iwlwifi | grep depende me devuelve “cfg80211”. Pero, ¿cómo puedo comprobar acerca de nl80211 y mac80211. Además, ¿cómo sé si el controlador admite el modo AP o no?

    – infoobstruido

    19 de marzo de 2017 a las 12:56


Creé un diagrama de flujo de código básico para la pila inalámbrica en Linux,
desde wpa_supplicant > cfg80211 > mac80211 > ath9k_htc.

El código ha sido rastreado para Linux kernel 5.4.31.

Aquí está el Enlace.

  • Guau, es increíble. ¿Qué software usaste para crear este diagrama?

    – Itachi Tensi

    22 de junio de 2020 a las 4:22


  • @ItachiTensie No usé ningún software, solo lo hice con Dibujos de Google…

    – Akshdeep Singh

    22 de junio de 2020 a las 7:43

avatar de usuario de eyalsh
eyalsh

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

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

¿Ha sido útil esta solución?