NCM数据报指针条目中的 Null 条目处理规则
2025-07-07
0
0
1. Null 条目的定义
任何 NCM 数据报指针条目(NDP16 或 NDP32)满足以下条件之一时,被视为 Null 条目:
- 索引字段为零:
wDatagramIndex
(NDP16)或dwDatagramIndex
(NDP32)为0
。
- 长度字段为零:
wDatagramLength
(NDP16)或dwDatagramLength
(NDP32)为0
。
- 两者均为零:
- 索引和长度字段同时为
0
。
- 索引和长度字段同时为
2. 接收端处理逻辑
顺序解析:
- 接收方必须从 NDP 的第一个条目开始 按顺序 处理数据报指针条目。
- 遇到第一个 Null 条目时,立即停止解析,并忽略该 NDP 中后续所有条目(即使后续条目非零)。
终止符强制要求:
- 规范要求每个 NDP 必须以一个 Null 条目结束(见 3.3.1 和 3.3.2 节)。
- 发送方错误:若 NDP 未以 Null 条目终止,接收方 可选择丢弃整个 NDP 及其关联的所有数据帧(视为格式错误)。
全零 NDP 的特殊情况:
- 发送方允许发送一个 格式合法但所有指针条目均为零 的 NDP(即仅含 Null 条目)。
- 接收方应 忽略此类 NTB(不触发错误,但也不处理数据)。
3. 设计意图与典型场景
- 提前终止:
Null 条目允许发送方动态结束有效条目列表(例如实际数据报数量少于预分配的条目空间)。 - 错误恢复:
强制终止符确保接收方能安全检测格式错误,避免解析越界内存。 - 空传输兼容性:
全零 NDP 提供一种显式的“无数据”信号(类似空报文)。
4. 示例
合法 NDP16 结构(含终止符)
NCM0签名 | 长度=0x0010 | NextNdp=0 | Index[0]=0x000C | Length[0]=0x0100 | Index[1]=0x0000 | Length[1]=0x0000
- 解析:
- 处理第一个条目:有效(
Index=0x000C
,Length=0x0100
)。 - 处理第二个条目:Null(
Index=0
),停止解析。
- 处理第一个条目:有效(
非法 NDP32(无终止符)
ncm1签名 | 长度=0x0020 | Reserved=0 | Index[0]=0x0010 | Length[0]=0x0200 | Index[1]=0x0110 | Length[1]=0x0200
- 行为:
接收方可能丢弃整个 NDP(因缺少终止符)。
5. 开发者注意事项
- 发送方必须:
- 始终在 NDP 末尾显式添加 Null 条目(即使预分配空间未用完)。
- 接收方建议:
- 实现严格的格式校验,对无终止符的 NDP 记录错误日志。
- 性能优化:
- 全零 NDP 可用于流量控制(如设备暂无可发数据时返回空响应)。
此规则通过明确的终止语义,平衡了协议灵活性与鲁棒性。