V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wsxhwyy
V2EX  ›  宽带症候群

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

  •  3
     
  •   wsxhwyy · 2022-09-21 21:37:03 +08:00 · 4673 次点击
    这是一个创建于 554 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    第 1 条附言  ·  2022-09-22 21:10:07 +08:00

    分享一下传输文件和patch so文件的方法。比较方便的传输文件的方法是直接使用nc来建立连接,例如PC的IP为192.168.0.100:

    PC端准备接收文件:

    $ nc -l 5000 < /dev/null > libca-oam.so.1.0.0
    

    猫棒端检查md5并发送文件:

    # md5sum /usr/lib/libca-oam.so.1.0.0 
    a8d470daea0afcd627ccd0dc206caf36  /usr/lib/libca-oam.so.1.0.0
    # nc 192.168.0.100 5000 < /usr/lib/libca-oam.so.1.0.0
    

    PC端接收到文件后验证md5,验证无误后打patch并传输到猫棒:

    $ md5sum libca-oam.so.1.0.0
    a8d470daea0afcd627ccd0dc206caf36  libca-oam.so.1.0.0
    $ xxd libca-oam.so.1.0.0 | sed 's/0003f480: 0400 0991/0003f480: 2548 0000/' | xxd -r > libca-oam.so.1.0.0.patched
    $ md5sum libca-oam.so.1.0.0.patched
    19a0de2ee15bf7dc583e703078c69caf  libca-oam.so.1.0.0.patched
    $ nc -l 5000 < libca-oam.so.1.0.0.patched
    

    猫棒端接收文件并验证:

    # nc 192.168.0.100 5000 < /dev/null > libca-oam.so.1.0.0
    # md5sum libca-oam.so.1.0.0
    19a0de2ee15bf7dc583e703078c69caf  libca-oam.so.1.0.0
    

    验证md5无误后覆盖原固件:

    # cp libca-oam.so.1.0.0 /usr/lib/libca-oam.so.1.0.0
    # reboot
    
    32 条回复    2023-05-08 13:52:22 +08:00
    maoshen1234
        1
    maoshen1234  
       2022-09-21 21:45:27 +08:00
    牛逼,好贴,我这里就是这样的,一输 LOID ,立马死机
    Yien
        2
    Yien  
       2022-09-21 22:31:42 +08:00 via Android
    大佬🐮🍺
    请你喝🍺
    teehoo
        3
    teehoo  
       2022-09-21 22:37:17 +08:00 via iPhone
    牛啊大佬!
    Archeb
        4
    Archeb  
       2022-09-21 22:43:10 +08:00
    大佬🐮🍺
    swiftg
        5
    swiftg  
       2022-09-22 00:00:53 +08:00
    这找 bug 和修 bug 的能力真强
    wtks1
        6
    wtks1  
       2022-09-22 01:02:15 +08:00 via Android   ❤️ 1
    大佬厉害
    Niphor
        7
    Niphor  
       2022-09-22 09:11:45 +08:00
    大佬🐮🍺
    mywaiting
        8
    mywaiting  
       2022-09-22 09:27:56 +08:00
    反编译,定位,修复~~

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

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

    是否能把这个手段写出来分享以下,谢谢。能登录到 OLT 设备上,等于就控制了一堆每家每户的光猫。。。相信大家也会很感兴趣的。
    lj0014
        12
    lj0014  
       2022-09-22 14:47:57 +08:00
    技术大佬~
    onion83
        13
    onion83  
       2022-09-22 15:11:18 +08:00
    大佬🐮🍺
    neiltroyer849
        14
    neiltroyer849  
       2022-09-22 18:33:23 +08:00
    膜拜大佬
    LuciferJShieh
        15
    LuciferJShieh  
       2022-09-22 19:41:52 +08:00 via Android
    方便说一下用什么方式下载文件到本地的吗?这猫棒没有 scp 命令。。。
    LuciferJShieh
        16
    LuciferJShieh  
       2022-09-22 19:42:59 +08:00 via Android
    @mrzx 全程就没提登 olt 设备啊,通过猫棒日志来查 bug 的啊
    Damn
        17
    Damn  
       2022-09-22 21:17:15 +08:00
    @mrzx 阅读理解时间:
    原文:
    “使用卖家提供的 debug 方法获取 OLT 注册的日志”
    “查看后续 log 显示 OLT 注册成功”
    -----
    人工翻译:
    “使用卖家提供的 debug 方法获取 [猫棒向] OLT 注册 [时产生] 的日志”
    “查看 [猫棒上] 后续 log , 显示 [猫棒向] OLT 注册成功”
    mrzx
        18
    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
        19
    ju0594  
       2022-09-23 14:33:14 +08:00
    大佬厉害了!
    monkeybape
        20
    monkeybape  
       2022-09-23 16:38:22 +08:00
    厉害了 马上试试看
    monkeybape
        21
    monkeybape  
       2022-09-24 03:00:05 +08:00
    大佬厉害了 原本因为不兼容家里宽带的 7263-BH+已经放抽屉很久了 因为线路的 OLT 是 MA5800-X15 使用猫棒的时候也是死机 用的你的方法替换后已经成功拨上号了
    zhangyoufu
        22
    zhangyoufu  
       2022-09-24 15:54:15 +08:00 via iPhone
    想当初我也改 OAM 和局端对抗了几个回合,后来局端直接给我把 ONU 刷成砖了
    ycsos
        23
    ycsos  
       2022-09-24 16:07:10 +08:00
    大佬太牛逼了,我曾经搞过 7263-BH+ 当时设置完 LOID 之后就死机连不上了,还以为是模块因为兼容性问题搞挂了,发回卖家卖家发现能连上,但后来换成了 8055 ,现在看来就是这个原因。当时还盛传是华为的 OLT 做了端对端加密导致第三方的 ONT 没办法直接使用,必须是华为的 ONU 才行看来也是谣言。真心给大佬点赞
    hema888
        24
    hema888  
       2022-09-25 00:00:29 +08:00
    大佬能共享一下修改过的文件吗
    myzony
        25
    myzony  
       2022-11-11 23:35:44 +08:00
    @wsxhwyy 大佬反汇编工具用的什么? 我也遇到这种情况,插上光纤就死掉了,但是 debug 显示的地方与你不一样。
    myzony
        26
    myzony  
       2022-11-12 01:05:34 +08:00
    @wsxhwyy 感谢楼主的解决方案,成都电信已经成功解决。

    但是当中遇到一些问题,比如 nc 传输文件的时候到一半就中断了,重试了几次都不行。还好猫棒固件自带有 tftp ,在 linux 用 docker 搭建了一个 tftp 解决了文件传输的问题。

    楼主牛逼嗷!
    HolyGu
        27
    HolyGu  
       2022-11-22 16:39:05 +08:00
    江苏电信通过楼主的方法可以成功拨上号了,但是速度只有 100M ,使用光猫的情况下是可以跑满 1000M 的,这是啥情况,是运营商做了策略嘛
    guanyinhang
        28
    guanyinhang  
       2023-01-26 16:18:01 +08:00
    正愁花大价钱搞的猫棒方案没法用的时候,用楼主的方法解决了,感谢楼主

    顺便分享一下打过补丁的 libca-oam

    https://share.weiyun.com/CR5M6yzc
    Haruka007
        29
    Haruka007  
       341 天前
    大佬请教下,我这边 nc 把 so 导进去,结果 md5 值变了是咋回事
    guanyinhang
        30
    guanyinhang  
       341 天前
    @Haruka007 楼主用的命令 nc 192.168.0.100 5000 < /dev/null > libca-oam.so.1.0.0 有可能导致文件没发完整,用 nc 192.168.0.100 5000 > libca-oam.so.1.0.0 等 5 秒左右按 ctrl+c 手动中止传输就行
    Haruka007
        31
    Haruka007  
       341 天前
    @guanyinhang 我后来是拆分成小包传的,大了就传不完。 现在遇到新问题,pppoe 拨号在 vlan 口上没成功
    huangya
        32
    huangya  
       325 天前
    楼主,我最近也在折腾。我比较好奇,这个库是被哪个程序调用的,这个你知道吗?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1001 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 19:59 · PVG 03:59 · LAX 12:59 · JFK 15:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.