18

Pasé los últimos días leyendo páginas man, documentos y todo lo demás que trajo a colación Google, pero supongo que ahora estoy aún más confundido de lo que estaba al principio.Acceso a la interfaz inalámbrica (802.11) en la capa MAC (Linux)

Esto es lo que quiero hacer: Deseo enviar y recibir paquetes de datos con mi propio protocolo 3-x de capa a través de una interfaz inalámbrica (802.11) en sistemas Linux con C/C++. Hasta ahora, muy bien. No necesito balizas, asociaciones ni ningún material relacionado con AP/SSID. Sin embargo, para las transmisiones de datos me gustaría que la capa MAC se comporte "como siempre", lo que significa que los paquetes de unidifusión son ACK'd, retransmisiones, restitución, etc. También me gustaría disfrutar de las capacidades ampliadas de QoS (802.11e con 4 colas y diferentes categorías de acceso). El modo Promiscuo, por otro lado, no es una preocupación, solo requiero paquetes de difusión y paquetes enviados a la estación específica.

¿Cuál sería la forma correcta de hacerlo? La mayoría de la documentación que existe sobre el acceso de socket sin formato parece estar enfocada en el rastreo de red y eso no ayuda. He estado jugando con el modo de monitor desde hace un tiempo, pero por lo que he leído hasta ahora, los paquetes recibidos no son ACK'd en modo monitor, etc. Sin modo monitor, ¿cuál sería la alternativa? ¿Cómo utilizar el modo ad hoc y unix raw sockets? ¿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 man para socket (2), socket (7) y paquete (7) pero eso no ayudó en lo que respecta al comportamiento de la capa MAC en diferentes modos.

Gracias de antemano.

+1

Puede buscar y ver si hay una solución de * software * de código abierto para generar tráfico de prueba, es decir, una combinación de paquetes válidos y no válidos para ver cómo los maneja el equipo del otro lado. Presumiblemente, esto tendría la capacidad de realizar operaciones habituales completas, pero también variaciones arbitrarias (para introducir los errores deseados). Si tal existe, puede usarlo o aprender de él. –

Respuesta

0

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

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

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

La implementación de su propia capa de transporte completa desde cero es muy difícil y casi seguro que no es lo que quiere hacer. Si, por el contrario, desea utilizar la pila de TCP/IP existente además de su propia interpretación personalizada de 802.11, entonces probablemente quiera crear una interfaz de red virtual. Esto actuaría como intermediario entre TCP/IP y la capa de medios.

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

+2

OP no mezcla capas. Hay acks y retransmisiones 802.11, ver www.sss-mag.com/pdf/802_11tut.pdf – abb

+0

Malo, vi ACK, retransmisiones y retrasos y todo eso asociado con la capa de transporte. –

1

Probablemente desea algo como libpcap.

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

3

Como desea crear un protocolo de capa de red propio (reemplazo para IP), la palabra clave es: "socket de ethernet raw". Por lo tanto, ignore el "socket de IP sin procesar".

Esto es por dónde empezar:

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

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

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

+0

El enlace de ejemplo ya no parece estar activo. ¿Podría compartir un enlace actualizado (o dar alguna referencia sobre qué buscar para obtenerlo)? –

7

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 red Ethernet. El direccionamiento y el comportamiento son generalmente los mismos. Entonces, para un protocolo de capa 3 no debería preocuparse por 802.11 y escribir su código como si esperara que se ejecutara en la red Ethernet.

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

Las tarjetas de funcionamiento sin ningún tipo de asociación con la red (simplemente escupiendo paquetes en el aire) no son una buena idea por un par de razones. Lo más importante es que depende mucho del hardware y no es confiable. Todavía puede hacerlo utilizando la interfaz RF mon (modo monitor AKA) en un lado y la inyección de paquetes (usando el encabezado radiotap) en el otro, pero no lo recomiendo. Incluso si tienes un juego de cartas idénticas, es muy probable que encuentres difícil de 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 monturas de estado dentro del firmware (lea sobre las tarjetas FullMAC vs. SoftMAC). Incluso las tarjetas SoftMAC difieren significativamente. Por ejemplo, teóricamente en modo monitor, como dijiste, la tarjeta no debería ACK recibir paquetes. Sin embargo, hay tarjetas que ACK recibieron marco de todos modos, porque basan su decisión exclusivamente en el hecho de que dicho marco está dirigido a ellos. Algunas tarjetas incluso pueden intentar ACK todos los marcos que ven. Algo similar sucederá con las retransmisiones: algunas tarjetas enviarán paquetes inyectados solo una 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.

Seguir la capa 3 y usar los modos existentes (como ad hoc), le dará todas las capacidades que desee y más (QoS, etc.). trama Ethernet que se envía a la interfaz se "traduce" por el núcleo a formato 802.11 con el mapeo QoS etc.

Si desea obtener información sobre el comportamiento de MAC en varios modos tendrá que o bien leer la mac80211 código o el estándar 802.11 en sí mismo. http://linuxwireless.org wiki lo ayudo con algunas cosas, pero los hackers kernel suelen estar ocupados escribiendo documentación que no sean comentarios en el código;)

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

Cuestiones relacionadas