lwIP 2.2.1源码结构与移植

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.shcodespell_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->inputsys_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_ORDERLWIP_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_newsys_mutex_*sys_sem_*sys_mbox_*sys_initsys_arch_protect(可选)。FreeRTOS 见 contrib/ports/freertos/sys_arch.c
配置头 lwipopts.h(放在你的 include 路径最前面) 覆盖 src/include/lwip/opt.h 的默认值,决定裁剪/使能哪些协议、内存多大、开不开调试。参考 contrib/examples/example_app/lwipcfg.h.exampletest/unit/lwipopts.h
网卡驱动 你自己写的 xxxif.c + netif 注册 实现 initlinkoutput(发一帧),必要时 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 为例)

  1. 初始化函数里填 netifhwaddr_len=6hwaddr[]mtuflagsNETIF_FLAG_BROADCAST|NETIF_FLAG_ETHARP|NETIF_FLAG_LINK_UP...),output=etharp_outputlinkoutput=低层发送函数
  2. 收包:驱动中断/轮询拿到一帧 -> pbuf_alloc(PBUF_RAW, 长度+ETH_PAD, PBUF_POOL) 填入数据 -> 交给 netif->input(NO_SYS)或 tcpip_input
  3. 发包:在 linkoutput 里遍历 pbuf 链调用 DMA/寄存器发送,注意 pbuf 可能非连续。
  4. 链路插拔:LWIP_NETIF_LINK_CALLBACK 打开后调 netif_set_link_up/down,并在 status 回调里处理。
  5. 参考现成骨架: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_SIZEPBUF_POOL_SIZEMEMP_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.txtdoc/mdns.txtdoc/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.hmemp.hpbuf.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
相关推荐
Titan20241 小时前
网络基础:传输层协议知识梳理
linux·服务器·网络
TechWayfarer1 小时前
做IP归属地查询时总是查不准?IP纯净度检测实战:从“查归属地“到识别“脏IP“的四个维度
服务器·网络·python·tcp/ip·安全·web安全
盛世宏博智慧档案3 小时前
跨地域组网:总部与分公司传感器数据统一汇聚方案
网络·以太网温湿度传感器
2401_891957313 小时前
NAT、代理服务、内网穿透和内网打洞
网络·智能路由器
XR1234567883 小时前
医院基础网络改造升级选型深度解析
开发语言·网络·php
2401_868534783 小时前
网规备考_5.5 IDS与IPS的原理及应用
网络·安全
hanbon4 小时前
DeepSeek能不能直接写技术标目录?先拆点再润色
网络·ai写标书·评分表·目录确认
Jae den4 小时前
什么是反向代理?
服务器·网络
云絮.4 小时前
网络原理 ----TCP
服务器·网络·tcp/ip