5. 發(fā)送與接收數(shù)據(jù)包
數(shù)據(jù)包的發(fā)送:
4.jpg (39.14 KB, 下載次數(shù): 229)
下載附件
2009-03-25 20:24 上傳
圖5-1 發(fā)送數(shù)據(jù)包的結(jié)構(gòu)圖及相互關(guān)系
根據(jù)發(fā)送隊列數(shù)num_tx_queues建立相應(yīng)的發(fā)送緩沖區(qū)結(jié)構(gòu)e1000_tx_ring,在該結(jié)構(gòu)中有描述該區(qū)域的指向e1000_tx_desc結(jié)構(gòu)的desc,該緩沖區(qū)指向的dma總線地址,用于接收硬件傳送來的用e1000_buffer結(jié)構(gòu)描述的緩沖塊數(shù)組buffer_info[],另外的幾個參數(shù)則主要用于描述這些緩沖塊,其中count表示緩沖塊的個數(shù),next_to_use和next_to_clean主要描述緩沖塊的使用狀態(tài),如已經(jīng)接收接收了數(shù)據(jù)的位置及準(zhǔn)備接收的位置,當(dāng)有新的數(shù)據(jù)包要發(fā)送時,首先由上層協(xié)議調(diào)用e1000_xmit_frame(),在該函數(shù)中接著調(diào)用e1000_tx_queue()根據(jù)相應(yīng)的參數(shù)找到緩沖塊存放,緩沖塊的初始化則由函數(shù)e1000_tx_map()實現(xiàn)。buffer_info指向的環(huán)形緩沖塊區(qū)域主要用來接收總線地址映射來的數(shù)據(jù)包,所有的緩沖塊用next_to_match連接成一個環(huán),每個緩沖塊用結(jié)構(gòu)體e1000_buffer表示,在該結(jié)構(gòu)中,skb存放數(shù)據(jù)包的內(nèi)容,dma表示該數(shù)據(jù)包所在的總線地址。此處使用函數(shù)pci_map_single()進行流式映射,的映射方向為PCI_DMA_TODEVICE,控制總線會把虛擬地址空間所指內(nèi)容映射到總線地址,然后將該內(nèi)容由網(wǎng)卡傳送出去。發(fā)送數(shù)據(jù)包的相關(guān)結(jié)構(gòu)圖及相互關(guān)系如圖5-1所示。
e1000_tx_ring結(jié)構(gòu)中的desc所指向的buffer_addr記錄了每次發(fā)送的緩沖塊所映射的總線地址,即buffer_addr記錄的是總線地址。而desc本是一個虛擬地址,該虛擬地址是通過pci_alloc_consistent()映射的發(fā)送緩沖區(qū)的地址,其與DMA緩沖區(qū)中的一段總線地址相對應(yīng),該總線地址由e1000_tx_ring結(jié)構(gòu)中的dma成員保存,這種映射關(guān)系在對開啟網(wǎng)卡時就實現(xiàn)了,其與在發(fā)送數(shù)據(jù)包時映射的總線地址有區(qū)別,后者是在發(fā)送時動態(tài)進行的。
數(shù)據(jù)包的接收
5.jpg (40.86 KB, 下載次數(shù): 216)
下載附件
2009-03-25 20:24 上傳
圖5-2 接收數(shù)據(jù)包的結(jié)構(gòu)圖及相互關(guān)系
根據(jù)接收隊列數(shù)num_rx_queues建立相應(yīng)的接收緩沖區(qū)結(jié)構(gòu)e1000_rx_ring,在該結(jié)構(gòu)中有描述該區(qū)域的指向e1000_rx_desc結(jié)構(gòu)的desc,該緩沖區(qū)指向的dma總線地址,用于接收硬件傳送來的用e1000_buffer結(jié)構(gòu)描述的緩沖塊數(shù)組buffer_info[],另外的幾個參數(shù)則主要用于描述這些緩沖塊,其中count表示緩沖塊的個數(shù),next_to_use和next_to_clean主要描述緩沖塊的使用狀態(tài),如已經(jīng)接收接收了數(shù)據(jù)的位置及準(zhǔn)備接收的位置,當(dāng)有新的數(shù)據(jù)包要到來時,則根據(jù)這兩個參數(shù)找到相應(yīng)的區(qū)域存放。對于需要分片接收的數(shù)據(jù)包則利用了ps_page和ps_page_dma來實現(xiàn),參數(shù)cpu指定了該接收緩沖隊列所屬的處理器?偩地址與要發(fā)送的虛擬地址間的映射方向為PCI_DMA_FROMDEVICE,控制總線會把總線地址的內(nèi)容映射到虛擬地址空間內(nèi)。接收數(shù)據(jù)包的相關(guān)結(jié)構(gòu)圖及相互關(guān)系如圖5-2所示。
當(dāng)有新的數(shù)據(jù)包到達時,首先觸動中斷處理函數(shù)e1000_intr(),在函數(shù)中會為新來的數(shù)據(jù)包在緩沖塊數(shù)組buffer_info中找到一個新的緩沖塊位置,并完成e1000_buffer結(jié)構(gòu)的賦值。數(shù)據(jù)包的接收其實就是將總線地址指向的內(nèi)容拷貝到skb中,然后根據(jù)skb中的協(xié)議將其傳給相應(yīng)的上層協(xié)議的接收函數(shù)。
[ 本帖最后由 Minit 于 2009-3-25 20:57 編輯 ] |