我公司產品是雙網口,原來的程式是自己寫的tcp/ip協議棧,因為只是簡單實現了arp和tcp、udp的最簡單情況,所以有時候在公網上會遇到問題。
後來在單網口的產品中移植了lwip,輕量級tcp/ip協議棧,覺得一定程度上解決了問題,所以雙網絡卡的產品也要用lwip這個協議棧來實現。這個工作就落到了我的頭上。
單網絡卡的移植我不贅述,只描述從單網絡卡向雙網絡卡移植過程中遇到的問題以及解決方法。
首先,我看了下單網絡卡移植中所作的改動。
硬體啟動時初始化硬體,呼叫my_lwip_init(),這個函式中建立任務,新增網絡卡配置。
low_level_init()函式中設定本網絡卡初始化時mac位址的設定。
low_level_output()函式處理輸出資訊。
low_level_input()函式處理輸入資訊。
ethernetif_input()函式是區分接受到的資料報怎麼處理。
由此,可以知道我所需要做的主要改動就是針對這幾個函式,及其相關的函式。
多建立乙個netif塊,硬體初始化時在mylwip_init()函式中多新增乙個netif_add,並呼叫netif_set_up().
在low_level_init()中,區分兩個網絡卡的mac位址並且填充到netif塊中。[由此**可見,硬體mac位址修改後程式必須重新設定netif鍊錶才能正確執行。]
在low_level_output()中,判斷返回的資料是要傳送到哪個網絡卡,將資料拷貝到網絡卡傳送緩衝區,然後傳送。
在low_level_input()中,判斷是哪個網絡卡接受到了資料,並將網絡卡接受緩衝區中的資料拷貝到netif塊的payload資料處。
在進行完這幾步驟以後,ping程式已經可以通了,但是出現了一些奇怪的現象,同乙個網口竟然能通訊兩個ip位址的內容[在乙個網口ping兩個網絡卡都能通],所以又在ethernetif_input()函式中判斷加入目標位址是本網絡卡再進入tcp/ip的處理。到這時也解決了。
然後出現了乙個讓人啼笑皆非的問題,ping net1 ok,ping net 2 ok,tcp net1 error,tcp net2 ok。而且只有乙個網絡卡時,net1和net2都正常。所以懷疑是路由這塊出了問題,檢視lwip的文件才發現,ip_route()函式的規則是目標位址處於本網絡卡的網段則認為本網絡卡的資料,否則走預設路由配置。由於我們的模組是為了做資料熱備或者多通訊口才設定的雙網絡卡,所以兩個網絡卡都是乙個網段的配置,這時ip_route()函式找到預設的乙個路由表中的第乙個路由就直接返回了。無奈之下,我寫了ip_route2(),以比較源位址的方式來確定是由哪個網絡卡來傳送資料。
到此為止,測試ok,開心之極,趕緊記錄下來。
作者callmeback
Uboot 網絡卡移植遇到的問題與解決方法
在上一章節中描述的兩個問題,這裡做下簡單回顧。在執行到接收以太幀的時候,出現了data abrot異常,如下 data abort pc 7fe9a2a0 lr 7aede325 reloc pc 43e432a0 lr 3ee87325 sp 7ae54ce0 ip 00000014 fp 000...
Apache安裝過程出現的問題以及解決方法
近期剛剛學習php,在學習php環境搭建時安裝apache的工程 現的問題以及解決方法。總結了一下,分享給大家可以對剛剛學習php的小夥伴們有所幫助。apache簡介 apache是一款web伺服器軟體,有多種產品,可以支援ssl技術,支援多個虛擬主機。apache的特點是簡單 速度快 效能穩定,並...
Mac下安裝brew遇到的問題以及解決方案
版本 mac os 10.15.5 homebrew是一款mac os平台下的軟體包管理工具,擁有安裝 解除安裝 更新 檢視 搜尋等很多實用的功能。簡單的一條指令,就可以實現包管理,而不用你關心各種依賴和檔案路徑的情況,十分方便快捷。其實在沒有問題的情況下,一條命令就可以安裝成功 將下方命令貼上到終...