Para manejar la comunicación desde el espacio de usuario a su protocolo, registre su protocolo con la API de sockets del kernel. Esto le permite crear un socket normal desde el espacio de usuario.
Eche un vistazo a la implementación del socket bluetooth/RFCOM para obtener ejemplos de código relevantes.
static const struct proto_ops rfcomm_sock_ops = {
.family = PF_BLUETOOTH,
.owner = THIS_MODULE,
.bind = rfcomm_sock_bind,
.connect = rfcomm_sock_connect,
.listen = rfcomm_sock_listen,
.
.
.
.accept = rfcomm_sock_accept,
};
static const struct net_proto_family rfcomm_sock_family_ops = {
.family = PF_BLUETOOTH,
.owner = THIS_MODULE,
.create = rfcomm_sock_create
};
Para dar de alta un protocolo tendrás que rellenar la estructura proto_ops. Esta estructura sigue el patrón orientado a objetos observado en otras partes dentro del kernel. Esta estructura define una interfaz a seguir para los desarrolladores que implementan su propia interfaz de socket.
Implemente las funciones que define la interfaz, como vincular, conectar, escuchar y asignar el puntero de función a la entrada de la estructura. Defina ioctl para funciones no cubiertas por la interfaz de operaciones.
Terminas con una estructura que luego incrustas en la estructura de socket que devolvemos de la función de creación.
Struct net_proto_family define una nueva familia de protocolos. Esta estructura incluye la función de creación donde la implementación de su función debe llenar una estructura de socket llena con la estructura proto_ops.
Después de eso, registre la familia con sock_register, y si todo está bien, debería poder crear un socket adecuado desde el espacio de usuario.
Internamente, el protocolo probablemente debería usar skbuffs (ver aquí y aquí) para comunicarse con los dispositivos de red.
Los skbuffs son la forma universal de manejar paquetes de red en el kernel de Linux. Los paquetes son recibidos por la tarjeta de red, se colocan en algunos skbuffs y luego se pasan a la pila de red, que usa el skbuff todo el tiempo.
Esta es la estructura de datos básica y la ruta io para implementar un protocolo de red dentro del kernel de Linux.
No tengo conocimiento de ningún documento que describa este procedimiento de principio a fin. La fuente está contigo en este caso.