首 页文档资料下载资料维修视频包年699元
请登录  |  免费注册
当前位置:精通维修下载 > 文档资料 > 家电技术 > 维修教程知识 > 单片机栏
基于LWIP的ICMP路由重定向改进
来源:本站整理  作者:佚名  2009-03-18 09:38:47




4 实 现
    对ICMP层改进的实现代码主要集中于3处。
    第一处位于ICMP模块的icmp_input()函数,针对ICMP的消息处理机制,增加了路由重定向的处理。整个函数的处理流程如图3所示。其中虚线框起来的部分为我们增加的功能。首先检查是不是重定向包,然后检验包的完整性和有效性。在这些检查都通过以后,判断缓存功能是否启用。启用与否由一个全局变量控制,默认是关闭的。如果没有启用缓存,则对重定向包进行计数,当达到上限后,启用缓存功能。重定向计数器应当定时归零,这样在一段时间内没有收到足够的重定向包,缓存功能仍然不会开启。这可以把这个重定向计数器加入其他需要定时执行的函数中来实现(比如arp_timer()函数)。开启缓存后,初始化缓存表,将每个条目的老化计数器置为最大,表示已过期,即所有条目都是空闲可用状态。然后启用定时老化功能。LWIP提供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所示。虚线框起来的部分是加入的功能。

   

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

上一页  [1] [2] 

关键词:

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分)

推荐阅读

图文阅读

热门阅读

Copyright © 2007-2017 down.gzweix.Com. All Rights Reserved .
页面执行时间:123,324.20000 毫秒