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 包传输 (命令/通知优先)
- 详细流量控制机制见 链路层描述