Función NetLink 7 C

Función NetLink 7 C
Las tareas del espacio de usuario, así como el núcleo, se comunican entre sí a través de NetLink. Está compuesto por una API de núcleo interno para los complementos centrales y una interfaz de tarea de espacio de usuario centrada en los enchufes comunes. En este artículo de instrucción, la interfaz de núcleo central no se describe. Además, de hecho, hay una interfaz de NetLink anticuada accesible a través de los periféricos de caracteres de NetLink. Esta interfaz no se describe aquí y se incluye únicamente para la compatibilidad hacia atrás. Los datagramas son el foco del servicio de NetLink. Hay dos opciones aceptables para el estilo de socket: sock_raw y sock_dgram. Mientras tanto, la interfaz NetLink de alguna manera no diferencia entre los datagramas y los enchufes sin procesar.

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:

  • Netlink_route: Acepta las actualizaciones de enrutamiento y de conexión que podrían usarse para cambiar el IPS, la configuración de enlaces, las configuraciones de los vecinos, las disciplinas de colas, las clasificaciones de comunicación y las clasificaciones de paquetes.
  • Netlink_w1: Los mensajes enviados por la red de 1 alambre.
  • Netlink_usersock: Se utiliza solo por los protocolos de interfaz de modo de usuario.
  • Netlink_firewall: Transfiera los paquetes IPv4 a través del modo de usuario a NetFilter que se utiliza por la cola de IP del paquete central. Desde que se consideró innecesario durante una duración prolongada del tiempo (a favor de la función de cola NFNetLink mucho más sofisticada), el firewall de NetLink finalmente se elimina en Linux 3.5.
  • Netlink_sock_diag: Pide al núcleo los detalles sobre los enchufes que pertenecen a las diferentes variantes de protocolo.
  • Netlink Crypto: Solicitar datos de cifrado utilizando la interfaz NetLink, tanto autenticada con la API de cifrado del núcleo, y permite configurar la API criptográfica del kernel.
  • Netlink_ip6_fw: Transfiere los marcos IPv6 a través del modo de usuario a NetFilter. Utilizado por la cola del componente del núcleo IP6.

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.