静态路由的刷新方法

文档序号:7910347阅读:749来源:国知局

专利名称::静态路由的刷新方法
技术领域
:本发明涉及数据通信技术,特别涉及在路由设备中对静态路由的配置与维护管理,使得在网络中接口发生变化而需要刷新相关的静态路由时,能够减少对设备中CPU的占用时间,并可避免因对设备中CPU的占用时间过长造成的系统死机问题。
背景技术
:在常规的通信系统中,在路由设备上都会建立并维护用于静态路由的radix树。其中包含了本设备配置的所有静态路由。常规方法是通过命令行来配置静态路由。静态路由一经配置成功,就会保存在本路由设备中。一旦某个网络接口发生变化,路由设备中的路由模块就会搜索这棵radix树,找出需要更新静态路由,用最新接口信息将该路由刷新。因此,当接口频繁打开/关闭时,路由模块也跟着不停地增加和删除静态路由,从而占用了大量的CPU时间。另一方面,对于支持VLAN接口的三层交换机产品,在物理端口上可以配置大量的VLAN接口。而一旦这个物理端口发生变化,所有这些VLAN接口都会发生变化,相应地也要刷新静态路由。此时容易造成路由模块占用太长的CPU,导致其他模块出现异常,严重时会导致系统重起。现有技术的静态路由刷新方法之所以会出现占用CPU时间过长的问题,主要有两方面的原因1)路由模块针对接口打开/关闭消息对静态路由的处理不合理。任何一个接口发生变化,路由模块都要遍历radix树中的所有静态路由,并对其中每一条静态路由都重复执行刷新操作。而实际上只需要刷新那些与本接口相关的静态路由即可。另外,刷新操作中根据静态路由的下一跳查找对应的出接口采用线性查找的方法,可能需要遍历系统当前配置的所有接口。因此,在配置了大量的VLAN接口后,对每条静态路由都这样查找一遍必然占用大量的CPU时间。2)路由模块对静态路由刷新(维护)管理的调度策略不合理。只要有消息需要处理,路由模块就不停地调用静态路由的消息处理函数,而完全没有考虑其他任务的需求,从而导致其他任务因为得不到执行而被饿死。实际上,在CPU资源不可抢占的实时系统中,适当的放权是非常重要的。也就是说,当系统接口频繁地打开或关闭,或者网络拓扑发生变化时,首先应保证设备的平稳运行,其次才是考虑尽快收敛的问题。因此,有必要对路由模块对静态路由信息的维护处理方法加以改进,使其更加适应复杂的运行环境。目前,本发明人还没有发现对静态路由的刷新和维护方法进行优化的相关方案。
发明内容因此,针对上述现有技术中存在的问题,本发明的目的就是要提供一种新的对静态路由进行刷新的方法,以解决路由模块在操作中占用CPU时间过长的问题。根据本发明,提供了一种静态路由的刷新方法,包括如下步骤(1)建立网络接口与相关的静态路由之间的关联;(2)对于发生变化的所述网络接口,搜索与所述网络接口相关的静态路由;(3)对搜索到的所述相关静态路由进行刷新。在本发明的上述方法中,步骤(1)包括(1-1)将同一目的地的多个静态路由构成静态路由链表,所述静态路由链表中的每一项表示一条特定的静态路由,并且包含所述静态路由下一跳的链表,该链表中的每个节点表示了该静态路由配置的一个下一跳;(1-2)对静态路由根据所配置下一跳找到的出接口索引进行散列(HASH)运算,生成所述的静态路由出接口索引HASH表,该HASH表的节点与所述静态路由下一跳链表中的相应节点互相关联。在本发明的上述方法中,步骤(2)包括(2-1)当所述网络接口发生变化时,根据变化的接口计算出该接口索引的HASH值;(2-2)在所述HASH表中搜索与所述接口相关的静态路由;(2-3)对搜索到的静态路由进行刷新。在本发明的上述方法中,对静态路由的刷新包括如下步骤(2-3-1)根据变化的接口查找所述静态路由的下一跳;(2-3-2)用查找到的静态路由的下一跳再次搜索合法的出接口;(2-3-3)如果能够查找到新的出接口,则根据该下一跳新的出接口索引生成索引节点,重新加入所述HASH表中;(2-3-3)如果查找不到所述下一跳,则将所述静态路由置于所述HASH表的特定位置。在现有技术的静态路由刷新方法中,只是将静态路由组织在radix树中,而没有将静态路由与配置的接口联系起来。这样就导致在接口变化时不知道应该刷新哪条静态路由,所以只好将所有静态路由全部刷新一遍。而在本发明的上述方法中,通过在radix树的静态路由及其所配置的接口之间建立索引关系。当网络接口变化时,沿着这个索引就可以找出所有真正需要刷新的相关静态路由了。另外,在本发明的上述方法中,还可进一步包括如下步骤(4-1)为单个静态路由处理任务设置一次不间断执行的最大执行时间;(4-2)在所述静态路由处理任务中的至少一个时间检测点检测当前静态路由处理任务的执行时间;(4-3)如果所检测到的执行时间未超过所述最大执行时间,则继续执行所述当前静态路由处理任务;和(4-4)如果所检测到的执行时间超过所述最大执行时间,则停止执行当前的静态路由处理任务,并释放执行静态路由处理任务的CPU。由于现有技术中在包括静态路由刷新处理在内的路由维护管理任务的调度方面存在占用CPU时间过长的问题,在本发明的上述方法中,通过控制路由维护管理一次执行的最大时长,从而避免了将其他任务饿死的现象。本发明的上述步骤(4-2)进一步还可包括如下步骤(4-2-1)根据当前静态路由处理任务中包含的子任务的优先级,将所述最大执行时间划分为与所述子任务的个数相应的子任务最大执行时间;(4-2-2)在所述子任务中的至少一个时间检测点检测当前子任务的执行时间;(4-2-3)如果所检测到的执行时间未超过所述子任务的最大执行时间,则继续执行所述当前子任务;和(4-2-4)如果所检测到的执行时间超过所述子任务的最大执行时间,则停止执行当前的子任务,而执行当前静态路由处理任务中包含的下一个所述子任务。因为静态路由的维护管理与其他的路由协议共用一个操作系统任务,如果采用sleep等同步放权机制,虽然不至于将其他任务长时间挂起,但有可能将路由任务中其他路由协议挂起。因此,本发明的上述方法进一步采用了异步放权的机制。即将整个路由任务再划分成一个子任务,例如定时器子任务、JOB子任务、接口处理子任务等,对其中每个子任务按其重要程度分配执行时间。执行时间到后即使还没有执行完毕,也要放权给下一个子任务执行。如果执行总时间超限,则整个路由任务放权给其他任务。这样的机制既保证了路由任务和其他任务的公平性,又保证了内部子任务之间的公平性。通过详细文字说明并结合以下附图,本发明的上述目的、特征及优点将变得更加易于理解,其中图1是根据本发明的在静态路由及其所配置的接口之间建立索引关系的数据结构图;图2是根据本发明的对路由维护任务设置一次不间断执行的最大时长并进行相应的任务调度处理的方法示意图。具体实施例方式下面参考图1详细描述本发明的一种实施方案的例子。如上所述,现有技术中的路由模块专门为静态路由设置了一棵radix树,其中放置了本设备配置的所有静态路由,以方便查找。因为可以为同一目的地设置不同优先级的静态路由,所以在本发明的一种实施例中,将这些不同优先级的静态路由串成一条单向连表,挂到radix树的节点上。链表中的每个结构表示了一条特定优先级的静态路由。对于每一特定的静态路由,可以配置个数不限的下一跳。具体地说,如图1中实线部分所示,静态路由中配置的到同一目的地的具有特定优先级的静态路由用一个rt_static表示。它所具有的下一跳用adv表示。如上所述,与一个特定的静态路由对应的adv的数量可以有多个。它们组成一个单向链表挂在该rt_static下面。如果对于每个用adv表示的下一跳,通过调用接口查询函数能够找到一个出接口,则路由模块就可以使该静态路由生效并下发微码。如图1所示,在本发明中,为了将静态路由与接口建立起关联,对根据静态路由配置下一跳找到的对应出接口索引进行HASH运算(散列运算),从而生成了一个HASH表(hash_table)。因为可能对不同的接口进行散列运算得出的HASH值相同,所以需要建立一个冲突链,将具有相同HASH值的出接口串在一起。另外,如图1中的虚线部分所示,因为有可能不同的静态路由找到的出接口相同,因此在HASH表中再生成一个表示不同静态路由配置的下一跳的链表。这个链表有一个链头(head),它位于HASH表的冲突链中。其下有一个双向链表,双向链表中的每个节点可称为elem。在elem中保存有指向出接口的指针ifap。为了能够找到该接口所属的静态路由,在elem中还保存有一个rt_static指针。同时,为了与静态路由的上述数据结构中的adv对应起来,以便删除配置时可以将对应的elem删除,在每个elem中还保存了一个adv指针,即每个elem结构都与一个adv结构对应,而每个adv结构都至少有一个elem结构与之关联。从图1中可以看出,adv链表与elem链表就好象挂在rt_static下面的一张“梯子”的两边,它们之间的相互指针则构成了“梯子”的“横档”,将adv链表与elem链表联系在一起。总之,在每个静态路由配置的下一跳的链表中通过elem结构、rt_static结构和adv结构建立了出接口与静态路由的关联。利用上述结构建立的网络接口与静态路由的关联,在接口变化时,可以按照如下方法更新相关的静态路由(1)对变化的接口进行散列计算,得出该接口的HASH值。在HASH表的冲突链中搜索对应的head结构。如果没有找到,则表明没有配置与本接口相关的静态路由,不进行路由的刷新并释放CPU资源;否则转下一步(2);(2)遍历head下挂的所有elem结构。对每个elem,从其中的rt_static回指指针找到配置的静态路由,调用单个静态路由的刷新函数,同时将包括rt_static指针、adv指针、ifap指针在内的参数传递给该刷新函数,并执行下一步骤(3)在利用上述参数刷新静态路由时,如果能够找到出接口,则以接口索引为key(即用接口索引作为输入,并调用HASH函数计算得出得结果,它将作为HASH表的索引)生成该接口的索引节点,插入HASH表中。所谓接口索引是系统内部表示一个接口的唯一标识,它是一个ULONG类型的数值。HASH函数采用接口索引作为输入,经过对接口索引采用移位、相加、异或等方法尽量使得输入不同的接口索引能够得到不同的计算结果。如果找不到出接口,同样需要生成一个索引节点,以便以后配置接口IP地址后能够重新使能该静态路由。因为没有出接口的索引,因此将这一类找不到出接口的静态路由挂到HASH表中一个特殊的位置上——例如第256个数组上。以后,每配置一个新的IP地址都检查这些找不到出接口的静态路由集合,以从中找出可以生效的静态路由。在本发明中,利用下一跳查找出接口的函数利用了一种IP地址radix树作为查找对象。这棵树是将本设备配置的IP地址按照子网大小和掩码长度安排在一个二叉树上。除此之外,还需要将静态路由中配置的下一跳也挂在这棵树上,此时IP地址就是配置的下一跳,掩码为32。这样在查找出接口时就象对IP报文查找路由表那样将下一跳作为目的地址查找这棵radix树,如果能最长匹配到一个挂有IP地址的节点,则该IP地址所在的接口就是本下一跳对应的出接口。因为无论配置多少IP地址,radix树最多只有32层,因此最多匹配32次就一定可以知道能否找到出接口。当然,即使不采用这样的快速定位方法,而是沿用原有的线性遍历每个接口的方法,依然可以找出出接口,只不过效率要低一些。但无论采用哪一种方法,出接口查询函数的原型是一样的,只是内部实现不同而已。对于静态路由而言,并不知道该函数内部是如何实现的,只是调用该查询函数。这样,利用本发明上述的数据结构和方法,可以只更新与某个接口相关的静态路由,对于其他静态路由则不做处理。这样可以最大限度地提高处理的效率,减少对CPU的占用。上面的优化只是针对静态路由做的修改。当接口状态变化的消息不多时,上面的优化已经足够。但如果存在大量接口状态变化的消息,则静态路由处理的总时间还是很长的。因此,对静态路由处理的消息个数需要加以限制。否则路由任务占用CPU过长的问题仍然有可能出现。但因为每个消息的处理时长差别很大,直接限制消息处理的个数具有很大的盲目性。因此,本发明在上述方法的基础上进一步提供了在时间尺度上间接地限制消息个数的方法。在静态路由的维护管理的任务中,包含了多个不同的子任务,概括起来可分为以下几个(1)报文处理—主要是接收TCP/IP协议栈的消息,回调各个协议注册的接收函数处理协议报文;(2)接口处理—主要是接收由接口管理和IP模块上送的有关接口状态和IP地址的消息;(3)出错处理—主要是处理由转发模块上送的出错消息,必要时需要重发已有的路由信息;(4)命令行处理—主要是接收由命令行传来的配置命令,转发给各个协议的命令处理函数;(5)定时器处理—路由模块自己维护一套定时器处理机制。(6)作业处理—路由模块将可以延迟执行的任务称为作业,它将在系统空闲时得以执行。以上子任务中,除了作业每次只处理一个,无法加以控制外,所有其它的任务都可以按时间限制一次处理的消息个数。具体方法将在下文中结合图2加以说明。给整个路由任务(例如刷新任务)指定一个的一次不间断执行的最大执行时间(RMET),例如定为250ms。可以针对不同的设备或系统的需求加以修改。在整个路由任务的执行过程中设置至少一个时间检测点。在这些检测点上检查当前路由刷新任务总的执行时间是否超过RMET。如果没有超过,则继续执行该任务,否则即停止执行当前路由刷新,并释放CPU控制权。这样可以保证当前路由刷新任务不会将其它的操作系统任务饿死。在本发明的一种实施例中,可以按上述6项子任务的重要程度和执行频度,将250ms的RMET划分为6部分,称为子任务最大执行时间(SMET)。例如,报文处理为70ms;接口处理为90ms;出错处理20ms;命令行处理为30ms;定时器处理为20ms;作业处理为20ms。在具体处理时,控制每个子任务的执行时间不能超过上述子任务最大执行时间所限定的值。在一个子任务中也相应地设置至少一个检测点。然后查找在这些检测点上检查当前子任务的执行时间是否超过相应的SMET。如果没有超过,则继续该子任务中后续消息的处理,否则即使还有消息待处理,也必须从当前子任务中返回主循环,将CPU让给下一个子任务。具体地说,在图2所示的实施例中,定时器子任务遇到检测点,先计算当前已经执行的时间,然后判断是否超过RMET。如果已超过RMET,则释放CPU,同时用SMET减去已经执行时间,以便当下次路由任务重新占用CPU后该子任务继续执行时间不会超过SMET的限制,从而做到子任务之间的平衡调度。如果未超过RMET,则进一步检查定时器子任务的处理时间是否超过其相应的SMET,如未超过则可继续处理其它定时器并重复上述检测步骤;否则,即使还有定时器需要处理也必须及时退出,用RMET减去本次子任务处理时间,然后进入下一步的作业处理子任务的处理。如果所有定时器处理完毕后,执行时间依然没有超过SMET的限制,则将SMET减去本次执行时间的剩余时间叠加到下一个子任务的SMET上,使得其它子任务相对繁忙时可以使用更多的时间进行处理。上述只是详细描述了定时器子任务的处理步骤,其实其它的子任务的执行步骤也大体相同,都是需要在合适的地点设置时间检查点,并检查RMET和SMET是否超时。如果超时在保存断点后需要及时退出以便让下一个子任务继续执行。根据两个条件来决定是否允许一个子任务继续执行(1)路由任务总的剩余时间RMET,它表示了整个路由任务最多还能执行多长时间就必须释放CPU给其它任务,它保证的是整个路由任务和其它任务对CPU占用的公平性;(2)本子任务定制的最长执行时间,它表示的是该子任务一次执行的处理时间总和不能超过该限制,它保证的是路由任务内部的各个子任务之间对CPU占用的公平性。SMET初值可以由用户指定,而且在路由任务运行过几遍后,RMET不断递减而SMET的初值保持不变,使得SMET的数值可能大于RMET,这时在一个子任务处理中间会将整个路由任务挂起,释放CPU给其它任务。当路由任务再次执行时,依然从挂起的子任务中恢复执行,但挂起本子任务前后两次执行时间总和也不能超过定制的SMET的限制。在上述方法中,给出的SMET只是其一次可以执行的最大时间,而这些子任务之间的执行时间往往具有一定的弹性。如果该子任务在其相应的SMET限定的时间前就已经完成了工作,可以立即返回,并将剩余的时间用于后面的子任务。这样循环一遍后,如果发现总的执行时间没有超过RMET的限制,并且当前路由任务还有工作需要执行,则可以不放权,再次进入循环,将剩余的时间用于繁忙子任务的处理。这里的循环就是指6个子任务依次执行一遍,其中有可能出现某些子任务在SMET时间内提前完成,而某些子任务因SMET超时未完成的情况。在这种情况下,再次循环就是为了继续处理那些因SMET超时而提前中止的子任务。在大部分情况下,不是所有的子任务都很繁忙,例如命令行处理因为输入命令的速度限制,往往用不完30ms的时间;定时器处理都是干一些对时间敏感且处理简短的事情,往往也用不完20ms,这些子任务剩余的时间可以给诸如报文处理或接口处理子任务使用。正是由于这种子任务之间的宽松关系使得一方面所有子任务都有机会得到执行;另一方面将时间尽量分配给繁忙的子任务。在本发明的一个优选实施例中,释放对CPU的控制权的操作也不是简单的调用操作系统的sleep函数(该函数就象一个启动操作系统的定时器,时长就是sleep的参数。调用该函数的任务自动被挂起直到过了指定时间后才可能恢复执行)方式,而是启动一个优先级很低的操作系统任务。向这个任务发一个事件,然后等待这个任务返回一个响应。因为这个任务的优先级很低,所以在系统很繁忙时也能保证其它比路由任务优先级低的任务得到执行,而在系统不繁忙时,该任务在收到路由任务的事件后可以立即返回一个响应,使得路由任务可以立即执行,提高了CPU的使用效率。尽管上面对本发明进行了说明,应当理解,这些说明只是列举了本发明的一些具体实施的例子,而不是对本发明的限定。对本发明实施例的各个细节显然可以进行各种修改和采用各种等同的手段。例如,本发明的核心思想是,在静态路由和可能发生变化的因素(接口,IP地址)之间建立关联,以达到快速处理静态路由更新的目的。但建立关联的数目和方式差异很大。本发明的实施方案中的通过HASH表的方式在接口索引和静态路由之间建立关联只是其中的一种方式,还可以有其它方式。例如,通过在直接在接口数据结构和存放IP地址的数据结构中增加指针链表,也能达到同样的目的。同样,对于路由任务的调度而言,调度策略也有很多种,也可以使用很多现成的调度算法。本发明的方案是在一个非抢占的任务中实现的,没有向操作系统那样实施很精准的控制,而且考虑到调度本身的开销,因而只采用了较为容易实现的一种。除此之外,还可以综合考虑动态优先级与执行时间等其它一些因素,对子任务的处理流程进行人为地控制以实现公平、稳定、有所侧重的运行。因此,本发明的范围仅由权利要求书所限定。权利要求1.一种静态路由的刷新方法,包括如下步骤(1)建立网络接口与相关的静态路由之间的关联;(2)对于发生变化的所述网络接口,搜索与所述网络接口相关的静态路由;(3)对搜索到的所述相关静态路由进行刷新。2.根据权利要求1所述的方法,其特征在于,所述步骤(1)包括(1-1)将同一目的地的多个静态路由构成静态路由链表,所述静态路由链表中的每一项表示一条特定的静态路由,并且包含所述静态路由下一跳的链表,该链表中的每个节点表示了该静态路由配置的一个下一跳;(1-2)对静态路由根据所配置下一跳找到的出接口索引进行散列(HASH)运算,生成所述的静态路由出接口索引HASH表,该HASH表的节点与所述静态路由下一跳链表中的相应节点相关联。3.根据权利要求2所述的方法,其特征在于,所述步骤(2)包括(2-1)当所述网络接口发生变化时,根据变化的接口计算出该接口索引的HASH值;(2-2)在所述HASH表中搜索与所述接口相关的静态路由;(2-3)对搜索到的静态路由进行刷新。4.根据权利要求3所述的方法,其特征在于,所述对静态路由的刷新包括(2-3-1)查找所述静态路由的下一跳;(2-3-2)如果查找到所述下一跳,则根据该下一跳的接口索引生成索引节点,加入所述HASH表中;(2-3-3)如果查找不到所述下一跳,则将所述静态路由置于所述HASH表的特定位置。5.根据权利要求2所述的方法,其特征在于,进一步包括,(1-4)将所述静态路由的下一跳作为掩码长度为32位的IP地址,建立radix树;(1-5)当所述网络接口发生变化时,搜索所述radix树中相应的静态路由的下一跳节点;(1-6)更新下一跳节点所对应的静态路由。6.根据权利要求1所述的方法,其特征在于,进一步包括,(4)当多个所述网络接口发生状态变化时,限制对静态路由处理的消息个数。7.根据权利要求6所述的方法,其特征在于,所述限制对静态路由处理的消息个数的步骤进一步包括(4-1)为单个静态路由处理任务设置一次不间断执行的最大执行时间;(4-2)在所述静态路由处理任务中的至少一个时间检测点检测当前静态路由处理任务的执行时间;(4-3)如果所检测到的执行时间未超过所述最大执行时间,则继续执行所述当前静态路由处理任务;和(4-4)如果所检测到的执行时间超过所述最大执行时间,则停止执行当前的静态路由处理任务,并释放执行静态路由处理任务的CPU。8.根据权利要求7所述的方法,其特征在于,所述步骤(4-2)进一步包括(4-2-1)根据当前静态路由处理任务中包含的子任务的优先级,将所述最大执行时间划分为与所述子任务的个数相应的子任务最大执行时间;(4-2-2)在所述子任务中的至少一个时间检测点检测当前子任务的执行时间;(4-2-3)如果所检测到的执行时间未超过所述子任务的最大执行时间,则继续执行所述当前子任务;和(4-2-4)如果所检测到的执行时间超过所述子任务的最大执行时间,则停止执行当前的子任务,而执行当前静态路由处理任务中包含的下一个所述子任务。9.根据权利要求8所述的方法,其特征在于,所述步骤(4-2-3)进一步包括(4-2-3-1)当所述当前子任务在其最大执行时间内完成时,立即进入下一子任务的处理;并且所述方法进一步包括(4-2-5)在按照步骤(4-2-1)-(4-2-4)进行了所有子任务的处理后,判断是否超过所述单个静态路由处理任务的最大执行时间;(4-2-5)如果没有超过所述最大执行时间,判断当前静态路由处理任务中是否还有子任务需要执行;(4-2-6)如果还有子任务需要执行,则执行该子任务,然后返回步骤(4-2-2)。10.根据权利要求7、8或9所述的方法,其特征在于,所述步骤(4-4)进一步包括在释放执行静态路由处理任务的CPU时,启动具有低优先级的操作系统任务。全文摘要本发明提供了一种静态路由的刷新方法,包括如下步骤建立网络接口与相关的静态路由之间的关联;对于发生变化的所述网络接口,搜索与所述网络接口相关的静态路由;只对搜索到的所述相关静态路由进行刷新,同时优化路由模块的任务调度机制,实现整个系统的平稳运行。根据本发明,可以最大限度地提高处理的效率,减少对CPU的占用。文档编号H04L29/02GK1543133SQ0312425公开日2004年11月3日申请日期2003年4月30日优先权日2003年4月30日发明者王军,王军申请人:华为技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1