二、在网络层的处理
这部分是说明数据报文在网络层的处理。上面一部分已经说明了在链路层的处理。在链路层的处理,基本都是在驱动中已经实现了的。接着链路层的处理,对于ipv6协议,处理过程在ipv6_recv()中。
1. ipv6_rcv()中,会做一些必要的检查和更新MIB的一些信息,接着处理hopbyhop报头。然后进入NF_HOOK(PF_INET, NF_IP_PRE_ROUTING, skb, dev, NULL, ip6_rcv_finish); 对于NF_HOOK的作用解释。 如果没有配置netfilter,可以简单认为NF_HOOK就等于直接调用ip6_rcv_finish (skb)。
Ipv6_rcv()会处理hopbyhop报头,在ipv6_parse_hopopts()函数中处理。注意ip6_parse_tlv()的处理过程,它本身只处理PAD0和PAD1的type,就是rfc2460里面最早定义的两个选项,其它选项都是通过tlvprochopopt_lst中定义的回调函数来处理的。这样就能够根据将来协议的发展,灵活的添加新的hopbyhop类型,而不需要修改这个函数本身。