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

數(shù)據(jù)發(fā)送流程
注冊發(fā)送函數(shù)
在low_level_output函數(shù)內(nèi)要實現(xiàn)自己的網(wǎng)卡發(fā)送功能。