结论:Tesla panda 安全模式的优先级不是「谁能发」而是「谁优先」:启动时先假定 Autopark/Summon 活跃并拒绝所有主机 Tesla 候选帧;原车 LKAS 锁存时把 0x488 从主机 TX 切回原车透传;原车 AEB 活跃时恢复 0x2B9 透传并拒绝主机取消帧。因此「白名单里有某地址」不等于该地址的每个字段都经过逐信号安全校验。
RX 完整性:9 类监视帧与校验
tesla_model3_y_rx_checks 含 9 类帧:相机总线 2 的 0x2B9/0x488,主总线 0 的 DI 速度、ESP 第二车速、EPAS 状态、油门、刹车、DI 巡航/Autopark 和 UI 警告。各自配置地址、长度、名义频率及计数上限;仅 ESP 轮速和刹车未忽略质量位。UI 警告进入通用 RX 健康监控,但 tesla_rx_hook() 并无对应的状态提取分支。
共享 safety_rx_hook() 先验证校验/计数/质量位,再对命中且有效的帧运行车型钩子;坏 RX 帧不可当作有效的原车 AEB/LKAS 状态更新。校验按地址选择校验字节,计算地址两字节与其它载荷字节的 8 位和。
| 函数 | 责任 |
|---|---|
tesla_get_counter() |
按地址从不同字节/位域取得 3 或 4 位计数器。 |
tesla_get_checksum_byte()、tesla_get_checksum()、tesla_compute_checksum() |
按地址选择校验字节,计算地址两字节与其它载荷字节的 8 位和。 |
tesla_get_quality_flag_valid() |
0x155 ESP 轮速质量位必须为 1;0x145 制动状态不能为未初始化或故障编码。 |
tesla_rx_hook() |
更新角度/接管、DI/ESP 双车速、踏板、巡航、Autopark、原车 AEB/LKAS 锁存。 |
tesla_init() |
选择默认或调试纵向 TX 表,重置原车辅助状态,并在启动时先假定 Autopark/Summon 活跃。 |
原车状态锁存:Autopark、LKAS 与 AEB 的上升沿
tesla_rx_hook() 的 DI 主车速与 0x155 ESP 第二车速按不同原始编码解码;后者经 speed_mismatch_check() 比较,差超过 2 m/s 时撤销控制许可。0x370 EPAS 角度进入采样窗口;高等级手握或特定高角速度故障置 steering_disengage,由共享接管逻辑消费。两速度帧及 EPAS 帧异步到达,静态代码不保证共时。
0x286 的 Autopark 活跃编码包括 3、4、9;只有在原车巡航未接合的上升沿才锁存 tesla_autopark,状态退出时清除。随后的原车巡航状态须再与 !tesla_autopark 合取后送 pcm_cruise_check()。0x488 相机报文仅在自身 LKAS 状态上升沿且 controls_allowed=false 时锁存原车 LKAS;状态消失时清除。0x2B9 相机报文的 AEB 活动位则直接更新 tesla_stock_aeb。插件必须保留三种原车状态的来源、有效性和时间信息,不可只发布合并后的「辅助驾驶占用」布尔量。
TX 与转发优先级矩阵
| 条件 | 主机 TX | 相机总线 2 到主总线 0 |
|---|---|---|
| 初始化后尚未收到解除 Autopark 的 0x286,或锁存的 Autopark 活跃 | tesla_tx_hook() 拒绝所有 Tesla 候选帧 |
车型动态钩子不阻断 0x488/0x27D/0x2B9,允许原车路径继续。 |
| 普通非 Autopark、原车 LKAS 未锁存 | 0x488 可在角度/控制类型许可下发送 | 0x488 与 0x27D 被 tesla_fwd_hook() 阻断。 |
| 原车 LKAS 已锁存 | 0x488 被车型 TX 钩子拒绝 | 0x488 透传给主总线。 |
| 默认原车纵向 | 0x2B9 仅允许无执行量的 ACC_CANCEL_GENERIC_SILENT,且不得宣称 AEB 事件 |
0x2B9 一直透传;原车 AEB 活跃时主机取消帧也被拒绝。 |
ALLOW_DEBUG 且纵向参数位置位 |
0x2B9 可按加速度限值发送,仍禁止主机 AEB 事件 | 无原车 AEB 时阻断原车 0x2B9;原车 AEB 活跃时恢复透传并拒绝主机 0x2B9。 |
tesla_tx_hook() 对 0x488 只接受控制类型 NONE 或 ANGLE_CONTROL,并用车辆模型参数限制 0.1 度转角及横向动力学;原车 LKAS 锁存时即使数值合规仍拒绝。0x2B9 禁止主机设置任何 AEB 事件;默认模式仅可送加速度上下限均为中性 375 的取消编码。调试纵向模式的原始加速度范围为 288–425,中性为 375;两端都低于中性时额外拒绝,以防静止后倒车风险。
白名单不等于逐信号校验:0x27D 的边界
tesla_init() 的两个 TX 表都含 0x488、0x2B9、0x27D/总线 0。0x488 与 0x27D 保留 check_relay=true,但设 disable_static_blocking=true,因此共享 safety_fwd_hook() 不会先把它们恒定阻断,留给 Tesla 的动态钩子选择透传。默认模式的 0x2B9 check_relay=false;纵向模式则为 true 但仍关闭静态阻断。
关键在于 0x27D 没有 Tesla TX 载荷分支:非 Autopark 时,它只经过通用地址/总线/长度、继电器状态和车型总阻断门,不能据此认定各字段经过逐信号安全校验。
证据与新硬件边界
test_tesla.py 包含校验/计数、速度失配、制动质量位、驾驶员接管、Autopark、原车 LKAS/AEB 透传、转角和倒车限制用例;其测试库默认加 ALLOW_DEBUG。新增的本机转发矩阵探针在严格编译和 UBSan 下分别运行 release/debug 变体,两者均通过:核对启动 Autopark 阻断、普通/原车 LKAS 转向透传,以及调试纵向和原车 AEB 的 0x2B9 转发切换。但它只设置隔离状态并检查通用 safety 函数,没有覆盖真实 RX 报文时序、目标编译器、板级继电器或 ECU 接受。
自制硬件与插件化重构应把固件构建类型、Tesla 平台/转向控制字段代际、CAN 来源、车辆模型参数和安全参数版本绑定。感知/控制插件只能提供候选角度或加速度;Autopark、原车 LKAS/AEB 优先权、双车速、质量位与故障降级仍须由独立受信任安全层执行。
常见问题
为什么启动时会拒绝所有主机 Tesla 候选帧?
因为 tesla_init() 在启动时先假定 Autopark/Summon 活跃,在收到解除 Autopark 的 0x286 之前,tesla_tx_hook() 会拒绝所有 Tesla 候选帧;Autopark 锁存活跃时同样如此。
原车 LKAS 锁存后,0x488 还能由主机发送吗?
不能。原车 LKAS 已锁存时 0x488 被车型 TX 钩子拒绝,主总线方向则改为把 0x488 透传给主总线。普通非 Autopark 且原车 LKAS 未锁存时,0x488 才可在角度/控制类型许可下发送。
0x27D 在白名单里是否代表它经过逐信号校验?
不代表。0x27D 没有 Tesla TX 载荷分支;非 Autopark 时它只经过通用地址/总线/长度、继电器状态和车型总阻断门,不能据此认定各字段经过逐信号安全校验。
原车 AEB 活跃时 0x2B9 会怎样处理?
原车 AEB 活跃时恢复 0x2B9 透传并拒绝主机 0x2B9;默认原车纵向模式下,主机侧 0x2B9 仅允许无执行量的 ACC_CANCEL_GENERIC_SILENT,且不得宣称 AEB 事件。
延伸阅读
- 从使能到车轮:执行链上的八道门,以及它们各自不保证什么 —— 说明安全模式只是执行链上的一环。
- panda 故障寄存器与配置契约 —— 对照另一类固件侧许可与状态。
- GM panda 安全模式 —— 与 Tesla 的原车辅助优先权设计对照。
- Subaru Global panda 安全模式 —— 另一品牌的安全模式分层写法。
- panda USB 分片重组 —— 承接安全钩子之前的传输层边界。
参考资料
- 项目 02 ——
openpilot-research/TESLA_PANDA_SAFETY_MODE_DEEP_DIVE.md(取用了 RX 监视帧、原车状态锁存、TX 与转发优先级矩阵及证据边界)。 - 项目 02 ——
openpilot-research/FORD_PANDA_SAFETY_MODE_DEEP_DIVE.md(仅用于对照品牌安全模式的通用分发结构)。
说明:本文为对固定源码快照的静态结构分析,未运行完整测试套件、未连接硬件、未验证目标车型的真实参数组合。文中所有阈值、行号索引与配置均出自源文档,标注为未验证的结论保留其原有边界。
更新记录
首次发布 2026-10-11 最近核对:2026-10-11