方面,響應(yīng)于確定查表結(jié)果已被發(fā)布,核心處理器105在步驟420繼續(xù)處理該數(shù)據(jù)包。
[0054]在步驟420,核心處理器105發(fā)送請求到專用處理器,用于執(zhí)行測量操作。該請求也包括與核心處理器105的線程相關(guān)聯(lián)的信號量。在一實施方式中,測量操作,根據(jù)RFC2475,可包括測量由分類器(其識別特定的數(shù)據(jù)包)選擇的業(yè)務(wù)流的時間特性(例如,速率)。這個過程的瞬時狀態(tài)可以影響標(biāo)記器、整形器、丟棄器的操作和/或可能被用于記帳、測量或擁塞控制目的。
[0055]在步驟422,專用處理器執(zhí)行數(shù)據(jù)包的測量操作。在確定步驟424,核心處理器105確定信號量是否指示測量操作已經(jīng)執(zhí)行,并且結(jié)果已被發(fā)布。響應(yīng)于確定測量結(jié)果沒有被發(fā)布,在步驟426,核心處理器105的線程被切換到睡眠模式,直到結(jié)果被發(fā)布。另一方面,響應(yīng)于確定測量操作已經(jīng)完成執(zhí)行并且結(jié)果被發(fā)布,核心處理器105在步驟428繼續(xù)處理數(shù)據(jù)包。
[0056]在步驟428,核心處理器105發(fā)送請求到專用處理器以對數(shù)據(jù)包執(zhí)行擁塞控制或監(jiān)管操作。在一實施方式中,擁塞控制,根據(jù)RFC 2475,是根據(jù)相應(yīng)的強(qiáng)制施行業(yè)務(wù)量概況的測量器的狀態(tài)在業(yè)務(wù)流中丟棄包的過程。數(shù)據(jù)包可以基于從測量操作得到的數(shù)據(jù)而被丟棄。來自核心處理器105的請求還包括與請求專用處理器的核心處理器105的線程相關(guān)聯(lián)的信號量。
[0057]在步驟430,擁塞控制操作由專用處理器執(zhí)行。在確定步驟432,核心處理器105確定信號量是否已經(jīng)指示擁塞控制處理已經(jīng)被執(zhí)行,并且已經(jīng)發(fā)布結(jié)果。響應(yīng)于確定擁塞控制操作的結(jié)果還不可用,在步驟434,核心處理器105的線程被切換到睡眠模式,直到結(jié)果被發(fā)布。另一方面,響應(yīng)于確定擁塞控制結(jié)果已被發(fā)布,核心處理器105在步驟436繼續(xù)處理該數(shù)據(jù)包。
[0058]在確定步驟436,核心處理器105確定數(shù)據(jù)包的一部分,如存儲在核心處理器105的本地存儲器中的數(shù)據(jù)包的頭部,已通過任何一組網(wǎng)絡(luò)操作被修改。在一實施方式中,某些操作,如分段數(shù)據(jù)包、更新校驗和、數(shù)據(jù)包的生存時間(TTL)等修改數(shù)據(jù)包的某些部分。響應(yīng)于確定數(shù)據(jù)包沒有被修改,控制被轉(zhuǎn)移到步驟446。另一方面,響應(yīng)于確定數(shù)據(jù)包的部分被修改,在步驟438,核心處理器105發(fā)送請求到專用處理器以將來自核心處理器105的本地存儲器的數(shù)據(jù)包的修改部分寫入到數(shù)據(jù)存儲器125。核心處理器105還包括具有請求的信號量。
[0059]在步驟440,專用處理器執(zhí)行存儲器寫入操作以將數(shù)據(jù)包的修改的部分寫入到數(shù)據(jù)存儲器125。在確定步驟442,核心處理器105確定信號量是否已經(jīng)指示存儲器寫入操作已經(jīng)執(zhí)行,并且數(shù)據(jù)包的修改部分已被寫入到數(shù)據(jù)存儲器125。響應(yīng)于確定存儲器寫入操作尚未完成寫入數(shù)據(jù)包的修改部分,核心處理器105的線程被切換到睡眠模式,直到該修改的部分被寫入到數(shù)據(jù)存儲器125。另一方面,響應(yīng)于確定修改的部分已被寫入到數(shù)據(jù)存儲器125,核心處理器105在步驟446繼續(xù)處理數(shù)據(jù)包。
[0060]在步驟446,核心處理器105發(fā)送請求到輸出包隊列處理器140以將數(shù)據(jù)包添加到輸出隊列。核心處理器105還包括具有請求的信號量。在步驟448,輸出包隊列處理器140執(zhí)行排隊操作以將數(shù)據(jù)包添加到適當(dāng)?shù)妮敵鲫犃?。在一實施方式中,基于在查表操作過程中確定的數(shù)據(jù)包的隊列ID,輸出包隊列處理器140識別輸出隊列。
[0061]在確定步驟450,核心處理器105確定信號量是否指示數(shù)據(jù)包已被添加到輸出隊列。響應(yīng)于確定數(shù)據(jù)包還沒有被添加到輸出隊列,在步驟452,核心處理器105的線程被切換到睡眠模式,直到數(shù)據(jù)包被添加到輸出隊列。另一方面,響應(yīng)于確定數(shù)據(jù)包被添加到輸出隊列,核心處理器105確定該線程已完成數(shù)據(jù)包的處理。在步驟454,核心處理器105的線程通過發(fā)送請求到輸入包隊列處理器115可以開始處理下一數(shù)據(jù)包。
[0062]進(jìn)一步地,出口模塊135基于與輸出隊列相關(guān)聯(lián)的QoS從輸出隊列獲取數(shù)據(jù)包并將數(shù)據(jù)包轉(zhuǎn)發(fā)至它們相應(yīng)的目標(biāo)地址。
[0063]網(wǎng)絡(luò)處理器100的每一個核心處理器和特定的處理器的每一個線程可以并行地對不同的數(shù)據(jù)包執(zhí)行上述討論的操作。
[0064]返回參照圖4中討論的操作,網(wǎng)絡(luò)處理器100執(zhí)行對由網(wǎng)絡(luò)處理器100處理的每個數(shù)據(jù)包的某些命令。進(jìn)一步地。這些命令對于核心處理器的每個線程是類似的。網(wǎng)絡(luò)處理器100創(chuàng)建數(shù)據(jù)結(jié)構(gòu)來存儲命令,并甚至是在第一處理器的第一線程向輸入隊列處理器請求數(shù)據(jù)包之前初始化數(shù)據(jù)結(jié)構(gòu)。在一實施方式中,命令包括:(a)存儲器讀取-從數(shù)據(jù)存儲器125讀取數(shù)據(jù)(數(shù)據(jù)包頭部和數(shù)據(jù)包的描述符)到核心處理器的本地存儲器,(b)存儲器寫入-從核心處理器的本地存儲器將修改的數(shù)據(jù)(數(shù)據(jù)包頭部和數(shù)據(jù)包的描述符)寫入到數(shù)據(jù)存儲器,(C)將數(shù)據(jù)包添加到輸出隊列,(d)更新用于數(shù)據(jù)包的錯誤計數(shù)器,(e)查表命令,(d)測量命令,(f)擁塞控制命令等。甚至在網(wǎng)絡(luò)處理器100開始處理第一個數(shù)據(jù)包并為每個核心處理器的每個線程使用數(shù)據(jù)結(jié)構(gòu)之前,進(jìn)行初始化或者預(yù)分配存儲器給數(shù)據(jù)結(jié)構(gòu)用于以上命令,能減少每個數(shù)據(jù)包執(zhí)行這些共同管理操作所消耗的時間。網(wǎng)絡(luò)處理器100可以利用其處理能力來執(zhí)行網(wǎng)絡(luò)協(xié)議相關(guān)的任務(wù),并且因此,增加EOPP的數(shù)量。在網(wǎng)絡(luò)處理器中的所有串可能不會運行“類似”的代碼。
[0065]雖然使所有的線程運行類似的代碼,例如,用于處理傳入數(shù)據(jù)包的代碼,是可能的,在一實施方式中,不是核心處理器105的每個線程都在處理數(shù)據(jù)包。編程是可能的,使得只有線程的子集在處理傳入包。其它線程可以被編程以執(zhí)行任務(wù),例如,后臺任務(wù),其將僅在當(dāng)較高優(yōu)先級的線程(處理傳入數(shù)據(jù)包)在睡眠模式時運行。
[0066]網(wǎng)絡(luò)處理器100的架構(gòu)允許處理例如(a)輸入數(shù)據(jù)包操作-接收輸入數(shù)據(jù)包并將它們添加到輸入隊列,(b)由核心處理器處理數(shù)據(jù)包,以及(C)輸出數(shù)據(jù)包操作-轉(zhuǎn)發(fā)來自輸出隊列的數(shù)據(jù)包到其相應(yīng)的目標(biāo)地址,以獨立執(zhí)行。即,例如,該架構(gòu)分離了對于當(dāng)數(shù)據(jù)包被網(wǎng)絡(luò)處理器100接收時和當(dāng)數(shù)據(jù)包被處理時的需要。當(dāng)數(shù)據(jù)包到達(dá)網(wǎng)絡(luò)處理器100時,數(shù)據(jù)包被添加到輸入隊列,并且核心處理器可以在稍后的時間從輸入隊列獲得數(shù)據(jù)包,例如,當(dāng)核心處理器準(zhǔn)備好時,以處理數(shù)據(jù)包。這樣的架構(gòu)允許網(wǎng)絡(luò)處理器100花費用于處理數(shù)據(jù)包所必要的盡可能多的時間或需要的時間,例如,在移動到下一個之前,執(zhí)行深度包檢測。
[0067]圖5是根據(jù)公開的技術(shù)的實施方式的一流程圖,示出了處理輸入數(shù)據(jù)包的過程500。該過程500可以是在網(wǎng)絡(luò)處理器,例如圖1的網(wǎng)絡(luò)處理器100,中執(zhí)行的。在步驟505,入口模塊130接收數(shù)據(jù)包。該數(shù)據(jù)包可從在計算機(jī)網(wǎng)絡(luò)中的各種計算機(jī)被接收,網(wǎng)絡(luò)處理器100作為該計算機(jī)網(wǎng)絡(luò)的一部分。在步驟510,入口模塊130 (或與入口模塊130合作的存儲器分配模塊)從,例如,網(wǎng)絡(luò)處理器100的數(shù)據(jù)存儲器125分配存儲器給接收到的數(shù)據(jù)包。在步驟515,數(shù)據(jù)包被存儲在數(shù)據(jù)存儲器中。在步驟520,入口模塊130指示輸入包隊列處理器115將數(shù)據(jù)包添加到輸入隊列。
[0068]返回參照步驟515,數(shù)據(jù)包被存儲在數(shù)據(jù)存儲器125的一個或多個緩沖區(qū)內(nèi)。該數(shù)據(jù)存儲器125包含多個可配置大小的緩沖區(qū)。如果接收到的數(shù)據(jù)包的大小大于緩沖區(qū)的大小,數(shù)據(jù)包會被分成若干部分,并且每個部分都被存儲在一緩沖區(qū)中。入口模塊130(或與入口模塊130合作的包緩沖區(qū)鏈生成單元)鏈接具有數(shù)據(jù)包的部分的每個緩沖區(qū),以形成數(shù)據(jù)包的包緩沖區(qū)鏈。
[0069]返回參照步驟520,網(wǎng)絡(luò)處理器100確保僅當(dāng)數(shù)據(jù)包的所有部分被寫入到數(shù)據(jù)存儲器125之后數(shù)據(jù)包通過核心處理器105是可訪問的。入口模塊130附加一信號量到存儲器寫入操作以寫入數(shù)據(jù)包到存儲器。輸入包隊列處理器115不發(fā)送數(shù)據(jù)包到請求核心處理器,直到數(shù)據(jù)包的所有部分被寫入到數(shù)據(jù)存儲器。當(dāng)數(shù)據(jù)包的所有部分被寫入,信號量喚醒輸入包隊列處理器115指示完整的數(shù)據(jù)包被寫入到存儲器中。輸入包隊列處理器115然后可以發(fā)送數(shù)據(jù)包到請求核心處理器。核心處理器然后暫停后臺任務(wù),并恢復(fù)其高優(yōu)先級功會K。
[0070]圖6是根據(jù)公開的技術(shù)的實施方式的一框圖,示出了用于表示存儲在網(wǎng)絡(luò)處理器的存儲器中的數(shù)據(jù)包的結(jié)構(gòu)的示例600。該示例600可以是在網(wǎng)絡(luò)處理器,例如圖1的網(wǎng)絡(luò)處理器100,中實現(xiàn)。由入口模塊130接收的數(shù)據(jù)包被存儲在數(shù)據(jù)存儲器125中。在一實施方式中,控制存儲器120可以具有包緩沖區(qū)結(jié)構(gòu),其包含指向存儲在數(shù)據(jù)存儲器125中的數(shù)據(jù)包的指針。例如,對于存儲在數(shù)據(jù)存儲器125中的數(shù)據(jù)包“Packet 0”,控制存儲器120可以存儲包緩沖區(qū)鏈605,其包含包緩沖區(qū)結(jié)構(gòu)605,610和615,其具有指向包含數(shù)據(jù)包“Packet O”的緩沖區(qū)的指針。網(wǎng)絡(luò)處理器100通過控制存儲器120使用以上包緩沖區(qū)結(jié)構(gòu)提供對存儲在數(shù)據(jù)存儲器125中的數(shù)據(jù)包的訪問。
[0071]如果數(shù)據(jù)包的大小小于數(shù)據(jù)存儲器的緩沖區(qū)的大小,則該數(shù)據(jù)包被存儲在單個緩沖區(qū)中。如果數(shù)據(jù)包被存儲在單個緩沖區(qū)中,數(shù)據(jù)包的緩沖區(qū)鏈可以僅具有包緩沖區(qū)結(jié)構(gòu)。例如,數(shù)據(jù)包“Packet I”的包緩沖區(qū)鏈625僅具有一個包緩沖區(qū)結(jié)構(gòu)。另一方面,當(dāng)數(shù)據(jù)包的大小大于緩沖區(qū)的大小,則數(shù)據(jù)包被分成若干部分,且這些部分被存儲在若干個緩沖區(qū)內(nèi)。包含數(shù)據(jù)包的部分的每個緩沖區(qū)被鏈接以形成包緩沖區(qū)鏈,如包緩沖區(qū)鏈605。包緩沖區(qū)結(jié)構(gòu)可包括兩個指針,即指向在輸入隊列中的下一個數(shù)據(jù)包的下一個數(shù)據(jù)包指針,以及指向相同數(shù)據(jù)包的下一個緩沖區(qū)的下一個緩沖區(qū)指針。在一些包緩沖區(qū)結(jié)構(gòu)中,可能一個指針被使用,或沒有指針被使用。
[0072]在示例600中,對于數(shù)據(jù)包“Packet 0”,包緩沖區(qū)鏈605的第一包緩沖區(qū)結(jié)構(gòu)610 (也被稱為頭部緩沖區(qū)結(jié)構(gòu)610)包括指針“Pkt 1,0”,其指向輸入隊列中的下一個數(shù)據(jù)包“Packet 1”,而下一個緩沖區(qū)指針“Pkt 0,I”指向包含數(shù)據(jù)包“Packet O”的下一個部分的下一個緩沖區(qū)。在包緩沖區(qū)結(jié)構(gòu)615中,然而,僅有下一個緩沖區(qū)指針“Pkt 0,2”被使用。下一個包指針沒有被使用。下一個包指針可以具有空值。在包緩沖區(qū)鏈605的最后一個數(shù)據(jù)包緩沖區(qū)結(jié)構(gòu)620 (也稱為尾部包緩沖區(qū)結(jié)構(gòu)620)中,沒有指針被使用。下一個包指針可以具有空值。下一個緩沖區(qū)指針可以具有值,例如,包結(jié)束(EOP),這指示當(dāng)前的緩沖區(qū)是數(shù)據(jù)包“Packet O”的在包緩沖區(qū)鏈605中的最后一個緩沖區(qū)。
[0073]當(dāng)數(shù)據(jù)包被存儲在數(shù)據(jù)存儲器125中時,包緩沖區(qū)結(jié)構(gòu)和包緩沖區(qū)鏈被創(chuàng)建。當(dāng)數(shù)據(jù)包被