iopsys-feed/layer2interface/broadcom/etc/init.d/dsl
2018-01-26 16:17:00 +01:00

515 lines
13 KiB
Bash
Executable file

#!/bin/sh /etc/rc.common
. /lib/functions.sh
include /lib/network
START=20
USE_PROCD=1
DEVICE_ADDED=0
device_config_exists() {
ubus call uci get '{"config":"network","type":"device"}' | grep -w name | grep -qw "$1" && return 0
return 1
}
configure_untagged_vlan() {
local name="$1"
local device="$2"
local ifname="$3"
[ -n "$ifname" -a -n "$name" ] || return
device_config_exists "$ifname" && return
uci -q set network.$name=device
uci -q set network.$name.type=untagged
uci -q set network.$name.ifname="$device"
uci -q set network.$name.name="$ifname"
uci -q commit network
DEVICE_ADDED=1
}
# ATM #
check_pvc() {
local vpi=$1
local vci=$2
local ret
ret=$(xtmctl operate conn --show | awk -v test="$vpi/$vci" '{if ($3==test ) print $5 }')
case $ret in
''|*[!0-9]*) return 0 ;;
*) return $ret ;;
esac
}
check_xtm_list() {
local qclass=$1
local pcr scr mbs
local ret
case $# in
1)
pcr=0
scr=0
mbs=0
;;
2)
pcr=$2
scr=0
mbs=0
;;
4)
pcr=$2
scr=$3
mbs=$4
;;
esac
ret=$(xtmctl operate tdte --show | awk -v test="$qclass" -v pcr="$pcr" -v scr="$scr" -v mbs="$mbs" '{if ($2==test && $3==pcr && $4==scr && $5==mbs ) print $1 }')
case $ret in
''|*[!0-9]*) return 0 ;;
*) return $ret ;;
esac
}
configure_atm_device() {
local name vpi vci device link_type encapsulation qos_class pcr mbs scr
config_get name $1 name "ATM"
config_get vpi $1 vpi "8"
config_get vci $1 vci "35"
config_get device $1 device "atm0"
config_get link_type $1 link_type "eoa"
config_get encapsulation $1 encapsulation "llc"
config_get qos_class $1 qos_class "ubr"
config_get pcr $1 pcr
config_get mbs $1 mbs
config_get scr $1 scr
check_pvc $vpi $vci
ret=$?
if [ "$ret" -eq 0 ]; then
check_xtm_list $qos_class $pcr $scr $mbs
ret=$?
if [ "$ret" -eq 0 ]; then
case $qos_class in # ubr, cbr, gfr, vbr-nrt, vbr-rt, ubr+, abr
ubr)
xtmctl operate tdte --add "$qos_class"
;;
ubr_pcr|ubr+)
xtmctl operate tdte --add "$qos_class" $pcr
;;
cbr)
xtmctl operate tdte --add "$qos_class" $pcr
;;
nrtvbr|vbr-nrt)
xtmctl operate tdte --add "$qos_class" $pcr $scr $mbs
;;
rtvbr|vbr-rt)
xtmctl operate tdte --add "$qos_class" $pcr $scr $mbs
;;
gfr)
;;
abr)
;;
esac
fi
case $link_type in # EoA, IPoA, PPPoA, CIP
EoA|eoa)
[ $encapsulation == "vcmux" ] && encapsulation="vcmux_eth" || encapsulation="llcsnap_eth"
;;
PPPoA|pppoa)
[ $encapsulation == "vcmux" ] && encapsulation="vcmux_pppoa" || encapsulation="llcencaps_ppp"
;;
IPoA|ipoa)
[ $encapsulation == "vcmux" ] && encapsulation="vcmux_ipoa" || encapsulation="llcsnap_rtip"
;;
CIP|cip)
;;
esac
check_xtm_list $qos_class $pcr $scr $mbs
ret="$?"
xtmctl operate conn --add 1.$vpi.$vci aal5 $encapsulation 0 1 $ret
xtmctl operate conn --addq 1.$vpi.$vci 0 wrr 1 dt # low priority queue
xtmctl operate conn --addq 1.$vpi.$vci 1 wrr 1 dt # mid priority queue upstream ACK's and ping from LAN will use this queue
xtmctl operate conn --addq 1.$vpi.$vci 7 wrr 1 dt # high priority queue, internal traffic dhcp igmp dns and icmp
xtmctl operate conn --createnetdev 1.$vpi.$vci $device
xtmctl operate intf --state 1 enable
configure_untagged_vlan "$name" "$device" "$device.1"
[ $DEVICE_ADDED -eq 1 ] && ubus call network reload
fi
}
remove_atm_devices() {
local vpi vci rest
local vpivci=`xtmctl operate conn --show | grep "ATM\|mode" | awk '{if (NR!=1 && $1!="PTM") {print $3}}'`
for i in $vpivci
do
rest=${i#\/}
vpi=${rest%%\/*}
vci=${rest#*\/}
echo "xtmctl operate conn --delete 1.$vpi.$vci"
xtmctl operate conn --delete 1.$vpi.$vci
echo "xtmctl operate conn --deletenetdev 1.$vpi.$vci"
xtmctl operate conn --deletenetdev 1.$vpi.$vci
done
}
create_atm_devices() {
echo "Creating ATM Device(s)"
config_load dsl
config_foreach configure_atm_device atm-device
}
# ATM END #
# PTM #
check_ptm() {
local ret
local ptmprio=$1
local dslat=$2
if [ "$ptmprio" -eq 2 ]; then
ptmprio="high"
else
ptmprio="low"
fi
ret=$(xtmctl operate conn --show | awk -v dslat="$dslat" -v ptmprio="$ptmprio" '{if ($2 == dslat && $3 == ptmprio ) print $2 }')
case $ret in
''|*[!0-9]*) return 0 ;;
*) return $ret ;;
esac
}
configure_ptm_device() {
local name device priority portid
config_get name $1 name "PTM"
config_get device $1 device "ptm0"
config_get priority $1 priority 1
config_get portid $1 portid 1
check_ptm $priority $portid
ret=$?
if [ "$ret" -eq 0 ]; then
xtmctl operate conn --add $portid.$priority
xtmctl operate conn --addq $portid.$priority 0 wrr 1 dt -1 -1 3000 # low priority queue
xtmctl operate conn --addq $portid.$priority 1 wrr 1 dt -1 -1 3000 # mid priority queue upstream ACK's and ping from LAN will use this queue
xtmctl operate conn --addq $portid.$priority 7 wrr 1 dt -1 -1 3000 # high priority queue, internal traffic dhcp igmp dns and icmp
echo "xtmctl operate conn --createnetdev $portid.$priority $device"
xtmctl operate conn --createnetdev $portid.$priority $device
xtmctl operate intf --state 1 enable
configure_untagged_vlan "$name" "$device" "$device.1"
[ $DEVICE_ADDED -eq 1 ] && ubus call network reload
fi
}
remove_ptm_devices() {
local delptm
local x=0
IFS=$'\n'
for i in `xtmctl operate conn --show | grep "PTM\|mode"`
do
if [ $x -eq 1 ]; then
delptm=$(echo $i | awk '{if ($1!="ATM") print $2"."$11}')
echo "xtmctl operate conn --delete $delptm"
xtmctl operate conn --delete $delptm
xtmctl operate conn --deletenetdev $delptm
fi
x=1
done
unset IFS
}
create_ptm_devices() {
echo "Creating PTM Device(s)"
config_load dsl
config_foreach configure_ptm_device ptm-device
}
# PTM END #
prioritize_arp()
{
ebtables -t nat -D POSTROUTING -j mark --mark-or 0x7 -p ARP >/dev/null
ebtables -t nat -A POSTROUTING -j mark --mark-or 0x7 -p ARP >/dev/null
}
remove_devices() {
remove_atm_devices
remove_ptm_devices
}
create_devices() {
local tpstc="$(xdslctl info --show | grep TPS-TC)"
if echo "$tpstc" | grep -q "ATM Mode"; then
create_atm_devices
elif echo "$tpstc" | grep -q "PTM Mode"; then
create_ptm_devices
fi
}
start_dsl() {
local VDSL=0
local GFAST=0
local mod=""
local modes=""
local profile=""
config_load dsl
# Modes
config_get mode line mode
for mod in $mode; do
[ $mod == "gdmt" ] && "${modes}d"
[ $mod == "glite" ] && modes="${modes}l"
[ $mod == "t1413" ] && modes="${modes}t"
[ $mod == "adsl2" ] && modes="${modes}2"
[ $mod == "adsl2p" ] && modes="${modes}p"
[ $mod == "annexl" ] && modes="${modes}e"
[ $mod == "annexm" ] && modes="${modes}m"
[ $mod == "vdsl2" ] && modes="${modes}v" && VDSL=1
[ $mod == "gfast" ] && modes="${modes}f" && GFAST=1
done
# VDSL Profiles
config_get profile line profile
profile="$(echo $profile | sed 's/35b/BrcmPriv1/g')"
# Capabilities
config_get_bool bitswap line bitswap 1
[ $bitswap -eq 1 ] && bitswap="on" || bitswap="off"
config_get_bool sra line sra 1
[ $sra -eq 1 ] && sra="on" || sra="off"
# config_get_bool trellis line trellis 1
# config_get_bool sesdrop line sesdrop 1
# VDSL2 only
config_get_bool us0 line us0 1
[ $us0 -eq 1 ] && us0="on" || us0="off"
# config_get_bool dynamicd line dynamicd 1
# config_get_bool dynamicf line dynamicf 1
# config_get_bool sos line sos 1
echo "Starting DSL"
xtmctl start
xtmctl operate intf --state 1 enable
if [ $VDSL -eq 1 -o $GFAST -eq 1 ]; then
echo "xdslctl start --up --mod $modes --profile "$profile" --sra $sra --bitswap $bitswap --us0 $us0"
xdslctl start --up --mod $modes --profile "$profile" --sra $sra --bitswap $bitswap --us0 $us0
else
echo "xdslctl start --up --mod $modes --sra $sra --bitswap $bitswap"
xdslctl start --up --mod $modes --sra $sra --bitswap $bitswap
fi
if [ $GFAST -eq 1 ]; then
# enable V43 tone set for GFAST
echo "xdslctl configure1 --phycfg 0 0 0 0 0 0 0 0 0 0 0 0x400000 0x400000"
xdslctl configure1 --phycfg 0 0 0 0 0 0 0 0 0 0 0 0x400000 0x400000
fi
}
# CONVERT OLD CONFIG #
convert_old_atm() {
local name ifname baseifname
local vpi vci link_type atmtype pcr scr mbs
local encapseoa encapspppoa encapsipoa encapsulation
config_get atmtype $1 atmtype "ubr"
config_get link_type $1 link_type "EoA"
config_get pcr $1 pcr
config_get scr $1 scr
config_get mbs $1 mbs
config_get vpi $1 vpi "8"
config_get vci $1 vci "35"
config_get encapseoa $1 encapseoa
config_get encapspppoa $1 encapspppoa
config_get encapsipoa $1 encapsipoa
config_get baseifname $1 baseifname "atm0"
config_get name $1 name "ATM$vpi$vci"
uci -q set dsl.$baseifname=atm-device
uci -q set dsl.$baseifname.name="$name"
uci -q set dsl.$baseifname.device="$baseifname"
uci -q set dsl.$baseifname.qos_class="$atmtype"
uci -q set dsl.$baseifname.vpi="$vpi"
uci -q set dsl.$baseifname.vci="$vci"
uci -q set dsl.$baseifname.pcr="$pcr"
uci -q set dsl.$baseifname.mbs="$mbs"
uci -q set dsl.$baseifname.scr="$scr"
case $link_type in
EoA)
uci -q set dsl.$baseifname.link_type="eoa"
[ "$encapseoa" == "vcmux_eth" ] && encapsulation="vcmux" || encapsulation="llc"
uci -q set dsl.$baseifname.encapsulation="$encapsulation"
;;
PPPoA)
uci -q set dsl.$baseifname.link_type="pppoa"
[ "$encapspppoa" == "vcmux_pppoa" ] && encapsulation="vcmux" || encapsulation="llc"
uci -q set dsl.$baseifname.encapsulation="$encapsulation"
;;
IPoA)
uci -q set dsl.$baseifname.link_type="ipoa"
[ "$encapsipoa" == "vcmux_ipoa" ] && encapsulation="vcmux" || encapsulation="llc"
uci -q set dsl.$baseifname.encapsulation="$encapsulation"
;;
esac
}
convert_old_ptm() {
local name ifname baseifname
local dslat ptmprio
config_get name $1 name "PTM"
config_get baseifname $1 baseifname "ptm0"
config_get dslat $1 dslat
config_get ptmprio $1 ptmprio
uci -q set dsl.$baseifname=ptm-device
uci -q set dsl.$baseifname.name="$name"
uci -q set dsl.$baseifname.device="$baseifname"
uci -q set dsl.$baseifname.priority="$ptmprio"
uci -q set dsl.$baseifname.portid="$dslat"
}
convert_old_dsl() {
local cap
sed -i 's/Enabled/1/g' /etc/config/layer2_interface
sed -i 's/Disabled/0/g' /etc/config/layer2_interface
uci -q delete dsl.line.mode
uci -q delete dsl.line.profile
uci -q delete dsl.line.us0
uci -q delete dsl.line.sra
uci -q delete dsl.line.bitswap
config_load layer2_interface
# Mode
config_get_bool cap capabilities GDmt 1
[ $cap -eq 1 ] && uci -q add_list dsl.line.mode=gdmt
config_get_bool cap capabilities Glite 1
[ $cap -eq 1 ] && uci -q add_list dsl.line.mode=glite
config_get_bool cap capabilities T1413 1
[ $cap -eq 1 ] && uci -q add_list dsl.line.mode=t1413
config_get_bool cap capabilities ADSL2 1
[ $cap -eq 1 ] && uci -q add_list dsl.line.mode=adsl2
config_get_bool cap capabilities ADSL2plus 1
[ $cap -eq 1 ] && uci -q add_list dsl.line.mode=adsl2p
config_get_bool cap capabilities AnnexL 1
[ $cap -eq 1 ] && uci -q add_list dsl.line.mode=annexl
config_get_bool cap capabilities AnnexM 1
[ $cap -eq 1 ] && uci -q add_list dsl.line.mode=annexm
config_get_bool cap capabilities VDSL2 1
[ $cap -eq 1 ] && uci -q add_list dsl.line.mode=vdsl2
config_get_bool cap capabilities GFast 0
[ $cap -eq 1 ] && uci -q add_list dsl.line.mode=gfast
# Profile
config_get_bool cap capabilities 8a 1
[ $cap -eq 1 ] && uci -q add_list dsl.line.profile=8a
config_get_bool cap capabilities 8b 1
[ $cap -eq 1 ] && uci -q add_list dsl.line.profile=8b
config_get_bool cap capabilities 8c 1
[ $cap -eq 1 ] && uci -q add_list dsl.line.profile=8c
config_get_bool cap capabilities 8d 1
[ $cap -eq 1 ] && uci -q add_list dsl.line.profile=8d
config_get_bool cap capabilities 12a 1
[ $cap -eq 1 ] && uci -q add_list dsl.line.profile=12a
config_get_bool cap capabilities 12b 1
[ $cap -eq 1 ] && uci -q add_list dsl.line.profile=12b
config_get_bool cap capabilities 17a 1
[ $cap -eq 1 ] && uci -q add_list dsl.line.profile=17a
config_get_bool cap capabilities 30a 1
[ $cap -eq 1 ] && uci -q add_list dsl.line.profile=30a
config_get_bool cap capabilities 35b 0
[ $cap -eq 1 ] && uci -q add_list dsl.line.profile=35b
# Capability
config_get_bool cap capabilities US0 1
uci -q set dsl.line.us0=$cap
config_get_bool cap capabilities bitswap 1
uci -q set dsl.line.bitswap=$cap
config_get_bool cap capabilities sra 1
uci -q set dsl.line.sra=$cap
}
convert_old_config() {
[ -f /etc/config/dsl ] || touch /etc/config/dsl
# DSL
if uci -q get layer2_interface.capabilities >/dev/null; then
convert_old_dsl
fi
# ATM Devices
if uci -q get layer2_interface_adsl.@atm_bridge[0] >/dev/null; then
config_load layer2_interface_adsl
config_foreach convert_old_atm atm_bridge
fi
# PTM Devices
if uci -q get layer2_interface_vdsl.@vdsl_interface[0] >/dev/null; then
config_load layer2_interface_vdsl
config_foreach convert_old_ptm vdsl_interface
fi
uci -q commit dsl
# rm -f /etc/config/layer2_interface
# rm -f /etc/config/layer2_interface_adsl
# rm -f /etc/config/layer2_interface_vdsl
}
# CONVERT OLD CONFIG END#
start_service() {
create_devices
}
stop_service() {
remove_devices
# echo "Stopping DSL"
# stop causes IRQ issues
# xdslctl stop
}
boot() {
local HASADSL="$(db -q get hw.board.hasAdsl)"
local HASVDSL="$(db -q get hw.board.hasVdsl)"
[ "$HASADSL" == "1" -o "$HASVDSL" == "1" ] || return
convert_old_config
prioritize_arp
start_dsl
start
}
reload_service() {
stop
start
}
service_triggers() {
procd_add_reload_trigger dsl layer2_interface layer2_interface_adsl layer2_interface_vdsl
}