USB网络控制通讯NCM
+ -

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. 接收端处理逻辑

  1. 顺序解析

    • 接收方必须从 NDP 的第一个条目开始 按顺序 处理数据报指针条目。
    • 遇到第一个 Null 条目时,立即停止解析,并忽略该 NDP 中后续所有条目(即使后续条目非零)。
  2. 终止符强制要求

    • 规范要求每个 NDP 必须以一个 Null 条目结束(见 3.3.1 和 3.3.2 节)。
    • 发送方错误:若 NDP 未以 Null 条目终止,接收方 可选择丢弃整个 NDP 及其关联的所有数据帧(视为格式错误)。
  3. 全零 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
  • 解析
    1. 处理第一个条目:有效(Index=0x000C, Length=0x0100)。
    2. 处理第二个条目: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 可用于流量控制(如设备暂无可发数据时返回空响应)。

此规则通过明确的终止语义,平衡了协议灵活性与鲁棒性。

0 篇笔记 写笔记

关注公众号
  • HID人机交互
  • Linux&USB
  • UAC音频
  • TYPE-C
  • USB规范
  • USB大容量存储
  • USB百科
  • USB网络控制通讯NCM
  • USB周边
  • UVC摄像头
  • Windows系统USB
  • 音视频博客
  • 取消
    感谢您的支持,我会继续努力的!
    扫码支持
    扫码打赏,你说多少就多少

    打开支付宝扫一扫,即可进行扫码打赏哦

    您的支持,是我们前进的动力!