¿Cómo empujar skb en un punto específico de la pila de red de Linux?
linux-kernel network-programming (3)
No estoy del todo claro de dónde se origina este skb. En userland, hay dos formas de hacer esto. Una es usar un dispositivo tun
(y simplemente escribir el paquete). La otra es usar libpcap
(que tiene la característica poco conocida de enviar paquetes sin procesar ocultos entre todas las cosas recibidas).
Usted dice que quiere hacer esto registrando un ioctl
(probablemente significa agregar su propio ioctl
) y luego llama al ioctl
desde el espacio de usuario. No es inmediatamente obvio por qué querrías hacer eso cuando ya puedes lograrlo sin modificar el kernel. Sin embargo, si quisiera hacer esto, lo que haría sería seguir la ruta que usa el controlador tun
, y hacer el equivalente de write()
-ing al dispositivo tun
en su nueva ioctl
. Eso podría significar tener una interfaz similar a una tun
para que actúe como fuente de los paquetes. Sospecho que los paquetes en el sistema necesitan una interfaz de fuente de tipo.
Quiero enviar skb al punto de prerouting
de la pila de red de Linux. ¿Hay alguna manera de hacer esto? Utilicé las dev_queue_xmit()
y netif_rx()
, pero no creo que puedan empujar skb en el punto de prerouting
de la pila de red de Linux.
Sospecho que quieres que libpcap o libnetfilter_queue en lo sucesivo se denominen colectivamente cola de userland. La cola de Userland enrutará todos los paquetes que coincidan con alguna regla (que defina) a su aplicación de usuario. Las funciones dev_queue_ * y netif_ * se aplican al enrutamiento de nivel kernel y no son relevantes para aplicaciones de usuario.
Userland colas tiene implicaciones de rendimiento y, dependiendo de la biblioteca que utilice, tendrá que utilizar un método específico para volver a inyectar su paquete en las colas de netfilter.
Creo que la función que está buscando es ip_queue_xmit()
, que es donde la implementación de IPV4 comienza a verificar tablas, filtros, etc.