基于VxWorks的雙端口網(wǎng)卡智能雙冗余驅(qū)動
智能雙冗余網(wǎng)卡驅(qū)動中定義了一個(gè)控制單網(wǎng)卡設(shè)備的控制結(jié)構(gòu),如下所示:
typedef struct ne2000_device
{
……
int unit; /*網(wǎng)卡單元號*/
int ilevel; /*中斷優(yōu)先級*/
int byteAccess; /*字節(jié)存儲模式*/
ULONG base; /*基地址*/
int offset; /*內(nèi)存對齊偏移量*/
volatile ULONG imask; /*中斷屏蔽碼*/
UCHAR enetAddr[6]; /*網(wǎng)卡物理地址*/
……
} DETHEND_DEVICE;
驅(qū)動中創(chuàng)建了兩個(gè)網(wǎng)卡設(shè)備控制結(jié)構(gòu)分別控制兩塊網(wǎng)卡。上層應(yīng)用通過操作網(wǎng)卡控制結(jié)構(gòu)從而實(shí)現(xiàn)對網(wǎng)卡的各種操作。
2.3 網(wǎng)絡(luò)通信故障診斷方法
要實(shí)現(xiàn)網(wǎng)絡(luò)端口的智能切換,實(shí)現(xiàn)網(wǎng)卡間冗余備份的功能,首要前提就是需要診斷出當(dāng)前工作的網(wǎng)卡是否網(wǎng)絡(luò)通信故障。任何一種網(wǎng)絡(luò)芯片都提供連接狀態(tài)自動診斷功能,通過在網(wǎng)絡(luò)芯片的某個(gè)寄存器的相應(yīng)位置0或置1來表示該網(wǎng)卡連接正常還是連接錯(cuò)誤。它所檢測的依據(jù)是網(wǎng)卡是否連通,也就是從本機(jī)網(wǎng)絡(luò)端口到網(wǎng)線另一端的網(wǎng)絡(luò)端口整個(gè)通路是否連通,它能檢測出網(wǎng)線斷開、網(wǎng)絡(luò)接口松動及故障等錯(cuò)誤。
本文使用的SEM/DETH雙端口以太網(wǎng)卡采用兩塊RTL8019AS網(wǎng)絡(luò)芯片,該網(wǎng)絡(luò)芯片的寄存器組采用分頁存儲方式,共分為4頁,都映射到16個(gè)I/O地址空間上。其中,第3頁CONFIG0寄存器的B2位表示網(wǎng)卡連接狀態(tài)自動診斷結(jié)果,當(dāng)該位為1時(shí)表示連接錯(cuò)誤,為0時(shí)表示連接正常。智能雙冗余驅(qū)動的網(wǎng)絡(luò)故障診斷任務(wù)判斷網(wǎng)卡連接狀態(tài)的代碼如下:
setting=sysInByte(pDrvCtrl->base); /*讀取命令寄存器狀態(tài)*/
sysOutByte(pDrvCtrl->base,(0xc0|setting));/*選擇第3頁寄存器組*/
if(sysInByte(pDrvCtrl->base+CONFIG0_REG) 0x04)/*網(wǎng)絡(luò)連接錯(cuò)誤*/
{ …… }
2.4 單物理地址實(shí)現(xiàn)
要使兩塊網(wǎng)卡實(shí)現(xiàn)智能雙冗余備份,它們必須有相同的物理地址和IP地址。否則,當(dāng)由其中一個(gè)網(wǎng)卡切換到另一個(gè)網(wǎng)卡上時(shí),如果IP地址發(fā)生變化,系統(tǒng)將無法正常接收、發(fā)送數(shù)據(jù);如果IP地址不發(fā)生變化而僅僅物理地址發(fā)生變化,雖然網(wǎng)卡切換后,系統(tǒng)仍可以正常接收、發(fā)送數(shù)據(jù),但由于物理地址發(fā)生變化,將引起協(xié)議棧中ARP綁定表的變化,重新對應(yīng)ARP綁定表中IP地址與網(wǎng)卡物理地址的關(guān)系,則延長了兩個(gè)網(wǎng)卡之間的切換時(shí)間。
系統(tǒng)的IP地址存在于系統(tǒng)的網(wǎng)絡(luò)協(xié)議棧中,在系統(tǒng)啟動后與網(wǎng)卡進(jìn)行綁定。由于本文設(shè)計(jì)實(shí)現(xiàn)的智能雙冗余驅(qū)動對于應(yīng)用系統(tǒng)和協(xié)議棧來說呈現(xiàn)單網(wǎng)卡的特征,網(wǎng)卡之間的切換只在驅(qū)動程序中完成,所以,當(dāng)發(fā)生網(wǎng)卡切換時(shí),系統(tǒng)的IP地址并不發(fā)生變化。
對于網(wǎng)卡的物理地址來說,通常每塊網(wǎng)卡有一個(gè)全世界范圍內(nèi)惟一的物理地址,它保存在網(wǎng)卡的PROM中。網(wǎng)卡初始化時(shí),要從PROM中讀出物理地址,把它存放在適當(dāng)?shù)募拇嫫骱蛿?shù)據(jù)結(jié)構(gòu)中,對外來說,寄存器和數(shù)據(jù)結(jié)構(gòu)中的數(shù)值就是這塊網(wǎng)卡的物理地址。在智能雙冗余驅(qū)動程序中,當(dāng)驅(qū)動程序初始化時(shí)只讀取一塊網(wǎng)卡PROM中的物理地址,然后把這個(gè)地址寫入兩塊網(wǎng)卡的對應(yīng)物理地址寄存器和數(shù)據(jù)結(jié)構(gòu)變量pDrvCtrl中,這樣,兩塊網(wǎng)卡對外就具有統(tǒng)一的物理地址了。因?yàn)轵?qū)動程序自始至終只有一塊網(wǎng)卡處于激活狀態(tài),另一塊作為備份,因此不會發(fā)生同一個(gè)網(wǎng)絡(luò)上兩個(gè)物理地址相同出現(xiàn)沖突這種現(xiàn)象。
3 性能測試
3.1 測試方法
針對本文設(shè)計(jì)、實(shí)現(xiàn)的雙端口網(wǎng)卡智能雙冗余驅(qū)動進(jìn)行性能測試。將智能雙冗余驅(qū)動編譯到VxWorks操作系統(tǒng)中,使用帶有SEM/DETH雙端口以太網(wǎng)卡的計(jì)算機(jī)做目標(biāo)機(jī),使用兩根網(wǎng)線把目標(biāo)機(jī)連接到交換機(jī)上。目標(biāo)機(jī)應(yīng)用程序以40次/秒的速率向外發(fā)送UDP廣播報(bào)文。采用普通PC機(jī)作為主機(jī)系統(tǒng),運(yùn)行Windows2000操作系統(tǒng),使用sniffer Pro工具進(jìn)行網(wǎng)絡(luò)監(jiān)控。
3.2 測試結(jié)果及分析
測試結(jié)果如圖2所示,橫坐標(biāo)代表報(bào)文數(shù),縱坐標(biāo)代表主機(jī)接收到的目標(biāo)機(jī)UDP廣播報(bào)文中兩個(gè)連續(xù)UDP報(bào)文之間的間隔時(shí)間(單位為秒)。由圖2可以看到,由于目標(biāo)機(jī)正常工作狀態(tài)下是以40次/秒的速率廣播發(fā)送UDP網(wǎng)絡(luò)報(bào)文的,所以每兩個(gè)報(bào)文之間的時(shí)間間隔大部分為25ms左右。在圖2中出現(xiàn)了8次主機(jī)接收到的廣播報(bào)文時(shí)間間隔為100ms左右的情況,這是由于在目標(biāo)機(jī)端進(jìn)行了8次網(wǎng)卡切換,在網(wǎng)卡切換過程中出現(xiàn)了報(bào)文丟失現(xiàn)象。
由測試結(jié)果看,本文設(shè)計(jì)實(shí)現(xiàn)的智能雙冗余驅(qū)動能夠很好地實(shí)現(xiàn)雙端口網(wǎng)卡冗余備份的功能,在檢測到主通道網(wǎng)卡設(shè)備連接錯(cuò)誤時(shí)可以切換到備用通道繼續(xù)進(jìn)行網(wǎng)絡(luò)通信,并且可以在兩塊網(wǎng)卡之間循環(huán)切換;同時(shí),該驅(qū)動對上層用戶透明,呈現(xiàn)單網(wǎng)卡的特性,完全在驅(qū)動中實(shí)現(xiàn)網(wǎng)卡間的冗余備份。
本文設(shè)計(jì)實(shí)現(xiàn)了一個(gè)基于VxWorks的雙端口網(wǎng)卡智能雙冗余驅(qū)動,在驅(qū)動中實(shí)現(xiàn)了網(wǎng)絡(luò)通信故障診斷和網(wǎng)卡間智能切換功能,對上層應(yīng)用呈現(xiàn)單網(wǎng)卡特性。通過對設(shè)計(jì)實(shí)現(xiàn)的智能雙冗余驅(qū)動進(jìn)行性能測試,驗(yàn)證了設(shè)計(jì)的正確性和有效性,但通過測試結(jié)果也可以看到,在網(wǎng)卡切換過程中還存在切換時(shí)間較長的問題,有待進(jìn)一步研究。
c++相關(guān)文章:c++教程
評論