ip輸入處理函式ip input 小結

2021-04-12 23:56:07 字數 2159 閱讀 9926

ip輸入處理函式ip_input()小結

當有幀資料到達網路介面時,網路裝置驅動程式會呼叫m_devget()函式建立一mbuf鍊錶,將收到的幀的資料部分(從ip首部開始) 存放到該mbuf鏈中.然後呼叫eth_input(struct ifnet * ifp, struct ether_header *eh, struct mbuf *m)函式通知協議.如果識別到該幀的資料部分為ip分組(型別長度欄位為0x0800),eth_input()會將指標m指向的mbuf鍊錶作為ip分組插入到ip輸入佇列ipintrq中,並且通過軟中斷通知ip協議;否則,如果識別到該幀的資料部分為arp分組(型別長度欄位為0x0806), eth_input()會將指標m指向的mbuf鍊錶作為arp分組插入到arp輸入佇列arpintrq中,並且通過軟中斷通知arp協議.**如下:

void ether_input(ifp, eh, m)

}.......

s = splimp();

if (if_qfull(inq))

else

if_enqueue(inq, m);     //將m指向的鍊錶插入到相應的協議輸入佇列中

splx(s);

}ip協議在收到軟中斷後,會呼叫ip層軟中斷處理函式void ipintr(void),net/3直接在ipintr裡面處理ip分組, 而ecos則是在ipintr函式裡呼叫了ip_input()函式來處理每乙個ip分組:

static void ipintr(void)

}ip_input的原型很簡單: void ip_input(struct mbuf * m),下面詳細介紹一下ip_input函式所完成的工作:

(1)驗證工作:首先驗證主機系統上面的網路介面有沒有配置了ip位址(驗證in_ifaddr是否為空);其次,驗證m指向的mbuf鏈的資料部分(即ip分組)有誤錯誤,如:ip版本號是否為4,檢驗和是否正確,首部長度是否正確,等等.

(2)如果hlen標識分組首部長度》40,ip_input()函式就會去呼叫ip_dooption(struct mbuf *m)對首部選項進行處理.在ip_dooption()函式中,如果發現選項資料有誤,則直接丟棄分組,或者發現由於選項中採用了源路由選項則**分組,這兩種情況下函式返回1,否則返回0.ip_input()檢查ip_dooption()的返回值,如果發現返回值為1,則ip_input認為分組已經在ip_dooption函式裡被處理完了,ip_input直接返回,繼續下乙個分組的處理;否則,當發現返回值為0時,繼續對分組進行處理. 下面我們描述一下函式ip_dooption的處理過程:

a.對源路由選項lsrr,ssrr選項的處理.需要注意的是,如果分組啟動了源路由選項,那麼分組的目的ip位址將會被選項中的下一跳ip位址替換.並且在確定分組已經到達目的主機後,所經過的路由選項會被備份在靜態全域性變數ip_srcrt中,所經過的路由器的跳數會被記錄在ip_nhops中,以備傳輸層協議構造逆轉路由.如果發現分組還沒有到達最終的目的位址,那麼ip_dooption在所有選項處理完畢後將會呼叫ip_forward(m,1)函式**該分組.

b.對記錄路由選項的處理

c.對時間戳選項的處理

(3)掃瞄本系統中in_ifaddr指向的ip位址鏈,判斷本系統是否為分組所要到達的目的位址.首先檢查所有介面的目的位址ia_addr,看是否有能與分組的目的位址匹配(單播); 其次檢查分組到達的介面的廣播位址,看是否與分組的目的位址匹配(廣播). 如果位址鏈掃瞄完成後發現沒有位址與分組的目的位址匹配,就去驗證多播.如果還不匹配,最後檢查分組是否為受限的特殊位址,如全1,或全0.

如果通過以上檢查後,系統有位址與分組的目的位址匹配,則確定分組已經到達了最終目的地,否則分組需要被**.當然,只有當系統被配置成路由器(全域性變數ip_forward == 1)時才**分組然後返回,否則直接丟棄分組後返回.

(4)如果分組已經到達最終目的地,則ip_input()此時會去檢查分組的ip首部,以判斷該分組是否為ip資料報的某個分片.如果確定該分組是某個ip資料報的某個分片,則ip_input將呼叫ip_reass()函式將到達的分片與以前的分片進行重灌.這就涉及到乙個重要的資料結構---重灌表.

(5)如果到達的分片與以前的分片重灌在一起,能組成乙個完整的資料報,或者到達的分組本身就是乙個完整的資料報,則ip層將通過ip首部所標識的協議型別呼叫相應的傳輸層函式.**如下:

(*inetsw[ip_protox[ip->ip_p]].pr_input)(m, hlen);

(6)函式返回.

QLineEdit 實現ip輸入

工程目錄如下 建立乙個 基於qwidget 的空白工程,新增 c class 也就是 iplineedit.cpp 和 iplienedit.h 這兩個檔案,新新增的用於繼承 qlineedit 類重新寫乙個用於ip輸入的類 iplineedit.cpp 檔案內容 include iplineedi...

scanf函式對異常輸入的處理

標籤 空格分隔 c 雙學位高階語言程式設計 程式設計竅門 c輸入輸出 如果想用c語言的scanf函式篩選正常輸入,過濾異常輸入,那便可以用scanf函式的返回值了。scanf函式有返回值,但是我們一般都僅用其輸入功能。返回值用法如下。include int main scanf返回值的意思是正確讀入...

python處理輸入

把一行當做字串讀入,首先去除字串的前後空格,然後以空格作為分隔符來拆分該字串得到乙個字串列表,然後把該字串列表的每一項轉換為整數。最後輸入整理到了乙個整數列表中。a list map int,input strip split print a 1 2 8 9 輸入 1,2,8,9 輸出有時候需要一邊...