文件目录
这里以源码版本2.1.2为例。 源码解压后如上图所示,三个文件夹。 doc文件夹里由两个重要文件提一下,rawapi.txt是关于如何使用raw API;sys_arch.txt是关于移植说明,规定了需要实现的函数和宏定义等等。 src文件夹下一共有五个文件夹,apps, api, core, include, netif。 apps 包含了各种应用层协议; api 包括了LWIP的sequential API和socket API两类接口函数和实现相关源码,需要操作系统支持; core 是LWIP内核源代码,可以单独运行,无需操作系统支持; include 包含协议栈使用的头文件; netif 主要包含底层网络接口相关文件。
下图是CORE文件夹下的截图:
其中core文件夹是整个协议栈重点,包含了IP、ICMP、IGMP、TCP、UDP等核心协议以及建立它们之上的DNS、DHCP、SNMP等上层应用协议。 ipv4文件夹里由IPv4标准中与IP层数据处理相关的所有代码,同理ipv6是IPv6标准与IP层相关代码; snmp文件夹、dns.c、dhcp.c分别实现的是简单网络管理协议、动态主机配置协议、域名系统协议。 init.c 包含一个与LWIP协议栈初始化密切相关函数,和一些协议栈配置信息的检查与输出。 mem.c memp.c 两种特有的内存管理方式实现对协议栈内存的有效管理。 netif.c 包含了协议栈接口管理的相关函数,协议栈支持多个网络接口。 pbuf.c 包含了协议栈内核使用的数据包管理函数,采用特殊的数据包结构,避免各层次间拷贝。提高数据传递效率,同时节省内存空间。 raw.c 为应用层提供了一种直接和IP数据包交互的方式,通TCP处于同一等级,享受IP层提供服务。 stats.c 包含协议栈内部数据统计与显示的相关函数,比如内存使用、邮箱、信号量等。 sys.c sys_arch.c 前者实现对操作系统模拟层封装,为协议栈提供统一邮箱、信号量操作函数。后者是完成对操作系统中邮箱和信号量函数的封装。前者是将后者的函数再次封装得到具有协议栈特色的邮箱、信号量操作函数。 tcp.c 对TCP控制块操作函数。 udp.c 包括UDP控制块管理、数据发送函数、数据接收函数等。
下图是api文件夹下截图: 如图所示,为用户提供了两种简单的上层api接口,一种是协议栈的sequent API,另一种是socket API。这两种API均是通过引进邮箱和信号量等通信与同步机制,实现对内核core中raw API封装和调用。 从用户对的角度来讲,两种API为程序开发提供了方便,但是不可避免降低了代码执行效率和整个系统的稳定性。 api_lib.c和api_msg.c包含了所有sequential API的实现相关函数,前者预留给洪湖的编程接口,后者是对消息封装和处理函数; neibuf.c包含上层数据包管理函数的实现,netdb.c包含与主机名字转换相关函数,主要再socket中使用;netifapi.c包含上层网络接口管理函数的实现;sockets.c包含socket API实现; tcpip.c提供上层API与协议栈内核交互的函数,是API功能实现的一个枢纽。
include文件夹下比较重要的文件就两个,一个是opt.h,包含所有内核参数的默认配置;另一个init.h文件,包含源代码相关的宏定义,如协议版本号等。
协议栈
协议栈构成如下: 对于应用层协议先不管,主要先学习ARP、IP、ICMP、UDP、TCP这些核心协议的原理与代码实现。
|