Skip to content

MDD Sim Gateway v1.3.15

Choose a tag to compare

@github-actions github-actions released this 20 Aug 09:49
· 55 commits to main since this release
v1.3.15
e633b05

修复:经调制解调器桥接的线路可能无法注册

如果某条线路的 SIM 是通过 modem 桥(VPCD)访问的,重建引擎镜像后该线路可能再也注册不上,表现为每两分钟重建一次,而每次隧道都正常建立——因此故障看起来与出口节点无关,却也没有任何信息指向真正的原因。

起因是 1.3.13 引入的读卡器绑定校验。它读取 EF.ICCID 来确认"这个槽位里的卡确实属于本线路",而这个读取调用没有超时。在 modem 桥的逻辑通道上,该读取不会失败,而是挂起——桥把多个通道复用到同一张物理 SIM,未接通的通道会让读取永远停住。三个组件都写了"卡不应答属于故障,而非换卡证据"的容错规则,但这条规则的前提是读取会返回。

本次修复两处,缺一不可:

  • 所有读卡操作加上时限,让挂起变成各调用方本就会处理的"读不出"情形;
  • 绑定校验改为在 SIM 桥启动时判定一次,不再每次鉴权都重做。运营商给整个鉴权交换只有三秒,在这个窗口内重复回答一个已有答案的问题,本身就足以让注册失败——只加超时而不挪位置,仍然会以"响应来得太晚"的方式失败。

校验对所有读卡器保持完整效力,modem 桥通道也不例外:两个外观相同、没有 USB 序列号的模块互换端口,正是这项校验存在的意义。

是否受影响

只有重建过引擎镜像的安装会遇到(全新安装,或手动强制重建)。自更新会保留现有引擎镜像,因此不会触及这一路径。使用物理读卡器的线路不受影响。


Fixed: a line reached through a modem bridge could stop registering

When a line's SIM is reached through a modem bridge (VPCD), rebuilding the engine image could leave that line unable to register — it rebuilt every couple of minutes with its tunnel established each time, so the failure looked unrelated to the exit node while nothing pointed at the actual cause.

The card-binding check added in 1.3.13 reads EF.ICCID to confirm the slot really holds this line's SIM, through a call that has no timeout. On a bridge channel that read does not fail — it hangs: the bridge multiplexes several channels onto one physical SIM, and a channel it has not wired up leaves the read parked forever. All three components implement a "a card that will not answer is a fault, not proof of a swap" rule, but that rule only applies once the read comes back.

Two changes, both required:

  • Every card read is now bounded, turning the hang into the "could not read" case the existing handlers already cover.
  • The binding question is settled once, when the SIM bridge starts, instead of on every authentication. The carrier allows three seconds for that whole exchange; re-answering a settled question inside it was enough to lose the registration on its own — bounding the read without moving it still failed, just as "the answer arrived after the carrier gave up".

The check keeps its full force on every reader, bridge channels included: two look-alike modems with no USB serial swapping ports is exactly the mix-up it exists to catch.

Who is affected

Only installations that rebuilt their engine image (a fresh install, or a manual forced rebuild). A self-update preserves the existing engine image and cannot reach this path. Lines on physical readers are unaffected.


Full Changelog: v1.3.14...v1.3.15