開發板須要有雙網卡,並能進行正常通訊。網絡
若選擇中斷機制實現,硬件PHY上需具備中斷引腳且能正常輸出。函數
雙網卡冗餘備份方案採用"主-備份"網卡策略將多塊物理網卡進行綁定,綁定後兩個網卡只有一個物理地址和IP地址,同一時刻只有一個網卡進行工做,當主網卡或線路出現故障時能自動切換到備份網卡。測試
雙網卡冗餘備份方案採用輪詢機制檢測,即每隔一段時間進行一次PHY鏈接狀態檢測,當檢測到主網卡鏈接斷開且備份網卡鏈接正常時,切換至備份網卡。spa
雙網卡冗餘備份方案採用中斷機制檢測,即PHY鏈接狀態改變產生中斷信號,當即進行檢測,當檢測到主網卡鏈接斷開且備份網卡鏈接正常時,切換至備份網卡。code
中斷機制檢測相比輪詢機制,反應時間更快,但須要硬件支持。ip
調用ifconfig命令查看當前網卡信息,獲取須要進行綁定的兩個網卡名,如圖 4.1所示。開發
圖 4.1獲取網卡信息cmd
跳轉到/etc/目錄下,添加一個綁定雙網卡的配置文件bonding.ini,內容示例如程序清單 4.1所示。it
程序清單 4.1 bonding.ini配置文件io
[bonding] ipaddr=192.168.2.220 netmask=255.255.255.0 gateway=192.168.2.1 mac=80:46:38:78:28:39 en1name=en1 en2name=en2 mode=1 ****** mode=0 (若不配置默認100ms)********* miimon=100 ****** mode=1 (若不配置默認降低沿觸發)********* gpiotype=1 gpiolevel=0
本次配置採用了主從策略,具體說明以下:
ipaddr:配置綁定後的IP地址;
netmask:配置綁定後的子網掩碼;
gateway:配置綁定後的默認網關;
mac:配置綁定後的物理地址;
en1name:配置須要綁定的主網卡名;
en2name:配置須要綁定的備份網卡名;
mode:配置工做模式(0:輪詢機制,1:中斷機制),若選擇輪詢機制,需配置miimon項;若選擇中斷機制,需配置en1gpio、en2gpio、gpiotype、gpiolevel項;
miimon:配置輪詢檢測時間(毫秒),一般設置爲100毫秒;
gpiotype:配置觸發方式(0:電平觸發,1:邊沿觸發);
gpiolevel:配置觸發條件(若是爲電平觸發, 1 表示高電平觸發, 0 表示低電平觸發;若是爲邊沿觸發, 1 表示上升沿觸發, 0 表示降低沿觸發, 2 表示雙邊沿觸發)。
雙網卡冗餘備份模塊須要調用網卡驅動中的ioctl函數,並設置物理網卡硬件地址,要求底層網卡驅動具備如表格 4.1功能:
表格 4.1 ioctl函數cmd命令
cmd命令 |
參數類型 |
功能 |
SIOCSIFHWADDR |
struct ifreq |
設置硬件地址 |
GET_LINK_STATE |
struct ifreq |
獲取PHY狀態 |
SET_PHY_MICR |
NULL |
設置PHY中斷 |
CLEAR_PHY_MISR |
NULL |
清除PHY中斷狀態 |
GET_MAC_IRQ |
ULONG |
獲取網卡中斷號 |
GET_PHY_GPIO |
UINT8 |
獲取PHY中斷輸出GPIO管腳號 |
若網卡驅動中ioctl函數未實現,需修改網卡驅動,具體細節爲:
網卡驅動函數中添加ioctl函數,如程序清單 4.2所示。
程序清單 4.2網卡驅動函數修改
static struct netdev_funcs net0_drv = { ioctl = __enetCoreIoctl, };
編寫ioctl函數,如程序清單 4.3所示。
程序清單 4.3添加ioctl函數
static INT __enetCoreIoctl (struct netdev *pNetDev, int iCmd, void *pArg) { struct ifreq *pifreq; switch (iCmd) { case XXX: break; default: break; } return (ERROR_NONE); }
ioctl函數中,添加SIOCSIFHWADDR命令,如程序清單 4.4所示。
程序清單 4.4添加SIOCSIFHWADDR命令
#define SIOCSIFHWADDR _IOW('i', 55, struct ifreq) case GET_LINK_STATE: pifreq = (struct ifreq *)pArg; /* TODO:設置 MAC 地址 */ break;
ioctl函數中,添加GET_MAC_IRQ命令,如程序清單 4.5所示。
程序清單 4.5添加GET_MAC_IRQ命令
#define GET_MAC_IRQ _IOWR('i', 260, struct ifreq) case GET_MAC_IRQ: /* TODO:獲取 MAC 中斷號 */ break;
輪詢機制須要調用網卡驅動中的ioctl函數,並讀取硬件設備PHY的鏈接狀態,須要修改網卡驅動ioctl函數,具體細節爲:
ioctl函數中,添加GET_LINK_STATE命令,如程序清單 4.6所示。
程序清單 4.6添加GET_LINK_STATE命令
#define GET_LINK_STATE _IOWR('i', 257, struct ifreq) case GET_LINK_STATE: pifreq = (struct ifreq *)pArg; /* TODO: 讀取硬件設備PHY的鏈接狀態 */ /* 若鏈接:pifreq->ifr_flags |= IFF_RUNNING; */ /* 未鏈接:pifreq->ifr_flags &= ~IFF_RUNNING; */ break;
中斷機制須要調用網卡驅動中的ioctl函數,並清除PHY的中斷狀態寄存器,須要修改網卡驅動ioctl函數,具體細節爲:
添加SET_PHY_MICR命令,如程序清單 4.7所示。
程序清單 4.7添加SET_PHY_MICR命令
#define SET_PHY_MICR _IOWR('i', 258, struct ifreq) case SET_PHY_MICR: /* TODO:設置 PHY 中斷控制寄存器,使能連接狀態改變中斷 */ /* 將硬件 PHY 上的中斷引腳設置爲輸出 */ break;
添加CLEAR_PHY_MISR命令,如程序清單 4.8所示。
程序清單 4.8添加CLEAR_PHY_MISR命令
#define CLEAR_PHY_MISR _IOWR('i', 259, struct ifreq) case CLEAR_PHY_MISR: /* TODO:清除 PHY 中斷狀態 */ break;
注意:申請GPIO管腳號須要在開發板 BSP 適配文件中添加對應的GPIO配置。
添加GET_PHY_GPIO命令,如程序清單 4.9 所示。
程序清單 4.9添加GET_PHY_GPIO命令
#define GET_PHY_GPIO _IOWR('i', 261, struct ifreq) case GET_PHY_GPIO: /* TODO:獲取 PHY GPIO 管腳號 */ break;
模塊加載,開啓雙網卡冗餘備份。
模塊卸載,關閉雙網卡冗餘備份。
主機ping開發板,手動拔掉一根網線,觀察是否自動切換到另外一個網卡上去,網絡是否仍是連通狀態;等會拔掉另外一根網線再次觀察網絡連通性。