跳转至

IP包指令

对应源码: components/airlink/src/luat_airlink_cmds.c, components/airlink/src/luat_airlink_cmds.c

这是联网类通信必须支持的指令, 指令 id 只有 0x100. 用于 IP/MAC 包透传, 是 AirLink 实现 "WiFi SoC 通过 4G 模组上网" 的核心.

包结构

data 字段只分 2 部分:

字段 长度 含义
adapter_id 1B 网络适配器 (网卡) id, 范围 0-15 (LUAT_AIRLINK_MAX_ADAPTERS = 16)
payload NB IP 数据包 或 MAC 数据包

IP 数据包的长度, 由指令层的通用长度字段来限定, 一般限制在 1500 字节, 最高到 1560 字节.

数据类型

虽然叫 "IP包" 指令, 实际允许传输 IP 包、MAC 包, 取决于两端的网卡类型:

网卡类型 实际传输
带 MAC 的以太网类型网卡 以太网 MAC 包: 14 字节以太网头部 + IP 数据
点对点网卡 (无 MAC) 纯 IP 包

IP 包不具体区分 IPv4 和 IPv6, 协议层透明.

包数据处理

客户端 (数据发送)

数据来源通常是 lwip 的 netif->lowlevelout 函数, 对外数据的 pbuf 被 airlink 代码拦截, 转发到任务层:

lwip netif -> lowlevelout -> airlink hook -> luat_airlink_queue_send_ippkg
                                                    ↓
                                            SPI/UART 物理层

服务端 (数据接收)

数据接收后, 根据 adapter_id 挑选合适的 netdrv/lwip, 在 LWIP 线程 内投递到 netif->input:

SPI/UART 物理层 -> airlink task -> 解出 adapter_id + payload
                                          ↓
                                    LWIP 线程
                                          ↓
                                    netif->input

注意: 为了实现多网融合, 在模块端通常还会先经过 NAPT 层的改写 (源/目的地址转换), 然后再推入任务层.

多网卡支持

  • LUAT_AIRLINK_MAX_ADAPTERS = 16 (components/airlink/include/luat_airlink_transport.h)
  • 每个 adapter_id 可以绑定到不同的 transport slot (SPI master/slave/UART), 通过 airlink.bindTransport(adapter_id, mode) 配置
  • 多出口模式下 IP 包可以同时走多个物理通道, 实现负载均衡或冗余

包大小限制

限制
单包上限 (推荐) 1500 字节
单包上限 (链路层硬限) 1550 字节
超过处理 直接抛弃

流量控制

IP 包的优先级最低:

  • flags.mem_is_high 标志影响 — 内存紧张时对端应停止下发 IP 包
  • 不影响非 IP 包传输 (命令/通知优先)
  • 详细流量控制机制见 链路层描述
问一下 AI