資源描述:
《Lwip協(xié)議棧的詳細分析與移植.doc》由會員上傳分享,免費在線閱讀,更多相關內(nèi)容在工程資料-天天文庫。
1、Lwip協(xié)議棧的分析與移植主要解決兩個問題:操作系統(tǒng)仿真層的移植。這個基于uCOS-II的代碼太多了??梢越梃b焦海波著的LWIP移植i章。I'設備驅(qū)動的移植.驅(qū)動的移植主要就是完成ethernetif.c的工作。作者已經(jīng)給好了驅(qū)動的接口。structnetif{stnactnetif*next;structip_addrip_addr;structip_addrnetmask;structip_addrgw;err_t(*input)(structpbuf*p,structnetif*inp);err_t(*output)(structnetif*netif,struc
2、tpbufstructip_addr*ipaddr);err_t(*linkoutput)(structnetif*netif,structpbuf*p);void*state;#訐LWIP_DHCPstnactdhcp*dhcp;#endifunsignedcharhwaddr_len;unsignedcharhwaddr[NETIF_MAX_HWADDR_LEN];ul6_tmtu;charname[2J;u8_tnum;u8_tflags;};主要就是:err_t(*input)(structpbuf*p,structnetif*inp);這個是被驅(qū)動調(diào)用的,傳遞
3、一個數(shù)據(jù)包給TCP/IP棧。err_t(*output)(structnetif*netif,structpbuf*p,structip_addr*ipaddr);這個是被IP模塊調(diào)用的,向以太網(wǎng)上發(fā)送一個數(shù)據(jù)包,函數(shù)要先通過IP地址獲得解決硬件地址,然后發(fā)包。err_t(*linkoutput)(structnetif*netif,structpbuf*p);這個是直接發(fā)送數(shù)據(jù)包的接口相應的作者在ethernetif.c里而給了兒個函數(shù)框架,這個文件相當于一個碩件捕象層。staticvoidlow_level_init(structnetif*netif)網(wǎng)卡初始化函
4、數(shù)staticerr_tlow」evel_output(sfnicfnetif*netif,structpbuf*p)鏈路層發(fā)送函數(shù),實現(xiàn)err_t(*linkoutput)接口。staticstructpbuf*low」evclnetif*netif)得到一報幀數(shù)據(jù)staticerr_tethernetif_output(structnetif*netif,structpbuf*p,structip_addr*ipaddr)實現(xiàn)發(fā)送線程,實現(xiàn)err_t(*output)接口。staticvoidethernetifLinput(structnetif*netif)實現(xiàn)
5、接收線程,識別數(shù)據(jù)包是ARP包還是IP包err_tethernetif_init(structnetif*netif)初始化底層接口其實,寫驅(qū)動的時候只要自己再筵個ethemet.c,實際的網(wǎng)絡硬件控制的文件然后提供兒個函數(shù)比如:voidEMACInit(void)硬件的初始化voidEMACPacketSend(u8_t^buffer,u16_tlength)用來將buffer里而的包復制到網(wǎng)絡設備的發(fā)送緩沖里而,發(fā)送。ul6_tEMACPacketReceive(u8_t^buffer,u16_tmax」ength)用來將網(wǎng)絡設備的接收緩沖里面的包數(shù)據(jù)復制到buff
6、er里面。u16_tEMACPacketLength(u16_tmax」ength)獲得包長度還有其他控制類函數(shù)。最厲,用ethernet.c里的函數(shù)完成ethernetif.c里的框架。這樣脈絡可能會清楚?點。LWIP的移植主要是參考網(wǎng)絡文獻和網(wǎng)卡的數(shù)據(jù)手冊。下面從lwip協(xié)議棧入手分析lwip協(xié)議棧的具體函數(shù)。移植LWIP協(xié)議棧主要關注的是底層和網(wǎng)卡之間的銜接工作。structnetif*netif_add(structnetif*netif,structip_addr*ipaddr,structip_addr*netmask,structip_addr*gw,vo
7、id*state,err_t(*init)(stmctnetif*netif),err_t(*inpiH)(s(nictpbuf*p,structnetif*netif))添加一個網(wǎng)絡設備:跟物理網(wǎng)卡再配i個IP地址。State域用來和實際的網(wǎng)卡交互。指示網(wǎng)卡的狀態(tài)信息。Init()隊
8、數(shù)是初始化網(wǎng)絡設備兩數(shù),這個兩數(shù)在添加的時候被調(diào)用。Input()函數(shù)參數(shù)只是對網(wǎng)絡設備注冊,這個函數(shù)在輸入的時候調(diào)用。netif_add()函數(shù),配宜網(wǎng)絡設備的相關信息,初始化對應的網(wǎng)絡設備。系統(tǒng)屮的網(wǎng)絡設備由…個網(wǎng)絡設備的鏈表構(gòu)成。此函數(shù)會傳進來-?個