一种基于哈希表和扩展存储器的高性能IPv6地址查找方法

文档序号:7746005阅读:311来源:国知局
专利名称:一种基于哈希表和扩展存储器的高性能IPv6地址查找方法
技术领域
本发明涉及一种在高速IPv6路由器中查找路由表项的方法,准确地说,涉及一种采用哈希表和扩展存储器的IPv6地址查找方法,属于IPv6网络设备路由转发技术领域。
背景技术
IP路由器在网络中起着桥梁作用,可将多个小网络连接成大网络,通过 IPdnternet Protocol)协议相互通信。而路由器最主要功能是IP数据包的转发,即从 输入接口接收IP数据包,并根据IP包首部中的目标地址,从路由信息表RIB(R0uting Information Base)中查找出相应的输出接口信息,然后将IP包转发到相应的输出接口, 从而完成分组转发功能。为了解决路由信息表中路由前缀数目快速增长的问题,无分类域间路由 CIDR(Classless Inter-Domain Routing)的IP地址编址方案被正式采用,从而,必须采用 最长前缀匹配LPM(Longest Prefix Matching)算法解决IP地址查找问题,因此,大大增加 了 IP地址查找的复杂性。随着网络用户和通信业务的日益增长,导致IPv4地址分配面临枯竭,以及IPv4网 络安全性及灵活性等问题的限制,于是IETF(Internet Engineering TaskForce)提出了 IPv6 (Internet Protocol Version 6)编址方案,但是,由于IP地址从IPv4的32位变成 IPv6的128位,很多IPv4查找算法已经不能满足IPv6的128位地址查找。现在是IPv6发 展的初期,还有很多不确定性因素IPv6路由表中前缀分布规律及表项增长规律,IPv6地 址查找算法的设计只能依据IPv4地址查找的经验,从而,IPv6地址查找算法的效率及实现 代价等问题需要设计者来解决。现有的IPv6地址查找方法都是直接或者间接利用传统的IPv4地址查找方案进行 设计的,由于查找关键字从32位增长到128位,所以这种设计思路会存在很多问题,例如, 使用TCAM进行IPv6地址查找会在很大程度上提高设计成本和系统功耗,同样表项数量的 路由表,要使用多级TCAM进行级联才能完成查找工作,这样在工程系统设计时,其高昂的 成本和大的功耗使该方案不会被直接应用;使用Trie树及其衍生算法(比如层压缩Trie 树、路径压缩Trie树、多比特Trie树等)在地址查找时,会使存储器访问次数成倍增加,从 而导致查找延迟更大,系统查找效率降低;使用基于存储器扩展的查找方法会使存储成本 成指数级的增加,在IPv6地址中,分布数量最多的是长度为32位的路由前缀,直接利用存 储器扩展的方法进行设计,将其作为第一级查找,需要的存储器大小为232bit,再加上第二 级更大空间的存储器,使得直接应用该方案对IPv6地址查找是不可实现的。总之,IPv4地址查找方法直接用于IPv6地址查找是难以实现高性能IPv6地址查 找的,所以在IPv6地址查找方法设计时,要利用IPv6本身的特点(比如IPv6前缀分布规 律、IPv6路由表项增长趋势等)和传统的IPv4地址查找思路进行设计,会使IPv6地址查 找方法具有可实现性和高效性。

发明内容
本发明的目的是提供一种采用哈希表和扩展存储器两级结构的IPv6地址查找方 法,该方法具有高速查找效率、可扩展性强、存储利用率高等特点,可用于高性能IPv6核心 路由器中。(1)为描述方便,首先做如下定义定义1哈希前缀HP (i) (Hashing Prefix)表示长度i可以被8整除的前缀项,该 方法中所指的哈希前缀为=HP (16)、HP (24)、HP (32)、HP (40)、HP (48)、HP (56)和 HP (64);定义2扩展前缀EP (j,k) (Expanded Prefix)两个能被8整除哈希前缀项之间的 所有前缀,j = 8i+l,i为整数且0彡i彡7,k = j+m,m为整数且1彡m彡6该方法中所指 的扩展前缀包括:EP (17,23)、EP (25,31)、EP (33,39)、EP (41,47)、EP (49,55)和 EP (57,63) 等。在IPv6路由表中,哈希前缀HP和扩展前缀EP构成了整个路由表;定义3 扩展前缀哈希项 EPH (n) (Expanded Prefix Hashing Segment)与扩展前缀 扩展项EPE (η) (Expanded Prefix Expanded Segment)长度为η的扩展前缀可以分为两个 部分1 i和i+Ι n,i是小于η且最大可以被8整除的整数。将扩展前缀中1 i比 特之间的值称为EPH(η),而i+1 η称为扩展前缀扩展项EPE (η)。例如,长度为20比特的 扩展前缀2a01:c*/20,其扩展前缀哈希项ΕΡΗ(20)为2a01,其扩展前缀扩展项EPE(20)为
Co在该方法中用Hashm表示长度为m比特的哈希前缀所存储的哈希表。其中m = 16, 24,32,40,48,56 和 64,即有 Hashl6、Hash24、Hash32、Hash40、Hash48、Hash56、Hash64 分别 存放长度为16,24,32,40,48,56和64比特哈希前缀的哈希值;用RAMp_q表示存放扩展前 缀项所对应值的存储器块,RAM存储地址用扩展前缀扩展项EPE计算,其中包括RAM17_23、 RAM25_31、RAM33_39、RAM41_47、RAM49_55、RAM57_63 ;用 CPEs_t 表示哈希冲突处理单 元(Collision Processing Element),在该方法中包括 CPE16_23、CPE24_31、CPE32_39、 CPE40_47、CPE48_55、CPE56_63、CPE64。注在描述时将Hashm、RAMp_q、CPEs_t看成模块名,下面的描述过程同理。(2)本发明的思路及总体结构如下所述随着IPv6网络的发展,IPv6路由表项数目逐渐增加,并呈现出一定的分布规律, 如图2(Potaroo上核心路由器中的路由表),通过分析路由表中IPv6路由前缀长度的分布 规律,可以发现IPv6路由表前缀分布有如下特点①IPv6路由前缀长度全部小于64比特;②长度可以被8整除的前缀分布比例非常大,占总共路由表的93%以上。例如, 长度为32比特的前缀占整个路由表的65. 44%,长度为48比特的前缀占整个路由表的 24. 15%等等;③根据Potaroo网站统计的数据,长度可以被8整除的前缀增长速度特别快,而且 整个IPv6路由器表项数目的增长这部分前缀数量占很大比例,例如,08年1月到09年6月 期间,长度为32比特的前缀从600多项增加到了 1176项,长度为64比特的前缀从10多项 增加到30多项;④长度不能被8整除的前缀在整个路由表中所占的比例非常小,仅有6%,而且增长速度缓慢。本发明根据以上的分析结果,利用局部性原理对长度可以被8整除和不可以被8 整除的前缀项用不同的处理方法进行处理。将绝大多数前缀(长度可以被8整除的前缀)作为第一级哈希表中的数据,这样可以使绝大多数地址在第一级就可以完成查找,而将其它前缀(长度不可以被8整除的前 缀)作为第二级扩展存储器的数据,少数地址需要查找第二级可以完成查找。为了提高整 个查找系统的性能,该方法利用所统计的前缀分布规律,将长度为16比特,24比特,32比 特,40比特,48比特,56比特和64比特的前缀作为第一级查找数据,其它前缀作为第二级查 找。同时由于16比特和24比特,24比特和32比特,32比特和40比特,40比特和48比特, 48比特和56比特,56比特和64比特之间都相差7位,可以对其它长度的前缀用扩展存储 器进行处理,如图4和图11。Hash函数存在冲突,所以用哈希冲突处理模块解决冲突。这 就是本文提出的基于哈希和扩展存储器的IPv6地址查找的主要思路。图3给出了哈希表和扩展RAM的存储结构。为了表述方便,在图中将各种哈希表 Hashi (i = 16,24,32,40,48,56)的存储结构统一起来描述,每种哈希表都是17位的宽度和 65535项的深度(216)的存储器;也将各种扩展RAMp_q&存储结构统一起来描述,但是在具 体实现时,应该考虑到哈希冲突的影响,对存储器的地址宽度W(也为存储器深度D的对数 值W = Iog2D)应该做适当调整。 哈希表项存储结构(i = 16,24,32,40,48,56和64)如图3(a)所示①E 表示有扩展前缀扩展项ΕΡΕ,即长度为i+Ι i+7比特的前缀,E = 1,表示该 项存在扩展前缀扩展项EPE,E = 0,表示该项不存在扩展前缀扩展项;②BloCk_addr 是扩展前缀扩展项EPE所对应扩展RAM块的编号。例如,如果一条前缀项所对应BloCk_addr的值为“X”,扩展前缀扩展项EPE的低 位扩展可化成十进制数“y”,则该前缀所对应的下一跳值应该存放在第二级存储器的第 128*x+y个地址单元中;③F 表示哈希表此项为有效匹配前缀项。当F = 0时,Nh (i)为全零;F = 1时, 输出Nh(i),即为下一跳值;当对扩展RAM的某项插入前缀对应信息时,F字段则设为1 ;④Nh(i)字段为该前缀项所对应的下一跳值。 扩展部分的表项存储结构,如图3(b)所示①H 表示此项为有效匹配的前缀项,可以将此项所对应的下一跳值Nh(i+1,i+7) 输出。H = 1时,Nh(i+1, i+7)为全零,F = 1时,输出Nh(i+1,i+7);当对该项插入前缀信 息时,F字段则设为1 ;②Nh(i+1,i+7)字段为该前缀项所对应的下一跳值。上面所定义的哈希表存储结构和扩展RAM的存储结构在本文中的组织如图4所 示,哈希表存放哈希前缀HP和扩展前缀哈希项EPH的信息,第二级的扩展RAM存放扩展前 缀扩展项EPE的信息,这两级查找之间通过信号“E”进行连接。在查找过程中,如果哈希项 中的“F”为“1”,则表示该项即为匹配项;如果哈希表项中的‘ ”为“1”,则表示所查找的地 址还需要在扩展RAM中查找更长的匹配项;如果扩展RAM项中的“H”为“1”,则表示该扩展 RAM项中的值为匹配的下一跳索引值。(3)本发明采用的技术方案描述如下
一种基于哈希表查找和扩展存储器查找的IPv6地址查找方法,包括1个查找分 类器,1个更新分类器,7个并行的哈希处理单元Hashl6、Hash24、Hash32、Hash40、Hash48、 Hash56、Hash64,6 个扩展存储器处理单元 RAMI7_23、RAM25_31、RAM33_39、RAM41_47、 RAM49_55、RAM57_63,7 个哈希冲突处理单元 CPE16_23、CPE24_31、CPE32_39、CPE40_47、 CPE48_55、CPE56_63、CPE64,1个优先级比较单元;其特征在于对IPv6地址进行查找,并对 IPv6路由表项进行更新,具体步骤为a.根据IPv6路由表分布规律的统计,将路由表项分为两种一种是长度可以被8 整除的前缀,一种是长度不能被8整除的前缀;b.对两种路由表项分别用哈希表和扩展存储器进行存储,用哈希冲突处理单元处 理哈希冲突项;c.优先级比较器可以选择出最长匹配前缀所对应的下一跳信息;d.在查找过程中,以目的IPv6地址为查找对象在7路查找模块中并行查找,最长 匹配前缀所对应的下一跳信息为查找结果;本方法的具体查找过程如图6所示要进行IPv6地址查找,必须先将路由表进行初始化,初始化具体过程下文所述;
如果路由表初始化工作已完成,则可以对IPv6地址进行查找先对IPv6做第一级 哈希查找,然后根据情况判断是否要进行第二级查找。查找过程可以分为三个步骤完成第 一级哈希表查找,第二级扩展RAM查找和优先级比较。具体描述如下第一步将目的IPv6地址做7种hash查找,即分别在Hashl6、Hash24、Hash32、 Hash40、Hash48、Hash56、Hash64 哈希查找单元中,对目的 IPv6 地址的前 16bits、24bits、 32bits、40bits、48bits、56bits和64bits做并行查找操作。如果查找到匹配项,则将对应 的下一跳索引值输出到优先级比较器中准备比较。第二步如果第一级查找指示在第二级查找单元中还有更长的前缀需要做匹配计 算,则需要进行第二级查找,在第二级中利用存储器扩展技术,扩展前缀扩展项EPE可以插 入到有128个地址的块RAM中。设前缀的对应位为[i+l:i+7](i为哈希前缀的长度),查 找时,则根据目的地址的第(i+Ι i+7)位计算出索引值,利用该值在扩展RAM存储器中寻 址,匹配地址单元所对应的值即为下一跳值Nh(i+1,i+7),将该下一跳值输出到优先级比较 器中进行比较。第三步将输入到优先级比较器的寄存器中的值进行优先比较,“next hop”输出 优先级最高的值(即最长匹配前缀所对应的下一跳值)作为该IPv6目的地址所匹配的下 一跳值,即为所查到的值。e.在更新过程中,通过哈希计算和扩展存储器地址计算可以进行路由表项更新,包括路由表初始化(构造路由表)、插入表项、删除表项和修改表项,具体如下 路由表初始化及表项插入步骤为①通过需要更新的路由表项确定需要更新表项的位置先判断需要更新路由前缀 的长度是否可以被8整除;②如果可以被8整除,通过更新分类器选择出对应的处理模块,将此前缀进行哈 希计算,用所得哈希值索引哈希表,如果索引到的哈希表项已经放入其它路由信息,则将该前缀所对应的路由信息放入哈希冲突处理单元中进行处理,如果索引到的哈希表项是空 项,则将对应的路由信息放入该项中;③如果前缀长度不可以被8整除,通过更新分类器选择出对应的处理模块,先将 该前缀的扩展前缀哈希项做哈希计算,用所得哈希值索引哈希表,若该表项为空,则将所分 配的第二级存储单元的首地址存入该表项,然后将所对应的路由信息放入所分配存储单元 的对应位置,若该表项不为空且该前缀的扩展前缀哈希项不同于已插入前缀的扩展前缀哈 希项,则将该前缀所对应的路由信息插入到已分配的第二级存储单元中,如该表项不为空 且该前缀的扩展前缀哈希项和已插入前缀的扩展前缀哈希项相同,则将该前缀放入哈希冲 突处理单元中进行处理。如图5所示,路由表构造及表项插入的具体过程描述如下第一步将哈希表和扩展RAM初始化为空;第二步根据待插入前缀长度来判断此前缀属于哈希前缀HP还是扩展前缀EP, 如果是HP,则将此前缀进行哈希计算,用所得哈希值索引哈希表,如果索引到的哈希表项中 “F”字段为“0”,则将该项的“F”字段设为“l”,“Nh(i)”字段设为该前缀所对应的下一跳值; 如果对应项中“F”字段为“ 1 ”,表明该前缀项产生哈希冲突,则用CPE进行哈希冲突处理。
如果是EP,则将此前缀的扩展前缀哈希项EPH做哈希计算,用所得哈希值索引哈 希表,判断索引到的哈希表项“E”字段是否为“0”,如果“E”字段为“0”,则将哈希表对应项 的“E”字段设为“丨”,“Block_addr”字段是为扩展前缀扩展项EpE所分配块Ram的编号,用 扩展前缀扩展项EPE计算出块RAM的块内相对地址,并将下一跳值放入对应的存储单元中; 如果“E”字段为“ 1”且该前缀的扩展前缀哈希项EPH部分和已插入该项的前缀的扩展前缀 哈希项相同,则将该前缀的下一跳值放入该哈希表项“BloCk_addr ”字段所指示的已分配块 RAM中,用扩展前缀扩展项EPE计算出块RAM的块内相对地址,并将下一跳值放入对应的存 储单元中;如果“E”字段为“1”且该前缀的扩展前缀哈希项EPH部分和已插入该项的前缀 的扩展前缀哈希项不同,表明该前缀项产生哈希冲突,则用CPE进行哈希冲突处理。在此用一个例子说明以上路由表的构造过程现有三个待插入的路由表项,分别 为 2001:2abc: /32,下一跳值为 A, 2001 2abc 9 :/36,下一跳值为 B, 2abc 2001 9 :/36, 下一跳值为C。当插入前缀2001 2abc /32时,先判断出这个前缀长度为32比特,可以知道 该前缀为哈希前缀,经过哈希计算得到结果为16,h0abd,然后判断Hash32第16,h0abd个单 元中的“F”字段设是否为“0”,如果为“0”,则将该单元中的“F”字段设为“1”,“Nh(32)”字 段设置为“A”,其余字段都不改变;如果为“ 1 ”,则将前缀项2001 2abc /32放入CPE (32, 39)中进行处理,这样就完成了第一个表项的插入;当插入前缀2001:2abC:9::/36时,将其前32位做哈希计算得到的结果为 16,hOabd,然后判断Hash32第16,hOabd个单元中的“E”字段为“0”,则将该项的“E”字段 设为“1”,再给此扩展前缀扩展项9 ( 二进制可表示为1001000)分配一块8位宽,128个存 储单元的块扩展RAM,将此块RAM的编号填充到该哈希表项的“BloCk_addr”字段,将下一 跳值存入扩展MM的第72 ( 二进制1001000转换为十进制为72)个存储单元中(绝对地址 则为该块扩展MM的编号乘以128,再加上72所得的值),并将该单元的最高位“H”设置为 1,这样就完成了路由表项的插入;当插入第三项前缀2abc: 2001:9: :/36时,将其前32位做哈希计算得到的结果为16,hOabd,然后判断Hash32第16,hOabd个单元中的“Ε”字段为“ 1 ”,但是该前缀的扩展前 缀哈希项EPH和已插入前缀的扩展前缀哈希项不同,所以将该前缀放入哈希冲突处理模块 CPE中进行处理。这样,将所有的路由表项进行插入就完成了路由表的构建。 表项删除及修改步骤为①通过更新分类器选择出对应的处理模块;②利用查找方法,查找到待更新的路由表项,然后将该表项的路由信息进行删除 或者修改。路由表项删除及修改的具体情况描述如下路由表项的更新主要包括三种操作,插入、删除和修改,分别要根据待更新项的前 缀值确定更新表项的位置。对于前缀插入操作,可以按照路由表的创建算法进行插入。对 于前缀修改和删除操作,则类似于地址查找的过程,首先利用查找算法,找到该前缀表项, 然后再执行相应的修改和删除操作,可以分为以下两种情况第1种情况当要修改或删除的前缀为哈希前缀时,则将“F”字段设置为“0”,清 空其它字段的值;第2种情况当要修改或删除的前缀为扩展前缀时,则将“Ε”字段和“BloCk_addr” 字段设置为全“0”,然后收回扩展RAM的存储空间。其实也可以将路由表的更新看成地址查找的另一种功能,就是找到特定的位置, 在该位置上进行插入操作或者删除操作。将长度可以被8整除的路由前缀用哈希表进行存储,将长度不能被8整除的前缀 用哈希表和扩展存储器做两级存储。将长度为η的前缀(η不能被8整除)可以分为两个部分1 i和i+Ι n,i是 小于η且最大可以被8整除的整数。将前缀中1 i比特之间的值所对应的信息存储到哈 希表中,而i+Ι η之间的值所对应的信息存放到扩展存储器中,两级之间有相互联系的字 段。如图4所示,哈希表存放哈希前缀HP和扩展前缀哈希项EPH的信息,第二级的扩展RAM 存放扩展前缀扩展项EPE的信息,这两级查找之间通过信号“E”进行连接。在查找过程中, 如果哈希项中的“F”为“1”,则表示该项即为匹配项;如果哈希表项中的‘ ”为“1”,则表示 所查找的地址还需要在扩展RAM中查找更长的匹配项;如果扩展RAM项中的“H”为“1”,则 表示该扩展RAM项中的值为匹配的下一跳索引值。按照前缀长度从长到短,在优先级比较器中设置优先级从高到低的13个寄存器, 实现最长前缀匹配结果。优先级比较器的流程图如图13所示,工作过程如下第一步定义13个寄存器,分别表示各查找结果的优先级,设置其优先级从高到低依次为“Nh64”,“Nh57-63”,“Nh56”,“Nh49-55”,“Nh48”,“Nh41-47”,“Nh40”,“Nh 33-39”,“Nh 32”,“Nh 25-31”,“Nh 24”,"Nh 17-23”,“Nh 16”,并将这 13 个寄存器初始化为零。第二步如果哪一个寄存器内的值不为零,则该寄存器中所存的值为待查目的地 址所匹配的一个下一跳,而该目的地址的最长匹配前缀所对应的下一跳值为优先级最高的 寄存器里的值,将该值作为下一跳值输出,即为所查。
将哈希处理单元Hashl6、Hash24、Hash32、Hash40、Hash48、Hash56、Hash64 所计算 的16位值直接作为哈希值在哈希表中进行索引,;哈希处理单元Hashl6、Hash24、Hash32、Hash40、Hash48、Hash56 与对应的扩展存 储器 RAM17_23、RAM25_31、RAM33_39、RAM41_47、RAM49_55、RAM57_63 进行两级关联,并和对 应的哈希冲突处理单元 CPE16_23、CPE24_31、CPE32_39、CPE40_47、CPE48_55、CPE56_63 分 别构成6路处理模块,第7个哈希处理单元hash64和其对应的哈希冲突处理单元CPE64构 成1路处理模块,7路模块并行对IPv6地址进行查找以确定其匹配前缀项,在7路查找出的 结果中,通过优先级比较器进行比较以实现最长前缀匹配。通过哈希计算和扩展存储器地址计算完成路由表项更新工作,路由表项的更新主 要包括三种操作,插入、删除和修改,分别要根据待更新项的前缀值确定更新表项的位置, 对于前缀插入操作,可以按照路由表的创建算法进行插入。对于前缀修改和删除操作,则类 似于地址查找的过程,首先利用查找算法,找到该前缀表项,然后再执行相应的修改和删除 操作,可以分为以下两种情况第1种情况当要修改或删除的前缀为哈希前缀时,则将“F”字段设置为“0”,清 空其它字段的值;第2种情况当要修改或删除的前缀为扩展前缀时,则将“E”字段和“BloCk_addr” 字段设置为全“0”,然后收回扩展RAM的存储空间。有益效果本发明是采用基于哈希表和扩展存储器的两级结构查找方案,有93%以上的 IPv6地址可以使用一个存储周期即可完成查找,不到7%的IPv6地址只需要两个存储周期 即可完成查找,所以本发明具有很高的查找效率。由于地址查找方案会占用相对较大的存储空间,存储空间也是衡量地址查找方案 优劣的主要性能之一,所以按照65536项的IPv6路由表的规模,将该方法所占的存储空间 大小进行统计,如下按照定义,对哈希表Hashl6、Hash24、Hash32、Hash40、Hash48、Hash56、Hash64 用 20位宽的地址总线,17位宽的数据总线,这样,哈希表总共所占的存储为22°X(24+1)X7 =14. 875 (MB);设扩展前缀按7%计算,65536项路由表中有4587项扩展前缀,且每个扩展前缀所 占的存储空间为27X8 = Ik(7位宽的地址总线,8位宽的数据总线)可以求出总共需要的 存储空间为:4587Xlk = 4587k(b) = 0. 4587 (MB);设冲突率是按前缀分布比例分布的,如果按9. 86%的冲突率来计算(该冲突率是 统计得到的,会随着哈希表深度增加而减小),总共有6462项会发生哈希冲突,在处理哈希 冲突时,所需要的CAM为28. 75kB ;可以得到,如果65536项的路由表,使用本方案总共需要RAM为15. 33MB,需要CAM 28.75kB。由于预先设定大小的RAM和CAM还能存放更多路由表项,且哈希表的深度可以增加,所以本发明的扩展性强且容易实现。因此,本发明方法的优点是查找效率高、存储利用率高、可扩展性强且实现简单。


图1是基于哈希表和扩展存储器的高性能IPv6地址查找方法总体结构图;图2是IPv6路由表的前缀分布规律;图3 :a是哈希表存储结构,b是扩展存储器的存储结构;图4是哈希表和扩展存储器的组织方式;图5是路由表构造及前缀插入流程图;图6是查找过程流程图;图7 :a是48比特值的哈希计算过程示意图,b是40比特值哈希计算过程示意图;图8是1-16比特值的哈希组织过程;图9是扩展前缀在扩展存储器中的组织;图10是第二级扩展存储器地址分配实例示意图;图11是块RAM分配的一种特例;图12是哈希单元与扩展存储器的组织关系示意图;图13是优先级比较流程图;图14是哈希冲突处理原理图。
具体实施例方式本发明的具体实现方式描述如下(1)总体实现结构该方法使用7路哈希表并行查找,如图1所示。总体设计可以分为四部分哈希表 的设计,扩展RAM的设计,哈希冲突处理单元的设计以及优先级比较器的设计。而且还需要 考虑到每种哈希表的结构都不同,第一级哈希表和第二级扩展RAM如何进行组织。由于哈希表和扩展RAM之间存在一定的关系哈希表Hashi可以存放哈希前 缀HP⑴和扩展前缀哈希项EPH(i+l,i+7)的信息,所以将具体方案划分为Hashl6和 RAM17_23查找单元、Hash24和RAM25_31查找单元、Hash32和RAM33_39查找单元、Hash40和 RAM41_47 查找单元、Hash48 和 RAM49_55 查找单元、Hash56 和 RAM57_63 查找单元、Hash64 查找单元以及优先级比较器。按照这样的单元划分,Hashl6和RAM17_23查找单元、Hash24和RAM25_31查找单 元、Hash32 和 RAM33_39 查找单元、Hash40 和 RAM41_47 查找单元、Hash48 和 RAM49_55 查找 单元、Hash56和RAM57_63查找单元的实现方法及结构组织类似,即第一级哈希查找和第二 级扩展RAM查找,只需要将不同单元的哈希函数改变即可,Hash64查找单元仅仅是哈希查 找,而没有扩展RAM,实现更加简单,而且第一级哈希表和第二级扩展RAM的组织容易实现。所以按照这样的划分,具体实现的有这几部分哈希单元的设计,扩展RAM单元的 设计,哈希单元和扩展RAM的组织,哈希冲突处理单元的设计以及优先级比较器的设计。为了减少哈希冲突的发生,每个哈希表都是独立编址,但哈希表存储的数据结构都相同。将Hash 16和RAM17_23查找单元、Hash24和RAM25_31查找单元、Hash32和RAM33_39 查找单元、Hash40和RAM41_47查找单元、Hash48和RAM49_55查找单元、Hash56和RAM57_63 查找单元、Hash64查找单元所产生的哈希冲突都分别用CAM进行处理,因为在不影响系统 性能的情况下,CAM可以使用一个存储周期完成一次查找,并且CAM的设计复杂度及功耗比TCAM 低。(2)查找分类器和更新分类器的设计与实现查找分类器取待查IPv6地址的前16位、24位、32位、40位、48位、56位、64位,分别 送入7路模块中并行查找。例如,待查目的IPv6地址为2001 4500 5a6b 44f9 0 0 0 0 (16 进制表示法),则将 2001、2001:45、2001:4500、2001:4500:5a、2001:4500:5a6b、 2001 4500:5a6b:44、2001 4500:5a6b:44f9分别送入到如图1中的7路模块中进行处理。更新分类器将待更新数据进行判断发送到对应的7路模块中进行更新。例如,待 插入的路由表项为2001:2abC: :/32,则将该表项所对应的路由信息送入到Hash32模块中 进行插入操作;待删除的路由表项为2001:2abc:ba5: :/44,则将Hash40和RAM41_47查找 单元的对应表项进行删除即可。(3)哈希单元的设计与实现利用基于折叠XOR算法的哈希函数进行哈希计算,为了降低哈希冲突率,对7种不 同长度的数据采用7种不同的折叠XOR哈希算法,在描述时,我们将所有的哈希索引值都设 置成16位宽,但是在具体实现时,可以根据不同前缀分布设置不同的位宽。对本文所涉及 到的XOR Folding算法分为以下两种情况第一种情况直接折叠法,若数据可以划分为相等长度的子数据,且子数据长度和 所要求的哈希索引值位宽相等,则将数据做直接划分为相等长度的若干个子数据,然后将 子数据对应位进行异或操作。例如,若有一个48位的二进制数B[47:0],需要计算得到的索引值为16位宽的 IndeX[15:0],则 Index 计算公式为Index[15:0] = B[150] Φ B[31 16]十 B[47 32],过程如
以下例子48比特的值利用XOR Folding计算哈希索引值的过程,如图7(a)所示第一步对输入的48比特值B [47:0]进行哈希计算,B [47 0]是IPv6地址的前48 位或者48比特长度的前缀。第二步对此值进行折半异或操作,可以得到中间值Bl[15:0]Β^υ^Ρ ΒΓΜΙΘΒρ Ι,ΒΠΜΘΒρΟΙ,ΒΠΒΙΘΒΡ^ΒΕη θΒρδ],Β[11]ΘΒ[27],Β[10]ΘΒ[26],Β[9]ΦΒ[25],Β[8] Β[24],Β[7]十 Β[23],Β[6]十 Β[22],Β[5]十 Bp 1], Β[4] θ Β[20],Β[3]ΘΒ[19],Β[2]ΘΒ[183,Β[1]ΦΒ[17],Β
ΘΒ[16]}第三步对中间值Bl [15:0]和Β[47:32]进行位异或操作,得出哈希索引值 index[150]index[15:0] = {Bj[15]eB [47],Bj[14] B HGLBJD]十B [45],B1[12] B [44],BJ11] B [43],Β,[10]ΘΒ [^SLB1P]十B HlLB1R]十B [40],BJ7
B P^B1K]十B [383,6^5] B ΡΤΙ,Β,^ΙΘΒ [36],BJ3]十B [35],BJ2]@B [34],BJ1] B [33]為
8 [32]}
ο在该方案中,对长度为64比特,48比特和32比特的值使用直接折叠法进行哈希计
笪弁。第二种情况错位折叠法,若数据可以划分为相等长度的子数据,但子数据长度和 所要求的哈希索引值位宽不相等,则将数据做直接划分为相等长度的若干个子数据,然后将子数据之间进行错位,凑成和索引值位宽相等后再进行异或操作。若有一个40位的二进制数B[39:0]。需要计算得到的索引值为16位宽的Index [15:0],贝丨J Index 计算公式为:Index[15:0] =B[i: j]十, 0 < i, j, ρ, q < 40。例如,40比特的值利用XOR Folding计算哈希索引值的过程,如图7 (b)所示第一步对输入的40比特值B [39:0]进行哈希计算,B [39 0]是IPv6地址的前40 位或者40比特长度的前缀。第二步对此值进行折半异或操作,可以得到中间值Bl[15:0]和B2[15:0]BJIS.O] = {B[19],B[18],B[17],B[16],B[15],B[14],B[9] B[13], B[8] Θ B[12], B[7] ΘΒ[11],B[6]十 B[10],B[5]’B[4]’B[3]’B[2],B[1]},B2[15:0] = {Β[39],Β[38],Β[37],Β[36],Β[35],Β[34],Β|;29]Θ B[33],B[28] θ B[32], B[27] θ B[31],B[26] θ B[30],B[25],B[24],B[23],B[22],B[21],B[20]}.第三步得出哈希索引值index[15:0]: η 6χ[15:0] = {Β1[15]ΘΒ2[15],Β1[14]ΘΒ2[14],Β1[13]ΘΒ2[13],Β1[12]ΘΒ2[12],Β,ΙΠΙθΒ^ΙΙΙ,Β^ΙΟΙΦΒ^ΙΟΙ,Β,Ι^ΦΒ^Ι,Β,^ΦΒ^δ],Β^ΦΒ,Ι ΙΒ^ΦΒ,ΙβΙΒ^ΦΒ^ΙΒ^ΦΒ,μ Βρ ΘΑ^,Βρ ΘΒρ ,Β ηΘΒ^η,Β,^ΘΒΜ]}。在该方案中,对长度为56比特,40比特和24比特的值使用错位折叠法进行哈希计
笪弁。对1-16比特值进行组织过程如下可以直接将16位的值作为哈希索引,如图8所示,其实hashl6可以对0-16比特 的值直接进行处理,例如,10比特长的二进制数“1000110110”(转换成十进制数为566),其 哈希表索引地址为16’ d566,那么,哈希表中16’ d566单元即为所查找到的单元。因此,可 以用一次访问存储时间解决1-16位长数据的查找,而且该单元不会发生哈希冲突情况。(4)扩展存储器的实现A.扩展前缀扩展项EPE在扩展RAM中地址的计算已知一扩展前缀EP,可以获得它的扩展前缀扩展项EPE (i,η),其中η是EP的长 度,而i是小于η的能被8整除的最大整数,n-i+1 <7。用EPE可以形成一个7位的二进 制数S,用S作为索引,将该前缀所对应的下一跳信息插入到给其所分配块RAM的第δ个 存储单元中,这样就可以完成该前缀的组织。EPE所形成的二进制数δ用Verilog语言描 述为{Ε P Ε,j{0}},其中 j = n-i+1。以32到39位长度前缀组织为例说明扩展前缀在扩展RAM中的组织方式,如图9 所示,32位长的前缀为哈希前缀HP (32),则其信息可以直接存储在哈希表Hash32中,而 33到39位长的前缀为扩展前缀,其高32位扩展前缀哈希项EPH的有效信息存储到哈希表 Hash32中,低位信息存储于扩展RAM3339中。
B.扩展RAM的分配及回收这一小节主要描述块RAM的分配以及回收。块RAM的分配分为以下几种情况,如图10所示情况1 待插入前缀的扩展前缀哈希项EPH和已插入前缀的扩展前缀哈希项EPH 都不相同。如果已经插入了4条都不同的前缀,且4条前缀的扩展前缀哈希项EPH都不相 同,所以给每条前缀都分配一个128个存储单元的块RAM,各自的前缀信息分别存储到不同 块RAM中。第5条前缀待插入,先判断其扩展前缀哈希项与已分配前缀的扩展前缀哈希项 是否相同,如果不同,则重新分配一个128个存储单元的块RAM ;情况2 待插入前缀的扩展前缀哈希项EPH和已插入前缀的扩展前缀哈希项EPH 有相同的情况。第5条前缀待插入,先判断其扩展前缀哈希项EPH与已分配前缀的扩展前 缀哈希项EPH是否相同,如果相同,例如和第二条前缀的扩展前缀哈希项EPH相同,则将第5 条前缀的路由信息插入到第2个已分配的块RAM中,而不需要重新分配块RAM,这样不会发 生冲突。因为,如果有两条不同的前缀Pl和P2,当Pl和P2的扩展前缀哈希项EPH相同时, 其扩展前缀扩展项EPE —定不相同,而这两条前缀的路由信息一定存储在所分配的同一块 RAM中,由于扩展前缀扩展项EPE不相同,所以在同一块RAM中所计算得到的地址肯定不同。扩展前缀在扩展RAM中绝对地址的计算过程为当分配的块RAM的编号为block_ addr,扩展前缀扩展项EPE转换成的十进制数为V(印e),则该前缀所对应信息应该存储的 单元绝对地址ram_addr为ram_addr = 128 Xblock_addr+V (epe)。(公式 1)当进行表项删除时,就需要回收已分配的块RAM,由于该方案对每个扩展前缀所分 配的块RAM都是128个存储单元,所以在块RAM回收时,整个扩展RAM存储器不会产生存储 碎片。如果要给该空闲块插入表项,只需要得到对该空闲块所分配的编号即可。(5)哈希单元和扩展存储器的组织第一级哈希单元与第二级扩展RAM单元的组织关系如图12所示,其中有任意四个 前缀prefixl,prefix2,prefix3,prefix4,下一跳分别为 AA,BB, CC,DD,prefixl 和 prefix3 为哈希前缀HP,pref ix2和pref ix4为扩展前缀EP,pref ix3的值和pref ix4扩展前缀哈希 项EPH的值相同。哈希表的第16’ h00fi+l个单元存储prefixl的路由信息,其下一跳值为AA ;第 16,h00ff+2个单元存储prefix2扩展前缀哈希项EPH的信息,给其扩展前缀扩展项EPE分 配了第69个块RAM ;第16,hOfff+3个单元存储prefix3的路由信息,其下一跳为BB,同时 也存储prefiX4扩展前缀哈希项EPH的信息,给其扩展前缀扩展项EPE分配了第115个块 RAM0根据公式1,第69个块RAM的首地址为69*128+0,而prefix2的扩展前缀扩展项 EPE进行低位补零扩展成7位二进制数,最后转换成十进制数为85,则将prefiX2的下一跳 信息CC插入到扩展RAM的第69*128+85个地址单元中。同样,第115个块RAM的首地址为 115*128+0,而prefiX4的扩展前缀扩展项EPE进行低位补零扩展成7位二进制数,最后转 换成十进制数为42,则将prefix4的下一跳信息DD插入到扩展RAM的第115*128+42个地 址单元中。以上过程为第一级哈希单元和第二级扩展RAM之间的组织关系,图12中的灰色项表示有效前缀项,用虚线括起来的扩展RAM为被分配的块RAM。该方案中,所有扩展前缀EP 的第一级哈希表和第二级扩展RAM都是以这种方式组织的。(6)优先级比较器的实现优先级比较器的流程图如图13所示,工作过程如下第一步定义13个寄存器,分别表示各查找结果的优先级,设置其优先级从高 至丨J 低依次为“Nh64”,“Nh57-63”,“Nh56”,“Nh49-55”,“Nh48”,“Nh41-47”,“Nh40”,“Nh 33-39”,“Nh 32”,"Nh 25-31”,“Nh 24”,"Nh 17-23”,“Nh 16”,并将这 13 个寄存器初始化为零。第二步如果哪一个寄存器内的值不为零,则该寄存器中所存的值为待查目的地 址所匹配的一个下一跳,而该目的地址的最长匹配前缀所对应的下一跳值为优先级最高的 寄存器里的值,将该值作为下一跳值输出,即为所查。举例说明在一条目的地址查找过程中,如果优先级比较器中,寄存器“Nh48”的 值为8,hOa,寄存器“Nh32”的值为8,hOb,寄存器“Nhl7_23”的值为8,hOc,其余寄存器的 值依然为8,h00,则可以看出该地址有三个匹配项,而这三个匹配项中,所对应的下一跳值 为分别为8,11(^,8,11013,8,110(3,由于寄存器“他48”的优先级高于寄存器“Nh 32”和寄存 器“Nhl7-23”,所以寄存器“Nh48”中的值8,hOa即为该地址最长匹配前缀所对应的下一跳 值。(7)哈希冲突处理模块的实现在哈希计算过程中,会发生哈希冲突情况,所以就要进行哈希冲突处理。哈希冲突处理模块的设计必须考虑到以下几个问题第一,快速查找及更新性能。如果哈希冲突处理模块的查找能力不高,则会影响整 个系统的处理能力。第二,要保证可以处理所有冲突情况,这样才可以保证整个查找系统的功能完备 性。第三,在哈希函数的选择时,必须考虑到要保证尽量少发生冲突。基于以上几个问题,本文用CAM查找模块来处理哈希冲突。在设计时,对不同前缀 利用不同的CAM进行哈希冲突处理,总共需要6种宽度的CAM,即24位宽,32位宽,40位宽, 48位宽,56位宽和64位宽的CAM,分别处理24-31位,32-39位,40-47位,48-55位,56-63 位和64位长的前缀。CAM的具体组织与第一级哈希和第二级扩展RAM的组织方式相同。 如图14所示,CAM处理哈希前缀HP和扩展前缀哈希项EPH,扩展前缀扩展项EPE的信息存 储于块RAM中。扩展前缀在扩展RAM中绝对地址的计算过程为当分配的块RAM的编号为 block_addr,扩展前缀扩展项EPE低位补零形成7位二进制数,再将该7位二进制数转换成 的十进制数V (epe),则该前缀所对应信息应该存储的单元绝对地址ram_addr为ram_addr = 128Xblock_addr+V(epe)。(8)整体工作过程 路由表构造及表项插入的具体过程如图5所示,具体描述如下第一步将哈希表和扩展RAM初始化为空;第二步根据待插入前缀长度来判断此前缀属于哈希前缀HP还是扩展前缀EP, 如果是HP,则将此前缀进行哈希计算,用所得哈希值索引哈希表,如果索引到的哈希表项中“F”字段为“0”,则将该项的“F”字段设为“l”,“Nh(i)”字段设为该前缀所对应的下一跳值; 如果对应项中“F”字段为“1”,表明该前缀项产生哈希冲突,则用CPE进行哈希冲突处理。如果是EP,则将此前缀的扩展前缀哈希项EPH做哈希计算,用所得哈希值索引哈希表,判断索引到的哈希表项“E”字段是否为“0”,如果“E”字段为“0”,则将哈希表对应项 的“E”字段设为“丨”,“Block_addr”字段是为扩展前缀扩展项EpE所分配块Ram的编号,用 扩展前缀扩展项EPE计算出块RAM的块内相对地址,并将下一跳值放入对应的存储单元中; 如果“E”字段为“ 1”且该前缀的扩展前缀哈希项EPH部分和已插入该项的前缀的扩展前缀 哈希项相同,则将该前缀的下一跳值放入该哈希表项“BloCk_addr ”字段所指示的已分配块 RAM中,用扩展前缀扩展项EPE计算出块RAM的块内相对地址,并将下一跳值放入对应的存 储单元中;如果“E”字段为“1”且该前缀的扩展前缀哈希项EPH部分和已插入该项的前缀 的扩展前缀哈希项不同,表明该前缀项产生哈希冲突,则用CPE进行哈希冲突处理。· IPv6地址查找过程如图6所示要进行IPv6地址查找,必须先将路由表进行初始化,初始化具体过程下文所述;如果路由表初始化工作已完成,则可以对IPv6地址进行查找先对IPv6做第一级 哈希查找,然后根据情况判断是否要进行第二级查找。查找过程可以分为三个步骤完成第 一级哈希表查找,第二级扩展RAM查找和优先级比较。具体描述如下第一步将目的IPv6地址做7种hash查找,即分别在Hashl6、Hash24、Hash32、 Hash40、Hash48、Hash56、Hash64 哈希查找单元中,对目的 IPv6 地址的前 16bits、24bits、 32bits、40bits、48bits、56bits和64bits做并行查找操作。如果查找到匹配项,则将对应 的下一跳索引值输出到优先级比较器中准备比较。第二步如果第一级查找指示在第二级查找单元中还有更长的前缀需要做匹配计 算,则需要进行第二级查找在第二级中利用存储器扩展技术,扩展前缀扩展项EPE可以插 入到有128个地址的块RAM中。设前缀的对应位为[i+l:i+7](i为哈希前缀的长度),查 找时,则根据目的地址的第(i+Ι i+7)位计算出索引值,利用该值在扩展RAM存储器中寻 址,匹配地址单元所对应的值即为下一跳值Nh(i+1,i+7),将该下一跳值输出到优先级比较 器中进行比较。第三步将输入到优先级比较器的寄存器中的值进行优先比较,“next hop”输出 优先级最高的值(即最长匹配前缀所对应的下一跳值)作为该IPv6目的地址所匹配的下 一跳值,即为所查到的值。 路由表项删除及修改的具体情况描述如下路由表项的更新主要包括三种操作,插入、删除和修改,分别要根据待更新项的前 缀值确定更新表项的位置。对于前缀插入操作,可以按照路由表的创建算法进行插入。对 于前缀修改和删除操作,则类似于地址查找的过程,首先利用查找算法,找到该前缀表项, 然后再执行相应的修改和删除操作,可以分为以下两种情况第1种情况当要修改或删除的前缀为哈希前缀时,则将“F”字段设置为“0”,清 空其它字段的值;第2种情况当要修改或删除的前缀为扩展前缀时,则将“E”字段和“BloCk_addr” 字段设置为全“0”,然后收回扩展RAM的存储空间。
权利要求
一种基于哈希表查找和扩展存储器查找的IPv6地址查找方法,包括1个查找分类器,1个更新分类器,7个并行的哈希处理单元Hash16、Hash24、Hash32、Hash40、Hash48、Hash56、Hash64,6个扩展存储器处理单元RAM17_23、RAM25_31、RAM33_39、RAM41_47、RAM49_55、RAM57_63,7个哈希冲突处理单元CPE16_23、CPE24_31、CPE32_39、CPE40_47、CPE48_55、CPE56_63、CPE64,1个优先级比较单元;其特征在于对IPv6地址进行查找,并对IPv6路由表项进行更新,具体步骤为a.根据IPv6路由表分布规律的统计,将路由表项分为两种一种是长度可以被8整除的前缀,一种是长度不能被8整除的前缀;b.对两种路由表项分别用哈希表和扩展存储器进行存储,用哈希冲突处理单元处理哈希冲突项;c.优先级比较器可以选择出最长匹配前缀所对应的下一跳信息;d.在查找过程中,以目的IPv6地址为查找对象在7路查找模块中并行查找,最长匹配前缀所对应的下一跳信息为查找结果;e.在更新过程中,通过哈希计算和扩展存储器地址计算可以进行路由表项更新,包括路由表初始化、插入表项、删除表项和修改表项,具体步骤为路由表初始化及表项插入过程为①通过需要更新的路由表项确定需要更新表项的位置先判断需要更新路由前缀的长度是否可以被8整除;②如果可以被8整除,通过更新分类器选择出对应的处理模块,将此前缀进行哈希计算,用所得哈希值索引哈希表,如果索引到的哈希表项已经放入其它路由信息,则将该前缀所对应的路由信息放入哈希冲突处理单元中进行处理,如果索引到的哈希表项是空项,则将对应的路由信息放入该项中;③如果前缀长度不可以被8整除,通过更新分类器选择出对应的处理模块,先将该前缀的扩展前缀哈希项做哈希计算,用所得哈希值索引哈希表,若该表 项为空,则将所分配的第二级存储单元的首地址存入该表项,然后将所对应的路由信息放入所分配存储单元的对应位置,若该表项不为空且该前缀的扩展前缀哈希项不同于已插入前缀的扩展前缀哈希项,则将该前缀所对应的路由信息插入到已分配的第二级存储单元中,如该表项不为空且该前缀的扩展前缀哈希项和已插入前缀的扩展前缀哈希项相同,则将该前缀放入哈希冲突处理单元中进行处理。表项删除及修改过程为①通过更新分类器选择出对应的处理模块;②利用查找方法,查找到待更新的路由表项,然后将该表项的路由信息进行删除或者修改。
2.根据权利要求1所述的基于哈希表查找和扩展存储器查找的IPv6地址查找方法, 其特征在于,步骤b中将长度可以被8整除的路由前缀用哈希表进行存储,将长度不能被8 整除的前缀用哈希表和扩展存储器做两级存储。
3.根据权利要求1所述的基于哈希表查找和扩展存储器查找的IPv6地址查找方法, 其特征在于,步骤b中将长度为η的前缀(η不能被8整除)可以分为两个部分1 i和 i+Ι n,i是小于η且最大可以被8整除的整数。将前缀中1 i比特之间的值所对应的信息存储到哈希表中,而i+1 η之间的值所对应的信息存放到扩展存储器中,两级之间有 相互联系的字段。
4.根据权利要求1所述的基于哈希表查找和扩展存储器查找的IPv6地址查找方法,其 特征在于,步骤c中按照前缀长度从长到短,在优先级比较器中设置优先级从高到低的13 个寄存器,实现最长前缀匹配结果。
5.根据权利要求1所述的基于哈希表查找和扩展存储器查找的IPv6地址查找方法, 其特征在于,步骤b中将哈希处理单元Hashl6、Hash24、Hash32、Hash40、Hash48、Hash56、 Hash64所计算的16位值直接作为哈希值在哈希表中进行索引。
6.根据权利要求1所述的基于哈希表查找和扩展存储器查找的IPv6地址查找方法, 其特征在于,步骤d中哈希处理单元Hashl6、Hash24、Hash32、Hash40、Hash48、Hash56与对 应的扩展存储器 RAM17_23、RAM25_31、RAM33_39、RAM41_47、RAM49_55、RAM57_63 进行两级 关联,并和对应的哈希冲突处理单元 CPE16_23、CPE24_31、CPE32_39、CPE40_47、CPE48_55、 CPE56_63分别构成6路处理模块,第7个哈希处理单元hash64和其对应的哈希冲突处理单 元CPE64构成1路处理模块,7路模块并行对IPv6地址进行查找以确定其匹配前缀项,在7 路查找出的结果中,通过优先级比较器进行比较以实现最长前缀匹配。
7.根据权利要求1所述的基于哈希表查找和扩展存储器查找的IPv6地址查找方法,其 特征在于,步骤e通过哈希计算和扩展存储器地址计算完成路由表项更新工作。
全文摘要
一种基于哈希表查找和扩展存储器查找的IPv6地址查找方案,包括1个查找分类器,1个更新分类器,7个并行的哈希处理单元,6个扩展存储器处理单元、7个哈希冲突处理单元和1个优先级比较单元。前6个哈希处理单元与对应的扩展存储器进行两级关联,并和对应的哈希冲突处理单元分别构成6路处理模块,第7个哈希处理单元和其对应的哈希冲突处理单元构成1路处理模块,7路模块并行对IPv6地址进行查找以确定其下一跳信息。本发明根据IPv6地址前缀的分布规律,结合哈希查找和扩展存储器查找的原理,使IPv6地址在1-2个存储周期可以完成查找操作。本发明查找和更新性能高、可扩展性强,是一种适合高性能IPv6路由器的查找方案。
文档编号H04L29/12GK101827137SQ201010145939
公开日2010年9月8日 申请日期2010年4月13日 优先权日2010年4月13日
发明者杜慧敏, 杨康平, 王亚刚, 王明明, 王芳莉, 赵萍, 郝鹏 申请人:西安邮电学院
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1