專利名稱:一種維護(hù)內(nèi)容可地址映射存儲器中路由表的方法
技術(shù)領(lǐng)域:
本發(fā)明一般涉及網(wǎng)絡(luò)通信技術(shù),特別涉及一種用于在網(wǎng)絡(luò)通信中維護(hù)CAM(內(nèi)容可地址映射存儲器)中路由表的方法。
背景技術(shù):
在具有路由功能的IP網(wǎng)絡(luò)設(shè)備中,路由表存儲了當(dāng)前的路由信息。系統(tǒng)中的各個模塊分別對路由表進(jìn)行添加、刪除、搜索等操作。通常搜索路由表有以下幾個步驟1)搜索匹配的主機(jī)地址;2)搜索匹配的網(wǎng)絡(luò)地址;3)搜索默認(rèn)表項(默認(rèn)表項一般在路由表中被指定為一個網(wǎng)絡(luò)表項,其網(wǎng)絡(luò)號為0)。
匹配主機(jī)地址步驟始終發(fā)生在匹配網(wǎng)絡(luò)地址步驟之前,而匹配網(wǎng)絡(luò)地址始終發(fā)生在搜索默認(rèn)表項之前。
路由表可以存儲在主機(jī)的內(nèi)存中,在采用網(wǎng)絡(luò)處理器架構(gòu)的網(wǎng)絡(luò)設(shè)備中,路由表還可以存儲在CAM(內(nèi)容可地址映射存儲器)中,由網(wǎng)絡(luò)處理器中的微代碼進(jìn)行路由的查找。在CAM中的路由表,其最長匹配搜索由器件完成,而路由表項的插入、刪除必須由軟件來維護(hù)。對于不同的CAM器件,這些維護(hù)的算法不一樣。
在表項具有優(yōu)先級的CAM中,寫入的路由表項攜帶優(yōu)先級。即主機(jī)地址的路由表項攜帶的優(yōu)先級最高,網(wǎng)絡(luò)地址的路由表項次之,默認(rèn)表項最低。這樣,器件在進(jìn)行匹配搜索時,總是先匹配優(yōu)先級最高的路由表項。
而現(xiàn)在通用的CAM一般的表項都沒有優(yōu)先級,這就需要軟件在下發(fā)表項的時候,根據(jù)表項的優(yōu)先級重新對CAM中的表項進(jìn)行排序。
存儲在主機(jī)的內(nèi)存中的路由表一般采用二叉樹的數(shù)據(jù)結(jié)構(gòu),并采用二叉樹排序算法,對路由表進(jìn)行維護(hù)和利用(參見機(jī)械工業(yè)出版社出版的《TCP/IP詳解卷二實現(xiàn)》)。由于存儲在通用CAM中路由表規(guī)模大,表項本身又不帶有優(yōu)先級,而表項的移動需要刪除、添加操作,在使用這種算法對路由表項進(jìn)行維護(hù)時,開銷很大。因此,二叉樹排序算法在維護(hù)通用CAM中的路由表項時,并不適用。
發(fā)明內(nèi)容
本發(fā)明的一個目的是提供一種在通用的無優(yōu)先級的CAM中維護(hù)路由表的方法,以較小的開銷進(jìn)行大規(guī)模路由表的維護(hù)和使用。
為實現(xiàn)上述目的,本發(fā)明提供了一種維護(hù)路由表的方法,包括以下步驟將CAM中路由表映射成多個具有不同優(yōu)先級的邏輯塊;以及利用所述邏輯塊進(jìn)行路由表項的插入和/或刪除。
所述路由表的插入包括以下的步驟找出帶有空閑表項的邏輯塊的步驟;插入待插入路由表項的步驟。
優(yōu)選地,當(dāng)找出的帶有空閑表項的邏輯塊的優(yōu)先級小于待插入路由表項的優(yōu)先級時,所找出的邏輯塊是所有優(yōu)先級比待插入路由表項的優(yōu)先級小的空閑邏輯塊中優(yōu)先級最大的邏輯塊;當(dāng)找出的帶有空閑表項的邏輯塊的優(yōu)先級大于待插入路由表項的優(yōu)先級時,所找出的邏輯塊是所有優(yōu)先級比待插入路由表項的優(yōu)先級大的空閑邏輯塊中的優(yōu)先級最小的邏輯塊。
所述插入待插入路由表項的步驟可選地帶有上移路由表項或下移路由表項的步驟。
所述上移路由表項的步驟包括(a)按照優(yōu)先級從高到底的順序,將找出的帶有空閑表項的邏輯塊的下一優(yōu)先級的邏輯塊和具有待插入表項優(yōu)先級的邏輯塊之間的邏輯塊的最后一個路由表項依次移動到優(yōu)先級高一級的邏輯塊的空閑尾位置的步驟;(b)在每次移動時,改變相應(yīng)邏輯塊的信息的步驟。
所述下移路由表項的步驟包括(a)按照優(yōu)先級從低到高的順序,依次將找出的帶有空閑表項的邏輯塊和具有待插入表項優(yōu)先級的邏輯塊之間的邏輯塊的第一個表項向下移動的步驟;(b)在每次移動時,改變相應(yīng)邏輯塊的信息的步驟。
所述路由表項刪除的步驟包括,刪除路由表項的步驟,更新邏輯塊信息的步驟??蛇x地,還包括將邏輯塊的最后一個路由表項移動到該刪除的路由表項原來占用的位置的步驟。
所述的邏輯塊由帶有頭指針、占用的頭指針、占用的尾指針、空閑頭指針、空閑尾指針的數(shù)據(jù)結(jié)構(gòu)來儲存和管理。
所述的數(shù)據(jù)結(jié)構(gòu)大小不等。
本發(fā)明的維護(hù)路由表的方法,做到了開銷和路由表的規(guī)模無關(guān),開銷較小,易于代碼實現(xiàn)。
圖1是依據(jù)本發(fā)明的一個實施例的存儲和管理邏輯塊的數(shù)據(jù)結(jié)構(gòu);圖2是依據(jù)本發(fā)明的一個實施例的路由表項插入的流程圖;圖3是依據(jù)本發(fā)明的一個實施例的路由表項移動的示意圖;圖4是圖3所示的路由表項移動后的邏輯塊示意圖。
具體實施例方式
下面結(jié)合附圖,對本發(fā)明的具體實施例進(jìn)行詳細(xì)的說明。
路由表中主機(jī)路由表項、網(wǎng)絡(luò)路由表項、默認(rèn)路由表項的優(yōu)先級可以通過掩碼來標(biāo)識,主機(jī)路由掩碼有效位通常有32位,網(wǎng)絡(luò)路由表項的掩碼有效位處于1~31之間,而默認(rèn)路由表項的掩碼有效位個數(shù)為0。掩碼中的有效位數(shù)越長,則路由表項(以下簡稱表項)的優(yōu)先級最高,這樣總共有33個優(yōu)先級。
在本發(fā)明中將CAM中的路由表映射成33個邏輯塊,所謂的邏輯塊就是按照路由掩碼優(yōu)先級的大小,邏輯上將路由表劃分成33塊,每塊中路由掩碼的優(yōu)先級相同,每個邏輯塊由一個數(shù)據(jù)結(jié)構(gòu)來存儲和管理。在本發(fā)明的一個實施例中,如圖1所示,這個數(shù)據(jù)結(jié)構(gòu)為typedef struct tagCAM_QUE_S{ULONGulHead;/*頭指針 */
ULONGulUsedHead; /*占用的頭指針 */ULONGulUsedTail;/*占用的尾指針 */ULONGulFreeHead; /*空閑頭指針 */ULONGulFreeCount; /*空閑表項總數(shù) */ULONGulFreeTail; /*空閑尾指針 */}CAM_QUE_S;其中,頭指針指明邏輯塊的起始位置,占用的頭指針指明邏輯快中第一個路由表項的位置,占用的尾指針指明邏輯塊中最后一個路由表項的位置,空閑的頭指針表明邏輯快中第一個空閑的位置,空閑尾指針,表明邏輯塊中最后一個空閑的位置,空閑表項總數(shù)說明空閑位置的總數(shù)。在沒有空閑表項時,空閑頭指針和空閑尾指針的位置重疊,設(shè)置為NULL。
以下詳細(xì)描述本發(fā)明的一個實施例的維護(hù)路由器的方法的實現(xiàn)。
1.初始化使用大小為33、類型為CAM_QUE_S的結(jié)構(gòu)體數(shù)組全局變量來管理邏輯塊。并設(shè)置各邏輯塊中空閑表項數(shù)的初始值。可以按照通常情況下各種路由表項的多少,來設(shè)定初始值,以最大程度避免表項的移動。例如對5K大小的路由表,可以將各邏輯塊初始值如下表設(shè)置
路由表的維護(hù)包括路由表項的插入與刪除。
2.路由表項插入a.首先查找?guī)в锌臻e表項的邏輯塊。
在本說明書中,帶有空閑表項的邏輯塊,也可稱為空閑邏輯塊。表項在插入時,根據(jù)表項的掩碼得到表項的優(yōu)先級(設(shè)為D)。如圖2所示,首先尋找與優(yōu)先級為D的邏輯塊距離最近,并且優(yōu)先級小于等于D的空閑邏輯塊,如果找到了,則返回找到的邏輯塊的優(yōu)先級。如果沒有找到,則尋找與優(yōu)先級為D的邏輯塊距離最近,而且優(yōu)先級大于D的邏輯塊,如果找到了,則返回找到的邏輯塊的優(yōu)先級;如沒有找到,說明路由表中所有的邏輯塊都已占用,返回錯誤。
尋找邏輯塊的方法非常簡單,可以在一個循環(huán)中實現(xiàn)按優(yōu)先級從高到低遍歷邏輯塊,利用邏輯塊中的空閑表項總數(shù)來判斷所在邏輯塊是否有空閑,利用一個變量保存最后找到的帶有空閑表項的邏輯塊的優(yōu)先級。當(dāng)有空閑表項的邏輯塊優(yōu)先級小于等于待插入表項的優(yōu)先級時,跳出遍歷循環(huán),因為是由高到低的遍歷,所以能夠保證找到的帶有空閑表項的邏輯塊是所有優(yōu)先級小于等于優(yōu)先級D的帶空閑表項的邏輯塊中優(yōu)先級最大的邏輯塊。也就是說,找到的空閑邏輯塊是最靠近優(yōu)先級為D邏輯塊的優(yōu)先級小于等于D的空閑邏輯塊。否則,直至循環(huán)結(jié)束。因為變量保存了最后找到的帶有空閑表項的邏輯塊的優(yōu)先級,因而能夠判斷是否找到了優(yōu)先級大于D的空閑邏輯塊,并且可以保證找到的邏輯塊是所有優(yōu)先級大于D的空閑邏輯塊中優(yōu)先級最小的邏輯塊,即是最靠近優(yōu)先級為D的邏輯塊的優(yōu)先級大于D的空閑邏輯塊。如果沒有找到空閑的邏輯塊,返回錯誤。
b.確定放置待插入表項的位置,并放置該表項。
如果返回的優(yōu)先級和待插入表項的優(yōu)先級相同,則直接將表項放到該邏輯塊的空閑頭位置,同時修改邏輯塊的信息,即改變邏輯塊的空閑個數(shù),調(diào)整指針位置。此處將該邏輯塊的空閑個數(shù)減一,空閑頭指針和尾指針下移,。
如圖3的表項上移算法所示,如果返回的優(yōu)先級大于待插入表項的優(yōu)先級,則將返回優(yōu)先級的下一優(yōu)先級的邏輯塊的最后一個表項移動到返回的優(yōu)先級的邏輯塊的空閑尾指針位置,并更改返回的優(yōu)先級的邏輯塊的信息占用的尾指針上移、空閑表項總數(shù)減一,如果空閑表項總數(shù)減一后為零,即該邏輯塊加入表項后已滿,則將空閑尾指針置為NULL。這樣,就為下一次移動空出了位置。然后,將剛剛移動的邏輯塊的下一優(yōu)先級的邏輯塊的最后一個表項移動到上次移動所空出的位置上,并修改上次移動的邏輯塊的信息頭指針、占用的頭指針、占用的尾指針上移,空閑頭指針、空閑尾指針仍置為NULL,空閑表項總數(shù)不變。重復(fù)上述步驟,直至與待插入表項的優(yōu)先級相同的邏輯塊的最后一個表項已移動到空出位置上,其上一優(yōu)先級邏輯塊信息已相應(yīng)修改。此時將待插入的表項插入到空出的位置上,并修改與之優(yōu)先級相同的邏輯塊信息。
如圖3的表項下移算法所示,如果返回的優(yōu)先級小于待插入表項的優(yōu)先級,則將返回優(yōu)先級的邏輯塊的第一個表項移動到該邏輯塊的空閑頭位置,同時更改邏輯塊信息將頭指針、占用的頭指針下移,空閑表項總數(shù)減一,空閑頭指針下移,如果空閑表項總數(shù)減一后為零,即該邏輯塊加入表項后已滿,則將空閑頭指針置為NULL。這樣,就為上一優(yōu)先級的邏輯塊空出了位置。然后,將上一優(yōu)先級的邏輯塊的第一個表項移動到上次空出的位置上,并相應(yīng)修改邏輯塊的信息,將頭指針、占用的頭指針、占用的尾指針下移,空閑頭指針依舊設(shè)為NULL。重復(fù)以上步驟,直到與待插入表項的優(yōu)先級相同的邏輯塊的第一個表項已移動到空出位置上。再將待插入的表項插入到優(yōu)先級相同的邏輯塊的空閑頭位置,修改邏輯塊的信息將該邏輯塊的尾指針下移,其余信息不變。圖3示出了只有找到的低優(yōu)先級的邏輯塊與待插入表項的優(yōu)先級系統(tǒng)的邏輯塊之間具有兩個需要移動的邏輯塊的情況,也可能是一個或多個,甚至沒有。在中間沒有需要移動的邏輯塊時,只需移動兩次表項就可以了;在中間具有一個需要移動的邏輯塊時,需要移動3次。依此類推。
圖4示出了路由表項移動后,相關(guān)邏輯塊的變化的情況,最終插入表項的邏輯塊變大,原空閑邏輯塊變小。
在CAM路由表的維護(hù)中,修改邏輯塊的信息花費(fèi)的代價是次要的,如何減少表項移動的次數(shù)才是重要的。因為邏輯塊的信息保存在主機(jī)的內(nèi)存中,但是提供轉(zhuǎn)發(fā)的路由表保存在CAM中,主機(jī)需要調(diào)用驅(qū)動函數(shù)對CAM中路由表的添加、刪除操作,這些操作的代價是相對較大的。本發(fā)明的方法能夠保證在極端情況下,如優(yōu)先級最低的表項需要添加時,只有最高優(yōu)先級的邏輯塊中有空閑位置時,路由表項最多移動次數(shù)等于表項的優(yōu)先級總數(shù),而和路由表的大小無關(guān),從而確保了維護(hù)路由表的開銷很小。
3.表項刪除如果待刪除的表項處于占用的尾指針處,則直接刪除表項,同時更新邏輯塊信息。否則進(jìn)行下一步。
刪除表項,將所刪除表項所在的邏輯塊的占用尾指針處的表項移動到該位置,同時更新邏輯塊的信息。
在本發(fā)明的精神和范圍內(nèi),具體的實施方式是可以變化的,例如可以優(yōu)先尋找與待插入表項最靠近的優(yōu)先級比待插入表項的優(yōu)先級大的邏輯塊,在找不到的情況下,再尋找與待插入表項最靠近的優(yōu)先級比待插入表項的優(yōu)先級小的邏輯塊。此時,在遍歷的循環(huán)中,可按優(yōu)先級從低到高的順序遍歷。在尋找空閑路由表項時,也可不采用循環(huán)的方式,而采用逐一判斷的方法等。這些變化的實施方式,都在本發(fā)明的保護(hù)范圍內(nèi)。
使用本發(fā)明的維護(hù)路由表的方法,解決了CAM中路由表項無序管理的問題。表項最多移動次數(shù)等于表項優(yōu)先級的總數(shù),和路由表的大小無關(guān)。路由表規(guī)模非常大的網(wǎng)絡(luò)設(shè)備中,做到的開銷和路由表的規(guī)模無關(guān),具有較小的開銷。本發(fā)明的維護(hù)路由表的方法簡單,易于代碼實現(xiàn)。
權(quán)利要求
1.一種維護(hù)內(nèi)容可地址映射存儲器中路由表的方法,包括以下步驟將內(nèi)容可地址映射存儲器中路由表映射成多個具有不同優(yōu)先級的邏輯塊;以及利用所述邏輯塊進(jìn)行路由表項的插入和/或刪除。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述路由表的插入包括以下的步驟找出帶有空閑表項的邏輯塊;以及插入路由表項。
3.根據(jù)權(quán)利要求2所述的方法,其特征在于,當(dāng)找出的帶有空閑表項的邏輯塊的優(yōu)先級小于待插入路由表項的優(yōu)先級時,所找出的邏輯塊是所有優(yōu)先級比待插入路由表項的優(yōu)先級小的空閑邏輯塊中優(yōu)先級最大的邏輯塊;當(dāng)找出的帶有空閑表項的邏輯塊的優(yōu)先級大于待插入路由表項的優(yōu)先級時,所找出的邏輯塊是所有優(yōu)先級比待插入路由表項的優(yōu)先級大的空閑邏輯塊中的優(yōu)先級最小的邏輯塊。
4.根據(jù)權(quán)利要求2或3所述的方法,其特征在于,當(dāng)找出的帶有空閑表項的邏輯塊的優(yōu)先級小于待插入路由表項的優(yōu)先級時,所述方法進(jìn)一步包括路由表項下移的步驟;當(dāng)找出的帶有空閑表項的邏輯塊的優(yōu)先級大于待插入路由表項的優(yōu)先級時,所述方法進(jìn)一步包括路由表項上移的步驟。
5.根據(jù)權(quán)利要求4所述的方法,其特征在于,所述上移路由表項的步驟包括(a)按照優(yōu)先級從高到底的順序,將找出的帶有空閑表項的邏輯塊的下一優(yōu)先級的邏輯塊和具有待插入表項優(yōu)先級的邏輯塊之間的邏輯塊的最后一個路由表項依次移動到優(yōu)先級高一級的邏輯塊的空閑尾位置;及(b)在每次移動時,改變相應(yīng)邏輯塊的信息。
6.根據(jù)權(quán)利要求4所述的方法,其特征在于,所述下移路由表項的步驟包括(a)按照優(yōu)先級從低到高的順序,依次將找出的帶有空閑表項的邏輯塊和具有待插入表項優(yōu)先級的邏輯塊之間的邏輯塊的第一個表項向下移動;(b)在每次移動時,改變相應(yīng)邏輯塊的信息。
7.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述路由表項刪除的步驟包括,刪除路由表項的步驟,更新邏輯塊信息的步驟。
8.根據(jù)權(quán)利要求7所述的方法,其特征在于,進(jìn)一步包括將所刪除路由表項所在的邏輯塊的最后一個路由表項移動到該刪除的路由表項原來占用的位置的步驟。
9.根據(jù)權(quán)利要求1到8任一項所述的方法,其特征在于,所述的邏輯塊由帶有頭指針、占用的頭指針、占用的尾指針、空閑頭指針、空閑尾指針的數(shù)據(jù)結(jié)構(gòu)來儲存和管理。
10.根據(jù)權(quán)利要求9所述的方法,其特征在于,所述的數(shù)據(jù)結(jié)構(gòu)大小不等。
全文摘要
本發(fā)明公開了一種維護(hù)CAM中路由表的方法,將CAM中的路由表在主機(jī)上映射成33個具有不同優(yōu)先級的邏輯塊,利用這些邏輯塊進(jìn)行路由表項的插入、刪除。所述的邏輯塊由帶有頭指針、占用的頭指針、占用的尾指針、空閑頭指針、空閑尾指針的數(shù)據(jù)結(jié)構(gòu)來儲存和管理。本發(fā)明的維護(hù)CAM中路由表的方法,做到了開銷和路由表的規(guī)模無關(guān),具有較小的開銷,并且易于代碼實現(xiàn)。
文檔編號H04L29/00GK1630247SQ20031012148
公開日2005年6月22日 申請日期2003年12月18日 優(yōu)先權(quán)日2003年12月18日
發(fā)明者樊宏偉 申請人:華為技術(shù)有限公司