20180917_jeffrey - silenceuncrio/diary GitHub Wiki
0910
review
0955
52XXZ 的 G.Shdsl.bis Status 可以參考 VPN 機種的 web ui
注意到 status 的 table 欄位會跟著 pair 數目連動
4-pair
2-pair
52XXZ 目前我只是把 CGI 回傳的 json 打印出來
該 json 結構在 browser 端顯示如下(未展開)
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
52XXZ - shdslbis.cgi?act=status
由兩邊的數值就可以知道
- 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
52XXZ - shdslbis.cgi?act=status - tc layer - atm
可以從 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
使用新增的 CGI - shdslbis.cgi?act=clearcrc
成功清除了 CRC
上 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
pair-2
pair-4
重新 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
硬體的 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
在 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
搞定
上 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
- 完成
- Status page: empty now and need to redesign
- 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
- Status page: empty now and need to redesign
- 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 再說