linux-kernel network-programming linux-device-driver ethernet

linux kernel - ¿Qué necesito construir para acceder directamente a los bits de trama Ethernet en el nivel kernel?



linux-kernel network-programming (3)

Me gustaría recuperar los bits del Marco Ethernet para todos los marcos Ethernet en el cable, sin importar si están destinados (nivel MAC) para mi máquina o no.

La lógica para eso tiene que ser a nivel del kernel.

Entonces, para lograr esto, necesito construir un módulo kernel o un controlador Ethernet o una interfaz de red Ethernet separados

Nota: Acabo de comenzar a aprender el desarrollo del módulo de kernel de Linux para mi proyecto. Lo siento si no es el lugar apropiado para publicar esta pregunta.


Hay muy buenas herramientas disponibles para capturar y recuperar marcos de Ethernet. Estas herramientas son tcpdump y wireshark. Tcpdump es una utilidad de línea de comandos donde wireshark es una utilidad basada en GUI. Puede usarlos lo que le resulte cómodo. Para obtener más información sobre esta herramienta, consulte los siguientes enlaces:

http://www.tcpdump.org/tcpdump_man.html

https://www.wireshark.org/docs/wsug_html_chunked/


Depende de la versión del kernel de Linux y también del procesador que se está utilizando.

En general, es posible que deba hacer algunos cambios al nivel del controlador de interrupción del controlador de red. Normalmente, tan pronto como se recibe el paquete, el conductor será interrumpido con la interrupción de recepción correspondiente. Una vez que se determina la interrupción de recepción, el paquete no se procesará completamente en el manejador de interrupciones. En cambio, el controlador activará una mitad inferior que hará el procesamiento adicional del paquete y es aquí donde es posible que necesite determinar el tipo de paquete y manejarlo de acuerdo con sus requerimientos. Además, tenga en cuenta que algunos NIC habrían directamente DMA''d los datos en sk_buff desde donde se enviará a la pila. En tal caso, sk_buff puede ser recuperado para su uso una vez que se obtiene de DMA (sk_buff contiene información de paquetes como datos, encabezado).

Netfilter es una de las mejores opciones para probar. Es un marco de filtrado de paquetes (conjunto de ganchos) con funciones de devolución de llamada que se invocan cuando el paquete atraviesa el enganche respectivo. Esto a su vez puede permitirle clasificar / procesar paquetes según su requerimiento.

Además, tenga en cuenta que algunos procesadores tienen módulos de procesamiento / acelerador de paquetes basados ​​en hardware que se pueden configurar para filtrar el tipo de paquete / protocolo de interés simplemente configurando los puertos de entrada respectivos. Algunos módulos de hardware también pueden extraer los metadatos de la carga útil y colocarlos en un búfer según ciertas reglas de extracción / análisis configuradas sin ningún tipo de intervención por parte del usuario.

Estas son algunas vistas de alto nivel sobre la recuperación y el procesamiento de tramas Ethernet y tenga en cuenta que está estrechamente unida a la arquitectura / diseño / controlador de su sistema.


Para recibir marcos destinados a todos los hosts, debe configurar su interfaz de red en modo promiscuo.

Para obtener marcos puede usar diferentes alternativas:

  1. pcap API (biblioteca libpcap)
  2. Enchufes de paquete: http://man7.org/linux/man-pages/man7/packet.7.html
  3. Mira ebtables (nunca lo he usado, así que no estoy seguro en este punto): http://linux.die.net/man/8/ebtables
  4. Aquí se propone netfilter: Cómo capturar marcos de red en un módulo kernel

Si aún desea hackear el kernel, no necesita crear un nuevo controlador de dispositivo Ethernet, simplemente escriba un módulo kernel que se registre para recibir tramas recibidas del controlador del dispositivo Ethernet. Mira el archivo kernel http://lxr.free-electrons.com/source/net/core/dev.c , puedes comenzar con la función:

int netif_rx(struct sk_buff *skb)

Este es el que recibe fotogramas del controlador del dispositivo.