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

由測試結果看,本文設計實現的智能雙冗余驅動能夠很好地實現雙端口網卡冗余備份的功能,在檢測到主通道網卡設備連接錯誤時可以切換到備用通道繼續進行網絡通信,并且可以在兩塊網卡之間循環切換;同時,該驅動對上層用戶透明,呈現單網卡的特性,完全在驅動中實現網卡間的冗余備份。
本文設計實現了一個基于VxWorks的雙端口網卡智能雙冗余驅動,在驅動中實現了網絡通信故障診斷和網卡間智能切換功能,對上層應用呈現單網卡特性。通過對設計實現的智能雙冗余驅動進行性能測試,驗證了設計的正確性和有效性,但通過測試結果也可以看到,在網卡切換過程中還存在切換時間較長的問題,有待進一步研究。
c++相關文章:c++教程
評論