Fonction NetLink 7 C

Fonction NetLink 7 C
Les tâches de l'espace utilisateur, ainsi que le noyau, communiquent entre elles via NetLink. Il est composé d'une API du noyau intérieur pour les plugins de base et une interface de tâche d'espace utilisateur centré sur les sockets commun. Dans cet article pédagogique, l'interface du noyau de base n'est pas décrite. De plus, il existe en effet une interface NetLink obsolète accessible via les périphériques de caractère NetLink. Cette interface n'est pas décrite ici et est uniquement incluse pour une compatibilité arrière. Les datagrammes sont au centre du service du Netlink. Il existe deux options acceptables pour le style socket: sock_raw et sock_dgram. L'interface NetLink, en quelque sorte, ne fait pas la différence entre les datagrammes et les prises brutes.

Familles Netlink

Le clan NetLink détermine le package du noyau ou l'ensemble NetLink à utiliser pour la communication. Les familles Netlink existantes désignées sont les suivantes:

  • NetLink_Route: Il accepte les mises à jour de routage ainsi que de connexion qui pourraient être utilisées pour modifier les IPS, les paramètres de liaison, les configurations de voisins, les disciplines en file d'attente, les classifications de communication et les classifications de paquets.
  • NetLink_W1: Les messages envoyés par le réseau 1 fil.
  • NetLink_usersock: Utilisé uniquement par les protocoles d'interface en mode utilisateur.
  • NetLink_firewall: Transférer les paquets IPv4 via le mode utilisateur vers NetFilter utilisé par la file d'attente IP du package de base. Depuis qu'il a été jugé inutile pour une durée prolongée (en faveur de la fonction de file d'attente NFNetLink beaucoup plus sophistiquée), le pare-feu NetLink est finalement éliminé dans Linux 3.5.
  • NetLink_Sock_Diag: Demande le noyau pour plus de détails sur les sockets appartenant aux différentes variantes de protocole.
  • Crypto Netlink: Demander des données de chiffre à l'aide de l'interface NetLink à la fois authentifiées avec l'API de cryptage du noyau et permet de configurer l'API cryptographique du noyau.
  • NetLink_IP6_FW: Transfère les cadres IPv6 via le mode utilisateur vers NetFilter. Utilisé par la file d'attente IP6 du composant du noyau.

L'interface netlink n'est pas digne de confiance. Il fait tout son possible pour fournir les informations à ses destinataires prévus. Cependant, si un problème de stockage ou toute autre erreur se pose, il pourrait perdre des communications. En permettant le drapeau NLM F ACK, l'émetteur peut demander à une affirmation du destinataire pour assurer une transmission fiable. Les paquets d'erreur NLMSG avec le champ de défaut réglé sur 0 sont des remerciements. Les remerciements des messages reçus doivent être produits par le programme lui-même.

Pour chaque paquet abandonné, le noyau tente de donner une réponse d'erreur NLMSG. Ce modèle doit également être suivi par les processus utilisateur. Quoi qu'il en soit, il est difficile de transmettre les données du noyau à l'utilisateur de manière fiable.

Alors que si le stockage du socket est rempli, le noyau n'est pas en mesure de transmettre un message NetLink car les informations seront perdues et le cœur avec son opération d'espace utilisateur ne partagerait plus la même notion de l'état du noyau. L'application est chargée de déterminer quand elle se produit à la suite de la défaillance Enobufs que Recvmsg (2) revient et resynchronise.

Exemple:

Nous discuterons d'un programme pour utiliser la fonction NetLink () pour la communication entre le noyau et les systèmes normaux. Tout d'abord, nous jetons un œil au côté utilisateur de ce programme. Pour cela, nous devons ajouter la prise principale et les en-têtes NetLink dans le code pour utiliser les sockets dans le programme C avec la fonction NetLink (), I.e. "prise.h ”et« netlink.h ”.

Après cela, nous avons réglé la taille maximale de la charge utile à 1024 et définissons les structures déterminantes, je.e. sockaddr_nl, src_adr, dest_adr. La structure nulle «NLMSGHDR» est également définie avec «* nl» et la structure Iovec. La fonction principale () est lancée avec la création d'une prise en utilisant la fonction «socket». Cette fonction contient le nom de domaine PF_NETLINK pour la prise et le type de socket sock_raw. Le protocole NetLink_test Socket est défini dans les paramètres de la fonction de socket.

La fonction memset () est utilisée pour pointer vers le bloc «src_adr» de la mémoire struct où la valeur 0 est définie sur plusieurs octets que la structure «src_adr» contient. À l'aide de la structure SRC_ADR, nous définissons la famille, l'ID de processus et les groupes de la prise particulière sur AF_NETLINK, ID de processus d'auto-processus et 0, respectivement. Semblable à une connexion TCP / IP, la prise établie est liée à une connexion locale (Origin) IP via la fonction NetLink Bind (). La fonction memset () est à nouveau utilisée pour pointer vers le bloc «dest_adr» de la mémoire struct où la valeur 0 est définie sur plusieurs octets que la structure de destination contient.

En utilisant la structure dest_adr, nous attribuons la famille, l'identification de processus et les groupes pour la prise de destination particulière à AF_NETLINK, 0 ID de processus et 0 groupes, respectivement. En utilisant la fonction malloc (), nous attribuons la mémoire dynamique à la structure «nlmsghdr» et enregistrons le résultat de retour, i.e. réussi ou non. Le pointeur de structure nulle «NL» pointe vers la longueur du message, l'ID de processus et le signalement 0 pour remplir l'en-tête de message NetLink. La fonction Strcpy () est là pour copier la chaîne dans la structure du pointeur nul «NL».


Par conséquent, la charge utile de communication plus NLMSGHDR constitue un message NetLink. Lorsqu'une communication est reçue, il va dans le tampon que le pointeur NL pointe. Nous pouvons également soumettre le message mis à jour à la structure MSGHDR «MSG». Le pointeur de la structure «NL» peut lire le message du noyau et l'afficher sur le shell via l'utilisation de la fonction NLMSG_DATA ().

Enfin, le descripteur de socket NetLink est utilisé pour fermer la prise NetLink.

Dans l'espace du programme du noyau, nous créons une «chaussette» de structure nulle avec son pointeur «* nl_sk». La fonction nl_data_ready () utilise cette structure et une longueur pour la réveiller et préparer les données après un sommeil. La fonction NetLink_Test () est là pour attendre un message qui descend de l'espace utilisateur au noyau et l'imprimez. En fin de compte, l'espace du noyau libère la prise.

Le «bonjour toi!»Le message s'affiche sur notre écran après avoir exécuté cet exemple.

Conclusion

Il s'agit de l'utilisation de la fonction NetLink () 7 de C dans nos programmes C séparément pour l'espace utilisateur et l'espace du noyau. Nous avons discuté de ses utilisations en envoyant un message de l'espace utilisateur à l'espace du noyau pertinent. L'exemple de code de cet article peut être implémenté sur n'importe quel compilateur.