Si le routage décide que le paquet doit être transmis, la fonction net/ipv4/ip_forward.c:ip_forward() est appelée.
La première tâche de cette fonction est de vérifier la partie de l'entête IP correspondant au TTL (Time To Live: durée de vie du paquet). Si elle est inférieure ou égale à 1, on détruit le paquet et on renvoie un message ICMP indiquant une durée de vie dépassée à l'expéditeur du dit paquet.
On vérifie alors l'entête du skb pour savoir si il reste suffisamment de place en fin de zone mémoire pour y placer l'entête de la couche liaison de l'entité. Le cas échéant, on agrandit le skb en conséquence.
Ensuite le TTL est décrémenté de 1.
Si notre paquet est plus grand que le MTU(Maximum Transport Unit: taille maximale d'un unité de transport dans un réseau) de destination et si le bit de non-fragmentation est à 1 dans l'entête IP, alors on détruit le paquet et on renvoie un message ICMP à l'expéditeur indiquant qu'une fragmentation est nécessaire.
Enfin il est temps de faire appel à un autre netfilter hook: NF_IP_FORWARD.
En considérant que le netfilter hook retourne la valeur NF_ACCEPT, la fonction net/ipv4/ip_forward:ip_forward_finish() est la prochaine étape du voyage de notre paquet.
La fonction ip_forward_finish() vérifie elle-même si il est nécessaire de rajouter d'éventuelles options dans l'entête IP, et fait appel aux fonctions de net/ipv4/ip_options.c. Après cela, elle appelle include/net/ip.h:ip_send().
Ensuite, ip_send() est appelée et vérifie si une fragmentation est nécessaire (Si c'est le cas, il y aura appel à la fonction net/ipv4/ip_fragment.c), puis on continue dans la fonction skb->dst->output(), qui n'est autre que net/ipv4/ip_forward:ip_output()
La fonction ip_output() traite le NAT (Networking Address Translation: système de traduction d'adresses pour les réseaux privés dans le cas d'un firewal par exemple) puis appelle le netfilter postrouting hook NF_POSTROUTING_HOOK et ip_finish_output2() après une traversée réussie du hook.
L'appel à la fonction ip_finish_output2() met le matériel en attente de notre skb et appelle net/ipv4/ip_output.c:ip_output().