5 Ajout des protocoles IPv6/ICMPv6
Le coeur de votre tutorat est de commencer l'écriture de la pile IPv6. Vous commencerez
par modifier la couche Ethernet pour permettre la réception des paquets de diffusion.
Puis vous implanterez une version basique des protocoles IPv6 et ICMPv6. Votre protocole
ICMPv6 doit gérer la découverte de voisin et les paquets d'écho. Ainsi, il sera possible
de tester votre pile à l'aide de l'utilitaire ping6.
5.1 Modification du protocole Ethernet
Faites en sorte que la couche Ethernet puisse gérer un tableau des adresses de diffusion
à honorer. En effet le protocole IPv6 ne peut pas se contenter de la diffusion totale
ff:ff:ff:ff:ff:ff. Il est suggéré d'ajouter un tableau des adresses de diffusion
à la structure de l'interface Ethernet. Les fonctions de gestion des adresses de diffusion
devraient être au niveau des fichiers stack.[ch].
La mise à jour du tableau des adresses de diffusion devrait se faire lors de la configuration
des interfaces réseau. Vous pouvez ajouter une fonction d'initialisation dans le tableau des
protocoles (type StackLayers). Les fonctions d'initialisations devraient être définies
dans les fichiers netxxx.[ch] correspondants. Il est suggéré de passer en paramètres de
la fonction un tableau associatif comportant au moins un pointeur vers l'interface réseau
courante.
5.2 Protocole IP version 6
Passons à la couche réseau IPv6. Vous allez créer deux fichiers dans le projet. Le
fichier des definitions netipv6.h et le fichier des fonctions netipv6.c.
Définissez la structure des adresses IPv6 et des entêtes IPv6 dans le fichier netipv6.h.
Ecrivez les fonctions de manipulation des adresses IPv6 dans le fichier netipv6.c.
5.2.1 Interfaces réseau
Vous allez devoir modifier la structure des interfaces réseau de stack.h en ajoutant
l'adresse IPv6 de l'interface et un tableau des adresses IPv6 de diffusion que l'interface
réseau doit prendre en compte. Au niveau du fichier stack.c, ajoutez une adresse
IPv6 dans la variable de l'interface réseau eth0.
5.2.2 Initialisation
La fonction d'initialisation du protocole IPv6 doit enregistrer les adresses Ethernet
de diffusion utilisées par IPv6 dans le tableau ad hoc de l'interface réseau courante.
Elle doit aussi calculer la liste des adresses IPv6 de diffusion nécessaire et la copier
dans la structure de l'interface réseau courante.
5.2.3 Fonction de décodage
La fonction de décodage ipv6DecodePacket doit vérifier les points suivants :
-
l'adresse IPv6 de destination est une adresse de l'interface ou une adresse de
diffusion gérée par l'interface,
- le nombre de sauts doit être strictement positif,
- le numéro d'entête suivante est un numéro de protocole,
- la taille dans les entêtes IPv6 est cohérente avec la taille du paquet.
N'oubliez pas le code de déverminage permettant, au minimum, d'afficher les paquets
IPv6 entrants et verifiés.
5.2.4 Fonction d'encodage
En ce qui concerne l'envoi de paquet (fonction ipv6SendPacket) les points suivants
sont à considérer :
-
Le paquet IPv6 est à constituer en fonction des paramètres d'appel obligatoires
de la fonction (protocole IPv6, adresse IPv6 de destination et données IPv6), en fonction
des paramètres optionnels (voir la structure IPv4_send_options et les constantes
IPV4_SEND_OPTION_xxxx dans l'archive) et enfin des paramètres disponibles
dans la structure d'interface réseau (adresse IPv6 source).
- Le paquet IPv6 doit être envoyé via la fonction d'envoi de la couche liaison; il
faut donc vérifier la taille du paquet (en toute théorie il faudrait fragmenter si le
paquet IPv6 ne tient pas dans la trame de la couche liaison) et trouver l'adresse MAC de
destination.
- Si le cache des voisins ne contient pas la bonne association, une découverte
de voisin doit être menée et le paquet IPv6 doit être relancé lors de la réception de
l'annonce de voisin ou à l'expiration d'un minuteur. Prévoir un compteur pour les éliminer
à terme.
- Un protocole IPv6 spécial doit être prévu pour les paquets à retransmettre, ces
paquets sont effet complets avec leurs entêtes IPv6, ipv6SendPacket doit donc les
traiter de façon particulière.
5.3 Protocole ICMP version 6
Le protocole ICMPv4 est simple à implanter. Dans la fonction de réception icmpv6DecodePacket
il faut vérifier la somme de contrôle ICMPvv64 (avec la fonction genericChecksum).
Votre couche ICMPv6 doit traiter les découvertes de voisins et répondre à une requête d'écho.
Vous n'aurez, bien sur, pas oublié d'insérer du code de déverminage permettant, au minimum,
d'afficher les paquets ICMPv6 entrants et sortants. Une fois ICMPv6 implanté vous vous
précipiterez pour tester le bon fonctionnement de votre pile et lançant de la machine
réelle un ping6 sur l'adresse IPv6 de votre pile (via l'interface tap0).