物聯網高手應備:網絡協議棧LwIP(一)
上節我們對LwIp的目錄結構已經有了了解,我們這篇文件將就LwIp協議棧做更深一步的研究。
重要源文件解釋
LwIp的源碼源文件多達幾百個,我們去讀源碼的時候不能一下子全部讀完,我們在讀源碼時候需要有所重點的去讀,才能快速的把握LwIp的精髓。
API目錄是提供了Socket接口和Sequential API的接口,Socket.c實現了BSD socket的接口封裝,tcpip.c文件并沒有實現tcpip協議,實際上是Sequential API 主線程模塊的的實現。api_lib.c是Sequential API的接口的實現。
core目錄則是協議棧的核心,其中tcp.c ip.c,udp.c 則是整個tcp/ip協議棧的核心實現,ip層還分為ipv4和ipv6兩個目錄,里面有ipv4 ipv6層的的具體實現。mem.c 和memp.c是內存管理的核心實現。
netif目錄是接口部分,***的2.0版本和原來的1.4版本對以太網部分做了較大改動,ethernetif.c是以太網驅動文件,需要根據具體硬件來進行移植。ethernetif.c文件在1.4版本的是在本目錄下,2.0版本則放到用戶的目錄下。本目錄還有其他的接口文件如ppp協議的等。ethernet.c是對以太網報文的抽象出入口函數接口。
無操作系統移植和初始化
把LwIp移植到具體的網卡上和操作系統上需要一定的工作量,移植LwIp分操作系統移植和非操作系統移植,操作系統移植較為繁瑣,我們先討論非操作系統移植。
非操作系統移植主要是需要移植ethernetif.c文件。網卡的初始化要放在low_level_init函數內執行。low_level_init函數是配置MAC地址,物理網卡的初始化函數。調用流程如下
網卡初始化流程
low_level_init設置好物理網卡芯片的參數(mac地址,phy型號,mac接口類型,接收模式,自協商等等),把這些參數寫入到網卡芯片的寄存器中。
物理網卡芯片初始化
物理芯片設置好了后就可以接收和發送數據了,但接收和發送數據函數需要由LwIp的函數來進行封裝,否則無法被LwIp處理。
數據接收流程
無操作系統和有操作系統的數據接收方式有所不同,無操作系統的接收入口函數是ethernetif_input,把網卡接收到數據送到LwIp協議棧

數據發送流程
注冊發送函數
在low_level_output函數內要實現自己的網卡發送功能。