LWIP目录结构以及在实验版web_server例子的实现原理 下载本文

内容发布更新时间 : 2024/6/16 12:45:25星期一 下面是文章的全部内容请认真阅读。

Date:2011/08/01

LWIP目录结构

LWIP/API

Api_lib.c:netbuf与netconn数据结构相关的各类函数

Api_msg.c:api_msg的发送与处理,安装在UDP/TCP控制块上的接收处理回调函数,通过其可以向相应的conn发送邮件或信号量,来表示接收到什么。 Err.c:各种错误代码,以及一个错误翻译函数 Socket.c:最抽象的socket系列函数实现代码

Tcpip.c:TCPIP的主进程tcpip_thread—通过邮箱驱动,以及向主进程发送邮件的两个函数(tcpip_apimsg)用于API或tcpip_input用于网口驱动发送接收到的数据,还有主进程的tcpip_input(其初始化一个回调函数tcpip_init_done连同其调用参数,该回调函数在tcpip_thread所有初始化完毕后调用)。

LWIP/core Dhcp.c

Inet.c:校验和的计算以及主机网络字序的转换函数 Inet6.c:ipversion校验和的计算 Mem.c:内存管理函数集

Memp.c:以数据结构为参数提供内存申请服务

Netif.c:网络接口服务集合,用于维护netif串结构和对其配置,定义了一个netif串以及缺省的netif

Pbuf.c:pbuf结构服务集合,向上层函数提供理想化的数据包纳空间

Stats.c:定义一个struct stats_lwip_stats全局变量,还有一个对其初始化的函数 Sys.c:系统服务函数函数集合,建立在用户提供的原始系统服务函数之上

Udp.c:一系统UDP层的函数,存在于TCPIP主进程中,主动函数api_msg.c中do.xx函数调用,如udp_bind().udp_send(),被动函数udp_input()是为ip_input()调用,还有一个安装udp_pcb回调函数的函数udp_recv.此外,还有一个udp_pcb的链表在此定义。 Tcp.c:tcp_in,c,tcp_input.c tcp_out.c tcp_output.c

LWIP/CORE/IPV4

Ip.c:ip层服务函数,包括一个在tcpip_thread()中调用的ip_input.c Ip_addr.c:定义了两个变量ip_addr_any,ip_addr_broadcast

Lwip/core/ipv6

Icmp6.c ip6.c ip6_addr.c

Lwip/core/ipv4/lwip

Icmp.h inet.h ip.h ip_addr.h ip_frag.h

Lwip/include/ipv6/lwip Icmp.h inet.h ip.h ip_addr.h

LWIP/include/lwip

Api.h:是api_lib.c头文件,定义了netbuf和netconn两个数据结构

Api_msg.h:api_msg.c的头文件,定义了api_msg_msg何api_msg两个数据结构 Arch.h:处理器,编译器相关定义,包括大小端,字节对齐编译命令 Debug.h所有debug相关的定义和开关

Dhcp.h:dhcp.c的头文件,定义了dhcp数据结构 Err.h:err.c的头文件 List.h:lict.c的头文件

Mem.h:mem.c头文件,定义了使用内存的大小,此外还有一些对齐用的宏 Memp.h:memp.c头文件

Netif.h:netif.c头文件,定义了netif的数据结构

Opt.h:重要文件,定义各种控制结构缺省数目,堆空间容量,对齐配置,功能开关,debug开关

Pbuf.h:pbuf.c头文件,定义了pbuf数据结构

Socket.h:socket.c头文件,定义了in_addr,socket_in,sockaddr,linger,timeeval,fd_set数据结构

Stats.h:stats.c头文件,定义了stat_proto,stats_mem,stats_pbuf,stats_syselem, Stat_sys,stat数据结构

Sys.h:sys.c的头文件,定义了sys_timeout,sys_timeouts数据结构

Tcp.h:tcp.c的头文件,定义了tcp_pcb,tcp_pcb_listen,tcp_seg数据结构 Tcpip.h:tcpip.c的头文件,定义了tcpip_msg数据结构 Udp.h:udp.c头文件,定义了tcpip_hdr,udp_pcb数据结构

Lwip/include/netif

Etharp.h:etharp.c头文件,定义了eth_addr,eth_hdr,etharp_hdr,ethip_hdr数据结构 定义了链路层数据包头结构 Loopif.h:loopif.c头文件 Slipif.h:slipif.c头文件

Lwip/netif

Etharp.c:各种ARP相关的函数,定义etharp_entry数据结构以及arp_table[]列表缓存 Ethernetif.c:驱动程序板块

Loopif.c:定义了换回解耦的两个函数 Slipif.c:slip协议相关的函数

外设应用层:该文件内函数会调用外设中间件提供的API函数,主要负责实现所需功能;

外设中间件:本代码的外设中间件使用的是LwIP协议栈,调用底层的网口发送与接收API,实现所需的网络协议和较复杂的网络应用;

外设驱动层:该文件内函数会读写芯片内的指定寄存器,将抽象的寄存器读写操作转化为较具体的API函数,供上层函数调用; 外设寄存器层:该文件为指定外设的头文件,负责将与外设相关的寄存器地址映

射到该文件中,使得上层可以对寄存器进行读写操作

main函数里面lwip_stack_init(TCPIP_PRIO, tcpip_init_done, 0); 跟踪程序其函数原型为:

void lwip_stack_init(int thread_prio, void (* initfunc)(void *), void *arg) {

sys_init();//硬件初始化 #ifdef STATS stats_init();

#endif /* STATS */

mem_init();//LWIP分配固定长度初始化

memp_init();//LWIP分配不固定的长度初始化 pbuf_init();//LWIP包缓冲管理pbufs初始化

netif_init();//网络接口初始化,这里面有一个netif指针,这个指针指向netif()这个函数,这个指针给ip_addr,netmask,gw赋NULL,

tcpip_init(thread_prio, initfunc, arg);//thread prio这个参数是被sys_thread_new(tcpip_thread,NULL,thread_prio)这个函数调用,这是一个操作系统线程的创建, /* void tcpip_init(void (* initfunc)(void *), void *arg)//指针函数 { tcpip_init_done = initfunc; tcpip_init_done_arg = arg; mbox = sys_mbox_new();//LWIP提供的缓冲和传递报文 sys_thread_new(tcpip_thread, NULL, TCPIP_THREAD_PRIO); } 注:tcpip_init是lwip提供一个api,主要任务建立lwip的主线程tcpip_thread!并在主线程里完成ip_init,tcp_init, udp_init */

return; }

1:tcpip_init_done对应程序里面的: static void tcpip_init_done(void *arg) { /*

* At this point LWIP has been initialized, but the Ethernet interface has