《TCPIP协议栈lwip的移植.docx》由会员分享,可在线阅读,更多相关《TCPIP协议栈lwip的移植.docx(31页珍藏版)》请在第一文库网上搜索。
1、TCP/IP合同栈IWiPB移植新建几种头文献1c1ude/1wiPopts.hInc1uderchcc.h1nc1udearchperf.h1cIude/arch/sys_arch.h除头文献外还需要添加一种C文献:sVs_arch.Co阐明在CIOC/sys_arch,txt中。修改netifEtheretif.co构造对齐的几种宏对于一种构造下载下来的1WIP的通用定义如下:PACK.STRUCT_BEGINstructicmp_echo_hdraPACK_STRUCT_FIE1D(u8_ttype);PACK_STRUCT_FIE1D(u8_tcode);PACK_STRUCT_FIE
2、1D(u16_tchksum);PACK.STRUCT_FIE1D(u16_tid);PACK_STRUCT_FIE1D(u16_tseqno);a)PACK_STRUCT.STRUCT;PACK_STRUCT_EN#definePACK_STRUCT_FIE1D(x)这个宏是为了字节序的转换,由于是用的小端,就不用转换了直接定义为#CIefinePACK_STRUCT_FIE1D(x)X#definePACK_STRUCT_STRUCTA#definePACK_STRUCT_BEGIN#definePACK_STRUCT_END以上三个宏都是为了做构造体对苏用:对于gcc的编译器在构造体后跟
3、个核心字就OkAStrUCtip_hdr);attribute(_packed)A因此可以定义为a#definePACK_STRUCT_STRUCT_attribUte_(packed)A#definePACK_STRUCT_BEGIN#definePACK_STRUCT_END对于VC的编译器就郁闷了,VC做构造体对齐是这样做0#pragmapack(1)构造体按照1字节对齐Astructip_hdr;#pragmapack()构造体按照编译器默认值对齐但是VCrJ编译器不容许将预解决做为宏,也就是不容许这种宏替代生涯!迦PACKSTRUeTBEGIN#pragmaPaCka)A因此想靠宏替
4、代来完毕字节对齐是不行了,于是就动了大工夫做了如下解决# ifdefWIN32A#definePACK_STRUCT_STRUCT#definePACK_STRUCT_BEGINa#definePACK_STRUCT_ENDA#e1seA#definePACK_STRUCT_STRUCT_attribute_(_packed)# definePACK_STRUeT_BEG1N# definePACK_STRUCT_ENDendifPACK_STRUCT_BEGIN# ifdefWIN32# pragmapack(1)#endifstructicmp_echo_hdraPACK_STRUCT_F
5、IE1D(u8_ttype);PACK_STRUCT_FIE1D(u8_tcode);PACK_STRUCT_FIE1D(u16_tchksum);APACK_STRUCT_FIE1D(u16_tid);PACK_STRUCT_FIE1D(u16_tseqno);APACK_STRUCT_STRUCT;A#ifdefWIN32# pragmapack()A#endifAPACK_STRUCT_END这样一改在VC下和GCC都可以了,但是每个构造上都要修改一下,这个是黑郁闷黑郁闷啊“轻量级”保护1ightweightsynchroiztionmechanismsSYS_ARCH_DEC1_PR0
6、TECT(x)-decIareaprotectionstatevariab1e.SYS_ARCH_PROTECT(x)-eterprotectionmode.SYS_ARCH_UNPROTECT(x)-1eaveprotectionmode.这三个宏定义一种迅速的“保护”和“解除保护”操作。例如进入保护可以是屏蔽中断或使用一种信号量或mutex。注意:进入保护后还容许再次进入保护,旧的保护标志通过Iev返回,退出保护时再恢复。如果没有定义这三个宏,Sys.h中有一段代码进行了判断。#ifndefSYS_ARCH_PR0TECT如果没有定义SYS_ARCH,PROTECT,那么可以在IWiPOP
7、ts.h中定义宏SYS_1IGHTWEIGHT_PROT,并在sys_arch.c中定义函数syS_arch_protect()和Sys_arch_unprotect(1ev)#ifSYS_1IGHTWEIGHT.PROT#defineSYS_ARCH_DEC1_PROTECT(Iev)sys_prot_t1ev*SYS_ARCH_PROTECT*Performa,faStprotect.Thiscou1dbeimp1ementedbydisab1inginterruptsforanembeddedsystemorbyusingasemaphoreor*mutex.Theimp1ementat
8、ionshou1da11owca11ingSYS_ARCH_PROTECTwhen*a1readyprotected.Theo1dprotection1eve1isreturnedinthevariab1e* 1ev.Thismacrowi11defau1ttocaI1ingthesys_arch_protect()function* whichshou1dbeimp1ementedinsys_arch.c.Ifaparticu1arportneedsa* differentimp1ementation,thenthismacromaybedefinedinsys_arch.h*/#defin
9、eSYS_ARCH_PROTECT(Iev)1ev=sys_arch_protect()*SYS_ARCH_UNPROTECT* PerformafastsetoftheprotectionIeve1to,1evn.Thiscou1dbe* imp1ementedbysettingtheinterrupt1eve1to1evwithintheMACROorby* usingasemaphoreormutex.Thismacrowi11defau1ttoca11ingthe* sys_arch_unprotect()functionwhichshou1dbeimp1ementedin* sys_
10、arch.c.Ifaparticu1arportneedsadifferentimp1ementation,then* thismacromaybedefinedinsys_arch.h*/# defineSYS_ARCH_UNPROTECT(1ev)sys_arch_unprotect(1ev)sys_prot_tsys_arch_protect(void);voidsys_arch_unprotect(sys_prot_tpva1);# e1se# defineSYS_ARCH_DEC1_PROTECT(1ev)# defineSYS_ARCH_PROTECT(1ev)# defineSY
11、S_ARCH_UNPROTECT(1ev)# endif*SYSJ11GHTWEIGHT_PROT*/# endif/*SYSARCHPROTECT*/1WIPCOMPATMUTEX定义此宏表达用信号量来替代mteo1nit.c不定义NO_SYS禾口wdefineNO_SYS0”的效果是同样取下面这些宏对代码有影响:1WIP_SOCKET1WIP_ARP1WIP_UDP1WIP.TCP1WIP_SNMP1WIP_AUTOIP1WIP_IGMP1WIP_DNS1WIPJIMERSvoidIwip_init(void)(*Sanitycheckuserconfigurab1eVaIUeS*/Iwi
12、p_sanity_check();/*Modu1esinitia1ization*/stats_init();#if!NO_SYSsys_init();#endif/*!NO_SYS*/mem_init();memp_init();Pbuf_init();netiUnit();#if1WIP_SOCKETIwip_socket_init();#endif/*1WIP_SOCKET*/iPJnit();#if1WIP_ARPetharp_init();#endif/*1WIP_ARP*/#if1WIP_RAWraw_init();#endif*1W1P_RAW*/#if1WIP_UDPudp_i
13、nit();#endif/*1WIP_UDP*/#if1WIP.TCPtcp_init();#endif*1W1P_TCP*/#if1WIP_SNMPsnmp_init();#endif*1WIP_SNMP*/# if1WIP_AUTOIPautoip_init();# endif*1WIP_AUTOIP*/#if1WIP_IGMPigmp_init();# endif/*1WIP_IGMP*/#if1WIP_DNSdns_init();ttendif*1WIP_DNS*/#if1WIP_TIMERSsys_timeouts_init();#endif*1WIP.TIMERS*/net1dd函
14、数它添加一种网络接口到Iwip,一种网卡应当是一种网络接口。本地回环也是一种网络接口,它已经在tcpipjit中的IwiPnit调用netifJnit被添加。/* Addanetworkinterfacetothe1istofIwIPnetifs.* paramnetifapre-a11ocatednetifStructure* ParamipaddrIPaddressforthenewnetif*paramnetmasknetworkmaskforthenewnetif* Paramgwdefau1tgatewayIPaddressforthenewnetif* Paramstateopaq
15、uedatapassedtothenewnetif* Paraminitca11backfunctionthatinitia1izestheinterface* paraminputca1!backfunctionthatisca11edtopass* ingresspacketsupintheprotoco11ayerstack.* returnnetif,orNU11iffai1ed.* /structnetif*netiCadd(structnetif*netif,ip_addr_t*ipaddr,ipaddrt*netmask,ip_addr_t*gw,void*state,netifinit_fninit,netif,inputfninput)StructnetJf在初始化用neti1dd添加到IWiP中。/*IPaddressconfigurationinnetw