【万事屋技术转载】解决海信 LTF7263 喵棒插入光纤后“死机”现象一例

海信的 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 侧配置的区别,正常的线路为 VLAN tranparent ,“死机”的线路默认为 VLAN tag 模式,由于固件中的 bug ,在设置 VLAN 的时候,丢失了 LAN 侧的 IP ,而 OLT 侧下发的 VLAN 并不是 PPPoE 所在的 VLAN 。

询问卖家后得知 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 ,拨号后测速达标,问题解决。希望海信的工程师可以在后续的固件中彻底修正这个问题。

声明:本站文章,有些原创,有些转载,如发现侵权侵请联系删除。本站所有原创帖均可复制、搬运,开网站就是为了大家一起乐乐,不在乎版权。对了,本站小水管,垃圾服务器,请不要采集,吐槽君纯属用爱发电,经不起折腾。

给TA打赏
共{{data.count}}人
人已打赏
技术宅

Google应用推出"关于你的结果"页面以帮助删除个人信息

2022-9-21 20:45:36

技术宅

巨微,不对,软宣布10月12日的Surface硬件发布会活动:“Save The Date”

2022-9-22 17:33:08

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索