1. 程式人生 > >SylixOS 網路協議棧lwip介紹3-----udp資料接收

SylixOS 網路協議棧lwip介紹3-----udp資料接收

資料包接收包括兩個部分。首先網絡卡獲取一個數據包並使用中斷通知系統,系統解析這個資料包放入緩衝佇列中。再由應用層呼叫介面recv()或recvfrom()獲取這個資料包。

1、中斷接收

(1)    系統在初始化時會註冊網絡卡中斷,處理函式為dm9000IntIsr()。當接收到一個數據包時會執行中斷處理,中斷處理內容很簡短,僅新增一個接收處理函式dm9000_receive()到任務佇列中,資料包主要在接受處理函式中被處理,減少了中斷開銷;

(2)    在dm9000_receive()中首先會建立一個POOL型別的pbuf結構,再呼叫驅動介面priv->inblk()從網絡卡中提取報文放入pbuf結構中,執行tcpip_input()處理這個資料包;

(3)    通過訊息佇列傳送資料到網路執行緒“t_netproto”,使用一個單獨的執行緒處理此資料包;

(4)    進入執行緒後執行ip4_input()進行網路層處理,提取出運輸層資料再通過udp_input()進行udp資料包處理;

(5)    根據ip與port找到對應的udp連結資訊即udp_pcb結構,提取pcb中對應的接收處理函式pcb->recv()即recv_udp()和連結結構connect,recv_udp()中會將此資料包傳送到此udp連結的訊息佇列中,等待使用者層提取;

網絡卡中斷接收流程如下:


 

2、recvfrom()

(1)    通過檔案描述符fd獲取檔案結構,並提取lwipfd。再通過lwipfd從socket表中獲取socket結構。Socket結構中包含了此udp連結中的connect資訊;

(2)    根據connect資訊獲取對應UDP連結的接收訊息佇列,並通過呼叫netconn_recv_data()從訊息佇列中獲取一條報文;

recvfrom()處理流程如下: