¿Cuáles son las diferencias entre los sockets de netlink y las llamadas ioctl?

Básicamente es la diferencia entre una cola de mensajes full-duplex (Netlink) y las funciones getter / setter ( ioctl ). Ambos están destinados a que las aplicaciones del usuario se comuniquen con los servicios del kernel, pero ahí es donde terminan las similitudes:

  • Los servicios del kernel pueden enviar información directamente a las aplicaciones del usuario a través de Netlink, mientras que usted habría encuestado explícitamente el kernel con funciones ioctl , una operación relativamente costosa.
  • Netlink comms es muy asíncrono , y cada lado recibe mensajes en algún momento después de que el otro lado los envíe. ioctl s son puramente sincrónicos : “¡Hola, kernel, DESPIERTA! ¡Necesito que proceses mi solicitud AHORA! ¡CHOP CHOP! ”
  • Netlink admite comunicaciones multicast entre el kernel y múltiples procesos de espacio de usuario, mientras que los ioctl s son estrictamente uno a uno.
  • Los mensajes de Netlink pueden perderse por varias razones (por ejemplo, sin memoria), mientras que los ioctl s son generalmente más confiables debido a su naturaleza de procesamiento inmediato.
  • Netlink es efectivamente solo para Linux; hay un RFC que extiende su utilidad al mundo de las redes definidas por software (SDN), pero no conozco a nadie que lo haya implementado para una adopción generalizada. Por el contrario, el código escrito para usar ioctl s comunes (p. Ej., La serie de E / S de terminal) es en gran parte portátil en todas las plataformas.

Si está implementando un módulo de kernel de Linux y se pregunta qué método usar, le recomiendo lo siguiente:

  • Control : ioctl debería ser su primera opción, a menos que haya una razón primordial, debido a su inmediatez y entrega confiable.
  • Datos : para pasar datos ocasionalmente, ioctl debería funcionar bien. Para datos masivos, y especialmente si observa operaciones asincrónicas, se prefiere Netlink.