lwIP 2.2.1源码结构与移植
本文档基于本仓库
lwIP-STABLE-2_2_1_RELEASE/src整理:目录结构来自实际源码树;每个文件的"作用/含义"依据该文件头部的@file注释与 lwIP 官方 README/doc 归纳(中文为整理说明)。仓库内另有两个可直接查阅的文档入口:doc/doxygen/output/index.html(官方 Doxygen 全文)与各目录下的FILES文件。
目录
- [1. 总体说明与分层结构](#1. 总体说明与分层结构)
- [2. 代码目录结构](#2. 代码目录结构)
- [3. lwIP 移植指南(新平台快速上手)](#3. lwIP 移植指南(新平台快速上手))
- [4. 每个头文件与源文件的作用和含义](#4. 每个头文件与源文件的作用和含义)
- [5. 附录:参考资料与常用宏速查](#5. 附录:参考资料与常用宏速查)
1. 总体说明与分层结构
lwIP 是一个面向嵌入式系统的轻量 TCP/IP 协议栈,重点是小内存占用(RAM 以几十 KB 计),同时保留完整 TCP 功能。仓库分两部分:src/ 是协议栈本体;contrib/ 是社区维护的示例、移植与附加功能。
lwIP 提供三类编程接口,移植前必须先分清:
- raw / callback API(核心回调式) :最底层、最快、内存最省。回调(
tcp_*、udp_*、raw_*、netif)都在协议栈上下文里执行;无操作系统(NO_SYS=1)时只能用这一种。 - netconn 顺序 API(sequential) :
src/api实现,阻塞式 open/read/write/close 风格,必须在 tcpip 线程之外调用。 - socket API(BSD 风格) :
src/api/sockets.c,构建在 netconn 之上,用于兼容现有 POSIX 网络程序(include/compat/posix提供头文件映射)。
协议栈内部的分层关系(数据流方向)大致如下:
text
应用程序(你的任务 / 业务逻辑)
| | |
v v v
socket API netconn API raw/callback API
(api/sockets.c) (api/api_lib.c) (tcp/udp/raw/netif)
\ | /
\ v /
tcpip 线程 + 邮箱(api/tcpip.c, sys 抽象层, 有 OS 时)
|
v
IPv4/IPv6:IP、ICMP、DHCP、ARP/ND、分片 ...(src/core)
|
v
netif 抽象层(core/netif.c)
|
v
网卡驱动(你自己的 MAC/PHY,或 src/netif 里的通用驱动)
|
v
物理链路(以太网 / 串口 / 802.15.4 / PPP ...)
2. 代码目录结构
2.1 顶层目录
| 顶层内容 | 作用 |
|---|---|
src/ |
lwIP 协议栈本体源码(协议核心、API、通用驱动、应用)。移植时通常只整体拷贝它。 |
contrib/ |
社区"贡献"代码:ports/ 官方移植(unix/win32/freertos)、apps/ 示例程序、addons/ 功能增强(DHCP 扩展、IPv6 静态路由、netconn、tcp_isn、tcp_md5)、examples/ 示例工程(含 ethernetif/ 网卡驱动骨架、example_app 等)、Coverity/ 覆盖率插桩。 |
doc/ |
文档与示例源码:Doxygen 配置与生成结果(doxygen/output/index.html)、PPP/MDNS/MQTT 说明、NO_SYS_SampleCode.c(无 RTOS 示例)、ZeroCopyRx.c(零拷贝接收示例)等。 |
test/ |
unit/(lwip_check 单元测试,覆盖 core/api/etharp/ip4/ip6/mdns/mqtt/ppp/tcp/udp/dhcp 等)、sockets/(socket 压力测试)、fuzz/(模糊测试与输入样本)。 |
BUILDING |
构建说明(CMake 变量、include 路径、链接方式)。 |
CMakeLists.txt |
顶层 CMake 工程(主要给 unix/win32 端口与测试用)。 |
README |
项目简介、特性、应用清单、许可证与开发入口。 |
FEATURES |
支持的协议/特性清单。 |
FILES |
顶层目录的说明(src 各子目录一句话介绍)。 |
CHANGELOG / UPGRADING |
变更日志 / 从旧版升级的注意事项。 |
COPYING |
BSD 许可证文本。 |
codespell_check.sh、codespell_changed_files.sh |
源码拼写检查脚本(开发用)。 |
2.2 src/ 完整目录树
text
src/
|-- Filelists.cmake
|-- Filelists.mk
|-- FILES
|-- api/
| |-- api_lib.c
| |-- api_msg.c
| |-- err.c
| |-- if_api.c
| |-- netbuf.c
| |-- netdb.c
| |-- netifapi.c
| |-- sockets.c
| `-- tcpip.c
|-- apps/
| |-- altcp_tls/
| | |-- altcp_tls_mbedtls_mem.c
| | |-- altcp_tls_mbedtls_mem.h
| | |-- altcp_tls_mbedtls_structs.h
| | `-- altcp_tls_mbedtls.c
| |-- http/
| | |-- altcp_proxyconnect.c
| | |-- fs.c
| | |-- fsdata.c
| | |-- fsdata.h
| | |-- http_client.c
| | |-- httpd_structs.h
| | |-- httpd.c
| | |-- fs/
| | | `-- img/
| | `-- makefsdata/
| | |-- makefsdata.c
| | `-- tinydir.h
| |-- lwiperf/
| | `-- lwiperf.c
| |-- mdns/
| | |-- mdns_domain.c
| | |-- mdns_out.c
| | `-- mdns.c
| |-- mqtt/
| | `-- mqtt.c
| |-- netbiosns/
| | `-- netbiosns.c
| |-- smtp/
| | `-- smtp.c
| |-- snmp/
| | |-- snmp_asn1.c
| | |-- snmp_asn1.h
| | |-- snmp_core_priv.h
| | |-- snmp_core.c
| | |-- snmp_mib2_icmp.c
| | |-- snmp_mib2_interfaces.c
| | |-- snmp_mib2_ip.c
| | |-- snmp_mib2_snmp.c
| | |-- snmp_mib2_system.c
| | |-- snmp_mib2_tcp.c
| | |-- snmp_mib2_udp.c
| | |-- snmp_mib2.c
| | |-- snmp_msg.c
| | |-- snmp_msg.h
| | |-- snmp_netconn.c
| | |-- snmp_pbuf_stream.c
| | |-- snmp_pbuf_stream.h
| | |-- snmp_raw.c
| | |-- snmp_scalar.c
| | |-- snmp_snmpv2_framework.c
| | |-- snmp_snmpv2_usm.c
| | |-- snmp_table.c
| | |-- snmp_threadsync.c
| | |-- snmp_traps.c
| | |-- snmpv3_mbedtls.c
| | |-- snmpv3_priv.h
| | `-- snmpv3.c
| |-- sntp/
| | `-- sntp.c
| `-- tftp/
| `-- tftp.c
|-- core/
| |-- altcp_alloc.c
| |-- altcp_tcp.c
| |-- altcp.c
| |-- def.c
| |-- dns.c
| |-- inet_chksum.c
| |-- init.c
| |-- ip.c
| |-- mem.c
| |-- memp.c
| |-- netif.c
| |-- pbuf.c
| |-- raw.c
| |-- stats.c
| |-- sys.c
| |-- tcp_in.c
| |-- tcp_out.c
| |-- tcp.c
| |-- timeouts.c
| |-- udp.c
| |-- ipv4/
| | |-- acd.c
| | |-- autoip.c
| | |-- dhcp.c
| | |-- etharp.c
| | |-- icmp.c
| | |-- igmp.c
| | |-- ip4_addr.c
| | |-- ip4_frag.c
| | `-- ip4.c
| `-- ipv6/
| |-- dhcp6.c
| |-- ethip6.c
| |-- icmp6.c
| |-- inet6.c
| |-- ip6_addr.c
| |-- ip6_frag.c
| |-- ip6.c
| |-- mld6.c
| `-- nd6.c
|-- include/
| |-- compat/
| | |-- posix/
| | | |-- netdb.h
| | | |-- arpa/
| | | | `-- inet.h
| | | |-- net/
| | | | `-- if.h
| | | `-- sys/
| | | `-- socket.h
| | `-- stdc/
| | `-- errno.h
| |-- lwip/
| | |-- acd.h
| | |-- altcp_tcp.h
| | |-- altcp_tls.h
| | |-- altcp.h
| | |-- api.h
| | |-- arch.h
| | |-- autoip.h
| | |-- debug.h
| | |-- def.h
| | |-- dhcp.h
| | |-- dhcp6.h
| | |-- dns.h
| | |-- err.h
| | |-- errno.h
| | |-- etharp.h
| | |-- ethip6.h
| | |-- icmp.h
| | |-- icmp6.h
| | |-- if_api.h
| | |-- igmp.h
| | |-- inet_chksum.h
| | |-- inet.h
| | |-- init.h
| | |-- init.h.cmake.in
| | |-- ip_addr.h
| | |-- ip.h
| | |-- ip4_addr.h
| | |-- ip4_frag.h
| | |-- ip4.h
| | |-- ip6_addr.h
| | |-- ip6_frag.h
| | |-- ip6_zone.h
| | |-- ip6.h
| | |-- mem.h
| | |-- memp.h
| | |-- mld6.h
| | |-- nd6.h
| | |-- netbuf.h
| | |-- netdb.h
| | |-- netif.h
| | |-- netifapi.h
| | |-- opt.h
| | |-- pbuf.h
| | |-- raw.h
| | |-- sio.h
| | |-- snmp.h
| | |-- sockets.h
| | |-- stats.h
| | |-- sys.h
| | |-- tcp.h
| | |-- tcpbase.h
| | |-- tcpip.h
| | |-- timeouts.h
| | |-- udp.h
| | |-- apps/
| | | |-- altcp_proxyconnect.h
| | | |-- altcp_tls_mbedtls_opts.h
| | | |-- FILES
| | | |-- fs.h
| | | |-- http_client.h
| | | |-- httpd_opts.h
| | | |-- httpd.h
| | | |-- lwiperf.h
| | | |-- mdns_domain.h
| | | |-- mdns_opts.h
| | | |-- mdns_out.h
| | | |-- mdns_priv.h
| | | |-- mdns.h
| | | |-- mqtt_opts.h
| | | |-- mqtt_priv.h
| | | |-- mqtt.h
| | | |-- netbiosns_opts.h
| | | |-- netbiosns.h
| | | |-- smtp_opts.h
| | | |-- smtp.h
| | | |-- snmp_core.h
| | | |-- snmp_mib2.h
| | | |-- snmp_opts.h
| | | |-- snmp_scalar.h
| | | |-- snmp_snmpv2_framework.h
| | | |-- snmp_snmpv2_usm.h
| | | |-- snmp_table.h
| | | |-- snmp_threadsync.h
| | | |-- snmp.h
| | | |-- snmpv3.h
| | | |-- sntp_opts.h
| | | |-- sntp.h
| | | |-- tftp_client.h
| | | |-- tftp_common.h
| | | |-- tftp_opts.h
| | | `-- tftp_server.h
| | |-- priv/
| | | |-- altcp_priv.h
| | | |-- api_msg.h
| | | |-- mem_priv.h
| | | |-- memp_priv.h
| | | |-- memp_std.h
| | | |-- nd6_priv.h
| | | |-- raw_priv.h
| | | |-- sockets_priv.h
| | | |-- tcp_priv.h
| | | `-- tcpip_priv.h
| | `-- prot/
| | |-- acd.h
| | |-- autoip.h
| | |-- dhcp.h
| | |-- dhcp6.h
| | |-- dns.h
| | |-- etharp.h
| | |-- ethernet.h
| | |-- iana.h
| | |-- icmp.h
| | |-- icmp6.h
| | |-- ieee.h
| | |-- igmp.h
| | |-- ip.h
| | |-- ip4.h
| | |-- ip6.h
| | |-- mld6.h
| | |-- nd6.h
| | |-- tcp.h
| | `-- udp.h
| `-- netif/
| |-- bridgeif_opts.h
| |-- bridgeif.h
| |-- etharp.h
| |-- ethernet.h
| |-- ieee802154.h
| |-- lowpan6_ble.h
| |-- lowpan6_common.h
| |-- lowpan6_opts.h
| |-- lowpan6.h
| |-- slipif.h
| |-- zepif.h
| `-- ppp/
| |-- ccp.h
| |-- chap_ms.h
| |-- chap-md5.h
| |-- chap-new.h
| |-- eap.h
| |-- ecp.h
| |-- eui64.h
| |-- fsm.h
| |-- ipcp.h
| |-- ipv6cp.h
| |-- lcp.h
| |-- magic.h
| |-- mppe.h
| |-- ppp_impl.h
| |-- ppp_opts.h
| |-- ppp.h
| |-- pppapi.h
| |-- pppcrypt.h
| |-- pppdebug.h
| |-- pppoe.h
| |-- pppol2tp.h
| |-- pppos.h
| |-- upap.h
| |-- vj.h
| `-- polarssl/
| |-- arc4.h
| |-- des.h
| |-- md4.h
| |-- md5.h
| `-- sha1.h
`-- netif/
|-- bridgeif_fdb.c
|-- bridgeif.c
|-- ethernet.c
|-- FILES
|-- lowpan6_ble.c
|-- lowpan6_common.c
|-- lowpan6.c
|-- slipif.c
|-- zepif.c
`-- ppp/
|-- auth.c
|-- ccp.c
|-- chap_ms.c
|-- chap-md5.c
|-- chap-new.c
|-- demand.c
|-- eap.c
|-- ecp.c
|-- eui64.c
|-- fsm.c
|-- ipcp.c
|-- ipv6cp.c
|-- lcp.c
|-- magic.c
|-- mppe.c
|-- multilink.c
|-- ppp.c
|-- pppapi.c
|-- pppcrypt.c
|-- pppoe.c
|-- pppol2tp.c
|-- pppos.c
|-- upap.c
|-- utils.c
|-- vj.c
`-- polarssl/
|-- arc4.c
|-- des.c
|-- md4.c
|-- md5.c
`-- sha1.c
说明:树中保留了每个目录的
FILES(该目录说明)、Filelists.cmake/Filelists.mk(CMake / Makefile 用的源文件清单,新增文件后需同步维护)。include/lwip/init.h.cmake.in是 CMake 生成lwip/init.h(版本号等)用的模板,普通移植直接用源码自带的init.h即可。src/apps/http下还有静态网页fs/*.html、图片以及主机工具makefsdata/。
2.3 src/ 各子目录职责(来自 src/FILES 与源码)
| 目录 | 职责 |
|---|---|
src/api |
高层顺序 API:netconn(api_lib/api_msg)、BSD socket(sockets)、netbuf、netdb、netifapi,以及"tcpip 主线程 + 邮箱"的线程模型实现(tcpip.c)。不用多线程(NO_SYS)时整目录可以不编译。 |
src/core |
协议栈核心:pbuf 缓冲、mem/memp 内存、IPv4/IPv6 与 TCP/UDP/ICMP/ARP/ND/DHCP 等协议实现、raw 接口、定时器(timeouts)、统计(stats)、altcp 分层 TCP、DNS 客户端。 |
src/apps |
官方应用(raw API 编写):httpd/http_client、snmp、sntp、mqtt、mdns、smtp、tftp、netbiosns、lwiperf、altcp_tls(mbedTLS 封装)。 |
src/include |
全部头文件:lwip/(公共 API + priv 内部头 + prot 报文格式)、compat/(POSIX 兼容)、netif/(驱动接口头)。 |
src/netif |
与具体芯片无关的链路层:ethernet(公共输入分发)、slipif(串口 SLIP)、lowpan6(6LoWPAN)、bridgeif(二层网桥)、zepif,以及完整的 ppp 协议族。 |
3. lwIP 移植指南(新平台快速上手)
移植 lwIP 不需要改动 src/ 里的内核代码。你要做的全部工作在三个地方:平台相关文件(arch/sys)、你自己的网卡驱动、lwipopts.h 配置。
3.1 先决定运行模型
| 模型 | 适用场景 | 要点 |
|---|---|---|
无 RTOS(NO_SYS 1) |
裸机/单循环,MCU 资源极小 | 只能使用 raw/callback API;主循环里轮询网卡并调用 netif->input 与 sys_check_timeouts();参考 doc/NO_SYS_SampleCode.c。 |
有 RTOS(NO_SYS 0) |
跑 FreeRTOS/RT-Thread 等,需多任务 | 需实现 sys_arch(信号量/邮箱/互斥/线程);内核在 tcpip 线程中跑,应用可用 socket/netconn 或多线程;参考 contrib/ports/freertos。 |
3.2 需要你提供的文件/接口
| 内容 | 位置/接口 | 说明 |
|---|---|---|
| 平台头 | arch/cc.h(被 include/lwip/arch.h include) |
定义基础整数类型(u8_t/u16_t/u32_t/s32_t/mem_ptr_t)、BYTE_ORDER、LWIP_PLATFORM_DIAG(打印)、LWIP_PLATFORM_ASSERT、结构体紧凑打包宏(PACK_STRUCT_*,GCC/Keil 已有默认;无默认时才需要)。可参考 contrib/ports/unix/port/include/arch/cc.h 或 win32 端口。 |
| 毫秒时基 | sys_now() |
无论有无 RTOS 都必须提供:协议栈定时器靠它推进(TCP 重传、ARP、DHCP 等)。 |
| OS 抽象层 | sys_arch.c / sys_arch.h |
仅 NO_SYS=0 时需要:sys_thread_new、sys_mutex_*、sys_sem_*、sys_mbox_*、sys_init、sys_arch_protect(可选)。FreeRTOS 见 contrib/ports/freertos/sys_arch.c。 |
| 配置头 | lwipopts.h(放在你的 include 路径最前面) |
覆盖 src/include/lwip/opt.h 的默认值,决定裁剪/使能哪些协议、内存多大、开不开调试。参考 contrib/examples/example_app/lwipcfg.h.example 与 test/unit/lwipopts.h。 |
| 网卡驱动 | 你自己写的 xxxif.c + netif 注册 | 实现 init、linkoutput(发一帧),必要时 status(链路状态);收包侧调用 netif->input(NO_SYS)或 tcpip_input(有 RTOS,可在中断里用)。 |
| errno 支持 | lwip/errno.h 或系统 errno |
socket 程序需要 errno;可 LWIP_PROVIDE_ERRNO 让 lwIP 自带,或包含系统 errno.h。 |
3.3 最小 lwipopts.h 模板
c
/* 最小示例:先按你的 RTOS/裸机情况改这几个开关即可跑通 */
#ifndef __LWIPOPTS_H__
#define __LWIPOPTS_H__
/* ---- 运行模型 ---- */
#define NO_SYS 1 /* 0: 有 RTOS(还需 sys_arch),1: 裸机 */
#define SYS_LIGHTWEIGHT_PROT 0 /* 无 RTOS 置 0 */
/* ---- 协议裁剪 ---- */
#define LWIP_IPV4 1
#define LWIP_IPV6 0 /* 双栈时开 1 并多编译 core/ipv6 全部文件 */
#define LWIP_ARP 1 /* 以太网需要 */
#define LWIP_ICMP 1 /* ping 需要 */
#define LWIP_TCP 1
#define LWIP_UDP 1
#define LWIP_RAW 0
#define LWIP_DHCP 1
#define LWIP_DNS 0
/* ---- 内存(按 MCU RAM 调整) ---- */
#define MEM_ALIGNMENT 4
#define MEM_SIZE (40*1024) /* 堆大小:TCP 窗口/发送缓冲等 */
#define PBUF_POOL_SIZE 16 /* 收包缓冲池个数 */
#define MEMP_NUM_TCP_SEG 24 /* 可同时在发的 TCP 段 */
/* ---- 调试(上线前关掉) ---- */
#define LWIP_DEBUG 0
#define LWIP_STATS 0
#define LWIP_NETIF_LINK_CALLBACK 1 /* 插拔检测回调 */
#endif /* __LWIPOPTS_H__ */
每个宏的完整默认值与注释都在 src/include/lwip/opt.h,裁剪/调优时对照它改。
3.4 裸机(NO_SYS=1)最小骨架
c
#include "lwip/init.h"
#include "lwip/netif.h"
#include "lwip/etharp.h" /* netif->output = etharp_output */
#include "netif/ethernet.h" /* 以太网帧分发:IP/ARP/PPPoE */
static struct netif g_netif;
static err_t low_level_output(struct netif *netif, struct pbuf *p) {
/* 把 pbuf 链 p 的内容逐段交给你的 MAC 发送,返回 ERR_OK */
return ERR_OK;
}
static err_t eth_init(struct netif *netif) {
/* 填 MAC 地址、mtu、flags(NETIF_FLAG_BROADCAST|...)、
linkoutput=low_level_output、output=etharp_output、
必要时 status=链路检测函数 */
return ERR_OK;
}
int main(void) {
ip4_addr_t ip, mask, gw; /* 或静态/零地址后用 DHCP */
lwip_init();
netif_add(&g_netif, &ip, &mask, &gw, NULL, eth_init, ethernet_input);
netif_set_default(&g_netif);
netif_set_up(&g_netif);
for (;;) {
if (mac_rx_ready()) { /* 收到一帧 */
struct pbuf *p = mac_rx_to_pbuf(); /* pbuf_alloc(PBUF_RAW,...) 装帧 */
if (p) {
g_netif.input(&g_netif, p); /* 分发:IP->TCP/UDP/raw,ARP 等 */
}
}
sys_check_timeouts(); /* 驱动所有协议定时器 */
}
}
要点:netif->input 字段在 netif_add 时给出(此处传 ethernet_input);sys_now() 需返回毫秒(可用 SysTick 计数);DHCP 场景先 netif_set_link_up 再启动 DHCP。完整可编译示例直接看 doc/NO_SYS_SampleCode.c;零拷贝收包技巧见 doc/ZeroCopyRx.c。
3.5 有 RTOS 时的差异
- 用
tcpip_init(init_done_cb, NULL)创建 tcpip 线程,之后所有 raw API 与协议处理都在 tcpip 线程 ;应用线程用 socket/netconn API 或tcpip_callback()提交函数。 - 网卡注册建议用
netifapi_netif_add()(线程安全封装),或保证在 tcpip 线程内调用。 - 中断收包:不要直接调
netif->input,应调tcpip_input(netif, p);中断里发回调用tcpip_callbackmsg_*_fromisr、邮箱sys_mbox_trypost_fromisr(FreeRTOS 端口重点看这两类函数)。 - sys_arch 映射:信号量->二值/计数信号量,互斥->互斥量,邮箱->队列,线程->RTOS 任务(注意栈大小)。直接抄
contrib/ports/freertos/sys_arch.c再改是常见做法。
3.6 以太网驱动编写清单(以裸 MAC 为例)
- 初始化函数里填
netif:hwaddr_len=6、hwaddr[]、mtu、flags(NETIF_FLAG_BROADCAST|NETIF_FLAG_ETHARP|NETIF_FLAG_LINK_UP...),output=etharp_output、linkoutput=低层发送函数。 - 收包:驱动中断/轮询拿到一帧 ->
pbuf_alloc(PBUF_RAW, 长度+ETH_PAD, PBUF_POOL)填入数据 -> 交给netif->input(NO_SYS)或tcpip_input。 - 发包:在
linkoutput里遍历 pbuf 链调用 DMA/寄存器发送,注意 pbuf 可能非连续。 - 链路插拔:
LWIP_NETIF_LINK_CALLBACK打开后调netif_set_link_up/down,并在status回调里处理。 - 参考现成骨架:
contrib/examples/ethernetif/(官方驱动模板)、contrib/ports/unix/port/netif/tapif.c、win32 的pcapif.c。
3.7 编译集成(include 与文件列表)
必须让编译器看到三类头:lwIP 自身的 src/include、你的移植头所在目录(含 arch/、sys_arch.h)、以及放着 lwipopts.h 的目录(顺序上它要在 opt.h 之前被找到,通常直接放 include 路径首位即可)。源文件用 src/Filelists.cmake(或 Filelists.mk)里的 lwipcore/lwipallapps 列表,或手工把要用的文件加入工程。注意:src 里每个 .c 顶层都 #include "lwip/opt.h",并以 #if LWIP_XXX 自裁,所以"多编译几个文件"通常只是增加 ROM,功能由 lwipopts.h 决定。
3.8 常见坑速记
opt.h的宏全都能被lwipopts.h覆盖,改配置先查opt.h对应宏的注释与默认值。- 结构体对齐:
prot/*.h的报文体已做紧凑打包;别在应用里用普通结构体直接套报文。 - 字节序:
BYTE_ORDER必须与 CPU 一致(arm 小端一般LITTLE_ENDIAN),否则校验和/地址全错。 - 内存不足时先
LWIP_STATS=1看 mem/memp 统计,再调MEM_SIZE、PBUF_POOL_SIZE、MEMP_NUM_*。 - 多线程下 core API 只在 tcpip 线程调用;裸机下回调里绝不能阻塞/长循环。
- DHCP/ARP 依赖以太网输入分发与定时器,先保证能 ping 通再上 DHCP。
- 开
LWIP_DEBUG=1+ 相应LWIP_XXX_DEBUG可打印协议细节;Release 记得关掉以省 ROM/性能。
4. 每个头文件与源文件的作用和含义
以下按目录分组,把 src/ 下全部 296 个 .c/.h 源文件(含内嵌的 makefsdata/tinydir 等)逐一说明。表格说明整理自各文件头部注释;.c 与同名 .h 成对出现时含义互补(.c 是实现,.h 是该模块的对外/内部声明)。
4.1 src/api ------ 顺序/线程安全高层 API(Netconn、Socket)
这一层把底层回调式接口包装成"阻塞式、可多线程调用"的顺序 API。实现机制是:应用程序线程把操作打包成消息发给 tcpip 线程执行(api_msg),线程安全函数见各文件。
文件数:9,
| 文件 | 作用 / 含义 |
|---|---|
api_lib.c |
netconn 顺序 API 对外实现(线程安全封装,基于消息邮箱与 netbuf/pbuf) |
api_msg.c |
netconn 顺序 API 内部实现:把 API 调用打包成消息交给 tcpip 线程 |
err.c |
错误码 err_t 相关管理实现 |
if_api.c |
RFC3493 接口识别 API:接口名与索引相互转换(if_nametoindex 等) |
netbuf.c |
netbuf 缓冲区管理:netconn 收发数据的描述,内部封装 pbuf 避免拷贝 |
netdb.c |
主机名解析 API(gethostbyname 等),供 socket API 使用 |
netifapi.c |
netif 顺序 API:在非 tcpip 线程中安全执行网卡操作(地址、启停、DHCP 开关等) |
sockets.c |
BSD 风格 socket API 完整实现(构建于 netconn 之上) |
tcpip.c |
tcpip 主线程与邮箱核心:tcpip_init/tcpip_input/tcpip_callback |
4.2 src/core ------ 协议栈核心(顶层公共文件)
src/core 是 lwIP 的灵魂:缓冲区 pbuf、内存 mem/memp、TCP/UDP/raw 与定时器、altcp 等都在此。此层回调 API 只能在 tcpip 线程(有 OS)或主循环(NO_SYS)中调用。
文件数:20,
| 文件 | 作用 / 含义 |
|---|---|
altcp.c |
altcp 公共部分:各分层实例的通用函数与回调分发 |
altcp_alloc.c |
altcp 实例分配(按类型分配 pcb 与回调函数表) |
altcp_tcp.c |
基于标准 TCP 的 altcp 底层实现(altcp 协议链的底端) |
def.c |
字节序与通用工具函数参考实现(htons/ntohs 等) |
dns.c |
DNS 客户端解析器:查询、缓存、搜索域 |
inet_chksum.c |
网络校验和实现(含伪头校验) |
init.c |
lwip_init 初始化入口与版本号管理 |
ip.c |
IPv4/IPv6 公共代码:报文输入分发、路由选择与转发 |
mem.c |
堆内存管理器(轻量 malloc 替代) |
memp.c |
内存池管理器:为 PCB、pbuf、netconn 等维护专用内存池 |
netif.c |
网卡接口抽象:注册、地址、启停、链路状态、默认网卡管理 |
pbuf.c |
pbuf 数据包缓冲区管理(分配/引用/拼接/拷贝) |
raw.c |
raw API:应用直接收发自定义 IP 协议报文 |
stats.c |
统计模块实现(LWIP_STATS 开启时编译) |
sys.c |
OS 抽象层辅助实现与默认函数(sys_now 等) |
tcp.c |
TCP 核心:PCB 管理、连接 API、状态机对外接口 |
tcp_in.c |
TCP 收包处理:校验、序号、ACK、窗口、重传与状态推进 |
tcp_out.c |
TCP 发包处理:发送队列、重发、分段封装与校验和 |
timeouts.c |
栈内定时器框架:注册/删除/超时触发(TCP/ARP/DHCP 等使用) |
udp.c |
UDP/UDPLite 实现:PCB 收发与选项 |
4.3 src/core/ipv4 ------ IPv4 协议族
IPv4 地址族的具体实现:IP 收发、ARP、ICMP、IGMP、DHCP、AutoIP/ACD、分片重组。
文件数:9,
| 文件 | 作用 / 含义 |
|---|---|
acd.c |
IPv4 地址冲突检测(RFC5227) |
autoip.c |
AutoIP/APIPA 自动链路本地地址(RFC3927) |
dhcp.c |
DHCPv4 客户端(RFC2131/2132) |
etharp.c |
以太网 ARP:缓存表、请求应答、IP 到以太网帧的输出 |
icmp.c |
ICMPv4 处理(ping 应答与差错) |
igmp.c |
IGMP 组播组成员管理 |
ip4.c |
IPv4 收发主实现(路由、TTL、选项) |
ip4_addr.c |
IPv4 地址工具函数 |
ip4_frag.c |
IPv4 分片与重组 |
4.4 src/core/ipv6 ------ IPv6 协议族
IPv6 地址族的具体实现:IP 收发、邻居发现 ND6、ICMPv6、MLD、DHCPv6、分片重组、Ethernet 输出。
文件数:9,
| 文件 | 作用 / 含义 |
|---|---|
dhcp6.c |
DHCPv6 客户端(目前仅无状态,RFC3736) |
ethip6.c |
IPv6 over Ethernet 输出(用 ND 邻居表解析 MAC) |
icmp6.c |
ICMPv6 处理(RFC4443) |
inet6.c |
提供 socket 兼容变量(如 IPv6 通配地址 in6addr_any) |
ip6.c |
IPv6 收发主实现(路由、扩展头) |
ip6_addr.c |
IPv6 地址工具函数 |
ip6_frag.c |
IPv6 分片与重组 |
mld6.c |
IPv6 组播监听发现 MLD(RFC2710) |
nd6.c |
IPv6 邻居发现与无状态地址自动配置(RFC4861/4862) |
4.5 src/netif ------ 通用网卡驱动(不含 ppp,见下节)
这里放的是"与具体芯片无关"的通用链路层实现:以太网公共处理、SLIP、6LoWPAN、网桥、ZEP。你自己的以太网 MAC 驱动放在工程里,通常只调用这些公共函数。
文件数:8,
| 文件 | 作用 / 含义 |
|---|---|
bridgeif.c |
IEEE 802.1D 二层网桥 netif 实现 |
bridgeif_fdb.c |
网桥转发数据库 FDB(MAC 学习/老化) |
ethernet.c |
以太网公共函数(ethernet_input 分发等) |
lowpan6.c |
6LoWPAN over IEEE 802.15.4 实现 |
lowpan6_ble.c |
6LoWPAN over BLE(RFC7668)实现 |
lowpan6_common.c |
6LoWPAN 公共编解码(IPHC 头压缩、分片) |
slipif.c |
SLIP 串口链路网卡实现 |
zepif.c |
ZEP netif 实现(UDP 隧道 6LoWPAN) |
4.6 src/netif/ppp ------ PPP 协议族实现
源自 pppd 的完整 PPP 实现:串口(PPPoS)、以太网(PPPoE)、L2TP 三种承载,以及 LCP/IPCP/IPv6CP、PAP/CHAP/EAP 等认证和控制协议,还有自带的极简加密库(polarssl)。只用串口 4G 模块拨号时一般只编 pppos 相关文件。
文件数:30,
| 文件 | 作用 / 含义 |
|---|---|
auth.c |
PPP 认证流程与链路状态管理 |
ccp.c |
CCP 压缩控制协议实现 |
chap-md5.c |
CHAP-MD5 认证实现 |
chap-new.c |
CHAP 通用认证框架实现 |
chap_ms.c |
MS-CHAP v1/v2 实现 |
demand.c |
按需拨号(dial-on-demand)支持 |
eap.c |
EAP 认证实现 |
ecp.c |
ECP 加密控制协议实现 |
eui64.c |
EUI-64 工具实现 |
fsm.c |
PPP 子协议通用状态机实现 |
ipcp.c |
IPCP:PPP 上 IPv4 地址协商 |
ipv6cp.c |
IPv6CP:IPv6 地址协商 |
lcp.c |
LCP 链路控制协议实现 |
magic.c |
随机数/魔法数生成实现 |
mppe.c |
MPPE 加密实现 |
multilink.c |
多链路 PPP 支持 |
ppp.c |
PPP 主实现(会话、收发、超时) |
pppapi.c |
PPP 顺序 API 实现(经 tcpip 线程调用) |
pppcrypt.c |
加解密辅助实现(DES 块等) |
pppoe.c |
PPPoE 发现与会话实现 |
pppol2tp.c |
PPPoL2TP 实现 |
pppos.c |
PPP over Serial:串口 HDLC 成帧收发 |
upap.c |
PAP 认证实现 |
utils.c |
PPP 内部工具函数 |
vj.c |
Van Jacobson TCP/IP 头压缩实现 |
polarssl/arc4.c |
RC4 流密码实现 |
polarssl/des.c |
DES 算法实现 |
polarssl/md4.c |
MD4 摘要实现 |
polarssl/md5.c |
MD5 摘要实现 |
polarssl/sha1.c |
SHA-1 摘要实现 |
4.7 src/apps ------ 官方应用层程序
基于 raw API 写的高层应用(很多默认不参与编译,由 lwipopts.h 中的 LWIP_* 宏或文件列表控制):HTTP(S) 服务器/客户端、SNMP、SNTP、mDNS、MQTT、SMTP、TFTP、NetBIOS、iPerf 等。'apps/snmp' 下的 ASN.1、MIB 相关文件按需裁剪。
文件数:49,
| 文件 | 作用 / 含义 |
|---|---|
altcp_tls/altcp_tls_mbedtls.c |
altcp 的 TLS 层实现:用 mbedTLS 为任意 TCP 协议提供 TLS |
altcp_tls/altcp_tls_mbedtls_mem.c |
TLS 会话相关内存分配/释放(可替换为专用内存) |
altcp_tls/altcp_tls_mbedtls_mem.h |
上述 TLS 内存管理函数原型 |
altcp_tls/altcp_tls_mbedtls_structs.h |
TLS 层内部结构体定义(altcp_tls 上下文等) |
http/altcp_proxyconnect.c |
HTTP CONNECT 代理建隧道用的 altcp 起始层 |
http/fs.c |
HTTP 服务器文件系统抽象实现(打开/读/关闭文件) |
http/fsdata.c |
makefsdata 生成的网页数据数组(编译进固件的只读站点) |
http/fsdata.h |
fsdata 数据表头 |
http/http_client.c |
HTTP 客户端实现 |
http/httpd.c |
轻量 HTTP 服务器核心:请求解析、SSI、CGI、文件响应 |
http/httpd_structs.h |
httpd 内部结构体(SSI/CGI 表项等) |
http/makefsdata/makefsdata.c |
主机端工具:把网页目录生成 fsdata.c 数组 |
http/makefsdata/tinydir.h |
极简目录遍历库头文件(makefsdata 使用) |
lwiperf/lwiperf.c |
iPerf 服务器实现(测试 TCP/UDP 吞吐) |
mdns/mdns.c |
mDNS 应答器(RFC6762/6763) |
mdns/mdns_domain.c |
mDNS 域名编解码相关功能 |
mdns/mdns_out.c |
mDNS 报文输出相关功能 |
mqtt/mqtt.c |
MQTT 客户端实现 |
netbiosns/netbiosns.c |
NetBIOS 名称服务应答器 |
smtp/smtp.c |
SMTP 客户端实现(发送邮件) |
snmp/snmp_asn1.c |
ASN.1(BER) 编解码实现 |
snmp/snmp_asn1.h |
ASN.1 编解码 API 头 |
snmp/snmp_core.c |
SNMP 核心:MIB 节点树构造与访问 |
snmp/snmp_core_priv.h |
SNMP 核心内部头 |
snmp/snmp_mib2.c |
MIB-II(RFC1213) 总实现与注册入口 |
snmp/snmp_mib2_icmp.c |
MIB-II 的 ICMP 组对象 |
snmp/snmp_mib2_interfaces.c |
MIB-II 的 interfaces 组对象 |
snmp/snmp_mib2_ip.c |
MIB-II 的 IP 组对象 |
snmp/snmp_mib2_snmp.c |
MIB-II 的 SNMP 组对象 |
snmp/snmp_mib2_system.c |
MIB-II 的 system 组对象 |
snmp/snmp_mib2_tcp.c |
MIB-II 的 TCP 组对象 |
snmp/snmp_mib2_udp.c |
MIB-II 的 UDP 组对象 |
snmp/snmp_msg.c |
SNMP 报文解析与构造(RFC1157) |
snmp/snmp_msg.h |
SNMP 报文处理内部结构头 |
snmp/snmp_netconn.c |
基于 netconn 的 SNMP agent 传输实现(多线程模式) |
snmp/snmp_pbuf_stream.c |
pbuf 上的流式位/字节读写工具 |
snmp/snmp_pbuf_stream.h |
上述 pbuf 流工具 API |
snmp/snmp_raw.c |
基于 raw API 的 SNMP agent 主实现(单线程模式) |
snmp/snmp_scalar.c |
SNMP 标量节点 MIB 实现辅助 |
snmp/snmp_snmpv2_framework.c |
SNMPv2-MIB framework 组对象 |
snmp/snmp_snmpv2_usm.c |
SNMPv2 USM 组对象(用户安全模型) |
snmp/snmp_table.c |
SNMP 表节点 MIB 实现辅助 |
snmp/snmp_threadsync.c |
MIB 访问与核心线程间的同步封装(多线程模式) |
snmp/snmp_traps.c |
Trap 报文发送实现 |
snmp/snmpv3.c |
SNMPv3 安全功能(RFC3414/3826) |
snmp/snmpv3_mbedtls.c |
SNMPv3 加解密/认证函数(mbedTLS 实现) |
snmp/snmpv3_priv.h |
SNMPv3 内部接口头 |
sntp/sntp.c |
SNTP 客户端实现(网络校时) |
tftp/tftp.c |
TFTP 客户端与服务端共用实现(RFC1350) |
4.8 include/compat ------ POSIX 兼容头
让已有的 POSIX 网络程序(#include <sys/socket.h>、<netdb.h>、<arpa/inet.h> 等)能不改代码地链接到 lwIP。
文件数:5,
| 文件 | 作用 / 含义 |
|---|---|
posix/netdb.h |
POSIX 兼容头:包装 lwip/netdb.h |
posix/arpa/inet.h |
POSIX 兼容头:把 arpa/inet.h 映射到 lwip/inet.h |
posix/net/if.h |
POSIX 兼容头:把 net/if.h 映射到 lwip/if_api.h |
posix/sys/socket.h |
POSIX 兼容头:使 #include <sys/socket.h> 映射到 lwip socket API |
stdc/errno.h |
POSIX 兼容头:errno 支持(LWIP_PROVIDE_ERRNO 时提供) |
4.9 include/lwip ------ 公共头文件(主头)
应用程序主要 include 的就是这些:xxx.h 与 src/core、src/api 里的同名 .c 一一对应,是"对外 API";prot/ 是纯报文格式定义;priv/ 是仅供栈内部使用的实现头。
文件数:53,
| 文件 | 作用 / 含义 |
|---|---|
acd.h |
ACD 地址冲突检测 API |
altcp.h |
altcp 分层 TCP 通用 API |
altcp_tcp.h |
altcp 基于 TCP 的底层实现 API |
altcp_tls.h |
altcp TLS 层 API(实现见 src/apps/altcp_tls) |
api.h |
netconn API(顺序 API 头文件) |
arch.h |
平台/编译器抽象头:大小端常量,并包含 arch/cc.h |
autoip.h |
AutoIP API |
debug.h |
调试基础设施:LWIP_DEBUGF、断言等宏 |
def.h |
通用宏与工具(大小端转换、字符串、取值宏等) |
dhcp.h |
DHCPv4 API |
dhcp6.h |
DHCPv6 API |
dns.h |
DNS 解析 API |
err.h |
err_t 错误码定义与接口 |
errno.h |
POSIX errno 兼容定义 |
etharp.h |
以太网 ARP API(驱动与栈调用) |
ethip6.h |
IPv6-over-Ethernet 输出 API |
icmp.h |
ICMPv4 API |
icmp6.h |
ICMPv6 API |
if_api.h |
接口识别 API(RFC3493) |
igmp.h |
IGMP API |
inet.h |
POSIX inet 兼容声明(inet_addr/ntoa/pton 等) |
inet_chksum.h |
校验和计算 API |
init.h |
lwip_init 与版本 API |
ip.h |
IP 层公共 API(v4/v6 分发与路由) |
ip4.h |
IPv4 API |
ip4_addr.h |
IPv4 地址 API |
ip4_frag.h |
IPv4 分片重组 API |
ip6.h |
IPv6 API |
ip6_addr.h |
IPv6 地址 API |
ip6_frag.h |
IPv6 分片重组 API |
ip6_zone.h |
IPv6 地址作用域 zone(RFC4007) |
ip_addr.h |
统一 ip_addr_t(v4/v6 双栈抽象) |
mem.h |
堆内存 API(mem_malloc/free) |
memp.h |
内存池 API(memp_malloc/free) |
mld6.h |
MLD6 API |
nd6.h |
ND6 API |
netbuf.h |
netbuf API |
netdb.h |
NETDB API(主机名解析) |
netif.h |
netif API(TCPIP 线程内使用) |
netifapi.h |
netif 顺序 API(其他线程安全使用) |
opt.h |
lwIP 全部默认配置项(lwipopts.h 覆盖这里) |
pbuf.h |
pbuf API |
raw.h |
raw API 头 |
sio.h |
串行 I/O 抽象 API(pppos 等使用) |
snmp.h |
SNMP 相关 netif 接入与统计 API |
sockets.h |
socket API 头(lwip_ 前缀函数) |
stats.h |
统计 API 头 |
sys.h |
OS 抽象 API(邮箱/信号量/互斥/线程/时间) |
tcp.h |
TCP raw API 头 |
tcpbase.h |
TCP 基础常量(tcp 与 altcp 共用) |
tcpip.h |
tcpip 线程同步 API(tcpip_callback 等) |
timeouts.h |
定时器 API(sys_timeout 等) |
udp.h |
UDP raw API 头 |
4.10 include/lwip/priv ------ 内核私有头
头文件注释里都写明"do not use in application code",应用工程不要直接包含它们。
文件数:10,
| 文件 | 作用 / 含义 |
|---|---|
altcp_priv.h |
altcp 内部实现头(勿在应用代码使用) |
api_msg.h |
netconn API 内部消息结构与实现(勿在应用代码使用) |
mem_priv.h |
内存内部实现(勿在应用代码使用) |
memp_priv.h |
内存池内部实现(勿在应用代码使用) |
memp_std.h |
全部内存池的声明清单(被重复包含以生成池) |
nd6_priv.h |
ND6 内部实现头 |
raw_priv.h |
raw API 内部实现头 |
sockets_priv.h |
socket API 内部实现头 |
tcp_priv.h |
TCP 内部实现头(协议控制块等) |
tcpip_priv.h |
tcpip 线程内部实现头 |
4.11 include/lwip/prot ------ 线协议格式定义
只定义各协议在网线上传输的报文/头结构(packed),不含 API。wire 结构统一 1 字节紧凑对齐。
文件数:19,
| 文件 | 作用 / 含义 |
|---|---|
acd.h |
ACD 线协议格式(报文结构体) |
autoip.h |
AutoIP 协议格式定义 |
dhcp.h |
DHCP 协议报文格式定义 |
dhcp6.h |
DHCPv6 协议格式定义 |
dns.h |
DNS 报文格式定义 |
etharp.h |
ARP 报文格式定义 |
ethernet.h |
以太网帧格式定义 |
iana.h |
IANA 分配的号码(协议号、端口等) |
icmp.h |
ICMPv4 报文格式定义 |
icmp6.h |
ICMPv6 报文格式定义 |
ieee.h |
IEEE 分配的号码(OUI 等) |
igmp.h |
IGMP 报文格式定义 |
ip.h |
IP 公共协议格式定义 |
ip4.h |
IPv4 报文头格式定义 |
ip6.h |
IPv6 报文头格式定义 |
mld6.h |
MLD6 报文格式定义 |
nd6.h |
ND6 报文格式定义 |
tcp.h |
TCP 报文头与选项格式定义 |
udp.h |
UDP 报文头格式定义 |
4.12 include/lwip/apps ------ 应用层头文件
与 src/apps 下的同名应用对应,另含每类应用的 *_opts.h 配置头。
文件数:35,
| 文件 | 作用 / 含义 |
|---|---|
altcp_proxyconnect.h |
HTTP 代理 CONNECT 的 altcp 层 API |
altcp_tls_mbedtls_opts.h |
mbedTLS TLS 层配置项(LWIP_ALTCP_TLS_MBEDTLS_*) |
fs.h |
HTTP 服务器文件系统抽象接口(fs_open/read/close 等) |
http_client.h |
HTTP 客户端 API |
httpd.h |
HTTP 服务器 API |
httpd_opts.h |
HTTP 服务器配置项 |
lwiperf.h |
iPerf 服务器 API |
mdns.h |
mDNS 应答器 API |
mdns_domain.h |
mDNS 域名相关 API |
mdns_opts.h |
mDNS 配置项 |
mdns_out.h |
mDNS 输出相关内部 API |
mdns_priv.h |
mDNS 私有定义头 |
mqtt.h |
MQTT 客户端 API |
mqtt_opts.h |
MQTT 配置项 |
mqtt_priv.h |
MQTT 内部接口头 |
netbiosns.h |
NetBIOS 应答器 API |
netbiosns_opts.h |
NetBIOS 配置项 |
smtp.h |
SMTP 客户端 API |
smtp_opts.h |
SMTP 配置项 |
snmp.h |
SNMP agent 主 API(启动与基础配置) |
snmp_core.h |
SNMP 核心 API(实现自定义 MIB) |
snmp_mib2.h |
SNMP MIB2 API |
snmp_opts.h |
SNMP 配置项 |
snmp_scalar.h |
SNMP 标量节点实现辅助 API |
snmp_snmpv2_framework.h |
SNMPv2-MIB framework 组声明 |
snmp_snmpv2_usm.h |
SNMPv2 USM 组声明 |
snmp_table.h |
SNMP 表节点实现辅助 API |
snmp_threadsync.h |
SNMP 线程同步节点 API |
snmpv3.h |
SNMPv3 API |
sntp.h |
SNTP 客户端 API |
sntp_opts.h |
SNTP 配置项 |
tftp_client.h |
TFTP 客户端接口头 |
tftp_common.h |
TFTP 公共类型与常量 |
tftp_opts.h |
TFTP 配置项 |
tftp_server.h |
TFTP 服务端接口头 |
4.13 include/netif ------ 通用网卡头文件
与 src/netif 的实现对应;其中 ethernet.h、etharp.h 是写以太网驱动时最常 include 的。
文件数:11,
| 文件 | 作用 / 含义 |
|---|---|
bridgeif.h |
802.1D MAC 桥接 netif API |
bridgeif_opts.h |
网桥 netif 配置项 |
etharp.h |
兼容头:ARP 已迁至 core/ipv4,仅保留 include |
ethernet.h |
以太网公共函数(ethernet_input 等),驱动把整帧交给它分发 |
ieee802154.h |
IEEE 802.15.4 MAC 帧定义 |
lowpan6.h |
6LoWPAN over 802.15.4 API |
lowpan6_ble.h |
6LoWPAN over BLE(RFC7668)API |
lowpan6_common.h |
6LoWPAN 公共例程头 |
lowpan6_opts.h |
6LoWPAN 配置项 |
slipif.h |
SLIP 网卡 API |
zepif.h |
ZEP(ZigBee 封装协议,UDP 隧道 6LoWPAN)netif API |
4.14 include/netif/ppp ------ PPP 头文件
对应 src/netif/ppp。ppp_opts.h 集中 PPP 配置,其余是各子协议与加密算法头。
文件数:29,
| 文件 | 作用 / 含义 |
|---|---|
ccp.h |
CCP 压缩控制协议头 |
chap-md5.h |
CHAP-MD5 认证头 |
chap-new.h |
CHAP 通用认证框架头 |
chap_ms.h |
MS-CHAP 认证头 |
eap.h |
EAP 认证头 |
ecp.h |
ECP 加密控制协议头 |
eui64.h |
EUI-64 工具头 |
fsm.h |
子协议通用状态机(FSM)头 |
ipcp.h |
IPCP(IPv4 地址协商)头 |
ipv6cp.h |
IPv6CP(IPv6 地址协商)头 |
lcp.h |
LCP 链路控制协议头 |
magic.h |
随机数/魔法数工具头 |
mppe.h |
MPPE 加密头 |
ppp.h |
PPP 顶层 API(会话建立/配置/关闭) |
ppp_impl.h |
PPP 内部实现头(状态机与函数声明) |
ppp_opts.h |
PPP 全部配置项 |
pppapi.h |
PPP 顺序 API 头(多线程模式) |
pppcrypt.h |
加解密辅助函数头 |
pppdebug.h |
PPP 调试输出宏 |
pppoe.h |
PPP over Ethernet 接口头 |
pppol2tp.h |
PPP over L2TP 接口头 |
pppos.h |
PPP over Serial 接口头 |
upap.h |
PAP 认证协议头 |
vj.h |
Van Jacobson 头压缩头 |
polarssl/arc4.h |
RC4 流密码头 |
polarssl/des.h |
DES 算法头 |
polarssl/md4.h |
MD4 摘要头 |
polarssl/md5.h |
MD5 摘要头 |
polarssl/sha1.h |
SHA-1 摘要头 |
5. 附录:参考资料与常用宏速查
5.1 仓库内可参考的资料
| 位置 | 内容 |
|---|---|
doc/doxygen/output/index.html |
lwIP 官方 Doxygen 文档(本仓库已生成,浏览器打开即可) |
doc/NO_SYS_SampleCode.c |
无操作系统最小使用示例(raw API) |
doc/ZeroCopyRx.c |
零拷贝接收的说明与示例 |
doc/ppp.txt、doc/mdns.txt、doc/mqtt_client.txt |
PPP、mDNS、MQTT 使用说明 |
src/include/lwip/opt.h |
全部配置宏的权威注释(字典) |
src/Filelists.cmake / Filelists.mk |
官方源文件分组与静态库定义 |
contrib/ports/{unix,win32,freertos} |
三套完整移植,可对照抄 |
contrib/examples/ethernetif |
网卡驱动编写模板 |
contrib/examples/example_app |
可直接跑的示例应用与配置样例 |
5.2 核心目录速查
| 目标 | 先看 |
|---|---|
| 想懂数据包怎么走 | src/core/pbuf.c + src/core/netif.c + src/core/ip.c |
| 想写 TCP 应用 | src/include/lwip/tcp.h + src/core/tcp.c |
| 想写 UDP 应用 | src/include/lwip/udp.h + src/core/udp.c |
| 想用 socket | src/include/lwip/sockets.h + src/api/sockets.c + include/compat/posix |
| 想调内存 | src/include/lwip/mem.h、memp.h、pbuf.h + 对应 core 实现 |
| 想写网卡驱动 | src/include/netif/ethernet.h + core/ipv4/etharp.c + 3.6 节清单 |
| 想做无系统裸机 | doc/NO_SYS_SampleCode.c |
| 想裁剪配置 | src/include/lwip/opt.h + 你自己的 lwipopts.h |