新闻中心

EEPW首页 > 手机与无线通信 > 设计应用 > 基于LWIP的ICMP路由重定向改进

基于LWIP的ICMP路由重定向改进

作者:时间:2009-03-18来源:网络收藏

本文引用地址:http://www.eepw.com.cn/article/158186.htm

4 实 现
的实现代码主要集中于3处。
第一处位于模块的icmp_input()函数,针对的消息处理机制,增加了的处理。整个函数的处理流程如图3所示。其中虚线框起来的部分为我们增加的功能。首先检查是不是重包,然后检验包的完整性和有效性。在这些检查都通过以后,判断缓存功能是否启用。启用与否由一个全局变量控制,默认是关闭的。如果没有启用缓存,则对重包进行计数,当达到上限后,启用缓存功能。重定向计数器应当定时归零,这样在一段时间内没有收到足够的重定向包,缓存功能仍然不会开启。这可以把这个重定向计数器加入其他需要定时执行的函数中来实现(比如arp_timer()函数)。开启缓存后,初始化缓存表,将每个条目的老化计数器置为最大,表示已过期,即所有条目都是空闲可用状态。然后启用定时老化功能。提供sys_timeout(interval,func_handler,arg)函数,用于每隔interval时间后,执行函数func_handler(arg)。定向老化功能可以将函数实现后,向这个sys_timeout()注册来实现。如果缓存已经开启,那么缓存这个收到的重定向包,总是把它插入老化计数器最大的条目,以实现LFU算法。
第二处仍然位于ICMP模块,但添加了一个函数rou_cache_timer()。它是一个定时老化缓存的函数,用于老化、清理缓存条目,并再次向sys_timeout()注册自己。其函数流程如图4所示。

在所有缓存条目都已过图4定时老化、清理缓存期后,应当关闭缓存功能,同时注销定时老化函数。这些功能由rou_cache_timer()来完成。

第三处位于数据链路层的etharp_output()函数内。这个函数负责将下一跳的IP地址对应的MAC地址填入。
显然,路由缓存的使用正在于此。在它使用默认网关地址前,应当查询一下缓存中是否已将此路由重定向了。如果确实重定向了,那么在此下一跳IP被使用前,应该替换已重定向的IP。整个函数的流程如图5所示。虚线框起来的部分是加入的功能。


结 语
本设计针对在多网关情况下不处理重定向IC―MP消息而作出了改进。这种改进包括接收这个ICMP消息并缓存路由信息,为此加入了自适应路由缓存的功能,即只在有重定向消息的时候自动开启缓存,在缓存全部老化后又自动关闭缓存。路由缓存在比较完整的TCP/IP协议栈上都得到实现,但复杂度较高。这里使用一种较简单的路由缓存结构以降低代码量及资源使用开销。本文提出的思路不仅适用于,在其他的小型协议栈上也适用。

tcp/ip相关文章:tcp/ip是什么



上一页 1 2 下一页

评论


相关推荐

技术专区

关闭