Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
OpenXG-UPF
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
1
Issues
1
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
OpenXG
OpenXG-UPF
Commits
3e69b6db
Commit
3e69b6db
authored
Jul 19, 2021
by
wangyongshou
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
add run upf function
parent
a958c891
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
336 additions
and
181 deletions
+336
-181
etc/template/vppe.conf
etc/template/vppe.conf
+2
-2
scripts/build_upf.sh
scripts/build_upf.sh
+14
-7
scripts/install_upf.sh
scripts/install_upf.sh
+32
-3
scripts/new_run_upf.sh
scripts/new_run_upf.sh
+288
-169
No files found.
etc/template/vppe.conf
View file @
3e69b6db
unix
{
unix
{
nodaemon
#
nodaemon
log
/
var
/
log
/
upf
/
vpp
/
vpp
.
log
log
/
var
/
log
/
upf
/
vpp
/
vpp
.
log
full
-
coredump
full
-
coredump
interactive
#
interactive
gid
vpp
gid
vpp
cli
-
listen
/
run
/
vpp
/
cli
.
sock
cli
-
listen
/
run
/
vpp
/
cli
.
sock
logsize
100
logsize
100
...
...
scripts/build_upf.sh
View file @
3e69b6db
...
@@ -50,9 +50,9 @@ function pre_create(){
...
@@ -50,9 +50,9 @@ function pre_create(){
function
config_file
(){
function
config_file
(){
#scripts
#scripts
cp
-f
$current
/
config_upf.sh
$UPFINSTALL
/scripts
cp
-f
$current
/
dpdk-devbind.py
$UPFINSTALL
/scripts
cp
-f
$current
/install_upf.sh
$UPFINSTALL
/scripts
cp
-f
$current
/install_upf.sh
$UPFINSTALL
/scripts
cp
-f
$current
/
run_upf.sh
$UPFINSTALL
/scripts
cp
-f
$current
/
new_run_upf.sh
$UPFINSTALL
/scripts
#etc
#etc
cp
-f
$configure
/template/n4_config.yaml
$UPFINSTALL
/etc
cp
-f
$configure
/template/n4_config.yaml
$UPFINSTALL
/etc
...
@@ -61,6 +61,7 @@ function config_file(){
...
@@ -61,6 +61,7 @@ function config_file(){
#tools
#tools
cp
-f
/sbin/ethtool
$UPFINSTALL
/tools
cp
-f
/sbin/ethtool
$UPFINSTALL
/tools
cp
-f
$base
/plugin/interreput
$UPFINSTALL
/tools
}
}
function
make_pkg
(){
function
make_pkg
(){
...
@@ -216,8 +217,8 @@ function help()
...
@@ -216,8 +217,8 @@ function help()
echo
"--pre_install Pre-installation of dependencies required by UPF"
echo
"--pre_install Pre-installation of dependencies required by UPF"
echo
"--vpp Build vpp"
echo
"--vpp Build vpp"
echo
"--n4 Build N4"
echo
"--n4 Build N4"
echo
"--c Remove files generated by previous compilation
\n
"
echo
"--c Remove files generated by previous compilation"
echo
"--
all
-dp Build n4 and vppe,make pkg"
echo
"--
upf
-dp Build n4 and vppe,make pkg"
echo
"--vppe-dp Build vppe, make pkg"
echo
"--vppe-dp Build vppe, make pkg"
echo
"--vppe-rp Release vppe, make pkg"
echo
"--vppe-rp Release vppe, make pkg"
echo
"--n4-dp Build n4, make pkg"
echo
"--n4-dp Build n4, make pkg"
...
@@ -247,7 +248,7 @@ function main() {
...
@@ -247,7 +248,7 @@ function main() {
vpp
vpp
shift
shift
;;
;;
--
all
-dp
)
--
upf
-dp
)
pre_create
pre_create
config_file
config_file
make_n4_package
make_n4_package
...
@@ -255,13 +256,13 @@ function main() {
...
@@ -255,13 +256,13 @@ function main() {
make_pkg
make_pkg
shift
;
shift
;
;;
;;
--vpp-dp
|
--vpp-debug-pkg
)
--vpp
e
-dp
|
--vpp-debug-pkg
)
pre_create
pre_create
config_file
config_file
make_vpp_package debug
make_vpp_package debug
shift
;
shift
;
;;
;;
--vpp-rp
|
--vpp-release-pkg
)
--vpp
e
-rp
|
--vpp-release-pkg
)
pre_create
pre_create
config_file
config_file
make_vpp_package release
make_vpp_package release
...
@@ -281,6 +282,12 @@ function main() {
...
@@ -281,6 +282,12 @@ function main() {
clear_all
clear_all
shift
shift
;;
;;
*
)
help
exit
0
shift
;;
esac
esac
done
done
exit
0
exit
0
...
...
scripts/install_upf.sh
View file @
3e69b6db
...
@@ -10,7 +10,8 @@
...
@@ -10,7 +10,8 @@
current
=
"
$PWD
"
current
=
"
$PWD
"
base
=
$(
dirname
"
$PWD
"
)
base
=
$(
dirname
"
$PWD
"
)
ROOT_PATH
=
/opt/5gc/test
ROOT_PATH
=
/opt/5gc/test
VPP_PRO
=
"vpp"
N4_PRO
=
"main"
function
pre_install
()
function
pre_install
()
{
{
if
[
!
-d
$ROOT_PATH
]
;
then
if
[
!
-d
$ROOT_PATH
]
;
then
...
@@ -68,11 +69,31 @@ function install_bupt_vppe ()
...
@@ -68,11 +69,31 @@ function install_bupt_vppe ()
return
0
return
0
}
}
function
close_upf
()
{
pid
=
$(
pidof
$VPP_PRO
)
if
test
-z
"
$pid
"
;
then
echo
"vpp
$pid
is not startup"
else
echo
"kill vpp
$pid
"
kill
-9
${
pid
}
fi
pid
=
$(
pidof
$N4_PRO
)
if
test
-z
"
$pid
"
;
then
echo
"n4
$pid
is not startup"
else
echo
"kill n4
$pid
"
kill
-9
${
pid
}
fi
}
function
help
()
function
help
()
{
{
echo
"help---"
echo
"help---"
echo
"Usage: install_upf [OPTION]..."
echo
"Usage: install_upf [OPTION]..."
echo
"--
all
pkg(bupt_vppe.tar.gz, bupt_n4.tar.gz) install vppe n4"
echo
"--
upf
pkg(bupt_vppe.tar.gz, bupt_n4.tar.gz) install vppe n4"
echo
"--vppe pkg(bupt_vppe.tar.gz) install vpp"
echo
"--vppe pkg(bupt_vppe.tar.gz) install vpp"
echo
"--n4 pkg(bupt_n4.tar.gz) install N4"
echo
"--n4 pkg(bupt_n4.tar.gz) install N4"
}
}
...
@@ -86,22 +107,30 @@ function main() {
...
@@ -86,22 +107,30 @@ function main() {
until
[
-z
"
$1
"
]
;
do
until
[
-z
"
$1
"
]
;
do
case
"
$1
"
in
case
"
$1
"
in
--
all
)
--
upf
)
pre_install
pre_install
close_upf
install_bupt_n4
install_bupt_n4
install_bupt_vppe
install_bupt_vppe
shift
shift
;;
;;
--vpp
)
--vpp
)
pre_install
pre_install
close_upf
install_bupt_vppe
install_bupt_vppe
shift
shift
;;
;;
--n4
)
--n4
)
pre_install
pre_install
close_upf
install_bupt_n4
install_bupt_n4
shift
shift
;;
;;
*
)
help
exit
0
;;
esac
esac
done
done
exit
0
exit
0
...
...
scripts/new_run_upf.sh
View file @
3e69b6db
#!/bin/bash
#!/bin/bash
current
=
"
$PWD
"
current
=
"
$PWD
"
base
=
$(
dirname
"
$PWD
"
)
base
=
$(
dirname
"
$PWD
"
)
VPPPATH
=
"
$base
/src/vppe"
VPPINSTALL
=
"
$base
/upf/vpp"
BUILD_ROOT
=
"build-root"
configure
=
"
$base
/etc"
arp
=
"
$base
/src/setuniarp"
config_system
=
""
#UPF_CONFIG=$base/etc/upf.conf
VPPPROCESS
=
"vpp"
VPPPROCESS
=
"vpp"
VPPCMD
=
"/usr/bin/vpp -c /opt/5gc/startup_debug.conf"
N4PROCESS
=
"main"
N4PROCESS
=
"main"
N4PATH
=
"
$base
/install/n4"
N4PATH
=
"
$base
/install/n4"
UEIP
=
""
PREFIX
=
""
INTER
=
""
MAC
=
""
VPPEXPORT
=
""
ARPPROCESS
=
"setuniarp"
UE_IP
=
""
UE_IP_PREFIX
=
""
SNAT_INTER
=
""
SNAT_IP
=
""
VPPHOST
=
""
DPDK_EXPORT
=
""
DPDK_ENTRY
=
""
N3_GW
=
""
DPDK_ENTRY_PCI
=
""
DPDK_ENTRY_PCI
=
""
DPDK_EXPORT_PCI
=
""
DPDK_EXPORT_PCI
=
""
DRIVE
=
""
DRIVE
=
""
CPUNUMBER
=
""
CPUNUMBER
=
""
function
init_configure
(){
yaml
=
"
$1
"
# vpp
mkdir
-p
/opt/5gc
cp
-r
$configure
/template /opt/5gc
$base
/plugin/configure
-i
$yaml
-o
/opt/5gc
cp
$base
/plugin/yq
$current
# nat
SNAT_IP
=
$(
$current
/yq r
$yaml
vpp.ip_link.snatIP
)
N3_GW_IP
=
$(
$current
/yq r
$yaml
vpp.ip_link.N3_GW
)
VPPHOST
=
$(
$current
/yq r
$yaml
vpp.ip_link.vppHost
)
DPDK_EXPORT
=
$(
$current
/yq r
$yaml
vpp.ip_link.gtpu_export
)
DPDK_ENTRY
=
$(
$current
/yq r
$yaml
vpp.ip_link.gtpu_entry
)
CPUNUMBER
=
$(
$current
/yq r
$yaml
vpp.ip_link.cpu
)
sed
's/@N3_GW@/${N3_GW_IP}/'
/opt/5gc/startup_debug.conf
>
/dev/null 2>&1 &
UPF_CONFIG
=
$base
/etc/upf.conf
VPP_CONFIG
=
$base
/etc/vppe.conf
VPP_N4
=
$base
/etc/n4_config.yaml
#vpp config
UPF_N3_NAME
=
""
UPF_N6_NAME
=
""
UPF_N3_IP
=
""
UPF_N6_IP
=
""
UPF_N3_PCI
=
""
UPF_N6_PCI
=
""
UPF_N3_GW
=
""
UPF_N6_GW
=
""
UPF_CPU
=
""
UPF_MAINCORE
=
""
UPF_WORKERCORE
=
""
#u4 config
UPF_N4_GNB
=
""
UPF_N4_SMF
=
""
UPF_N4_UPF
=
""
UPF_N4_LOGSIZE
=
""
UPF_INTER_IP
=
""
UPF_INTER_PCI
=
""
function
start_vppe
()
{
#cmd="$VPPCMD"
install_dpdk_kmod
#$base/tools/interreput -i $CPUNUMBER
rm
-rf
$current
/yq
echo
Y |
sudo tee
/sys/module/vfio/parameters/enable_unsafe_noiommu_mode
}
function
start_vpp
()
{
#$cmd >/dev/null 2>&1 &
$base
/bin/vpp
-c
$base
/etc/vppe.conf
>
/dev/null 2>&1
;
cmd
=
"
$VPPCMD
"
sleep
1s
install_dpdk_kmod
pid
=
$(
pidof
$VPPPROCESS
)
$base
/plugin/interreput
-i
$CPUNUMBER
if
test
-z
"
$pid
"
;
then
echo
Y |
sudo tee
/sys/module/vfio/parameters/enable_unsafe_noiommu_mode
echo
"vpp startup failed"
$cmd
>
/dev/null 2>&1 &
else
sleep
1s
echo
"vpp
$pid
startup success"
pid
=
$(
pidof
$VPPPROCESS
)
fi
if
test
-z
"
$pid
"
;
then
echo
"vpp startup failed"
else
echo
"vpp
$pid
startup success"
fi
}
}
function
start_n4
()
{
function
start_n4
()
{
#$N4PATH/main -c /opt/5gc/n4_config.yaml >/dev/null 2>&1 &
$N4PATH
/main
-c
/opt/5gc/n4_config.yaml
>
/dev/null 2>&1 &
$base
/bin/main
-c
$base
/etc/n4_config.yaml &
>
/dev/null 2>&1
;
sleep
1s
pid2
=
$(
pidof
$N4PROCESS
)
sleep
1s
if
test
-z
"
$pid2
"
;
then
pid2
=
$(
pidof
$N4PROCESS
)
echo
"n4 startup failed"
else
if
test
-z
"
$pid2
"
;
then
echo
"n4
$pid2
startup success"
echo
"n4 startup failed"
fi
else
exit
0
echo
"n4
$pid2
startup success"
fi
exit
0
}
}
:<<
!
function
close_upf
()
function
start_arp
()
{
{
pid
=
$(
pidof
$VPPPROCESS
)
if
test
-z
"
$pid
"
;
then
echo
"vpp
$pid
is not startup"
else
echo
"kill vpp
$pid
"
kill
-9
${
pid
}
fi
pid
=
$(
pidof
$N4PROCESS
)
if
test
-z
"
$pid
"
;
then
echo
"n4
$pid
is not startup"
else
echo
"kill n4
$pid
"
kill
-9
${
pid
}
fi
}
echo
"start arp"
function
close_vppe
()
{
echo
"
$arp
"
/setuniarp
$INTER
$MAC
"
$UEIP
/
$PREFIX
"
$VPPEXPORT
pid
=
$(
pidof
$VPPPROCESS
)
"
$arp
"
/setuniarp
$INTER
$MAC
"
$UEIP
/
$PREFIX
"
$VPPEXPORT
>
/dev/null 2>&1 &
if
test
-z
"
$pid
"
;
then
echo
"vpp
$pid
is not startup"
else
echo
"kill vpp
$pid
"
kill
-9
${
pid
}
fi
}
sleep
1s
function
close_n4
()
pid2
=
$(
pidof
$ARPPROCESS
)
{
if
test
-z
"
$pid2
"
;
then
echo
"arp startup failed"
pid
=
$(
pidof
$N4PROCESS
)
else
if
test
-z
"
$pid
"
;
then
echo
"arp
$pid2
startup success"
echo
"n4
$pid
is not startup"
fi
else
exit
0
echo
"kill n4
$pid
"
kill
-9
${
pid
}
fi
exit
0
}
}
!
function
close_vpp
()
{
function
install_dpdk_kmod
()
{
sudo
modprobe vfio-pci
;
insmod_result
=
$?
exec_result
$insmod_result
pid
=
$(
pidof
$VPPPROCESS
)
return
0
;
if
test
-z
"
$pid
"
;
then
echo
"vpp
$pid
is not startup"
else
echo
"kill vpp
$pid
"
kill
-9
${
pid
}
fi
}
}
function
exec_result
()
{
if
[
$1
-ne
0
]
;
then
echo
"insmod vfio-pci.ko false"
fi
function
close_n4
()
{
echo
"insmod vfio-pci.ko success!!!"
pid
=
$(
pidof
$N4PROCESS
)
if
test
-z
"
$pid
"
;
then
echo
"n4
$pid
is not startup"
else
echo
"kill n4
$pid
"
kill
-9
${
pid
}
fi
exit
0
}
}
:<<
!
function
close_arp
()
{
pid
=
$(
pidof
$ARPPROCESS
)
function
install_deps
()
if
test
-z
"
$pid
"
;
then
{
echo
"arp
$pid
is not startup"
else
echo
"install deps"
echo
"kill arp
$pid
"
kill
-9
${
pid
}
fi
}
}
!
function
unbind
()
function
install_dpdk_kmod
()
{
{
sudo
modprobe vfio-pci
;
insmod_result
=
$?
python3
$current
/dpdk-devbind.py
-u
0000:
$DPDK_EXPORT_PCI
;
python3
$current
/dpdk-devbind.py
-u
0000:
$DPDK_EXPORT_PCI
;
exec_result
$insmod_result
python3
$current
/dpdk-devbind.py
-b
$DRIVE
$DPDK_EXPORT_PCI
sleep
1
python3
$current
/dpdk-devbind.py
-b
$DRIVE
$DPDK_EXPORT_PCI
sleep
1
ifconfig
$DPDK_EXPORT
down
;
sleep
1
ifconfig
$DPDK_ENTRY
down
;
sleep
1
return
0
;
}
}
function
exec_result
()
function
get_inter_ip
()
{
{
if
[
$1
-ne
0
]
;
then
INTER_NAME
=
$1
echo
"insmod vfio-pci.ko false"
#RES=$(echo "ifconfig $INTER_NAME |grep inet| sed -n '1p'|awk '{print $2}'")
fi
UPF_INTER_IP
=
$(
echo
`
ifconfig
${
INTER_NAME
}
|
grep
inet |
sed
-n
'1p'
|
awk
'{print $2}'
`
)
}
echo
"insmod vfio-pci.ko success!!!"
function
get_inter_pci
()
{
INTER_NAME
=
$1
UPF_INTER_PCI
=
$(
echo
`
$base
/tools/ethtool
-i
${
INTER_NAME
}
|
grep
"bus-info"
|
awk
'{print $2}'
`
)
#UPF_INTER_PCI=$(echo ` ./dpdk-devbind.py --status | grep "if=${INTER_NAME}" | awk '{print $1}'`)
}
function
generate_instance
()
{
CPUCORES
=
$(
echo
`
cat
/proc/cpuinfo|
grep
"processor"
|
wc
-l
`
)
UPF_MAINCORE
=
`
expr
$CPUCORES
- 3
`
workerc1
=
`
expr
$CPUCORES
- 2
`
workerc2
=
`
expr
$CPUCORES
- 1
`
UPF_WORKERCORE
=
"
$workerc1
,
$workerc2
"
#vpp config
sed
-i
s/@MAINCORE@/
${
UPF_MAINCORE
}
/
$VPP_CONFIG
>
/dev/null 2>&1
;
sed
-i
s/@WORKERCORE@/
${
UPF_WORKERCORE
}
/
$VPP_CONFIG
>
/dev/null 2>&1
;
sed
-i
s/@N3_PCI@/
${
UPF_N3_PCI
}
/
$VPP_CONFIG
>
/dev/null 2>&1
;
sed
-i
s/@N6_PCI@/
${
UPF_N6_PCI
}
/
$VPP_CONFIG
>
/dev/null 2>&1
;
sed
-i
s/@N3_IP@/
${
UPF_N3_IP
}
/
$VPP_CONFIG
>
/dev/null 2>&1
;
sed
-i
s/@N6_IP@/
${
UPF_N6_IP
}
/
$VPP_CONFIG
>
/dev/null 2>&1
;
sed
-i
s/@N3_GW@/
${
UPF_N3_GW
}
/
$VPP_CONFIG
>
/dev/null 2>&1
;
sed
-i
s/@N6_GW@/
${
UPF_N6_GW
}
/
$VPP_CONFIG
>
/dev/null 2>&1
;
#n4 config
sed
-i
s/@gnb@/
${
UPF_N4_GNB
}
/
$VPP_N4
>
/dev/null 2>&1
;
sed
-i
s/@smf@/
${
UPF_N4_SMF
}
/
$VPP_N4
>
/dev/null 2>&1
;
sed
-i
s/@upf@/
${
UPF_N4_UPF
}
/
$VPP_N4
>
/dev/null 2>&1
;
sed
-i
s/@logSize@/
${
UPF_N4_LOGSIZE
}
/
$VPP_N4
>
/dev/null 2>&1
;
echo
""
echo
"/opt/5gc/vppe.conf"
echo
"/opt/5gc/n4_config.yaml"
}
#read upf.txt
function
read_config
()
{
while
read
line
do
eval
"
$line
"
done
<
$UPF_CONFIG
echo
"vpp config"
UPF_N3_NAME
=
$vpp_n3_name
echo
"vpp_n3_name:
$UPF_N3_NAME
"
UPF_N6_NAME
=
$vpp_n6_name
echo
"vpp_n6_name:
$UPF_N6_NAME
"
UPF_N3_IP
=
$vpp_n3_ip
echo
"UPF_N3_IP:
$UPF_N3_IP
"
UPF_N6_IP
=
$vpp_n6_ip
echo
"UPF_N6_IP:
$UPF_N6_IP
"
UPF_N3_GW
=
$vpp_n3_gw
echo
"UPF_N3_GW:
$UPF_N3_GW
"
UPF_N6_GW
=
$vpp_n6_gw
echo
"UPF_N6_GW:
$UPF_N6_GW
"
UPF_CPU
=
$vpp_cpu
echo
"vpp_cpu:
$UPF_CPU
"
get_inter_pci
$UPF_N3_NAME
UPF_N3_PCI
=
$UPF_INTER_PCI
echo
"UPF_N3_PCI:
$UPF_N3_PCI
"
UPF_INTER_PCI
=
""
get_inter_pci
$UPF_N6_NAME
UPF_N6_PCI
=
$UPF_INTER_PCI
echo
"UPF_N6_PCI:
$UPF_N6_PCI
"
echo
""
echo
"n4 config"
UPF_N4_GNB
=
$n4_gnb
echo
"UPF_N4_GNB:
$UPF_N4_GNB
"
UPF_N4_SMF
=
$n4_smf
echo
"UPF_N4_SMF:
$UPF_N4_SMF
"
UPF_N4_UPF
=
$n4_upf
echo
"UPF_N4_UPF:
$UPF_N4_UPF
"
UPF_N4_LOGSIZE
=
$n4_logSize
echo
"UPF_N4_LOGSIZE:
$UPF_N4_LOGSIZE
"
}
function
config_upf
()
{
read_config
generate_instance
}
}
function
help
()
function
help
()
{
{
echo
" "
echo
"help---"
echo
"Usage: build_upf [OPTION]..."
echo
"Usage: run_upf [OPTION]..."
echo
"--start Start UPF"
echo
"--start-upf start UPF(n4 and vppe)"
echo
"--close Close UPF"
echo
"--close-upf close UPF(n4 and vppe)"
}
}
function
install_depence
(){
cp
$base
/plugin/yq
$current
>
/dev/null 2>&1
function
main
()
cp
$base
/plugin/replace/replace
$current
>
/dev/null 2>&1
{
}
if
[
!
-f
$UPF_CONFIG
]
;
then
echo
"no exist
$UPF_CONFIG
"
function
unbind
(){
return
python3
$current
/dpdk-devbind.py
-u
0000:
$DPDK_EXPORT_PCI
;
fi
python3
$current
/dpdk-devbind.py
-u
0000:
$DPDK_EXPORT_PCI
;
install_deps
python3
$current
/dpdk-devbind.py
-b
$DRIVE
$DPDK_EXPORT_PCI
if
[
$#
-eq
0
]
;
sleep
1
then
python3
$current
/dpdk-devbind.py
-b
$DRIVE
$DPDK_EXPORT_PCI
help
sleep
1
exit
fi
ifconfig
$DPDK_EXPORT
down
;
sleep
1
until
[
-z
"
$1
"
]
;
do
ifconfig
$DPDK_ENTRY
down
;
case
"
$1
"
in
sleep
1
--start-upf
)
}
config_upf
#close vppe, n4 process
function
main
()
{
close_upf
install_depence
#start vppe, n4 process
start_vppe
if
[
$#
-eq
0
]
;
sleep
20s
then
start_n4
help
exit
shift
fi
;;
--close-upf
)
until
[
-z
"
$1
"
]
;
do
#close vppe, n4 process
case
"
$1
"
in
close_vppe
-o
)
close_n4
init_configure
$2
shift
start_vpp
;;
sleep
20s
start_n4
*
)
shift
help
;;
exit
0
--close
)
shift
close_vpp
;;
close_n4
esac
shift
done
;;
return
0
esac
done
return
0
}
}
main
"
$@
"
main
"
$@
"
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment