Familias de Netlink
El clan NetLink determina el paquete del núcleo o el conjunto de NetLink para usar para la comunicación. Las familias de NetLink existentes designadas son las siguientes:
La interfaz NetLink no es confiable. Hace todo lo posible para entregar la información a sus destinatarios previstos. Sin embargo, si surge un problema de almacenamiento o cualquier otro error, podría perder comunicaciones. Al habilitar el indicador NLM F ACK, el transmisor puede pedirle al destinatario una afirmación para garantizar una transmisión confiable. Los paquetes de error NLMSG con el campo de falla establecido en 0 son reconocimientos. Los reconocimientos para los mensajes recibidos deben ser producidos por el programa en sí.
Para cada paquete caído, el kernel intenta dar una respuesta de error NLMSG. Este patrón también debe ser seguido por los procesos del usuario. En cualquier caso, es difícil transmitir los datos del núcleo al usuario de manera confiable.
Mientras que, si se llena el almacenamiento del socket, el kernel no puede transmitir un mensaje de NetLink porque la información se perderá y el núcleo con su operación del espacio de usuario ya no compartiría la misma noción del estado del núcleo. La aplicación es responsable de determinar cuándo ocurre como resultado de la falla de Enobufs que RECVMSG (2) devuelve y resincroniza.
Ejemplo:
Discutiremos un programa para usar la función netlink () para la comunicación entre el núcleo y los sistemas normales. Primero, echamos un vistazo al lado del usuario de este programa. Para esto, tenemos que agregar el socket principal y los encabezados de NetLink en el código para hacer uso de los enchufes en el programa C junto con la función NetLink (), I.mi. "enchufe.h "y" netlink.H ".
Después de esto, establecemos el tamaño máximo de la carga útil en 1024 y establecemos las estructuras de definición, yo.mi. sockaddr_nl, src_adr, des_adr. La estructura nula "nlmsghdr" también se define con "*nl" e iovec estructura. La función Main () se inicia con la creación de un socket utilizando la función "Socket". Esta función contiene el nombre de dominio PF_NETLINK para el socket y el tipo de socket de sock_raw. El protocolo de socket netlink_test se define en los parámetros de la función de socket.
La función memset () se usa para apuntar hacia el bloque "src_adr" de la memoria de estructura donde el valor 0 se establece en varios bytes que contiene la estructura "src_adr". Usando la estructura src_adr, establecemos la familia, la identificación del proceso y los grupos del socket particular a AF_NETLINK, ID de auto -proceso y 0, respectivamente. Similar a una conexión TCP/IP, el socket establecido está vinculado a una IP de conexión local (origen) IP a través de la función NetLink Bind (). La función memset () se usa nuevamente para apuntar hacia el bloque "Dest_adr" de la memoria de estructura donde el valor 0 se establece en varios bytes que contiene la estructura de destino.
Usando la estructura Dest_adr, asignamos a la familia, ID de proceso y grupos para el socket de destino particular a AF_NETLINK, 0 ID de proceso y 0 grupos, respectivamente. Usando la función malloc (), asignamos la memoria dinámica para estructurar "nlmsghdr" y guardar el resultado de retorno, i I, i.mi. sucedido o no. El puntero de la estructura nula "NL" apunta hacia la longitud del mensaje, la ID del proceso y el indicador 0 para llenar el encabezado del mensaje NetLink. La función strcpy () está aquí para copiar la cadena dentro de la estructura del puntero nulo "nl".
Por lo tanto, la carga útil de comunicación más NLMSGHDR constituye un mensaje de NetLink. Cuando se recibe una comunicación, entra en el búfer que apunta el puntero de NL. También podemos enviar el mensaje actualizado a la estructura msghdr "msg". El puntero de estructura "NL" puede leer el mensaje del núcleo y mostrarlo en el shell mediante el uso de la función nlmsg_data ().
Por último, el descriptor de socket de netlink se usa para cerrar el socket de netlink.
Dentro del espacio del programa del núcleo, creamos una estructura nula "calcetín" junto con su puntero "*nl_sk". La función nl_data_ready () usa esta estructura y cierta longitud para despertarla y preparar los datos después de dormir. La función netlink_test () está aquí para esperar un mensaje que se reduzca desde el espacio de usuario al núcleo e imprima. Al final, el espacio del núcleo libera el enchufe.
El "Hola tu!El mensaje se muestra en nuestra pantalla después de ejecutar este ejemplo.
Conclusión
Se trata del uso de la función NetLink () 7 de C dentro de nuestros programas C por separado para el espacio de usuario y el espacio del núcleo. Discutimos sus usos enviando un mensaje desde el espacio de usuario al espacio relevante del kernel. El código de muestra de este artículo se puede implementar en cualquier compilador.