您好,登錄后才能下訂單哦!
開發板需要有雙網卡,并能進行正常通信。
若選擇中斷機制實現,硬件PHY上需具有中斷引腳且能正常輸出。
雙網卡冗余備份方案采用"主-備份"網卡策略將多塊物理網卡進行綁定,綁定后兩個網卡只有一個物理地址和IP地址,同一時刻只有一個網卡進行工作,當主網卡或線路出現故障時能自動切換到備份網卡。
雙網卡冗余備份方案采用輪詢機制檢測,即每隔一段時間進行一次PHY連接狀態檢測,當檢測到主網卡連接斷開且備份網卡連接正常時,切換至備份網卡。
雙網卡冗余備份方案采用中斷機制檢測,即PHY連接狀態改變產生中斷信號,立即進行檢測,當檢測到主網卡連接斷開且備份網卡連接正常時,切換至備份網卡。
中斷機制檢測相比輪詢機制,反應時間更快,但需要硬件支持。
調用ifconfig命令查看當前網卡信息,獲取需要進行綁定的兩個網卡名,如圖 4.1所示。
圖 4.1獲取網卡信息
跳轉到/etc/目錄下,添加一個綁定雙網卡的配置文件bonding.ini,內容示例如程序清單 4.1所示。
程序清單 4.1 bonding.ini配置文件
[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開發板,手動拔掉一根網線,觀察是否自動切換到另一個網卡上去,網絡是否還是連通狀態;等會拔掉另一根網線再次觀察網絡連通性。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。