tagger tag picard para mp3tag mac kid3 for easytag app linux network-programming network-protocols raw-sockets systems-programming

tag - Acceso a la interfaz inalámbrica(802.11) en la capa MAC(Linux)



picard app (4)

Pasé los últimos días leyendo páginas de manual, documentación y cualquier otra cosa que Google haya mencionado, pero supongo que estoy más confundida ahora de lo que estaba al principio.

Esto es lo que quiero hacer: quiero enviar y recibir paquetes de datos con mis propios protocolos de capa 3-x a través de una interfaz inalámbrica (802.11) en sistemas Linux con C / C ++. Hasta ahora tan bueno. No requiero balizas, asociación o cualquier cosa relacionada con AP / SSID. Sin embargo, para las transmisiones de datos, me gustaría que la capa MAC se comporte "como de costumbre", lo que significa que los paquetes de unicast son ACK''d, retransmisiones, retroceso, etc. También me gustaría disfrutar de las capacidades QoS extendidas (802.11e con 4 colas y diferentes categorías de acceso). Por otro lado, el modo promiscuo no es una preocupación, solo requiero la transmisión de paquetes y los paquetes enviados a la estación específica.

¿Cuál sería la forma correcta de hacerlo? La mayor parte de la documentación disponible sobre el acceso a socket sin procesar parece estar enfocada en la detección de redes y eso no ayuda. He estado jugando con el modo de monitor desde hace algún tiempo, pero por lo que he leído hasta ahora, los paquetes recibidos no se aceptan en modo de monitor, etc. Sin el modo de monitor, ¿cuál sería la alternativa? ¿Usando modo ad hoc y sockets crudos de Unix? ¿O tengo que jugar con los controladores?

No estoy buscando una solución completa, solo algunas buenas ideas, por dónde empezar. Leí las páginas del manual de socket (2), socket (7) y paquete (7), pero eso no ayudó con respecto al comportamiento de la capa MAC en diferentes modos.

Gracias por adelantado.


802.11 es la especificación de protocolo de capa 2 (y 1). Fue diseñado de una manera que permite que los protocolos de capa superior lo traten como una red Ethernet. El direccionamiento y el comportamiento son generalmente los mismos. Entonces, para un protocolo de capa 3, no debería preocuparse por el 802.11 y escribir su código como si esperara que se ejecutara en una red Ethernet.

Para que funcione, primero debe conectarse a una red inalámbrica de algún tipo (que conceptualmente es igual a conectar un cable a una tarjeta Ethernet). Aquí puede elegir la red ad-hoc (también conocida como IBSS) o de infraestructura (también conocida como BSS) (o PBSS una vez que se apruebe 802.11ad;).

Operar tarjetas sin ningún tipo de asociación con la red (solo escupir paquetes al aire) no es una buena idea por un par de razones. Lo más importante es que es muy dependiente del hardware y no es confiable. Aún puede hacerlo usando la interfaz RF mon (modo de monitor AKA) en un lado y la inyección de paquetes (usando el encabezado de radiotap) en el otro, pero no lo recomiendo. Incluso si tiene un conjunto de tarjetas idénticas, lo más probable es que encuentre dificultades para explicar y un comportamiento aleatorio en algún momento. Las NIC 802.11 simplemente no están diseñadas para este tipo de operación y mantienen diferentes montajes de estado dentro del firmware (lea acerca de las tarjetas FullMAC vs. SoftMAC). Incluso las tarjetas SoftMAC difieren significativamente. Por ejemplo, teóricamente en el modo de monitor, como usted dijo, la tarjeta no debe ACK recibir paquetes. Sin embargo, hay tarjetas que ACK recibió el marco de todos modos, porque basan su decisión exclusivamente en el hecho de que dicho marco se dirige a ellos. Algunas tarjetas pueden incluso intentar ACKAR todos los cuadros que ven. Algo similar ocurrirá con las retransmisiones: algunas tarjetas enviarán el paquete inyectado una sola vez (así es como debería funcionar). En otras NIC, las retransmisiones son manejadas por hardware (y firmware) y el controlador no puede apagarlo, por lo que obtendrá una retransmisión automática incluso con datos inyectados.

Mantenerse en la capa 3 y utilizar los modos existentes (como ad hoc), le brindará todas las capacidades que desee y más (QoS, etc.). El marco de Ethernet que envíe a la interfaz será "traducido" por el núcleo al formato 802.11 con mapeo de QoS, etc.

Si desea obtener información sobre el comportamiento de MAC en varios modos, deberá leer el código mac80211 o el estándar 802.11. http://linuxwireless.org wiki te ayudo con algunas cosas, pero los hackers del núcleo generalmente están muy ocupados para escribir documentación que no sea comentarios en el código;)

La implementación del protocolo L3 en sí misma también se puede realizar en modo kernel o usuario (utilizando sockets sin formato). Como es habitual, el lado del kernel será más difícil de hacer, pero más poderoso.


Debido a que desea crear su propio protocolo de capa de red (reemplazo para IP), la palabra clave es: "socket Ethernet sin procesar". Así que ignora las cosas "Raw IP socket".

Aquí es donde empezar:

int sockfd = socket( PF_PACKET, SOCK_RAW, htons(XXX) );

La página de manual correcta es: packet(7) .

Encuentre más información buscando en Google con la palabra clave. Un ejemplo bastante completo here .


Parece que estás mezclando los medios y las capas de transporte.

802.11 es lo que comúnmente se conoce como una capa de "enlace", "física" o "multimedia", lo que significa que solo se ocupa de la transmisión de datagramas sin procesar.

Conceptos como ACK, retransmisiones, backoff (control de flujo) se aplican a la capa de "transporte", y esos términos particulares están fuertemente asociados con TCP / IP.

Implementar su propia capa de transporte completa desde cero es muy difícil y casi seguro que no es lo que quiere hacer. Si, en cambio, desea utilizar la pila TCP / IP existente sobre su propia interpretación personalizada de 802.11, entonces probablemente desee crear una interfaz de red virtual. Esto actuaría como un intermediario entre TCP / IP y la capa de medios.

Esperemos que esto le dé un mejor contexto y palabras clave para buscar.


Probablemente quieras algo como libpcap .

Libpcap le permite leer / inyectar paquetes sin procesar desde / hacia una interfaz de red.