解决海信 LTF7263 喵棒插入光纤后“死机”现象一例

2022-09-21 21:37:03 +08:00
 wsxhwyy

海信的 LTF7263 一直是 10G EPON Stick 的首选方案之一,但海信的固件兼容性比较差,时常出现买家买到后发现与自己的线路不兼容的情况,LZ 就是受害者之一。

问题的表现为在没有插入光纤的时候,可以通过 telnet 和 SSH 访问,设置 MAC 、LOID 等参数,但在插入光纤后,SSH 和 telnet 断开,ping 无响应,探测不到 PPPoE server ,疑似“死机”。

使用卖家提供的 debug 方法获取 OLT 注册的日志: 开启一个 SSH 连接用来输出日志,然后开启一个 telnet 连接到管理命令行:

$ telnet 192.168.0.1 2233
...
Cortina>enable
Cortina#config
Cortina(config)#ssh-debug /dev/pts/0
Cortina(config-oam)#debug oam 8
Cortina(config-oam)#debug oam-org 8
Cortina(config-oam)#pkt-dump all

日志会输出到 SSH 所在的窗口,插入光纤,SSH 窗口输出以下 log 后连接中断:

...

ctc_oam_onu_vlan_set(): L2806, index is Valid, index = 1 

ctc_oam_onu_vlan_set(): L2816, vlan mode = 1 

ctc_oam_onu_vlan_set(): L2825, default vlan tpid:0x8100, tag:0x1 

ctc_oam_onu_tag_vlan_set_adapt: oam_port = 1, TPID = 0x8100, tag = 0x1
_ctc_add_def_vlan(): L1691, PVID 1 on oam_port 1

用同样的方法在 LZ 手上另一条 LTF7263 可以成功注册的线路上抓取 log ,工作正常的 log 为:

...

ctc_oam_onu_vlan_set(): L2806, index is Valid, index = 1

ctc_oam_onu_vlan_set(): L2816, vlan mode = 0

ctc_oam_onu_transparent_vlan_set_adapt(): L2363, oam_port = 1, vlan_mode: transparent

...

故猜测是 OLT 侧配置的区别,工作正常的线路 OLT 侧配置为 VLAN tranparent 模式,“死机”的线路 OLT 侧配置为 VLAN tag 模式,由于固件中的 bug ,在设置 VLAN 的时候,丢失了 LAN 侧的 IP ,又由于 OLT 侧下发的 VLAN 并不是 PPPoE 所在的真实 VLAN ,导致探测不到 PPPoE 服务器。

询问卖家后得知 LTF7263 并没有可用的固件更新,故 LZ 尝试自行修改固件绕过这个 bug 。思路是忽略掉 OLT 下发的 VLAN 模式配置,强制使用 VLAN 透传模式。

日志中的信息比较充足,有函数名行号等信息,通过按 string filter 可以得到与 OLT 注册相关的逻辑全部在 /usr/lib/libca-oam.so.1.0.0 中,通过反汇编这个 so 文件,定位到函数 ctc_oam_onu_vlan_set() ,之后就可以通过 printf 输出的行号等信息查找到 vlan mode 所在的地址:

...
0x0000000000000174:  38 00 A8 8F    lw    $t0, 0x38($sp)
0x0000000000000178:  00 0B 03 24    addiu $v1, $zero, 0xb00    // 行号 0xb00 = 2816
0x000000000000017c:  04 00 09 91    lbu   $t1, 4($t0)          // 读取 vlan mode
0x0000000000000180:  18 00 A3 AF    sw    $v1, 0x18($sp)
0x0000000000000184:  2C 80 83 8F    lw    $v1, -0x7fd4($gp)
0x0000000000000188:  E4 83 99 8F    lw    $t9, -0x7c1c($gp)
0x000000000000018c:  40 00 A2 AF    sw    $v0, 0x40($sp)
0x0000000000000190:  EC 0A 63 24    addiu $v1, $v1, 0xaec
0x0000000000000194:  3C 00 A8 AF    sw    $t0, 0x3c($sp)
0x0000000000000198:  1C 00 A9 AF    sw    $t1, 0x1c($sp)       // 将 vlan mode 写入 printf 参数
0x000000000000019c:  38 00 A9 AF    sw    $t1, 0x38($sp)
0x00000000000001a0:  14 00 B0 AF    sw    $s0, 0x14($sp)
0x00000000000001a4:  10 00 A3 AF    sw    $v1, 0x10($sp)       // 将行号写入 printf 参数
0x00000000000001a8:  25 38 00 00    move  $a3, $zero
0x00000000000001ac:  08 00 06 24    addiu $a2, $zero, 8
0x00000000000001b0:  05 00 05 24    addiu $a1, $zero, 5
0x00000000000001b4:  09 F8 20 03    jalr  $t9                  // 调用 printf
0x00000000000001b8:  25 20 00 00    move  $a0, $zero
...

将对应的位置改为:

0x000000000000017c:  25 48 00 00    move  $t1, $zero           // 强制设置 vlan mode = 0

把修改过的 so 文件复制到 LTF7263 中覆盖原始固件,重启之后插入光纤,log 中显示已强制使用 vlan transparent 模式:

...

ctc_oam_onu_vlan_set(): L2806, index is Valid, index = 1

ctc_oam_onu_vlan_set(): L2816, vlan mode = 0

ctc_oam_onu_transparent_vlan_set_adapt(): L2363, oam_port = 1, vlan_mode: transparent

...

“死机”现象不再出现,查看后续 log 显示 OLT 注册成功,对应的 VLAN 可以探测到 PPPoE server ,拨号后测速达标,问题解决。希望海信的工程师可以在后续的固件中彻底修正这个问题。

4799 次点击
所在节点    宽带症候群
32 条回复
maoshen1234
2022-09-21 21:45:27 +08:00
牛逼,好贴,我这里就是这样的,一输 LOID ,立马死机
Yien
2022-09-21 22:31:42 +08:00
大佬🐮🍺
请你喝🍺
teehoo
2022-09-21 22:37:17 +08:00
牛啊大佬!
Archeb
2022-09-21 22:43:10 +08:00
大佬🐮🍺
swiftg
2022-09-22 00:00:53 +08:00
这找 bug 和修 bug 的能力真强
wtks1
2022-09-22 01:02:15 +08:00
大佬厉害
Niphor
2022-09-22 09:11:45 +08:00
大佬🐮🍺
mywaiting
2022-09-22 09:27:56 +08:00
反编译,定位,修复~~

这操作不得不服气~~
hello365
2022-09-22 10:16:50 +08:00
大佬🐮🍺,so 文件给大家分享一下。
dingli900201
2022-09-22 10:45:33 +08:00
牛逼了!
mrzx
2022-09-22 14:36:31 +08:00
我只有一点好奇,作为小区里公用的 OLT 设备,你怎么有登录方式的?你要说卖你猫棒作为 ONU 设备有登录方式到不奇怪。。

正常情况,只有电信的人才能登录 OLT 设备,且只有电信才能下发 OLT 设备的配置。

是否能把这个手段写出来分享以下,谢谢。能登录到 OLT 设备上,等于就控制了一堆每家每户的光猫。。。相信大家也会很感兴趣的。
lj0014
2022-09-22 14:47:57 +08:00
技术大佬~
onion83
2022-09-22 15:11:18 +08:00
大佬🐮🍺
neiltroyer849
2022-09-22 18:33:23 +08:00
膜拜大佬
LuciferJShieh
2022-09-22 19:41:52 +08:00
方便说一下用什么方式下载文件到本地的吗?这猫棒没有 scp 命令。。。
LuciferJShieh
2022-09-22 19:42:59 +08:00
@mrzx 全程就没提登 olt 设备啊,通过猫棒日志来查 bug 的啊
Damn
2022-09-22 21:17:15 +08:00
@mrzx 阅读理解时间:
原文:
“使用卖家提供的 debug 方法获取 OLT 注册的日志”
“查看后续 log 显示 OLT 注册成功”
-----
人工翻译:
“使用卖家提供的 debug 方法获取 [猫棒向] OLT 注册 [时产生] 的日志”
“查看 [猫棒上] 后续 log , 显示 [猫棒向] OLT 注册成功”
mrzx
2022-09-23 09:27:35 +08:00
@Damn 谢了,明白了。

那这个界面应该是猫棒的 cli
$ telnet 192.168.0.1 2233
...
Cortina>enable
Cortina#config
Cortina(config)#ssh-debug /dev/pts/0
Cortina(config-oam)#debug oam 8
Cortina(config-oam)#debug oam-org 8
Cortina(config-oam)#pkt-dump all
ju0594
2022-09-23 14:33:14 +08:00
大佬厉害了!
monkeybape
2022-09-23 16:38:22 +08:00
厉害了 马上试试看

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/881974

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX