LWIP模块详细分析

更新时间:2024-06-29 02:26:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

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,其初始化入口函数

Void tcpip_init(void (* initfunc)(void *), void *arg);通过调用lwip_init(),初始化所有的子模块,并启动协议栈管理进程。

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

Void tcpip_init(void (* initfunc)(void *), void *arg) {

tcpip_init_done = initfunc; tcpip_init_done_arg = arg;

mbox = sys_mbox_new(TCPIP_MBOX_SIZE); lwip_init();

#if LWIP_TCPIP_CORE_LOCKING

lock_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(struct pbuf *p, struct netif *netif) 该入口函数通过判断输入报文p的协议类型来决定是按照arp协议进处理还是将该报文提交到IP 协议。

ethernet_input(struct pbuf *p, struct netif *netif) {

struct eth_hdr* ethhdr; u16_t type;

ethhdr = p->payload; switch (type) {

case ETHTYPE_IP: IP packet etharp_ip_input(netif, p);

case ETHTYPE_ARP: pass p to ARP module etharp_arp_input(netif, (struct eth_addr*)(netif->hwaddr), p); case ETHTYPE_PPPOEDISC: PPPOE_SUPPORT pppoe_disc_input(netif, p);

case ETHTYPE_PPPOE: /* PPP Over Ethernet Session Stage */ pppoe_data_input(netif, p);

default:

ETHARP_STATS_INC(etharp.proterr); ETHARP_STATS_INC(etharp.drop); }

return ERR_OK; }

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

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

/******************************************************************/ 在该模块中,创建了设备的地址映射arp 表,并提供地址映射关系查询接口。同时还提供了arp报文的发送接口。如下:

err_t etharp_output(struct netif *netif, struct pbuf *q, struct ip_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 来发送最终组合报文。

(6)、ip模块

ip 模块实现了协议的ip 层处理,主要文件为ip.c。其主要入口函数

为:err_t ip_input(struct pbuf *p, struct netif *inp)

该接口通过判断输入报文的协议类型,将其输入到相应的上层协议模块中去。比如,将udp报文送到udp_input。

该模块另外一个接口是输入函数,原型如下:

err_t ip_output(struct pbuf *p, struct ip_addr *src, struct ip_addr *dest, u8_t ttl, u8_t tos, u8_t proto)

该接口通过路由表或者传输ip 后,调用netif 的output字段函数钩 子发送报文。

(7)UDP模块

udp 模块实现了udp 协议层的协议处理,主要文件为udp.c。该模 块通过PCB 控制块将应用端口跟应用程序做了绑定。在接收到新报 文时,分析其对应的PCB,找到对应的处理钩子,进行应用的处理。 主要入口函数为:

void udp_input(struct pbuf *p, struct netif *inp) 该模块负责输出的接口如下:

err_t udp_send(struct udp_pcb *pcb, struct pbuf *p)

该模块负责将一个PCB 跟一个本地端口进行绑定的接口如下: err_t udp_bind(struct udp_pcb *pcb, struct ip_addr *ipaddr, u16_t port) 该模块负责将一个PCB 跟一个远端端口绑定的接口如下:

err_t udp_connect(struct udp_pcb *pcb, struct ip_addr *ipaddr, u16_t

(8)、icmp模块

该模块负责icmp 协议的处理,其比较简单。主要的处理接口如下: Void icmp_input(struct pbuf *p, struct netif *inp) 上述接口负责icmp 输入报文的分析和处理。

(9)、igmp模块

igmp 模块负责分组管理。其主要的接口函数如下:

void igmp_input(struct pbuf *p, struct netif *inp, struct ip_addr *dest)

该接口负责IGMP 协议报文的处理,比如分析当前报文是请求还 是应答。

err_t igmp_joingroup(struct ip_addr *ifaddr, struct ip_addr *groupaddr) 该接口将一个网口加入一个组。

err_t igmp_leavegroup(struct ip_addr *ifaddr, struct ip_addr *groupaddr)

该接口将一个网口从一个组中移出。

(10)、dhcp模块

dhcp 模块用于获取设备ip 地址的相关信息。其处理入口主要有这 么几个:dpch的启动、dpch的接收报文处理以及定时器模块的处理。 主要的接口原型如下:

err_t dhcp_start(struct netif *netif)

该接口用于设备启动dhcp 模块,主要是客户端的功能。该模块实 现设备dhcp描述结构生成,并将dhcp的端口绑定到udp协议中,以 及将本dhcp模块跟远端服务器端口进行绑定。最后启动dhcp 申请。 static void dhcp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, struct ip_addr *addr, u16_t port)

该接口为一个注册接口,用于dhcp 报文接收。在start dhcp 时, 该接口通过dhcp的udp pcb 注册到udp协议层。Udp进行报文处理 后,根据端口调用该注册接口。该接口中,实现dhcp 报文的协议处 理。

Void dhcp_fine_tmr() Void dhcp_coarse_tmr()

这两个函数接口实现了dhcp 的相关超时处理监控。上面一个用于 请求应答超时处理。下面一个用于地址租用情况的到期处理。 从源码分析看,上述的接口在应用lwip 的协议栈时,需要重点关 注。对于小内存应用的场合,该协议栈的内存管理以及pbuf 应用部 分需要自行改写。

关于lwip 源码的理解学习,请大家自己多看看相关资料。水好深,

作者这里也是略知

(11)、tcp模块 (12)、snmp模块

本文来源:https://www.bwwdw.com/article/ks73.html

Top