




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、LWIP協(xié)議棧及接口提取Version 1.02012/06/201 / 21 第 1 頁 共 21 頁版本1.0姓名部門郵件作者雷巖Leiyan3521審閱2 / 21 第 2 頁 共 21 頁版本歷史版本日期修訂姓名Rev 1.02011/11/07First Draftleiyan 3 / 21 第 3 頁 共 21 頁目錄一、LWIP介紹5二、LWIP源碼分析71LWIP協(xié)議棧的架構(gòu)72各個(gè)文件夾介紹83模塊及源文件介紹10三、LWIP協(xié)議棧處理數(shù)據(jù)流程17四、接口提取184 / 21 第 4 頁 共 21 頁一、 LWIP介紹首先說明一下,這篇文檔的主要目的是提取網(wǎng)絡(luò)發(fā)送和接收數(shù)據(jù)的
2、函數(shù)接口。然后用我們自己的驅(qū)動(dòng)網(wǎng)卡的接口函數(shù)替代程序中的接口。如果對(duì)LWIP協(xié)議棧本身沒什么興趣的,可以跳過第一、二、三章,直接閱讀第四章,使用我們的接口代替第四章的接口就行了。寫第一、二、三章的主要目的是為了方便理解數(shù)據(jù)的發(fā)送和接收在LWIP協(xié)議棧中是如何進(jìn)行處理的。這便于我們理解提取出來的接口。LWIP是瑞典計(jì)算機(jī)科學(xué)院開發(fā)的一套用于嵌入式系統(tǒng)的開放源代碼的輕量級(jí)的TCP/IP協(xié)議棧。傳統(tǒng)的,或者說是典型的TCP/IP協(xié)議族的設(shè)計(jì)都是按照分層的思想來設(shè)計(jì)的。這樣設(shè)計(jì)有個(gè)好處,就是每層相對(duì)于其他層獨(dú)立,代碼方便理解。缺點(diǎn)就是,每層之間進(jìn)行數(shù)據(jù)交互的時(shí)候必須要進(jìn)行復(fù)制,而數(shù)據(jù)的復(fù)制是很耗時(shí)的,
3、這就降低了實(shí)時(shí)性。LWIP采用了一種不同的設(shè)計(jì)方式來實(shí)現(xiàn)TCP/IP協(xié)議族。LWIP各層之間沒有明顯的界限,各層之間都可以訪問到共享在內(nèi)存中的數(shù)據(jù)。因?yàn)楦鲗佣伎梢栽L問共享內(nèi)存,所以這就避免了內(nèi)存復(fù)制產(chǎn)生的性能損失。但是并不是說LWIP就沒有分層的概念了。只不過LWIP各層都是邏輯意義上的層。每個(gè)協(xié)議都以模塊的形式被實(shí)現(xiàn)。而這些模塊就共同組成了LWIP整體。下面一章將分析LWIP的源碼,結(jié)合源碼介紹這些模塊。了解各個(gè)協(xié)議是怎么通過模塊被實(shí)現(xiàn)的。其中這里最主要的是TCP協(xié)議模塊的實(shí)現(xiàn)。TCP協(xié)議在LWIP協(xié)議棧中占得比例最大,有將近一半的代碼是專門用來實(shí)現(xiàn)TCP協(xié)議的。所以重點(diǎn)會(huì)分析TCP協(xié)議。并
4、且無線音頻項(xiàng)目采用的也是TCP協(xié)議傳輸數(shù)據(jù)。LWIP邏輯上被分為四個(gè)層:應(yīng)用層,傳輸層,網(wǎng)絡(luò)層和網(wǎng)絡(luò)接口層。如下圖1.1所示:5 / 21 第 5 頁 共 21 頁圖1.1LWIP協(xié)議棧的分層模型應(yīng)用層主要是使用LWIP協(xié)議棧開發(fā)相應(yīng)的網(wǎng)絡(luò)通信程序。LWIP主要提供了三種接口供用戶使用。三種接口分別為RAW API, Netconn API 和 BSD Socket AP。其中RAW API 主要是采用回調(diào)函數(shù)的方式來完成數(shù)據(jù)的發(fā)送和接收,RAW API 接口寫的應(yīng)用程序與 LWIP協(xié)議棧處在同一個(gè)進(jìn)程(或者稱任務(wù))中。Netconn API 和 BSD Socket AP工作于多線程方式中,
5、要使用者兩種接口,必須有多任務(wù)的操作系統(tǒng)的支持。這次項(xiàng)目采用的接口是RAW API。關(guān)于RAW API接口如何寫應(yīng)用層程序,另寫了一個(gè)專門的文檔介紹。這里不列出。傳輸層。我們最熟悉的TCP 協(xié)議,UDP協(xié)議,以及我們使用ping 命令時(shí)采用的ICMP協(xié)議都處在這一層。這一層提供了一些專門的接口,用于處理與應(yīng)用層和網(wǎng)絡(luò)層的數(shù)據(jù)傳送(注明,這里說的數(shù)據(jù)傳送并不是指數(shù)據(jù)的拷貝。事實(shí)上,LWIP協(xié)議棧使用的是內(nèi)存共享技術(shù),各層都能訪問這段共享內(nèi)存,各層傳遞的就是數(shù)據(jù)結(jié)構(gòu)指針,所以LWIP協(xié)議棧降低了內(nèi)存復(fù)制所產(chǎn)生的性能損失)。關(guān)于這層函數(shù),會(huì)在下面進(jìn)行具體說明。網(wǎng)絡(luò)層主要的協(xié)議是IP協(xié)議。這一層主要是
6、對(duì)底層接收的數(shù)據(jù)包進(jìn)行發(fā)送,轉(zhuǎn)發(fā),丟棄組合等功能。網(wǎng)絡(luò)接口層是和底層硬件驅(qū)動(dòng)交互的層。我們所需要提取的網(wǎng)絡(luò)接口就在這一層。6 / 21 第 6 頁 共 21 頁二、 LWIP源碼分析1 LWIP協(xié)議棧的架構(gòu)LWIP協(xié)議棧源碼的架構(gòu)如下圖2.1所示:圖2.1 LWIP協(xié)議棧源碼架構(gòu)api目錄:應(yīng)用程序接口文件,包括netconn 和BSD 2種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ì)
7、討論TCP協(xié)議。在此也可以簡(jiǎn)單看出LWIP協(xié)議棧沒有嚴(yán)格區(qū)分傳輸層和網(wǎng)絡(luò)層,因?yàn)閭鬏攲拥拇a和網(wǎng)絡(luò)層的代碼放在一個(gè)文件夾里實(shí)現(xiàn)了。目錄里還提供了RAW API接口的實(shí)現(xiàn)。RAW API 接口和上面兩種接口一樣,都是為了方便應(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è)文件提供了與
8、底層網(wǎng)絡(luò)驅(qū)動(dòng)的一個(gè)接口。我們要實(shí)現(xiàn)與自己的網(wǎng)絡(luò)接口驅(qū)動(dòng)交互,必須修改這個(gè)文件里的接口,使這些接口為上層屏蔽細(xì)節(jié)信息。7 / 21 第 7 頁 共 21 頁2各個(gè)文件夾介紹【1】api目錄,如圖2.2圖2.2 api目錄下的文件列表這個(gè)文件夾下面主要提供的是netconn API 和BSD socket API 。這些接口不是我們所要關(guān)心的。所以直接忽略。我們使用下面文件夾里提供的RAW API 接口?!?】core 目錄,如圖2.3圖2.3core目錄下的文件列表這個(gè)文件下下面,ipv6文件夾和snmp文件夾我們不需要關(guān)心。主要關(guān)心的文件有icmp.c Ip.c ip_addr.c ip_fr
9、ag.c dhcp.c init.c mem.c memp.c netif.c pbuf.c9 / 21 第 9 頁 共 21 頁Raw.c tcp.c tcp_in.c tcp_out.c udp.c【3】include 目錄,如圖2.4圖2.4include目錄下的文件列表這個(gè)文件夾下面主要包括所有.c文件用到的頭文件。Ipv6文件夾我們不必關(guān)心?!?】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.69 / 21 第 9 頁 共 21 頁
10、圖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ù)的,無需操作系統(tǒng)的支持。Standalone這個(gè)文件夾下面的ethernetif.c中給出的驅(qū)動(dòng)接口。我們?yōu)樽约旱木W(wǎng)絡(luò)接口設(shè)計(jì)的驅(qū)動(dòng)程最終用來代替這個(gè)文件里的接口。上面所有文件大致描述了LWIP協(xié)議棧的幾個(gè)模塊:配置模塊、初始化模塊、NetIf模塊、Mem(memp)模塊、netarp模塊、ip模塊、udp模塊、icmp 模塊、igmp模塊和dhcp模塊。
11、由于篇幅限制,不能對(duì)每個(gè)源文件都做介紹。只對(duì)我們感興趣的模塊的源文件做相應(yīng)的介紹。3模塊及源文件介紹【1】配置模塊配置模塊的文件主要包含在include/lwip/opt.h里(這里及下文所指的路徑均為相對(duì)路徑)。配置模塊通過各種宏定義的方式對(duì)系統(tǒng)、子模塊進(jìn)行了配置。比如,通過宏,配置了mem管理模塊的參數(shù)。該配置模塊還通過宏,配置了協(xié)議棧所支持的協(xié)議簇,通過宏定制的方式,決定了支持那些協(xié)議。/* * LWIP_ARP=1: Enable ARP functionality. */#ifndef LWIP_ARP#define LWIP_ARP 1#endif截取一段代碼說明問題。上面的代碼表
12、示配置的時(shí)候支持ARP(地址解析協(xié)議)協(xié)議族,此代碼下面對(duì)ARP協(xié)議族進(jìn)行一些其他的配置。10 / 21 第 10 頁 共 21 頁【2】初始化模塊初始化模塊(這里主要講的是TCP協(xié)議的初始化模塊)主要在文件 api/tcpip.c中。貼上源代碼voidtcpip_init(void (* initfunc)(void *), void *arg) lwip_init(); tcpip_init_done = initfunc; tcpip_init_done_arg = arg; mbox = sys_mbox_new(TCPIP_MBOX_SIZE);#if LWIP_TCPIP_CORE
13、_LOCKING lock_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è)初始化模塊是如此的重要,以至于我們可以說這是整個(gè)程序的核心。首先調(diào)用lwip_init()初始化了所有的子模塊。然后調(diào)用sys_thread_new()啟動(dòng)了協(xié)議棧管理進(jìn)程。所有的程序就在tcpip_thread這個(gè)進(jìn)程里運(yùn)行(這里說的是使用R
14、AW API接口的情況)?!?】NetIf模塊netif 模塊是非常重要的一個(gè)模塊,主要是因?yàn)槔锩嬗幸粋€(gè)netif 的結(jié)構(gòu)體。Netif模塊為協(xié)議棧與底層驅(qū)動(dòng)的接口模塊,其將底層的一個(gè)網(wǎng)口設(shè)備描述成協(xié)議棧的一個(gè)接口設(shè)備(net interface)。這個(gè)接口設(shè)備就是用上面說的netif結(jié)構(gòu)體來描述。所以說neitif結(jié)構(gòu)體很重要。Netif模塊主要文件為core/netif.c 和 include/lwip/netif.h。struct netif /* pointer to next in linked list */ struct netif *next; /* IP address co
15、nfiguration in network byte order */ struct ip_addr ip_addr; struct ip_addr netmask;11 / 21 第 11 頁 共 21 頁 struct ip_addr gw; /* This function is called by the network device driver * to pass a packet up the TCP/IP stack. */ err_t (* input)(struct pbuf *p, struct netif *inp); /* This function is call
16、ed by the IP module when it wants * to send a packet on the interface. This function typically * first resolves the hardware address, then sends the packet. */ err_t (* output)(struct netif *netif, struct pbuf *p, struct ip_addr *ipaddr); /* This function is called by the ARP module when it wants *
17、to send a packet on the interface. This function outputs * the pbuf as-is on the link medium. */ err_t (* linkoutput)(struct netif *netif, struct pbuf *p);#if LWIP_NETIF_STATUS_CALLBACK /* This function is called when the netif state is set to up or down */ void (* status_callback)(struct netif *net
18、if);#endif /* LWIP_NETIF_STATUS_CALLBACK */#if LWIP_NETIF_LINK_CALLBACK /* This function is called when the netif link is set to up or down */ void (* link_callback)(struct netif *netif);#endif /* LWIP_NETIF_LINK_CALLBACK */ /* This field can be set by the device driver and could point * to state in
19、formation for the device. */ void *state;#if LWIP_DHCP /* the DHCP client state information for this netif */ struct dhcp *dhcp;#endif /* LWIP_DHCP */#if LWIP_AUTOIP /* the AutoIP client state information for this netif */ struct autoip *autoip;#endif#if LWIP_NETIF_HOSTNAME /* the hostname for this
20、netif, NULL is a valid value */ char* hostname;#endif /* LWIP_NETIF_HOSTNAME */ /* maximum transfer unit (in bytes) */ u16_t mtu; /* number of bytes used in hwaddr */ u8_t hwaddr_len; /* link level hardware address of this interface */12 / 21 第 12 頁 共 21 頁 u8_t hwaddrNETIF_MAX_HWADDR_LEN; /* flags (
21、see NETIF_FLAG_ above) */ u8_t flags; /* descriptive abbreviation */ char name2; /* number of this interface */ u8_t num;#if LWIP_SNMP /* link type (from snmp_ifType enum from snmp.h) */ u8_t link_type; /* (estimate) link speed */ u32_t link_speed; /* timestamp at last change made (up/down) */ u32_t
22、 ts; /* counters */ u32_t ifinoctets; u32_t ifinucastpkts; u32_t ifinnucastpkts; u32_t ifindiscards; u32_t ifoutoctets; u32_t ifoutucastpkts; u32_t ifoutnucastpkts; u32_t ifoutdiscards;#endif /* LWIP_SNMP */#if LWIP_IGMP /* This function could be called to add or delete a entry in the multicast filt
23、er table of the ethernet MAC.*/ err_t (*igmp_mac_filter)( struct netif *netif, struct ip_addr *group, u8_t action);#endif /* LWIP_IGMP */#if LWIP_NETIF_HWADDRHINT u8_t *addr_hint;#endif /* LWIP_NETIF_HWADDRHINT */#if ENABLE_LOOPBACK /* List of packets to be queued for ourselves. */ struct pbuf *loop
24、_first; struct pbuf *loop_last;#if LWIP_LOOPBACK_MAX_PBUFS u16_t loop_cnt_current;#endif /* LWIP_LOOPBACK_MAX_PBUFS */#endif /* ENABLE_LOOPBACK */;這個(gè)結(jié)構(gòu)體里所有的成員的作用都已經(jīng)注釋了,這里我們只關(guān)心兩個(gè)成員:13 / 21 第 13 頁 共 21 頁err_t (* input)(struct pbuf *p, struct netif *inp);err_t (* output)(struct netif *netif, struct pbu
25、f *p,當(dāng)收到一個(gè)信息包時(shí),設(shè)備驅(qū)動(dòng)程序調(diào)用input 指針指向的函數(shù)。網(wǎng)絡(luò)接口通過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ù)填充。也就是說,當(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í),我們調(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文
26、件通過鏈表的方式描述了系統(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)體。typedef enum PBUF_RAM, /* pbuf data is stored in RAM */ PBUF_ROM, /* pbuf data is stored in ROM */ PBUF_REF, /*
27、pbuf comes from the pbuf pool */ PBUF_POOL /* pbuf payload refers to RAM */ pbuf_type;如上所示,pbuf有四種類型(但是文檔中只介紹了三種類型)。關(guān)于這四種類型的pbuf有什么區(qū)別請(qǐng)參考相應(yīng)的文檔,一句話說明四者的不同,主要是pbuf結(jié)構(gòu)體中存放的數(shù)據(jù)的位置不同。一句話說明pbuf類型的選擇。當(dāng)接收網(wǎng)絡(luò)數(shù)據(jù)包時(shí),我們選擇的pbuf是PBUF_POOL類型的。至于網(wǎng)絡(luò)數(shù)據(jù)包的發(fā)送,根據(jù)自己的實(shí)際情況自己選擇。struct pbuf *pbuf_alloc(pbuf_layer l, u16_t size, pb
28、uf_type type);void pbuf_realloc(struct pbuf *p, u16_t size); u8_t pbuf_header(struct pbuf *p, s16_t header_size);14 / 21 第 14 頁 共 21 頁void pbuf_ref(struct pbuf *p);void pbuf_ref_chain(struct pbuf *p);u8_t pbuf_free(struct pbuf *p);u8_t pbuf_clen(struct pbuf *p); void pbuf_cat(struct pbuf *head, stru
29、ct pbuf *tail);void pbuf_chain(struct pbuf *head, struct pbuf *tail);struct pbuf *pbuf_dechain(struct pbuf *p);err_t pbuf_copy(struct pbuf *p_to, struct pbuf *p_from);u16_t pbuf_copy_partial(struct pbuf *p, void *dataptr, u16_t len, u16_t offset);err_t pbuf_take(struct pbuf *buf, const void *dataptr
30、, u16_t len);struct pbuf *pbuf_coalesce(struct pbuf *p, pbuf_layer layer);這是對(duì)pbuf結(jié)構(gòu)體進(jìn)行操作的函數(shù)?!?】netarp模塊netarp模塊是處理arp協(xié)議的模塊,主要源文件為netif/etharp.c。其主要入口函數(shù)為:err_t ethernet_input(struct pbuf *p, struct netif *netif)該入口函數(shù)通過判斷輸入報(bào)文p的協(xié)議類型來決定是按照arp協(xié)議進(jìn)行處理還是將該報(bào)文提交到IP協(xié)議。如果報(bào)文是arp報(bào)文,該接口則調(diào)用etharp_arp_input,進(jìn)行arp請(qǐng)求處
31、理。如果是ip報(bào)文,該接口就調(diào)用etharp_ip_input進(jìn)行arp更新,并調(diào)用ip_input接口,將報(bào)文提交給ip層。在該模塊中,創(chuàng)建了設(shè)備的地址映射arp表,并提供地址映射關(guān)系查詢接口。同時(shí)還提供了arp報(bào)文的發(fā)送接口。如下:err_t etharp_output(struct netif *netif, struct pbuf *q, struct ip_addr *ipaddr)該接口需要注冊(cè)到netif的output字段,ip層在輸出報(bào)文時(shí),通過該接口獲取目標(biāo)機(jī)的MAC地址,組合最終報(bào)文后,由該接口調(diào)用底層設(shè)備的驅(qū)動(dòng)接口發(fā)送數(shù)據(jù)。在etharp_output接口中,判斷報(bào)文類型
32、,如果是廣播包或者組播包,就調(diào)用etharp_send_ip(組裝目標(biāo)mac和源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地址的映射,來獲取到目標(biāo)機(jī)的MAC地址。并在etharp_query中調(diào)用etharp_send_ip來發(fā)送最終組合報(bào)文?!?】ip模塊ip模塊實(shí)現(xiàn)了協(xié)議的ip層處理,主要文件為ipv4/ip.c。其主要入口函數(shù)為:err_t ip_input(struct pbuf *p, struct netif *
33、inp)該接口通過判斷輸入報(bào)文的協(xié)議類型,將其輸入到相應(yīng)的上層協(xié)議模塊中去。比如,將udp報(bào)文送到udp_input。該模塊另外一個(gè)接口是輸入函數(shù),原型如下:err_t ip_output(struct pbuf *p, struct ip_addr *src, struct ip_addr *dest, u8_t ttl, u8_t tos, u8_t proto)15 / 21 第 15 頁 共 21 頁該接口通過路由表或者傳輸ip后,調(diào)用netif的output函數(shù)指針指向的函數(shù)發(fā)送報(bào)文?!?】udp模塊不是我們所關(guān)心的,這里就不做介紹【8】icmp 模塊用的不多,不必關(guān)心【9】igmp
34、模塊用的不多,不必關(guān)心【10】dhcp模塊可能會(huì)用到。dhcp模塊用于獲取設(shè)備ip地址的相關(guān)信息。其處理入口主要有這么幾個(gè):dpch的啟動(dòng)、dpch的接收?qǐng)?bào)文處理以及定時(shí)器模塊的處理。主要的接口原型如下:err_t dhcp_start(struct netif *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)。static void dhcp_recv(void *arg, struct udp_pcb *pcb, struct pbu
35、f *p, struct ip_addr *addr, u16_t port)該接口為一個(gè)注冊(cè)接口,用于dhcp報(bào)文接收。在start dhcp時(shí),該接口通過dhcp的udp pcb注冊(cè)到udp協(xié)議層。Udp進(jìn)行報(bào)文處理后,根據(jù)端口調(diào)用該注冊(cè)接口。該接口中,實(shí)現(xiàn)dhcp報(bào)文的協(xié)議處理。Void dhcp_fine_tmr()Void dhcp_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)用部分需要自行改寫16 / 21 第 16 頁 共 21 頁三、 LWIP協(xié)議棧處理數(shù)據(jù)流程協(xié)議棧處理數(shù)據(jù)的流程主要是處理TCP數(shù)據(jù)包。關(guān)于UDP數(shù)據(jù)報(bào)的處理流程暫且不做討論。LWIP對(duì)TCP數(shù)據(jù)包的處理流程如下圖3.1所示。圖3.1LWIP協(xié)議棧數(shù)據(jù)處理流程如上圖所示,lwip協(xié)議棧對(duì)TCP數(shù)據(jù)包的處理經(jīng)過四層的處理。分別為應(yīng)用層,傳輸層,網(wǎng)絡(luò)層和網(wǎng)絡(luò)接口層。圖中左半邊部分是數(shù)據(jù)發(fā)送的處理部分,右半部分是數(shù)據(jù)接
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 游樂設(shè)施施工材料性能與應(yīng)用考核試卷
- 組織領(lǐng)導(dǎo)力與決策過程優(yōu)化考核試卷
- 互聯(lián)網(wǎng)平臺(tái)人工智能技術(shù)應(yīng)用考核試卷
- 2025標(biāo)準(zhǔn)合同簽訂流程范本
- 2025商品房買賣合同糾紛與特征范本
- 2025年標(biāo)準(zhǔn)個(gè)人門面出租合同模板
- 第03講 平方差與完全平方公式(原卷板)
- 二零二五違紀(jì)學(xué)生協(xié)議合同書范例
- 洗碗工的勞動(dòng)合同書范例二零二五年
- 二零二五年薪制勞動(dòng)合同范文
- 2025-2030中國射頻治療設(shè)備行業(yè)市場(chǎng)發(fā)展前景及發(fā)展趨勢(shì)與投資風(fēng)險(xiǎn)研究報(bào)告
- 砼構(gòu)件預(yù)制件的模具設(shè)計(jì)與制造技術(shù)考核試卷
- 《跨行業(yè)并購問題研究的理論基礎(chǔ)與文獻(xiàn)綜述》6300字
- 2025中煤鄂爾多斯能源化工有限公司高校畢業(yè)生招聘98人筆試參考題庫附帶答案詳解
- 《陜文投應(yīng)聘表格》word版
- 建設(shè)工程圍擋標(biāo)準(zhǔn)化管理圖集(2022年版)
- (完整word版)中小學(xué)教育質(zhì)量綜合評(píng)價(jià)指標(biāo)框架(試行)
- 《新概念英語》第一冊(cè)單詞表
- 半澤直樹日語字幕臺(tái)詞(一)
- 拌和站地基承載力及抗傾覆計(jì)算書
- 最新公司客戶訂單流程管理制度
評(píng)論
0/150
提交評(píng)論