当前位置:文档之家› lwip各层协议栈详解

lwip各层协议栈详解

竭诚为您提供优质文档/双击可除lwip各层协议栈详解篇一:lwip协议栈源码分析lwip源码分析-----caoxw1lwip的结构lwip(lightweightinternetprotocol)的主要模块包括:配置模块、初始化模块、netif模块、mem(memp)模块、netarp模块、ip模块、udp模块、icmp模块、igmp模块、dhcp模块、tcp模块、snmp模块等。

下面主要对我们需要关心的协议处理进行说明和梳理。

配置模块:配置模块通过各种宏定义的方式对系统、子模块进行了配置。

比如,通过宏,配置了mem管理模块的参数。

该配置模块还通过宏,配置了协议栈所支持的协议簇,通过宏定制的方式,决定了支持那些协议。

主要的文件是opt.h。

初始化模块:初始化模块入口的文件为tcpip.c,其初始化入口函数为:voidtcpip_init(void(*initfunc)(void*),void*arg) 该入口通过调用lwip_init()函数,初始化了所有的子模块,并启动了协议栈管理进程。

同时,该函数还带有回调钩子及其参数。

可以在需要的地方进行调用。

协议栈数据分发管理进程负责了输入报文的处理、超时处理、api函数以及回调的处理,原型如下:staticvoidtcpip_thread(void*arg)netif模块:netif模块为协议栈与底层驱动的接口模块,其将底层的一个网口设备描述成协议栈的一个接口设备(netinterface)。

该模块的主要文件为netif.c。

其通过链表的方式描述了系统中的所有网口设备。

netif的数据结构描述了网口的参数,包括ip地址、mac 地址、link状态、网口号、收发函数等等参数。

一个网口设备的数据收发主要通过该结构进行。

mem(memp)模块:mem模块同一管理了协议栈使用的内容缓冲区,并管理pbuf结构以及报文的字段处理。

主要的文件包括mem.c、memp.c、pbuf.c。

netarp模块:netarp模块是处理arp协议的模块,主要源文件为etharp.c。

其主要入口函数为:err_tethernet_input(structpbuf*p,structnetif*netif) 该入口函数通过判断输入报文p的协议类型来决定是按照arp协议进行处理还是将该报文提交到ip协议。

如果报文是arp报文,该接口则调用etharp_arp_input,进行arp 请求处理。

如果是ip报文,该接口就调用etharp_ip_input 进行arp更新,并调用ip_input接口,将报文提交给ip层。

在该模块中,创建了设备的地址映射arp表,并提供地址映射关系查询接口。

同时还提供了arp报文的发送接口。

如下:err_tetharp_output(structnetif*netif,structpbuf*q,s tructip_addr*ipaddr)该接口需要注册到netif的output字段,ip层在输出报文时,通过该接口获取目标机的mac地址,组合最终报文后,由该接口调用底层设备的驱动接口发送数据。

在etharp_output接口中,判断报文类型,如果是广播包或者组播包,就调用etharp_send_ip(组装目标mac和源mac)接口,etharp_send_ip调用netif结构中的设备驱动注册的linkoutput钩子函数发送最终报文。

如果是单播包,etharp_output接口就调用etharp_query进行ip地址和mac 地址的映射,来获取到目标机的mac地址。

并在etharp_query中调用etharp_send_ip来发送最终组合报文。

ip模块:ip模块实现了协议的ip层处理,主要文件为ip.c。

其主要入口函数为:err_tip_input(structpbuf*p,structnetif*inp)该接口通过判断输入报文的协议类型,将其输入到相应的上层协议模块中去。

比如,将udp报文送到udp_input。

该模块另外一个接口是输入函数,原型如下:err_tip_output(structpbuf*p,structip_addr*src,struc tip_addr*dest,u8_tttl,u8_ttos,u8_tproto)该接口通过路由表或者传输ip后,调用netif的output 字段函数钩子发送报文。

udp模块:udp模块实现了udp协议层的协议处理,主要文件为udp.c。

该模块通过pcb控制块将应用端口跟应用程序做了绑定。

在接收到新报文时,分析其对应的pcb,找到对应的处理钩子,进行应用的处理。

主要入口函数为:voidudp_input(structpbuf*p,structnetif*inp)该模块负责输出的接口如下:err_tudp_send(structudp_pcb*pcb,structpbuf*p)该模块负责将一个pcb跟一个本地端口进行绑定的接口如下:err_tudp_bind(structudp_pcb*pcb,structip_addr*ipadd r,u16_tport)该模块负责将一个pcb跟一个远端端口绑定的接口如下:err_tudp_connect(structudp_pcb*pcb,structip_addr*ip addr,u16_tport)icmp模块:该模块负责icmp协议的处理,其比较简单。

主要的处理接口如下:Voidicmp_input(structpbuf*p,structnetif*inp)上述接口负责icmp输入报文的分析和处理。

igmp模块:igmp模块负责分组管理。

其主要的接口函数如下:voidigmp_input(structpbuf*p,structnetif*inp,structip_addr*dest)该接口负责igmp协议报文的处理,比如分析当前报文是请求还是应答。

err_tigmp_joingroup(structip_addr*ifaddr,structip_a ddr*groupaddr)该接口将一个网口加入一个组。

err_tigmp_leavegroup(structip_addr*ifaddr,structip_ addr*groupaddr)该接口将一个网口从一个组中移出。

dhcp模块:dhcp模块用于获取设备ip地址的相关信息。

其处理入口主要有这么几个:dpch的启动、dpch的接收报文处理以及定时器模块的处理。

主要的接口原型如下:err_tdhcp_start(structnetif*netif)该接口用于设备启动dhcp模块,主要是客户端的功能。

该模块实现设备dhcp描述结构生成,并将dhcp的端口绑定到udp协议中,以及将本dhcp模块跟远端服务器端口进行绑定。

最后启动dhcp申请。

staticvoiddhcp_recv(void*arg,structudp_pcb*pcb,stru ctpbuf*p,structip_addr*addr,u16_tport)该接口为一个注册接口,用于dhcp报文接收。

在startdhcp时,该接口通过dhcp的udppcb注册到udp协议层。

udp进行报文处理后,根据端口调用该注册接口。

该接口中,实现dhcp报文的协议处理。

Voiddhcp_fine_tmr()Voiddhcp_coarse_tmr()这两个函数接口实现了dhcp的相关超时处理监控。

上面一个用于请求应答超时处理。

下面一个用于地址租用情况的到期处理。

从源码分析看,上述的接口在应用lwip的协议栈时,需要重点关注。

对于小内存应用的场合,该协议栈的内存管理以及pbuf应用部分需要自行改写。

2lwip的协议流程下面这张图比较清楚的描述了lwip的报文处理流程,呵呵,借用一下。

不过,其对netif->output描述不够。

从代码看,该output实际是arp层的输出,最后通过arp层调用netif中的底层输出接口发送报文。

篇二:lwip模块详细分析lwip模块只要包括:(1)、配置模块;(2)、初始化模块;(3)、netif模块;(4)mem模块(5)、netarp模块(6)ip模块(7)icmp模块(8)dhcp模块(9)tcp模块(10)snmp模块(1)、配置模块:通过各种宏定义的方式对系统和子系统进行配置。

主要文件是opt.h(2)、初始化模块:初始化模块入口文件tcpip.c,其初始化入口函数Voidtcpip_init(void(*initfunc)(void*),void*arg);通过调用lwip_init(),初始化所有的子模块,并启动协议栈管理进程。

staticvoidtcpip_thread(void*arg):协议栈数据分发管理进程负责输入报文的处理,超时处理、api函数及回调的处理。

Voidtcpip_init(void(*initfunc)(void*),void*arg){tcpip_init_done=initfunc;tcpip_init_done_arg=arg;mbox=sys_mbox_new(tcpip_mbox_size);lwip_init();#iflwip_tcpip_coRe_lockinglock_tcpip_core=sys_sem_new(1);#endif/*lwip_tcpip_coRe_locking*/sys_thread_new(tcpip_thRead_name,tcpip_thread,null, lwip_stk_size,tcpip_thRead_pRio);}(3)、netif模块:netif模块是协议栈与底层驱动的接口模块。

该模块的主要文件是netif.c,通过链表的形式描述了所有的网口设备。

netif的数据结构描述了网口的参数,包括ip地址、mac 地址、link状态、网口号、收发函数等等参数。

一个网口设备的数据收发主要通过该结构进行(4)mem模块mem模块同一管理了协议栈使用的内容缓冲区,并管理pbuf结构以及报文的字段处理。

主要的文件包括mem.c、memp.c、pbuf.c。

(5)、netarp模块netarp模块是处理arp协议的模块,主要源文件为etharp.c。

其主要入口函数:ethernet_input(structpbuf*p,structnetif*netif)该入口函数通过判断输入报文p的协议类型来决定是按照arp协议进处理还是将该报文提交到ip协议。

ethernet_input(structpbuf*p,structnetif*netif) {structeth_hdr*ethhdr;u16_ttype;ethhdr=p->payload;switch(type){caseethtype_ip:ippacketetharp_ip_input(netif,p);caseethtype_aRp:passptoaRpmoduleetharp_arp_input(netif,(structeth_addr*)(netif->hwa ddr),p);caseethtype_pppoedisc:pppoe_suppoRtpppoe_disc_input(netif,p);caseethtype_pppoe:/*pppoverethernetsessionstage*/ pppoe_data_input(netif,p);default:ethaRp_stats_inc(etharp.proterr);ethaRp_stats_inc(etharp.drop);}returneRR_ok;}if如果报文是aRp报文,该接口则调用etharp_arp_input,进行arp请求处理。

相关主题