20180917_jeffrey - silenceuncrio/diary GitHub Wiki

0910

review

0955

52XXZ 的 G.Shdsl.bis Status 可以參考 VPN 機種的 web ui

注意到 status 的 table 欄位會跟著 pair 數目連動

4-pair

image

2-pair

image

52XXZ 目前我只是把 CGI 回傳的 json 打印出來

該 json 結構在 browser 端顯示如下(未展開)

image

1030

status.pairNum 是目前 config 的 Pair Mode

我可以拿這個值來連動要顯示多少欄位

VPN Router 上 Channel 有 A, B, C 和 D 四個 channel

每個 channel 還分 Local Side 和 Remote Side

52XXZ 的 status.channel.length 為 8

這 8 個 channel 是怎麼對到 4 個 channel 的 Local Side 和 Remote Side ?

實際拿 52XXZ 和 VPN Router 做 SHDSL 連線

VPN Router

  • TC Layer: EFM
  • Pair Mode: 4 Wire
  • Channel A
    • Mode: Master
  • Channel B
    • (Mode: Master)

52XXZ

  • TC Layer: EFM
  • Pair Mode: Pair-2
  • Channel 1
    • Mode: STU-R
  • Channel 2
    • (Mode: STU-R)

其餘都是 default 值不去動

沒多久就連接上了

VPN ROuter 的 Dsl Status

image

52XXZ - shdslbis.cgi?act=status

image

由兩邊的數值就可以知道

  • status.channel[0] - channel 1 - Local Side
  • status.channel[1] - channel 2 - Local Side
  • status.channel[2] - channel 3 - Local Side
  • status.channel[3] - channel 4 - Local Side
  • status.channel[4] - channel 1 - Remote Side
  • status.channel[5] - channel 2 - Remote Side
  • status.channel[6] - channel 3 - Remote Side
  • status.channel[7] - channel 4 - Remote Side

從 VPN Router 的 Dsl Status 來盤 52XXZ 的 shdslbis.cgi?act=status

  • Mode - status.channel[x].stuMode
  • State - status.channel[x].lineState
  • Line Rate - status.channel[x].dataRate(Kbps)
  • Attenuation - status.channel[x].loopAttn(dB)
  • SNR - status.channel[x].snr(dB)
  • CRC- status.channel[x].crc

TC Layer 如果改成 ATM 的話不知道 VPN Router 的 Dsl Status 會不會有什麼要跟著連動的欄位

直接試試看

VPN Router

  • TC Layer: ATM
  • Pair Mode: 4 Wire
  • Channel A
    • Mode: Master
  • Channel B
    • (Mode: Master)

52XXZ

  • TC Layer: ATM
  • Pair Mode: Pair-2
  • Channel 1
    • Mode: STU-R
  • Channel 2
    • (Mode: STU-R)

VPN Router - Dsl Status - tc layer - atm

image

52XXZ - shdslbis.cgi?act=status - tc layer - atm

image

可以從 VPN Router 的 DSL Status 發現沒有任何欄位需要連動

不過 VPN Router 有個 Clear CRC 按鈕

52XXZ 在 shell 下有 setbis 這個 command

root@52XXZ:~# setbis ?
setbis utility version:2.10
Usgae : setbis -[?|v|r|z|c|s|l|d|R|L] Name=Value ...
 ?:help, 'v':version, 'r':retrain, 'z':clear crc, 'c'/'s':config/status
Example: setbis PairMode=PAIR-1 TCLayer=efm ch=0 Mode=STU-C Annex=Annex-B BaseRate=2304
mode          : STU-C,STU-R,STU-CR,STU-RC
tcLayer       : EFM,ATM,AUTO
pairMode      : PAIR-AUTO,PAIR-1,PAIR-2,PAIR-3,PAIR-4,PAIR-1X2,PAIR-2X2,PAIR-1X3,PAIR-1X4
annex         : ANNEX-A,ANNEX-B,ANNEX-F,ANNEX-G
tcpam         : TCPAM-16,TCPAM-32,TCPAM-AUTO,TCPAM-64,TCPAM-128,TCPAM-4,TCPAM-8,TCPAM-EXTEND
lineProbe     : ENABLE,DISABLE
pboMode       : PBO_NORMAL,PBO_FORCED
eplMode       : EPL_ENABLED,EPL_DISABLED
psdMask       : SYMETRIC,ASYMETRIC
pwrFeeding    : NO_POWER,POWER_FEED,WETTING_CURRENT
iopMode       : NONE,GSPN
atmEncap      : LLC,VCMUX
ch            : 0..1
pboValue      : 0..31
pboOffset     : 0..31
ccMarginDown  : -10..21
wcMarginDown  : -10..21
ccMarginUp    : -10..21
wcMarginUp    : -10..21
usedMargin    : 0..15
maxBaseRate   : 1..239
minBaseRate   : 1..239
maxSubRate    : 0..7
minSubRate    : 0..7
atmVpi        : 0..255
atmVci        : 0..65535
Note:AnnexF/G: TCPAM16=3..60, TCPAM32=12..89, TCPAM64=3..199, TCPAM128=3..239
     AnnexA/B: TCPAM16=3..36

直接使用 setbis -z 即可達成 Clear CRC 的功能

我需要新增一個 CGI - shdslbis.cgi?act=clearcrc

1310

先 pull 一版 52XXZ 最新的 code

build image... ok

upgrade via uboot - run update_fullimage... ok

boot - run flash_flash... ok

因為 rootfs 的緣故 跟 M360 採行一樣的 web 開發手法

root@52XXZ:~# cp -r /www /tmp/
root@52XXZ:~# iweb -p 3000 -d /tmp/www/ 1>/dev/null 2>&1 &

新增 CGI - shdslbis.cgi?act=clearcrc

proscend/prosrc/webcgi/shdslbis.c

@@ -96,6 +96,15 @@ static void _status()



+static void _clearcrc()
+{
+    system("setbis -z");
+
+    jweb.out.json.ok();
+}
+
+
+
 static void _help()
 {
     jweb.out.json.ok();
@@ -119,6 +128,10 @@ int main(void)
     {
         _status();
     }
+    else if (STRCMP(jweb.in.act, "clearcrc"))
+    {
+        _clearcrc();
+    }
     else if (STRCMP(jweb.in.act, "help"))
     {
         _help();

剛剛 tc layer 為 atm 時會有一些 crc

image

使用新增的 CGI - shdslbis.cgi?act=clearcrc

image

成功清除了 CRC

image

上 code

commit ec87b32fa9c771a3cc40b0cc7ab9106ac18dfa9a
Refs: [develop], {origin/develop}, {origin/HEAD}
Author: jeffrey <[email protected]>
Date:   Mon Sep 17 13:42:45 2018 +0800

    add CGI - shdslbis.cgi?act=clearcrc for clear CRC

 proscend/prosrc/webcgi/shdslbis.c | 13 +++++++++++++
 1 file changed, 13 insertions(+)

1440

目前完成的 G.Shdsl.bis - Status web ui 如下

pair-1

image

pair-2

image

pair-4

image

重新 build 個 image 再透過 uboot 做 upgrade - run update_fullimage... ok

跟 VPN Router 對接測一下... PASS

上 code

commit 7003da76d76b99a816192858149c69140bdc80b5
Refs: [develop], {origin/develop}, {origin/HEAD}
Author: jeffrey <[email protected]>
Date:   Mon Sep 17 14:52:43 2018 +0800

    finish the 'G.Shdsl.bis / Status' web page

 .../prosrc/www/app/feature/shdslbis_status.html    | 137 ++++++++++++++++++++-
 proscend/prosrc/www/app/feature/shdslbis_status.js |  12 +-
 proscend/prosrc/www/app/locale-en.json             |  17 +++
 proscend/prosrc/www/app/locale-fr.json             |  17 +++
 proscend/prosrc/www/app/locale-zh-tw.json          |  17 +++
 proscend/prosrc/www/app/services/icos.service.js   |   3 +
 6 files changed, 201 insertions(+), 2 deletions(-)

1455

拿一台實際上最多只到 pair-2 的 52XXZ

透過 uboot 燒錄剛剛產生的 image

目前 web ui 並沒有去檢查最多能支援到幾個 pair

image

硬體的 pair mode 上限可由以下資訊取得

typedef struct
{
    ...
    int       dslHwPairNum;                 // Board's DSL Pair Num(1/2/4)
    ...
} sSystemInformation;

proscend/prosrc/webcgi/system.c

@@ -106,6 +106,8 @@ static json_object * _get_status()

     json_object_object_add(system_status, "szSwMobileRouterVersion", json_object_new_string(_status.szSwMobileRouterVersion));

+    json_object_object_add(system_status, "dslHwPairNum", json_object_new_int(_status.dslHwPairNum));
+
     return system_status;
 }

尷尬的是我拿到的值為 0

image

module_shdslbis.h 看到有一個 function 可以拿到 DSL MAX Pair Number

extern int   GetDslMaxPairNum(void);

先把剛剛對於 system.cgi 的改動還原

直接利用現有的 shdslbis.cgi?act=help

@@ -105,9 +105,21 @@ static void _clearcrc()



+static json_object * _help_obj()
+{
+    json_object *obj = json_object_new_object();
+
+    json_object_object_add(vrrp_config, "dslMaxPairNum", json_object_new_int(GetDslMaxPairNum()));
+
+    return obj;
+}
+
+
+
 static void _help()
 {
-    jweb.out.json.ok();
+    json_object *help = _help_obj();
+    jweb.out.json.data("help", help);
 }

shdslbis.cgi?act=help

image

搞定

image

上 code

commit 2f88f4a534c80e8154f4f5d2f1b661c6f60f0bef
Refs: [develop], {origin/develop}, {origin/HEAD}
Author: jeffrey <[email protected]>
Date:   Mon Sep 17 15:26:14 2018 +0800

    use 'shdslbis.cgi?act=help' to help decide the max pair number of G.Shdsl.bis:
    - GetDslMaxPairNum()

 proscend/prosrc/webcgi/shdslbis.c                | 14 +++++++++++++-
 proscend/prosrc/www/app/feature/shdslbis.html    |  6 +++---
 proscend/prosrc/www/app/feature/shdslbis.js      |  8 +++++++-
 proscend/prosrc/www/app/services/icos.service.js |  3 +++
 4 files changed, 26 insertions(+), 5 deletions(-)

1550

盤一下 52XXZ 的待作項目

  • BGP
  • RIPv1/v2
  • Web UI
    • Status page: empty now and need to redesign
    • Management / Identification: not display
    • Firmware Upgrade: weird character display
    • G.Status: status page look weird
  • GRE
  • Firmware Upgrade

盤一下這些工作項目的現況

  • BGP
    • 已有 web ui
    • 待測
  • RIPv1/v2
    • 沒有在 web 的選單出現
  • Web UI
    • Status page: empty now and need to redesign
      • 一堆 CGI access 都回 500
    • Management / Identification: not display
      • icos_shm.cgi?act=shm&name=lte 回 500
    • Firmware Upgrade: weird character display
      • CGI 待實作
    • G.Status: status page look weird
      • 完成
  • GRE
    • 已有 web ui
    • 待測
  • Firmware Upgrade
    • 已有 web ui
    • CGI 待實作

重新調整一下順序

比較花時間的排前面

  • Firmware Upgrade
    • 已有 web ui
    • CGI 待實作
  • Web UI
    • Status page: empty now and need to redesign
      • 一堆 CGI access 都回 500
    • Management / Identification: not display
      • icos_shm.cgi?act=shm&name=lte 回 500
  • RIPv1/v2
    • 沒有在 web 的選單出現
  • BGP
    • 已有 web ui
    • 待測
  • GRE
    • 已有 web ui
    • 待測

1605

Firmware Upgrade 的部分先參考到之前 MRouter 專案上的 web_util_upgrade.c

int UtilUpgrade(char *imgfile)
{
        char szImageMCSV[36];
        FILE *fp;
        int res;

        rename(imgfile, UPGRADE_FILE);
        /* Check FileFormat */
        res=SysCmd("/usr/sbin/icos/ChkUpgradeFile.sh");
        switch (res)  {
                case 0:
                        WDBG("File Image Correct !\n");
                        break;
                case 1:
                        WDBG(" Error: File Image not Exist!\n");
                        JsonResponse(res, "Error: File Image not Exist!", res, NULL, NULL);
                        break;
                case 2:
                        WDBG(" Error: File CheckSum Error!\n");
                        JsonResponse(res, "Error: File CheckSum Error!", res, NULL, NULL);
                        break;
                case 9:
                        WDBG(" Error: MCSV mismatch!\n");
                        JsonResponse(res, "Error: MCSV mismatch!", res, NULL, NULL);
                        memset(szImageMCSV, 0, sizeof(szImageMCSV));
                        fp = fopen("/tmp/mcsv", "rb");
                        if (fp) {
                                fread(&szImageMCSV[0], 32, 1, fp);
                                fclose(fp);
                        }
                        memset(&gWebUnionConfig.systemInfo, 0, sizeof(sSystemInformation));
                        ICOS_GetStatus(MODULE_SYSTEM, 0, 0, &(gWebUnionConfig.systemInfo),
                                sizeof(sSystemInformation) );
                        fflush(stdout);
                        break;
                default:
                        WDBG("File Format Error, errcode:%d!", res);
                        JsonResponse(res, "Error: File Format Error!", res, NULL, NULL);
                        break;
        }
        fflush(stdout);// flush before call shell script
        if (res != 0) {
                WebLib_OutputStaticHtml("util-upgradeunlock.sht");
                ICOS_UnLockUpgradeFile();
                return ICOS_FAILURE;
        }
        WDBG("Update Flash. Please wait...");
        fflush(stdout);
        SysCmd("cp /usr/sbin/fwupgrade /tmp");
        res = SysCmd("/tmp/fwupgrade "UPGRADE_FILE);
        if (res == ICOS_SUCCESS) {
                JsonResponse(res, "Upgrade successfully!", res, "redirect_url",
                        WEBLOGIN_URL);
        } else {
                JsonResponse(res, "Upgrade Fail!", res, NULL, NULL);
                WDBG("Update Fail!, ErroCode:%d", res);
        }
        fflush(stdout);
        if (res == ICOS_SUCCESS) {
                int pid;
                char *arg_list[] = { "/usr/sbin/icosconfig", "coldreboot", "web", NULL};
                SysLog(LOG_NOTICE, "SYSTEM", "User Reboot by Web/Upgrade");
                pid = WebLib_Spawn("/usr/sbin/icosconfig", arg_list, 0);
                WDBG("Child process pid: %d\n", pid);
        }
        return ICOS_SUCCESS;
}

整理一下把通常的流程拉出來

int UtilUpgrade(char *imgfile)
{
    rename(imgfile, UPGRADE_FILE);

    /* Check FileFormat */
    SysCmd("/usr/sbin/icos/ChkUpgradeFile.sh");

    SysCmd("cp /usr/sbin/fwupgrade /tmp");

    SysCmd("/tmp/fwupgrade "UPGRADE_FILE);

    char *arg_list[] = { "/usr/sbin/icosconfig", "coldreboot", "web", NULL};
    WebLib_Spawn("/usr/sbin/icosconfig", arg_list, 0);
}

一個一個看

rename(imgfile, UPGRADE_FILE);

#define  UPGRADE_FILE       "/tmp/upgrade.img"

不管我們上傳什麼 firmware

一律 rename 並放在 /tmp/upgrade.img

SysCmd("/usr/sbin/icos/ChkUpgradeFile.sh");

該檔案內容如下

#!/bin/sh
####################################################################################
#   File Name   : ChkUpgradeFile.sh
#   Description : VR268 Upgrade Image Check CheckSum & MCSV Sctipt
#   Write   By  : Winston Chen                                  Date: 2014/09/11
####################################################################################
#   Usage  : ChkUpgradeFile.sh (skip)
#   Example: ChkUpgradeFile.sh (skip)
####################################################################################

RM=/bin/rm
CAT=/bin/cat
CUT=/usr/bin/cut
GREP=/bin/grep
ECHO=/bin/echo
INN_FILE=/tmp/upgrade.img
DEBUG=${DEBUG:-0}
####################################################################################
#   Function MID2GroupMID()
####################################################################################
MID2GroupMID() {
        case "$1" in
                169E ) $ECHO "169E";;
                169F ) $ECHO "169E";;
                16A0 ) $ECHO "169E";;
                16A1 ) $ECHO "169E";;
                00AA ) $ECHO "00AA";;
            *    ) $ECHO "0000";;
        esac
}

####################################################################################
#   Check File Exist
####################################################################################
if [ ! -s $INN_FILE ]; then
        if [ $DEBUG == 1 ]; then
                $ECHO " Error: Upgrade File $INN_FILE Not Exist"
        fi
        exit 1
fi

####################################################################################
#   Check File CheckSum
####################################################################################
/usr/sbin/uk170 img $INN_FILE 1>/dev/null 2>&1
if [ $? != 0 ]; then
        if [ $DEBUG == 1 ]; then
                $ECHO " Error: Upgrade File Checksum Error!"
        fi
        $RM -f $INN_FILE
        exit 2
fi

####################################################################################
#   Skip Check MCSV (For M/A Upgrade)
####################################################################################
if [ $# -ge 1 ]; then
        CALLER=$1
else
        CALLER=none
fi

if [ "$CALLER" == "skip" ]; then
        if [ $DEBUG == 1 ]; then
                $ECHO " Skip MCSV Check!"
        fi
        exit 0
fi

####################################################################################
#   Get MCSV
####################################################################################
IMG_MCSV=`/usr/bin/hexdump -C $INN_FILE -n 32 | $GREP 00000010 | $CUT -b62-77`
SWW_MCSV=`$CAT /etc/mcsv | $CUT -b1-16`
HWW_MCSV=`$CAT /tmp/etc/sysinfo.txt | $GREP HW_MCSV | $CUT -b 9-24`
if [ $DEBUG == 1 ]; then
        $ECHO HWW_MCSV=$HWW_MCSV
        $ECHO SWW_MCSV=$SWW_MCSV
        $ECHO IMG_MCSV=$IMG_MCSV
fi

$ECHO "Image  MCSV:$IMG_MCSV"  > /tmp/mcsv-info.txt
$ECHO "Sys HW MCSV:$HWW_MCSV" >> /tmp/mcsv-info.txt
$ECHO "Sys SW MCSV:$SWW_MCSV" >> /tmp/mcsv-info.txt
####################################################################################
#   Check Model ID
####################################################################################
IMG_MID=`$ECHO $IMG_MCSV | cut -b 1-4`
HWW_MID=`$ECHO $HWW_MCSV | cut -b 1-4`
SWW_MID=`$ECHO $SWW_MCSV | cut -b 1-4`
IMG_CID=`$ECHO $IMG_MCSV | cut -b 5-8`
HWW_CID=`$ECHO $HWW_MCSV | cut -b 5-8`
SWW_CID=`$ECHO $SWW_MCSV | cut -b 5-8`

IM2_MID=`MID2GroupMID $IMG_MID`
HW2_MID=`MID2GroupMID $HWW_MID`

if [ "$IM2_MID" != "$HW2_MID" ]; then
        $RM -f $INN_FILE
        if [ $DEBUG == 1 ]; then
                $ECHO " Error: IMG/HW MID mismatch ($IMG_MID)/($HW2_MID) !"
        fi
        $RM -f $INN_FILE
        exit 9
fi

####################################################################################
#   Check Custom ID
####################################################################################
if [ "$HWW_CID" == "0000" ]; then
        if [ "$SWW_CID" == "0000" ] || [ "$IMG_CID" == "0000" ]; then
                exit 0
        fi
        if [ "$SWW_CID" == "$IMG_CID" ]; then
                exit 0
        fi
fi

if [ "$HWW_CID" == "0001" ]; then
        if [ "$SWW_CID" == "0001" ] || [ "$IMG_CID" == "0001" ] ; then
                exit 0
        fi
        if [ "$SWW_CID" == "$IMG_CID" ]; then
                exit 0
        fi
fi

if [ "$HWW_CID" != "$IMG_CID" ]; then
        $RM -f $INN_FILE
        if [ $DEBUG == 1 ]; then
                $ECHO " Error: IMG/HW CID mismatch ($IMG_CID)/($HWW_CID) !"
        fi
        $RM -f $INN_FILE
        exit 9
fi

exit 0

SysCmd("cp /usr/sbin/fwupgrade /tmp");

這個才是主角

不過我要找一下 fwupgrade 的 source code 在哪裡

參考之前的日記 https://github.com/silenceuncrio/diary/wiki/20180724_jeffrey

579X 專案裡 fwupgrade 是隻 script

Mrouter 專案裡的 fwupgrade.sh

#!/bin/sh
################################################################################
#   File Name   : FwUpgrade.sh
#   Description : VR268 Upgrade Script
#   Write By    : Winston Chen                                  Date: 2014/09/11
#   Reference   : /etc/rc.d/invoke_upgrade.sh, /usr/sbin/vol_mgmt
################################################################################
syncconfig() {
        if [ -f /etc/release ]; then
                mkdir -p /mnt/data/etc/icos
                (cd /etc/icos; tar zcvf - . ) | \
                        (cd /mnt/data/etc/icos; tar zxvf -)
        else
                mkdir -p /mnt/data/icos
                (cd /etc/icos; tar zcvf - . ) | \
                        (cd /mnt/data/icos; tar zxvf -)
        fi
}
input=/tmp/upgrade.img
output=/mnt/data/upgrade.img
################################################################################
#   Check File Exist
################################################################################
if [ ! -s $input ]; then
        echo " Error: Upgrade File $input Not Exist"
        exit 1
fi

echo " Untar Upgrade Image ..."
mv $input $output

################################################################################
#   Upgrade Image
################################################################################
cd /tmp
for i in uImage rootfs.img firmware.img; do
        dd if=$output bs=64 skip=1 2> /dev/null | tar zxv $i
        [ -s "$i" ] || continue
        case "$i" in
                uImage)
                        echo " Upgrade Image 1/3 ..."
                        upgrade $i linux 0 0 1 > /dev/null 2>&1
                        ;;
                rootfs.img)
                        echo " Upgrade Image 2/3 ..."
                        upgrade rootfs.img rootfs 0 0 1 > /dev/null 2>&1
                        ;;
                firmware.img)
                        echo " Upgrade Image 3/3 ..."
                        upgrade firmware.img firmware 0 0 1 > /dev/null 2>&1
                        ;;
        esac
        [ ! -s "$i" ] || rm -f $i
done
[ -L /etc/icos -a -d /mnt/data/icos ] || \
        syncconfig > /dev/null 2>&1
echo " Upgrade Complete!"
rm -f $output
exit 0

579X 專案裡的 fwupgrade.sh

#!/bin/sh
################################################################################
#   File Name   : FwUpgrade.sh
#   Description : VR268 Upgrade Script
#   Write By    : Winston Chen                                  Date: 2014/09/11
#   Reference   : /etc/rc.d/invoke_upgrade.sh, /usr/sbin/vol_mgmt
################################################################################
syncconfig() {
        if [ -f /etc/release ]; then
                mkdir -p /mnt/data/etc/icos
                (cd /etc/icos; tar zcvf - . ) | \
                        (cd /mnt/data/etc/icos; tar zxvf -)
        else
                mkdir -p /mnt/data/icos
                (cd /etc/icos; tar zcvf - . ) | \
                        (cd /mnt/data/icos; tar zxvf -)
        fi
}
input=/tmp/upgrade.img
output=/mnt/data/upgrade.img
################################################################################
#   Check File Exist
################################################################################
if [ ! -s $input ]; then
        echo " Error: Upgrade File $input Not Exist"
        exit 1
fi

echo " Untar Upgrade Image ..."
mv $input $output

################################################################################
#   Upgrade Image
################################################################################
cd /tmp
for i in uImage rootfs.img firmware.img; do
        dd if=$output bs=64 skip=1 2> /dev/null | tar zxv $i
        [ -s "$i" ] || continue
        case "$i" in
                uImage)
                        echo " Upgrade Image 1/3 ..."
                        upgrade $i linux 0 0 1 > /dev/null 2>&1
                        ;;
                rootfs.img)
                        echo " Upgrade Image 2/3 ..."
                        upgrade rootfs.img rootfs 0 0 1 > /dev/null 2>&1
                        ;;
                firmware.img)
                        echo " Upgrade Image 3/3 ..."
                        upgrade firmware.img firmware 0 0 1 > /dev/null 2>&1
                        ;;
        esac
        [ ! -s "$i" ] || rm -f $i
done
[ -L /etc/icos -a -d /mnt/data/icos ] || \
        syncconfig > /dev/null 2>&1
echo " Upgrade Complete!"
rm -f $output
exit 0

完全一致

看來我可以直接照抄

1630

    char *arg_list[] = { "/usr/sbin/icosconfig", "coldreboot", "web", NULL};
    WebLib_Spawn("/usr/sbin/icosconfig", arg_list, 0);

這邊的動作相當單純

就只是 reboot 罷了

我想我可以先擺脫 web ui 的影響

直接用 tftp 拉一份 build 出來的 image

然後套 579X 的主流程走一遭

一關一關盤就可以到終點了

1650

我應該可以拿兩台 52XXZ 對接了

不過對接起來之後有關 bridge mode 或是 route mode

PC 該怎麼設定才能 ping 到另一端的 device 這都還要釐清是否有問題或是要加上什麼設定

我應該先專心做好 firmware upgrade 再說