路由¶
XGL 使用 16-bit 节点地址。本地 source_id 不得为 0 或
XGL_BROADCAST_ID (0xFFFF)。收到的 frame 在 source 为 0、source 为
broadcast,或 source 等于 target 且 target 不是 broadcast 时会被拒绝。
target_id 可以是本地节点、远端节点或 XGL_BROADCAST_ID。
TODO(xgen-link): confirm broadcast/multicast address policy beyond
XGL_BROADCAST_ID.
Route Table¶
每个 route 绑定:
target_id- PHY callbacks
max_frame_sizeread_freq_hz- metric
转发前必须检查 route MTU。超过 max_frame_size 的帧应返回 XGL_ERR_BUFFER_TOO_SMALL 并丢弃。
路由决策顺序¶
- 检查 frame 是否目标为本地节点。
- 如果本地,交给 transport。
- 如果不是本地,检查 TTL。
- 查找
target_id对应 route。 - 检查完整 frame 长度不超过 route MTU。
- 更新 TTL,并重算 header/frame CRC。
- 调用 egress PHY。
决策表¶
| 输入条件 | 决策 | 错误/计数行为 | 证据 |
|---|---|---|---|
source_id == 0 |
丢弃 | XGL_ERR_INVALID_PARAM,RX drop count |
src/network/xgl_network.c, src/network/xgl_network_receive.c |
source_id == XGL_BROADCAST_ID |
丢弃 | XGL_ERR_INVALID_PARAM,RX drop count |
src/network/xgl_network.c |
source_id == target_id 且 target 不是 broadcast |
丢弃 | XGL_ERR_INVALID_PARAM,RX drop count |
src/network/xgl_network.c |
target_id == local_id |
本地交付给 transport | 增加 network RX stats | src/network/xgl_network_receive.c |
target_id == XGL_BROADCAST_ID |
本地交付给 transport | xgl_network_is_local() 视为本地 |
include/xgl/internal/xgl_network.h |
| 远端 target 且 route 缺失 | 丢弃 | XGL_ERR_ROUTE_NOT_FOUND,RX drop count,error callback |
src/network/xgl_network_receive.c, test/test_network.cpp |
远端 target 且 ttl <= 1 |
丢弃 | XGL_ERR_TTL_EXPIRED,RX drop count,error callback |
src/network/xgl_network_receive.c, test/test_network.cpp |
| 远端 target 且 frame 超过 route MTU | 丢弃 | XGL_ERR_BUFFER_TOO_SMALL,RX drop count |
src/network/xgl_network_receive.c, test/test_network.cpp |
| 远端 target、route 存在、TTL 合法、MTU 适配 | 转发 | 递减 TTL,重算 header CRC 和 frame CRC,调用 route PHY TX | src/network/xgl_network_receive.c, test/test_network.cpp |
TTL¶
TTL 每转发一跳递减。非本地包在 ttl <= 1 时返回 XGL_ERR_TTL_EXPIRED,不得继续转发;因此成功转发离开本节点时 ttl >= 1。
认证帧在 TTL 变化时保留原始端到端 tag。转发路径只更新 TTL 和 CRC 字段;认证仍然有效,因为逐跳可变字段会从 canonical AAD 中排除。
交付路径¶
- 目标为本地节点:交给 transport。
- 目标为其他节点:查 route 并转发。
- broadcast/multicast:地址段保留,第一阶段不作为可靠单播路径。
多 PHY 注意事项¶
每个 PHY 的 read_freq_hz 可以不同。xgl_run() 会轮询 route,并结合 transport/reassembly deadline 给出下一次唤醒时间。低功耗系统不应为了一个慢速 PHY 固定高频唤醒整个协议栈。