LWIP協(xié)議棧架構(gòu)與設(shè)計(jì)解析復(fù)習(xí)課程_第1頁(yè)
LWIP協(xié)議棧架構(gòu)與設(shè)計(jì)解析復(fù)習(xí)課程_第2頁(yè)
LWIP協(xié)議棧架構(gòu)與設(shè)計(jì)解析復(fù)習(xí)課程_第3頁(yè)
LWIP協(xié)議棧架構(gòu)與設(shè)計(jì)解析復(fù)習(xí)課程_第4頁(yè)
LWIP協(xié)議棧架構(gòu)與設(shè)計(jì)解析復(fù)習(xí)課程_第5頁(yè)
已閱讀5頁(yè),還剩17頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、Good is good, but better carries it.精益求精,善益求善。LWIP協(xié)議棧架構(gòu)與設(shè)計(jì)解析LWIP協(xié)議棧及接口提取Version1.02012/06/20版本1.0姓名部門郵件作者雷巖L審閱版本歷史版本日期修訂姓名Rev1.02011/11/07FirstDraftleiyan目錄TOCo1-3hzuHYPERLINKl_Toc328052376一、LWIP介紹PAGEREF_Toc328052376h5HYPERLINKl_Toc328052377二、LWIP源碼分析PAGEREF_Toc328052377h7HYPERLINKl_Toc3280523781LW

2、IP協(xié)議棧的架構(gòu)PAGEREF_Toc328052378h7HYPERLINKl_Toc3280523792各個(gè)文件夾介紹PAGEREF_Toc328052379h8HYPERLINKl_Toc3280523803模塊及源文件介紹PAGEREF_Toc328052380h10HYPERLINKl_Toc328052381三、LWIP協(xié)議棧處理數(shù)據(jù)流程PAGEREF_Toc328052381h17HYPERLINKl_Toc328052382四、接口提取PAGEREF_Toc328052382h18LWIP介紹首先說(shuō)明一下,這篇文檔的主要目的是提取網(wǎng)絡(luò)發(fā)送和接收數(shù)據(jù)的函數(shù)接口。然后用我們自己的驅(qū)

3、動(dòng)網(wǎng)卡的接口函數(shù)替代程序中的接口。如果對(duì)LWIP協(xié)議棧本身沒(méi)什么興趣的,可以跳過(guò)第一、二、三章,直接閱讀第四章,使用我們的接口代替第四章的接口就行了。寫第一、二、三章的主要目的是為了方便理解數(shù)據(jù)的發(fā)送和接收在LWIP協(xié)議棧中是如何進(jìn)行處理的。這便于我們理解提取出來(lái)的接口。LWIP是瑞典計(jì)算機(jī)科學(xué)院開(kāi)發(fā)的一套用于嵌入式系統(tǒng)的開(kāi)放源代碼的輕量級(jí)的TCP/IP協(xié)議棧。傳統(tǒng)的,或者說(shuō)是典型的TCP/IP協(xié)議族的設(shè)計(jì)都是按照分層的思想來(lái)設(shè)計(jì)的。這樣設(shè)計(jì)有個(gè)好處,就是每層相對(duì)于其他層獨(dú)立,代碼方便理解。缺點(diǎn)就是,每層之間進(jìn)行數(shù)據(jù)交互的時(shí)候必須要進(jìn)行復(fù)制,而數(shù)據(jù)的復(fù)制是很耗時(shí)的,這就降低了實(shí)時(shí)性。LWIP采

4、用了一種不同的設(shè)計(jì)方式來(lái)實(shí)現(xiàn)TCP/IP協(xié)議族。LWIP各層之間沒(méi)有明顯的界限,各層之間都可以訪問(wèn)到共享在內(nèi)存中的數(shù)據(jù)。因?yàn)楦鲗佣伎梢栽L問(wèn)共享內(nèi)存,所以這就避免了內(nèi)存復(fù)制產(chǎn)生的性能損失。但是并不是說(shuō)LWIP就沒(méi)有分層的概念了。只不過(guò)LWIP各層都是邏輯意義上的層。每個(gè)協(xié)議都以模塊的形式被實(shí)現(xiàn)。而這些模塊就共同組成了LWIP整體。下面一章將分析LWIP的源碼,結(jié)合源碼介紹這些模塊。了解各個(gè)協(xié)議是怎么通過(guò)模塊被實(shí)現(xiàn)的。其中這里最主要的是TCP協(xié)議模塊的實(shí)現(xiàn)。TCP協(xié)議在LWIP協(xié)議棧中占得比例最大,有將近一半的代碼是專門用來(lái)實(shí)現(xiàn)TCP協(xié)議的。所以重點(diǎn)會(huì)分析TCP協(xié)議。并且無(wú)線音頻項(xiàng)目采用的也是TC

5、P協(xié)議傳輸數(shù)據(jù)。LWIP邏輯上被分為四個(gè)層:應(yīng)用層,傳輸層,網(wǎng)絡(luò)層和網(wǎng)絡(luò)接口層。如下圖1.1所示:圖1.1LWIP協(xié)議棧的分層模型應(yīng)用層主要是使用LWIP協(xié)議棧開(kāi)發(fā)相應(yīng)的網(wǎng)絡(luò)通信程序。LWIP主要提供了三種接口供用戶使用。三種接口分別為RAWAPI,NetconnAPI和BSDSocketAP。其中RAWAPI主要是采用回調(diào)函數(shù)的方式來(lái)完成數(shù)據(jù)的發(fā)送和接收,RAWAPI接口寫的應(yīng)用程序與LWIP協(xié)議棧處在同一個(gè)進(jìn)程(或者稱任務(wù))中。NetconnAPI和BSDSocketAP工作于多線程方式中,要使用者兩種接口,必須有多任務(wù)的操作系統(tǒng)的支持。這次項(xiàng)目采用的接口是RAWAPI。關(guān)于RAWAPI接

6、口如何寫應(yīng)用層程序,另寫了一個(gè)專門的文檔介紹。這里不列出。傳輸層。我們最熟悉的TCP協(xié)議,UDP協(xié)議,以及我們使用ping命令時(shí)采用的ICMP協(xié)議都處在這一層。這一層提供了一些專門的接口,用于處理與應(yīng)用層和網(wǎng)絡(luò)層的數(shù)據(jù)傳送(注明,這里說(shuō)的數(shù)據(jù)傳送并不是指數(shù)據(jù)的拷貝。事實(shí)上,LWIP協(xié)議棧使用的是內(nèi)存共享技術(shù),各層都能訪問(wèn)這段共享內(nèi)存,各層傳遞的就是數(shù)據(jù)結(jié)構(gòu)指針,所以LWIP協(xié)議棧降低了內(nèi)存復(fù)制所產(chǎn)生的性能損失)。關(guān)于這層函數(shù),會(huì)在下面進(jìn)行具體說(shuō)明。網(wǎng)絡(luò)層主要的協(xié)議是IP協(xié)議。這一層主要是對(duì)底層接收的數(shù)據(jù)包進(jìn)行發(fā)送,轉(zhuǎn)發(fā),丟棄組合等功能。網(wǎng)絡(luò)接口層是和底層硬件驅(qū)動(dòng)交互的層。我們所需要提取的網(wǎng)絡(luò)接

7、口就在這一層。LWIP源碼分析LWIP協(xié)議棧的架構(gòu)LWIP協(xié)議棧源碼的架構(gòu)如下圖2.1所示:圖2.1LWIP協(xié)議棧源碼架構(gòu)api目錄:應(yīng)用程序接口文件,包括netconn和BSD2種API。這個(gè)文件夾主要是為了方便應(yīng)用程序編寫而為應(yīng)用層提供的API接口。core目錄:ICMP,IP,TCP,UDP協(xié)議的實(shí)現(xiàn)文件,以及一些輔助函數(shù),LWIP實(shí)現(xiàn)的核心代碼。其中這個(gè)文件夾里面實(shí)現(xiàn)TCP協(xié)議的代碼量幾乎占了整個(gè)lwip協(xié)議棧的一半。重點(diǎn)會(huì)討論TCP協(xié)議。在此也可以簡(jiǎn)單看出LWIP協(xié)議棧沒(méi)有嚴(yán)格區(qū)分傳輸層和網(wǎng)絡(luò)層,因?yàn)閭鬏攲拥拇a和網(wǎng)絡(luò)層的代碼放在一個(gè)文件夾里實(shí)現(xiàn)了。目錄里還提供了RAWAPI接口的實(shí)

8、現(xiàn)。RAWAPI接口和上面兩種接口一樣,都是為了方便應(yīng)用程序編寫而為應(yīng)用層提供的API接口。include目錄:主要是LWIP協(xié)議棧使用的自定義的一些頭文件。netif目錄:這個(gè)目錄里主要實(shí)現(xiàn)的是ARP協(xié)議。當(dāng)然還有一些PPPOE等協(xié)議。當(dāng)然PPPOE協(xié)議不是我們所關(guān)心的。port目錄:最后寫這個(gè)目錄,主要是因?yàn)檫@個(gè)目錄是我們最終所要修改的一個(gè)目錄。可以看到此目錄下包含一個(gè)ethernetif.c文件。這個(gè)文件提供了與底層網(wǎng)絡(luò)驅(qū)動(dòng)的一個(gè)接口。我們要實(shí)現(xiàn)與自己的網(wǎng)絡(luò)接口驅(qū)動(dòng)交互,必須修改這個(gè)文件里的接口,使這些接口為上層屏蔽細(xì)節(jié)信息。2各個(gè)文件夾介紹【1】api目錄,如圖2.2圖2.2api目錄

9、下的文件列表這個(gè)文件夾下面主要提供的是netconnAPI和BSDsocketAPI。這些接口不是我們所要關(guān)心的。所以直接忽略。我們使用下面文件夾里提供的RAWAPI接口?!?】core目錄,如圖2.3圖2.3core目錄下的文件列表這個(gè)文件下下面,ipv6文件夾和snmp文件夾我們不需要關(guān)心。主要關(guān)心的文件有icmp.cIp.cip_addr.cip_etif.cpbuf.cRaw.ctcp.ctcp_in.ctcp_out.cudp.c【3】include目錄,如圖2.4圖2.4include目錄下的文件列表這個(gè)文件夾下面主要包括所有.c文件用到的頭文件。Ipv6文件夾我們不必關(guān)心。【4】

10、netif目錄,如圖2.5圖2.5netif目錄下的文件列表這個(gè)文件夾下面主要關(guān)心etharp.c這個(gè)文件其余的不必關(guān)心。其中文件夾PPP是關(guān)于點(diǎn)對(duì)點(diǎn)協(xié)議的,不必關(guān)心【5】port目錄,如圖2.6圖2.6port目錄下的文件列表這個(gè)文件夾下面關(guān)于arch目錄,這個(gè)目錄是移植時(shí)候主要修改的目錄。這個(gè)目錄下包含的是與體系結(jié)構(gòu)相關(guān)的一些定義等。FreeRTOS這個(gè)文件夾不需要關(guān)心,因?yàn)檫@是基于實(shí)時(shí)操作系統(tǒng)的,而我們現(xiàn)在做的項(xiàng)目是基于單任務(wù)的,無(wú)需操作系統(tǒng)的支持。Standalone這個(gè)文件夾下面的ethernetif.c中給出的驅(qū)動(dòng)接口。我們?yōu)樽约旱木W(wǎng)絡(luò)接口設(shè)計(jì)的驅(qū)動(dòng)程最終用來(lái)代替這個(gè)文件里的接口。

11、上面所有文件大致描述了LWIP協(xié)議棧的幾個(gè)模塊:配置模塊、初始化模塊、NetIf模塊、Mem(memp)模塊、netarp模塊、ip模塊、udp模塊、icmp模塊、igmp模塊和dhcp模塊。由于篇幅限制,不能對(duì)每個(gè)源文件都做介紹。只對(duì)我們感興趣的模塊的源文件做相應(yīng)的介紹。3模塊及源文件介紹【1】配置模塊配置模塊的文件主要包含在include/lwip/opt.h里(這里及下文所指的路徑均為相對(duì)路徑)。配置模塊通過(guò)各種宏定義的方式對(duì)系統(tǒng)、子模塊進(jìn)行了配置。比如,通過(guò)宏,配置了mem管理模塊的參數(shù)。該配置模塊還通過(guò)宏,配置了協(xié)議棧所支持的協(xié)議簇,通過(guò)宏定制的方式,決定了支持那些協(xié)議。/*LWIP

12、_ARP=1:EnableARPfunctionality.*/#ifndefLWIP_ARP#defineLWIP_ARP1#endif截取一段代碼說(shuō)明問(wèn)題。上面的代碼表示配置的時(shí)候支持ARP(地址解析協(xié)議)協(xié)議族,此代碼下面對(duì)ARP協(xié)議族進(jìn)行一些其他的配置?!?】初始化模塊初始化模塊(這里主要講的是TCP協(xié)議的初始化模塊)主要在文件api/tcpip.c中。貼上源代碼voidtcpip_init(void(*initfunc)(void*),void*arg)lwip_init();tcpip_init_done=initfunc;tcpip_init_done_arg=arg;mbox=

13、sys_mbox_new(TCPIP_MBOX_SIZE);#ifLWIP_TCPIP_CORE_LOCKINGlock_tcpip_core=sys_sem_new(1);#endif/*LWIP_TCPIP_CORE_LOCKING*/sys_thread_new(TCPIP_THREAD_NAME,tcpip_thread,NULL,TCPIP_THREAD_STACKSIZE,TCPIP_THREAD_PRIO);這個(gè)初始化模塊是如此的重要,以至于我們可以說(shuō)這是整個(gè)程序的核心。首先調(diào)用lwip_init()初始化了所有的子模塊。然后調(diào)用sys_thread_new()啟動(dòng)了協(xié)議棧管理進(jìn)

14、程。所有的程序就在tcpip_thread這個(gè)進(jìn)程里運(yùn)行(這里說(shuō)的是使用RAWAPI接口的情況)?!?】NetIf模塊netif模塊是非常重要的一個(gè)模塊,主要是因?yàn)槔锩嬗幸粋€(gè)netif的結(jié)構(gòu)體。Netif模塊為協(xié)議棧與底層驅(qū)動(dòng)的接口模塊,其將底層的一個(gè)網(wǎng)口設(shè)備描述成協(xié)議棧的一個(gè)接口設(shè)備(netinterface)。這個(gè)接口設(shè)備就是用上面說(shuō)的netif結(jié)構(gòu)體來(lái)描述。所以說(shuō)neitif結(jié)構(gòu)體很重要。Netif模塊主要文件為core/netif.c和include/lwip/netif.h。structnetif/*pointertonextinlinkedlist*/structnetif*nex

15、t;/*IPaddressconfigurationinnetworkbyteorder*/structip_addrip_addr;structip_addrnetmask;structip_addrgw;/*Thisfunctioniscalledbythenetworkdevicedriver*topassapacketuptheTCP/IPstack.*/err_t(*input)(structpbuf*p,structnetif*inp);/*ThisfunctioniscalledbytheIPmodulewhenitwants*tosendapacketontheinterfac

16、e.Thisfunctiontypically*firstresolvesthehardwareaddress,thensendsthepacket.*/err_t(*output)(structnetif*netif,structpbuf*p,structip_addr*ipaddr);/*ThisfunctioniscalledbytheARPmodulewhenitwants*tosendapacketontheinterface.Thisfunctionoutputs*thepbufas-isonthelinkmedium.*/err_t(*linkoutput)(structneti

17、f*netif,structpbuf*p);#ifLWIP_NETIF_STATUS_CALLBACK/*Thisfunctioniscalledwhenthenetifstateissettoupordown*/void(*status_callback)(structnetif*netif);#endif/*LWIP_NETIF_STATUS_CALLBACK*/#ifLWIP_NETIF_LINK_CALLBACK/*Thisfunctioniscalledwhenthenetiflinkissettoupordown*/void(*link_callback)(structnetif*

18、netif);#endif/*LWIP_NETIF_LINK_CALLBACK*/*Thisfieldcanbesetbythedevicedriverandcouldpoint*tostateinformationforthedevice.*/void*state;#ifLWIP_DHCP/*theDHCPclientstateinformationforthisnetif*/structdhcp*dhcp;#endif/*LWIP_DHCP*/#ifLWIP_AUTOIP/*theAutoIPclientstateinformationforthisnetif*/structautoip*

19、autoip;#endif#ifLWIP_NETIF_HOSTNAME/*thehostnameforthisnetif,NULLisavalidvalue*/char*hostname;#endif/*LWIP_NETIF_HOSTNAME*/*maximumtransferunit(inbytes)*/u16_tmtu;/*numberofbytesusedinhwaddr*/u8_thwaddr_len;/*linklevelhardwareaddressofthisinterface*/u8_thwaddrNETIF_MAX_HWADDR_LEN;/*flags(seeNETIF_FL

20、AG_above)*/u8_tflags;/*descriptiveabbreviation*/charname2;/*numberofthisinterface*/u8_tnum;#ifLWIP_SNMP/*linktype(fromsnmp_ifTypeenumfromsnmp.h)*/u8_tlink_type;/*(estimate)linkspeed*/u32_tlink_speed;/*timestampatlastchangemade(up/down)*/u32_tts;/*counters*/u32_tifinoctets;u32_tifinucastpkts;u32_tifi

21、nnucastpkts;u32_tifindiscards;u32_tifoutoctets;u32_tifoutucastpkts;u32_tifoutnucastpkts;u32_tifoutdiscards;#endif/*LWIP_SNMP*/#ifLWIP_IGMP/*ThisfunctioncouldbecalledtoaddordeleteaentryinthemulticastfiltertableoftheethernetMAC.*/err_t(*igmp_mac_filter)(structnetif*netif,structip_addr*group,u8_taction

22、);#endif/*LWIP_IGMP*/#ifLWIP_NETIF_HWADDRHINTu8_t*addr_hint;#endif/*LWIP_NETIF_HWADDRHINT*/#ifENABLE_LOOPBACK/*Listofpacketstobequeuedforourselves.*/structpbuf*loop_first;structpbuf*loop_last;#ifLWIP_LOOPBACK_MAX_PBUFSu16_tloop_cnt_current;#endif/*LWIP_LOOPBACK_MAX_PBUFS*/#endif/*ENABLE_LOOPBACK*/;這

23、個(gè)結(jié)構(gòu)體里所有的成員的作用都已經(jīng)注釋了,這里我們只關(guān)心兩個(gè)成員:err_t(*input)(structpbuf*p,structnetif*inp);err_t(*output)(structnetif*netif,structpbuf*p,當(dāng)收到一個(gè)信息包時(shí),設(shè)備驅(qū)動(dòng)程序調(diào)用input指針指向的函數(shù)。網(wǎng)絡(luò)接口通過(guò)output指針連接到設(shè)備驅(qū)動(dòng)。這個(gè)指針指向設(shè)備驅(qū)動(dòng)中一個(gè)向物理網(wǎng)絡(luò)發(fā)送信息包的函數(shù),當(dāng)信息包被發(fā)送時(shí)由IP層調(diào)用。這個(gè)字段由設(shè)備驅(qū)動(dòng)的初始設(shè)置函數(shù)填充。也就是說(shuō),當(dāng)我們從網(wǎng)絡(luò)上接收一個(gè)數(shù)據(jù)的時(shí)候我們調(diào)用input函數(shù)指針指向的函數(shù)進(jìn)行數(shù)據(jù)接收的處理。當(dāng)我們要向網(wǎng)絡(luò)中發(fā)送一個(gè)數(shù)據(jù)時(shí)

24、,我們調(diào)用output函數(shù)指針指向的那個(gè)函數(shù)進(jìn)行數(shù)據(jù)的發(fā)送工作。因?yàn)檫@個(gè)netif結(jié)構(gòu)體是與底層驅(qū)動(dòng)進(jìn)行交互的。所以input和output函數(shù)指針是直接指向網(wǎng)絡(luò)驅(qū)動(dòng)收發(fā)接口函數(shù)的?;氐絥etif.c文件中,netif.c文件通過(guò)鏈表的方式描述了系統(tǒng)中的所有網(wǎng)口設(shè)備。因?yàn)橄到y(tǒng)中可能會(huì)有很多網(wǎng)絡(luò)設(shè)備?!?】Mem(memp)模塊其實(shí)mem和memp管理的是不同類型的內(nèi)存,但都屬于內(nèi)存管理。所以放在了一起。Mem模塊同一管理了協(xié)議棧使用的內(nèi)容緩沖區(qū),并管理pbuf結(jié)構(gòu)以及報(bào)文的字段處理。主要的文件包括mem.c、memp.c、pbuf.c。這里我們所要關(guān)心的是內(nèi)存管理單元所管理的pbuf結(jié)構(gòu)體。t

25、ypedefenumPBUF_RAM,/*pbufdataisstoredinRAM*/PBUF_ROM,/*pbufdataisstoredinROM*/PBUF_REF,/*pbufcomesfromthepbufpool*/PBUF_POOL/*pbufpayloadreferstoRAM*/pbuf_type;如上所示,pbuf有四種類型(但是文檔中只介紹了三種類型)。關(guān)于這四種類型的pbuf有什么區(qū)別請(qǐng)參考相應(yīng)的文檔,一句話說(shuō)明四者的不同,主要是pbuf結(jié)構(gòu)體中存放的數(shù)據(jù)的位置不同。一句話說(shuō)明pbuf類型的選擇。當(dāng)接收網(wǎng)絡(luò)數(shù)據(jù)包時(shí),我們選擇的pbuf是PBUF_POOL類型的。至于網(wǎng)

26、絡(luò)數(shù)據(jù)包的發(fā)送,根據(jù)自己的實(shí)際情況自己選擇。structpbuf*pbuf_alloc(pbuf_layerl,u16_tsize,pbuf_typetype);voidpbuf_realloc(structpbuf*p,u16_tsize);u8_tpbuf_header(structpbuf*p,s16_theader_size);voidpbuf_ref(structpbuf*p);voidpbuf_ref_chain(structpbuf*p);u8_tpbuf_free(structpbuf*p);u8_tpbuf_clen(structpbuf*p);voidpbuf_cat(st

27、ructpbuf*head,structpbuf*tail);voidpbuf_chain(structpbuf*head,structpbuf*tail);structpbuf*pbuf_dechain(structpbuf*p);err_tpbuf_copy(structpbuf*p_to,structpbuf*p_from);u16_tpbuf_copy_partial(structpbuf*p,void*dataptr,u16_tlen,u16_toffset);err_tpbuf_take(structpbuf*buf,constvoid*dataptr,u16_tlen);stru

28、ctpbuf*pbuf_coalesce(structpbuf*p,pbuf_layerlayer);這是對(duì)pbuf結(jié)構(gòu)體進(jìn)行操作的函數(shù)?!?】netarp模塊netarp模塊是處理arp協(xié)議的模塊,主要源文件為netif/etharp.c。其主要入口函數(shù)為:err_tethernet_input(structpbuf*p,structnetif*netif)該入口函數(shù)通過(guò)判斷輸入報(bào)文p的協(xié)議類型來(lái)決定是按照arp協(xié)議進(jìn)行處理還是將該報(bào)文提交到IP協(xié)議。如果報(bào)文是arp報(bào)文,該接口則調(diào)用etharp_arp_input,進(jìn)行arp請(qǐng)求處理。如果是ip報(bào)文,該接口就調(diào)用etharp_ip_inp

29、ut進(jìn)行arp更新,并調(diào)用ip_input接口,將報(bào)文提交給ip層。在該模塊中,創(chuàng)建了設(shè)備的地址映射arp表,并提供地址映射關(guān)系查詢接口。同時(shí)還提供了arp報(bào)文的發(fā)送接口。如下:err_tetharp_output(structnetif*netif,structpbuf*q,structip_addr*ipaddr)該接口需要注冊(cè)到netif的output字段,ip層在輸出報(bào)文時(shí),通過(guò)該接口獲取目標(biāo)機(jī)的MAC地址,組合最終報(bào)文后,由該接口調(diào)用底層設(shè)備的驅(qū)動(dòng)接口發(fā)送數(shù)據(jù)。在etharp_output接口中,判斷報(bào)文類型,如果是廣播包或者組播包,就調(diào)用etharp_send_ip(組裝目標(biāo)mac

30、和源mac)接口,etharp_send_ip調(diào)用netif結(jié)構(gòu)中的設(shè)備驅(qū)動(dòng)注冊(cè)的linkoutput鉤子函數(shù)發(fā)送最終報(bào)文。如果是單播包,etharp_output接口就調(diào)用etharp_query進(jìn)行ip地址和MAC地址的映射,來(lái)獲取到目標(biāo)機(jī)的MAC地址。并在etharp_query中調(diào)用etharp_send_ip來(lái)發(fā)送最終組合報(bào)文?!?】ip模塊ip模塊實(shí)現(xiàn)了協(xié)議的ip層處理,主要文件為ipv4/ip.c。其主要入口函數(shù)為:err_tip_input(structpbuf*p,structnetif*inp)該接口通過(guò)判斷輸入報(bào)文的協(xié)議類型,將其輸入到相應(yīng)的上層協(xié)議模塊中去。比如,將ud

31、p報(bào)文送到udp_input。該模塊另外一個(gè)接口是輸入函數(shù),原型如下:err_tip_output(structpbuf*p,structip_addr*src,structip_addr*dest,u8_tttl,u8_ttos,u8_tproto)該接口通過(guò)路由表或者傳輸ip后,調(diào)用netif的output函數(shù)指針指向的函數(shù)發(fā)送報(bào)文?!?】udp模塊不是我們所關(guān)心的,這里就不做介紹【8】icmp模塊用的不多,不必關(guān)心【9】igmp模塊用的不多,不必關(guān)心【10】dhcp模塊可能會(huì)用到。dhcp模塊用于獲取設(shè)備ip地址的相關(guān)信息。其處理入口主要有這么幾個(gè):dpch的啟動(dòng)、dpch的接收?qǐng)?bào)文處理

32、以及定時(shí)器模塊的處理。主要的接口原型如下:err_tdhcp_start(structnetif*netif)該接口用于設(shè)備啟動(dòng)dhcp模塊,主要是客戶端的功能。該模塊實(shí)現(xiàn)設(shè)備dhcp描述結(jié)構(gòu)生成,并將dhcp的端口綁定到udp協(xié)議中,以及將本dhcp模塊跟遠(yuǎn)端服務(wù)器端口進(jìn)行綁定。最后啟動(dòng)dhcp申請(qǐng)。staticvoiddhcp_recv(void*arg,structudp_pcb*pcb,structpbuf*p,structip_addr*addr,u16_tport)該接口為一個(gè)注冊(cè)接口,用于dhcp報(bào)文接收。在startdhcp時(shí),該接口通過(guò)dhcp的udppcb注冊(cè)到udp協(xié)議層。Udp進(jìn)行報(bào)文處理后,根據(jù)端口調(diào)用該注冊(cè)接口。該接口中,實(shí)現(xiàn)dhcp報(bào)文的協(xié)議處理。Voiddhcp_fine_tmr()Voiddhcp_coarse_tmr()這兩個(gè)函數(shù)接口實(shí)現(xiàn)了dhcp的相關(guān)超時(shí)處理監(jiān)控。上面一個(gè)用于請(qǐng)求應(yīng)答超時(shí)處理。下面一個(gè)用于地址租用情況的到期處理。從源碼分析看,上述的接口在應(yīng)用lwip的協(xié)議棧時(shí),需要重點(diǎn)關(guān)注。對(duì)于小內(nèi)存應(yīng)用的場(chǎng)合,該協(xié)議棧的內(nèi)存管理以及pbuf應(yīng)用部分需要自行改寫LWIP協(xié)議棧處理數(shù)據(jù)流程協(xié)議棧處理數(shù)據(jù)的流程主要是處理TCP數(shù)據(jù)包。關(guān)于UDP數(shù)據(jù)報(bào)的處理流程暫且不做討論。LWIP對(duì)TCP數(shù)據(jù)包的處理流程如下圖3.1所示

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論