2010-04-05 提纯代码

今天做的工作主要是把4over6的代码提纯了一下。

工作的时候有几个发现,第一是在配置的时候,load里面,给tunnel配置了一个ipv4地址,ipv6地址,上次写的时候以为这个ipv6的地址是不需要的,但是今天发现这个是必需的,因为在tunnel封装的时候,封装之后的ipv6的头部是没有ipv6的地址的。然后在查找路由的时候顺便给它一个地址,这个地址就是给tunnel配置的地址。所以如果在配置的时候不给它找个地址的话,它就会找不着地址,从而发送不成功。(在ip_gre.c里面实现的隧道在存储的时候存储了三个数,一个是两端的ip地址,远端的被封装的ip地址。而4over6代码里面实现的隧道只存储了远端的两个地址,所以需要给配置一个地址,否则找不到。)

另外一个就是skb,skb在从下层收到是时候,它的头部是被掐掉的,但是它的network_layer的指针还指在原来的地方,所以可以使用iphdr()函数取得它的头部。在代码中,比较经常使用的是把network_layer_header和transport_layer_header赋值过去赋值过来,一般来说,当接到了下层的skb的时候,需要把network_layer_header重新设置一下,skb的协议也重设一下,然后在当成一个刚到的包,发送给网络层,刚从上层接到skb的时候,需要把现在的network_layer_header保存为transport_layer_header,然后再加入头部之后重新调整network_layer_header的配置,当成一个ip包传给其他的网卡。

另外有一个不明白的地方,不知道能不能吧4over6的代码里面的那个neighbour有关的函数给删掉,不知道删掉有没有什么影响,有一种可能就是ipv6的路由过程和ipv4的路由过程不一样,因为ipv4查找邻居的算法是ARP算法,但是ipv6查找邻居的算法是邻居发现算法,不知道这会不会导致linux在实现上面的不同。

明天写出一个脚本文件好每次配置的时候调用,然后看看linux怎么实现路由功能,不管是软件类型的路由器还是内核模拟的路由器。

posted @ 2010-04-06 00:10  wudanzy  阅读(214)  评论(0)    收藏  举报