From 962e5d07bf4d9172989d5ff7e079cfed793524a2 Mon Sep 17 00:00:00 2001 From: MOHAMED Kallel Date: Thu, 20 Nov 2014 11:18:55 +0100 Subject: [PATCH] Feature request #5515: VLAN Add the following object path and some sub params: - InternetGatewayDevice.Layer2Bridging.Bridge.{i}.VLAN.{i}. - InternetGatewayDevice.Layer2Bridging.Marking.{i}. - InternetGatewayDevice.Layer2Bridging.AvailableInterface.{i}. Signed-off-by: MOHAMED Kallel --- scripts/functions/common | 2 +- scripts/functions/layer_2_bridging | 534 ++++++++++++++++++++++++++--- 2 files changed, 487 insertions(+), 49 deletions(-) diff --git a/scripts/functions/common b/scripts/functions/common index ba76642..1c7983f 100644 --- a/scripts/functions/common +++ b/scripts/functions/common @@ -773,7 +773,7 @@ get_generic_dynamic() { } cat_cache_filter_param() { - cat "$1"* | grep "$2" + cat "$1"* | grep -F "$2" } get_param_prefix() { diff --git a/scripts/functions/layer_2_bridging b/scripts/functions/layer_2_bridging index a7e2b73..0e71d3c 100644 --- a/scripts/functions/layer_2_bridging +++ b/scripts/functions/layer_2_bridging @@ -7,58 +7,208 @@ set_bridge_bridgename() { delay_service reload "network" "1" } -set_bridge_x_inteno_com_associatedinterfaces() { - local iface="$1" - shift - local val="$*" - $UCI_SET network.$iface.ifname="$val" - delay_service reload "network" "1" -} - -get_bridge_bridgekey() { - local bkey=`brctl show | grep "br-$1" | cut -d. -f2 | cut -d$'\t' -f1` - [ "$bkey" != "" ] && printf '%u' "0x$bkey" -} - get_bridge_vlanid() { - local ifname vid - local ifnames=`$UCI_GET network.$1.ifname` - for ifname in $ifnames; do - local tmp=`$UCI_SHOW layer2_interface_vlan | grep "layer2_interface_vlan\.[^.]\+\.ifname=$ifname" | cut -f2 -d.` - vid=`$UCI_GET layer2_interface_vlan.$tmp.vlan8021q` - if [ "$vid" != "" ]; then echo $vid; return; fi - done + local bridge="$1" + local bkey=`$UCI_GET network.$bridge.bridge_instance` + local inst=`$UCI_SHOW layer2_interface_vlan |sed -n "s/layer2_interface_vlan\.[^.]\+\.instance=$bkey\.//p" | sort -n | head -n1` + [ "$inst" = "" ] && return + local vb=`$UCI_SHOW layer2_interface_vlan | grep "layer2_interface_vlan\.@vlan_bridge\[[0-9]\+\]\.instance=$bkey\.$inst" | cut -f2 -d.` + $UCI_GET layer2_interface_vlan.$vb.vid } set_bridge_vlanid() { + local bridge="$1" local val="$2" - local ifname nifname vid dev idev - local ifnames=`$UCI_GET network.$1.ifname` - for ifname in $ifnames; do - local tmp=`$UCI_SHOW layer2_interface_vlan | grep "layer2_interface_vlan\.[^.]\+\.ifname=$ifname" | cut -f2 -d.` - vid=`$UCI_GET layer2_interface_vlan.$tmp.vlan8021q` - if [ "$vid" != "" ]; then - idev=${ifname%.*} - break + local bkey=`$UCI_GET network.$bridge.bridge_instance` + local inst=`$UCI_SHOW layer2_interface_vlan |sed -n "s/layer2_interface_vlan\.[^.]\+\.instance=$bkey\.//p" | sort -n | head -n1` + if [ "$inst" = "" ]; then + local vb=`$UCI_ADD layer2_interface_vlan vlan_bridge` + local iv=`update_bridge_vlan_instance $vb $bkey` + $UCI_SET layer2_interface_vlan.$vb.bridgekey=$bkey + $UCI_SET layer2_interface_vlan.$vb.name="vlan_$bkey.$iv" + $UCI_SET layer2_interface_vlan.$vb.enable=0 + $UCI_SET layer2_interface_vlan.$vb.vid=$val + delay_service reload "network" "1" + else + local vb=`$UCI_SHOW layer2_interface_vlan | grep "layer2_interface_vlan\.@vlan_bridge\[[0-9]\+\]\.instance=$bkey\.$inst" | cut -f2 -d.` + set_bridgevlan_vid "$vb" "$val" + fi +} + +set_bridgevlan_enable() { + local vb="$1" + local val="$2" + + local vid=`$UCI_GET layer2_interface_vlan.$vb.vid` + vid=`printf '%d' $vid` + + local bkey=`$UCI_GET layer2_interface_vlan.$vb.bridgekey` + local cval=`$UCI_GET layer2_interface_vlan.$vb.enable` + val=`echo $val|tr '[A-Z]' '[a-z]'` + if [ "$val" = "true" -o "$val" = "1" ] && [ "$cval" != "1" ]; then + $UCI_SET layer2_interface_vlan.$vb.enable=1 + [ $vid -le 0 ] && return + update_add_vlan_interfaces "$bkey" "$vid" + update_add_vlan_to_bridge_interface "$bkey" "$vb" + elif [ "$val" = "false" -o "$val" = "0" ] && [ "$cval" != "0" ]; then + $UCI_SET layer2_interface_vlan.$vb.enable=0 + [ $vid -le 0 ] && return + update_remove_vlan_from_bridge_interface "$bkey" "$vb" + else + return + fi + + delay_service reload "network" "1" +} + +set_bridgevlan_vid() { + local vb="$1" + local val="$2" + local cval=`$UCI_GET layer2_interface_vlan.$vb.vid` + val=`printf '%d' $val` + [ "$val" = "$cval" -o $val -le 0 ] && return + local enable=`$UCI_GET layer2_interface_vlan.$vb.enable` + if [ "$enable" = "1" ]; then + local bkey=`$UCI_GET layer2_interface_vlan.$vb.bridgekey` + update_remove_vlan_from_bridge_interface "$bkey" "$vb" + $UCI_SET layer2_interface_vlan.$vb.vid=$val + update_add_vlan_interfaces "$bkey" "$val" + update_add_vlan_to_bridge_interface "$bkey" "$vb" + delay_service reload "network" "1" + else + $UCI_SET layer2_interface_vlan.$vb.vid=$val + fi +} + +set_marking_bridgekey() { + local mb="$1" + local val="$2" + local obkey=`$UCI_GET network.$mb.bridgekey` + $UCI_SET network.$mb.bridgekey=$val + local baseifname=`$UCI_GET network.$mb.baseifname` + case $baseifname in + eth0|atm*|ptm*) + local bkey=$obkey + local found=0 + local cmb cmbs=`$UCI_SHOW network | grep "network\.@marking-bridge\[[0-9]\+\]\.baseifname=$baseifname" | cut -f2 -d.` + for cmb in $cmbs; do + [ "`$UCI_GET network.$cmb.bridgekey`" = "$bkey" ] && { found=1; break; } + done + if [ "$found" = "0" ]; then + local vb vbs=`$UCI_SHOW layer2_interface_vlan | grep "layer2_interface_vlan\.@vlan_bridge\[[0-9]\+\]\.bridgekey=$bkey" | cut -f2 -d.` + for vb in $vbs; do + local vid=`$UCI_GET layer2_interface_vlan.$vb.vid` + [ "$vid" = "" ] && continue + local bridge=`$UCI_SHOW network | grep "network\.[^.]\+\.bridge_instance=$bkey" | cut -f2 -d.` + [ "$bridge" = "" ] && return + local bifname="`$UCI_GET network.$bridge.ifname` " + bifname=${bifname//$baseifname.$vid[^0-9]/} + bifname=${bifname// / }; bifname=${bifname// / } + $UCI_SET network.$bridge.ifname="${bifname% }" + done + fi + bkey=$val + [ "$bkey" = "" ] && return + local vb vbs=`$UCI_SHOW layer2_interface_vlan | grep "layer2_interface_vlan\.@vlan_bridge\[[0-9]\+\]\.bridgekey=$bkey" | cut -f2 -d.` + for vb in $vbs; do + local vid=`$UCI_GET layer2_interface_vlan.$vb.vid` + [ "$vid" = "" ] && continue + local enable=`$UCI_GET layer2_interface_vlan.$vb.enable ` + [ "$enable" = "" -o "$enable" = "0" ] && continue + update_remove_vlan_from_bridge_interface $bkey $vb + update_add_vlan_interfaces "$bkey" "$vid" + update_add_vlan_to_bridge_interface $bkey $vb + done + delay_service reload "network" "1" + ;; + esac +} + +set_marking_interfacekey() { + local mb="$1" + local val="$2" + local ab=`$UCI_SHOW network | grep "network\.@available-bridge\[[0-9]\+\]\.key=$val" | cut -f2 -d'.' | head -n1` + [ "$ab" = "" ] && return + $UCI_SET network.$mb.interfacekey=$val + local bifname=`$UCI_GET network.$ab.baseifname` + $UCI_SET network.$mb.baseifname=$bifname + case $bifname in + eth0|atm*|ptm*) + local bkey=`$UCI_GET network.$mb.bridgekey` + [ "$bkey" = "" ] && return + local vb vbs=`$UCI_SHOW layer2_interface_vlan | grep "layer2_interface_vlan\.@vlan_bridge\[[0-9]\+\]\.bridgekey=$bkey" | cut -f2 -d.` + for vb in $vbs; do + local vid=`$UCI_GET layer2_interface_vlan.$vb.vid` + [ "$vid" = "" ] && continue + local enable=`$UCI_GET layer2_interface_vlan.$vb.enable ` + [ "$enable" = "" -o "$enable" = "0" ] && continue + update_remove_vlan_from_bridge_interface $bkey $vb + update_add_vlan_interfaces "$bkey" "$vid" + update_add_vlan_to_bridge_interface $bkey $vb + done + delay_service reload "network" "1" + ;; + esac +} + +update_remove_vlan_from_bridge_interface() { + local bkey="$1" + local vb="$2" + local bridge=`$UCI_SHOW network | grep "network\.[^.]\+\.bridge_instance=$bkey" | cut -f2 -d.` + [ "$bridge" = "" ] && return + local vid=`$UCI_GET layer2_interface_vlan.$vb.vid` + local bifname="`$UCI_GET network.$bridge.ifname` " + bifname=${bifname//[aep]t[mh][0-9].$vid[^0-9]/} + bifname=${bifname// / }; bifname=${bifname// / } + $UCI_SET network.$bridge.ifname="${bifname% }" +} + +update_add_vlan_to_bridge_interface() { + local bkey="$1" + local vb="$2" + local bridge=`$UCI_SHOW network | grep "network\.[^.]\+\.bridge_instance=$bkey" | cut -f2 -d.` + [ "$bridge" = "" ] && return + + local vid=`$UCI_GET layer2_interface_vlan.$vb.vid` + [ "$vid" = "" ] && return + + local bifname="`$UCI_GET network.$bridge.ifname` " + local ifname vifname="" + local mb mbs=`$UCI_SHOW network | grep "network\.@marking-bridge\[[0-9]\+\]\.bridgekey=$bkey" | cut -f2 -d'.'` + for mb in $mbs; do + ifname=`$UCI_GET network.$mb.baseifname` + case "$ifname" in + eth0|atm*|ptm*) + ifname="$ifname.$vid" + [ "${bifname/$ifname[^0-9]/}" != "$bifname" ] && continue + bifname="$bifname$ifname " + ;; + esac + done + bifname=${bifname% }; bifname=${bifname# } + $UCI_SET network.$bridge.ifname="${bifname% }" +} + +update_add_vlan_interfaces() { + local bkey="$1" + local vid="$2" + local ifname mb mbs=`$UCI_SHOW network | grep "network\.@marking-bridge\[[0-9]\+\]\.bridgekey=$bkey" | cut -f2 -d'.'` + for mb in $mbs; do + ifname=`$UCI_GET network.$mb.baseifname` + local vif=`$UCI_SHOW layer2_interface_vlan | grep "layer2_interface_vlan\.@vlan_interface\[[0-9]\+\]\.ifname=$ifname.$vid" | cut -f2 -d.` + if [ "$vif" = "" ]; then + case "$ifname" in + eth0|atm*|ptm*) + vif=`$UCI_ADD layer2_interface_vlan vlan_interface` + $UCI_SET layer2_interface_vlan.$vif.baseifname=$ifname + $UCI_SET layer2_interface_vlan.$vif.bridge=1 + $UCI_SET layer2_interface_vlan.$vif.ifname=$ifname.$vid + $UCI_SET layer2_interface_vlan.$vif.name=$ifname.$vid + $UCI_SET layer2_interface_vlan.$vif.vlan8021q=$vid + ;; + esac fi done - - if [ "$vid" = "" ]; then - for idev in atm ptm eth0; do - dev=${ifnames#*$idev}; - [ "$dev" = "$ifnames" ] && continue - idev="$idev${dev%%.*}" - break - done - fi - local nifname=`add_bridge_vlan_interface $idev $val` - if [ "$vid" = "" ]; then - $UCI_SET network.$1.ifname="$ifnames $nifname" - else - $UCI_SET network.$1.ifname="${ifnames//$ifname/$nifname}" - fi - delay_service restart "layer2_interface_vlan" "1" - delay_service reload "network" "1" } update_bridge_instance() { @@ -76,28 +226,194 @@ update_bridge_instance() { fi } +update_bridge_vlan_instance() { + local bvlan="$1" + local ib="$2" + local inst=`$UCI_GET layer2_interface_vlan.$bvlan.instance` + if [ "$inst" != "" ]; then + echo "${inst#.}" + else + inst=`$UCI_SHOW layer2_interface_vlan |sed -n "s/layer2_interface_vlan\.[^.]\+\.instance=$ib\.//p" | sort -rn | head -n1` + inst=${inst:-0} + $UCI_SET layer2_interface_vlan.$bvlan.instance="$ib.$((++inst))" + $UCI_COMMIT + echo $inst + fi +} + +update_bridge_all_vlan_config_bybridge() { + local bridge="$1" + local bkey="$2" + local ifname ifnames=`$UCI_GET network.$bridge.ifname` + for ifname in $ifnames; do + case "$ifname" in + eth0*|atm*|ptm*) + local vid=${ifname#*.} + local vlan=`$UCI_SHOW layer2_interface_vlan | grep "layer2_interface_vlan\.@vlan_interface\[[0-9]\+\]\.ifname=$ifname" | cut -f2 -d.` + [ "$vlan" = "" ] && continue + update_bridge_vlan_config "$bridge" "$bkey" "$vid" "$vlan" + ;; + esac + done + $UCI_COMMIT +} + +update_bridge_vlan_config() { + local bridge="$1" + local bkey="$2" + local vid="$3" + local vlan="$4" + local cbridgevlan=`$UCI_SHOW layer2_interface_vlan | grep "layer2_interface_vlan\.@vlan_bridge\[[0-9]\+\]\.vid=$vid" | cut -f2 -d.` + if [ "$cbridgevlan" = "" ]; then + cbridgevlan=`$UCI_ADD layer2_interface_vlan vlan_bridge` + local iv=`update_bridge_vlan_instance "$cbridgevlan" "$bkey"` + $UCI_SET layer2_interface_vlan.$cbridgevlan.bridgekey=$bkey + $UCI_SET layer2_interface_vlan.$cbridgevlan.vid=$vid + $UCI_SET layer2_interface_vlan.$cbridgevlan.name=vlan_$bkey.$iv + fi +} + +update_availableinterface_list() { + local iface="$1" + local key + local ciface=`$UCI_SHOW network | grep "network\.@available-bridge\[[0-9]\+\]\.baseifname=$iface" | cut -f2 -d'.' | head -n1` + if [ "$ciface" != "" ]; then + $UCI_GET network.$ciface.key + return + fi + key=`$UCI_SHOW network |sed -n "s/network\.@available-bridge\[[0-9]\+\]\.key=//p" | sort -rn | head -n1` + key=${key:-0} + ciface=`$UCI_ADD network available-bridge` + $UCI_SET network.$ciface.baseifname=$iface + $UCI_SET network.$ciface.key=$((++key)) + $UCI_COMMIT + echo $key +} + +update_markinginterface_list() { + local bkey="$1" + local iface="$2" + local found ifname ifnames=`$UCI_GET network.$iface.ifname` + for ifname in $ifnames; do + found=0 + case "$ifname" in + eth0*|atm*|ptm*) + ifname=${ifname%.*} + local mb mbs=`$UCI_SHOW network | grep "network\.@marking-bridge\[[0-9]\+\]\.baseifname=$ifname" | cut -f2 -d'.'` + for mb in $mbs; do + [ "`$UCI_GET network.$mb.bridgekey`" = "$bkey" ] && { found=1; break; } + done + [ "$found" = "1" ] && continue + + local ciface=`$UCI_SHOW network | grep "network\.@available-bridge\[[0-9]\+\]\.baseifname=$ifname" | cut -f2 -d'.' | head -n1` + local interfacekey=`$UCI_GET network.$ciface.key` + local inst=`$UCI_SHOW network |sed -n "s/network\.@marking-bridge\[[0-9]\+\]\.instance=//p" | sort -rn | head -n1` + inst=${inst:-0} + + mb=`$UCI_ADD network marking-bridge` + $UCI_SET network.$mb.baseifname=$ifname + $UCI_SET network.$mb.bridgekey=$bkey + $UCI_SET network.$mb.interfacekey=$interfacekey + $UCI_SET network.$mb.instance="$((++inst))" + esac + done + + $UCI_COMMIT +} + +get_cache_object_bridge_vlan() { + local ib="$1" + local vb="$2" + local iv="$3" + get_object_cache_generic "InternetGatewayDevice.Layer2Bridging.Bridge.$ib.VLAN.$iv." "1" + get_param_cache_generic "InternetGatewayDevice.Layer2Bridging.Bridge.$ib.VLAN.$iv.VLANEnable" "1" "$UCI_GET layer2_interface_vlan.$vb.enable" "set_bridgevlan_enable $vb \$val" "" "xsd:boolean" + get_param_cache_generic "InternetGatewayDevice.Layer2Bridging.Bridge.$ib.VLAN.$iv.VLANName" "1" "$UCI_GET layer2_interface_vlan.$vb.name" "\$UCI_SET layer2_interface_vlan.$vb.name=\$val" + get_param_cache_generic "InternetGatewayDevice.Layer2Bridging.Bridge.$ib.VLAN.$iv.VLANID" "1" "$UCI_GET layer2_interface_vlan.$vb.vid" "set_bridgevlan_vid $vb \$val" "" "xsd:unsignedInt" +} + get_cache_object_bridge() { local iface="$1" local ib="$2" get_object_cache_generic "InternetGatewayDevice.Layer2Bridging.Bridge.$ib." "1" get_param_cache_generic "InternetGatewayDevice.Layer2Bridging.Bridge.$ib.BridgeEnable" "1" "" "set_interface_enable_ubus $iface \$val" "get_interface_enable_ubus $iface" "xsd:boolean" - get_param_cache_generic "InternetGatewayDevice.Layer2Bridging.Bridge.$ib.BridgeKey" "0" "get_bridge_bridgekey $iface" "" "" "xsd:unsignedInt" + get_param_cache_generic "InternetGatewayDevice.Layer2Bridging.Bridge.$ib.BridgeKey" "0" "echo $ib" "" "" "xsd:unsignedInt" get_param_cache_generic "InternetGatewayDevice.Layer2Bridging.Bridge.$ib.BridgeName" "1" "echo $iface" "set_bridge_bridgename $iface \$val" get_param_cache_generic "InternetGatewayDevice.Layer2Bridging.Bridge.$ib.VLANID" "1" "get_bridge_vlanid $iface" "set_bridge_vlanid $iface \$val" "" "xsd:unsignedInt" - get_param_cache_generic "InternetGatewayDevice.Layer2Bridging.Bridge.$ib.X_INTENO_COM_AssociatedInterfaces" "1" "$UCI_GET network.$iface.ifname" "set_bridge_x_inteno_com_associatedinterfaces $iface \$val" + get_param_cache_generic "InternetGatewayDevice.Layer2Bridging.Bridge.$ib.X_INTENO_COM_AssociatedInterfaces" "0" "$UCI_GET network.$iface.ifname" + get_object_cache_generic "InternetGatewayDevice.Layer2Bridging.Bridge.$ib.VLAN." "1" + update_bridge_all_vlan_config_bybridge $iface $ib + local vb vbs=`$UCI_SHOW layer2_interface_vlan | grep "layer2_interface_vlan\.@vlan_bridge\[[0-9]\+\]\.bridgekey=$ib" | cut -f2 -d.` + for vb in $vbs; do + local iv=`$UCI_GET layer2_interface_vlan.$vb.instance` + get_cache_object_bridge_vlan "$ib" "$vb" "${iv#*.}" + done +} + +get_cache_object_availableinterface() { + local ia="$1" + local oface="$2" + local key="$3" + local type="$4" + get_object_cache_generic "InternetGatewayDevice.Layer2Bridging.AvailableInterface.$ia." "0" + get_param_cache_generic "InternetGatewayDevice.Layer2Bridging.AvailableInterface.$ia.AvailableInterfaceKey" "0" "echo $key" "" "" "xsd:unsignedInt" + get_param_cache_generic "InternetGatewayDevice.Layer2Bridging.AvailableInterface.$ia.InterfaceReference" "0" "echo $oface" + get_param_cache_generic "InternetGatewayDevice.Layer2Bridging.AvailableInterface.$ia.InterfaceType" "0" "echo $type" +} + +get_cache_object_marking() { + local im="$1" + local mb="$2" + get_object_cache_generic "InternetGatewayDevice.Layer2Bridging.Marking.$im." "1" + get_param_cache_generic "InternetGatewayDevice.Layer2Bridging.Marking.$im.MarkingBridgeReference" "1" "$UCI_GET network.$mb.bridgekey" "set_marking_bridgekey $mb \$val" "" "xsd:int" + get_param_cache_generic "InternetGatewayDevice.Layer2Bridging.Marking.$im.MarkingInterface" "1" "$UCI_GET network.$mb.interfacekey" "set_marking_interfacekey $mb \$val" } get_cache_InternetGatewayDevice_Layer2Bridging() { local ib=0 iface get_object_cache_generic "InternetGatewayDevice.Layer2Bridging." "0" + get_object_cache_generic "InternetGatewayDevice.Layer2Bridging.AvailableInterface." "0" + local adev idev cdev ia + for adev in "$WAN_INST_ETH:ethernet" "$WAN_INST_ATM:adsl" "$WAN_INST_PTM:vdsl";do + idev=${adev%:*} + cdev=${adev#*:} + local fwan wans=`$UCI_SHOW layer2_interface_$cdev | sed -n "s/layer2_interface_$cdev\.[^.]\+\.baseifname=//p" | sort -u` + for fwan in $wans; do + local iwan=${fwan##*[hm]}; + local oface="InternetGatewayDevice.WANDevice.$idev.WANConnectionDevice.$((++iwan))." + ia=`update_availableinterface_list "$fwan"` + get_cache_object_availableinterface "$ia" "$oface" "$ia" "WANInterface" + done + done + for interface in `get_lan_device_interface`;do + local lan_iface=${interface%%;*} + local idev=${lan_iface%%:*} + local ndev=${lan_iface#*:} + + local eth eths=`get_lan_ethernet_interfaces $ndev` + local ieth=0 + for eth in $eths; do + [ "${eth/eth/}" = "$eth" ] && continue + local oface="InternetGatewayDevice.LANDevice.$idev.LANEthernetInterfaceConfig.$((++ieth))." + ia=`update_availableinterface_list "$eth"` + get_cache_object_availableinterface "$ia" "$oface" "$ia" "LANInterface" + done + done + get_object_cache_generic "InternetGatewayDevice.Layer2Bridging.Bridge." "1" local ifaces=`$UCI_SHOW network | grep "network\.[^=]\+=interface" | cut -d. -f2 | cut -d= -f1` for iface in $ifaces; do if [ "`$UCI_GET network.$iface.type`" = "bridge" ]; then ib=`update_bridge_instance $iface` + update_markinginterface_list "$ib" "$iface" get_cache_object_bridge "$iface" "$ib" fi done + get_object_cache_generic "InternetGatewayDevice.Layer2Bridging.Marking." "1" + local mb mbs=`$UCI_SHOW network | grep "network\.@marking-bridge\[[0-9]\+\]\.instance=" | cut -f2 -d'.'` + for mb in $mbs; do + local im=`$UCI_GET network.$mb.instance` + get_cache_object_marking "$im" "$mb" + done } add_layer2bridging_bridge() { @@ -125,6 +441,10 @@ delete_layer2bridging_bridge() { $UCI_SET network.$tmp.type= $UCI_SET network.$tmp.bridge_instance= + local vb vbs=`$UCI_SHOW layer2_interface_vlan | grep "layer2_interface_vlan\.@vlan_bridge\[[0-9]\+\]\.bridgekey=$instance" | cut -f2 -d.` + for vb in $vbs; do + $UCI_DELETE layer2_interface_vlan.$vb + done $UCI_COMMIT delay_service reload "network" "1" @@ -133,15 +453,120 @@ delete_layer2bridging_bridge() { return $FAULT_CPE_NO_FAULT } +add_layer2bridging_marking() { + local filename="$1" + local inst=`$UCI_SHOW network |sed -n "s/network\.@marking-bridge\[[0-9]\+\]\.instance=//p" | sort -rn | head -n1` + inst=${inst:-0} + mb=`$UCI_ADD network marking-bridge` + $UCI_SET network.$mb.instance="$((++inst))" + $UCI_COMMIT + get_cache_object_marking "$inst" "$mb" >> $cache_path/$filename + freecwmp_output "" "" "" "" "" "" "1" "$inst" + return $FAULT_CPE_NO_FAULT +} + +delete_layer2bridging_marking() { + local instance="$2" + local filename="$3" + $UCI_SET network.$mb.instance="$((++inst))" + local tmp=`$UCI_SHOW network |grep "network\.@marking-bridge\[[0-9]\+\]\.instance=$instance" | cut -d. -f2` + if [ "$tmp" = "" ]; then return $FAULT_CPE_INVALID_PARAMETER_NAME; fi + local bkey=`$UCI_GET network.$tmp.bridgekey` + local baseifname=`$UCI_GET network.$tmp.baseifname` + $UCI_DELETE network.$tmp + case $baseifname in + eth0|atm*|ptm*) + local found=0 + local cmb cmbs=`$UCI_SHOW network | grep "network\.@marking-bridge\[[0-9]\+\]\.baseifname=$baseifname" | cut -f2 -d.` + for cmb in $cmbs; do + [ "`$UCI_GET network.$cmb.bridgekey`" = "$bkey" ] && { found=1; break; } + done + if [ "$found" = "0" ]; then + local vb vbs=`$UCI_SHOW layer2_interface_vlan | grep "layer2_interface_vlan\.@vlan_bridge\[[0-9]\+\]\.bridgekey=$bkey" | cut -f2 -d.` + for vb in $vbs; do + local vid=`$UCI_GET layer2_interface_vlan.$vb.vid` + [ "$vid" = "" ] && continue + local bridge=`$UCI_SHOW network | grep "network\.[^.]\+\.bridge_instance=$bkey" | cut -f2 -d.` + [ "$bridge" = "" ] && return + local bifname="`$UCI_GET network.$bridge.ifname` " + bifname=${bifname//$baseifname.$vid[^0-9]/} + bifname=${bifname// / }; bifname=${bifname// / } + $UCI_SET network.$bridge.ifname="${bifname% }" + done + fi + esac + $UCI_COMMIT + + freecwmp_output "" "" "" "" "" "" "1" + sed -i "/$1/d" $cache_path/$filename + return $FAULT_CPE_NO_FAULT +} + +add_layer2bridging_bridge_vlan() { + local ibridge="$1" + local filename="$2" + + local bridge=`$UCI_SHOW network | grep "network\.[^.]\+\.bridge_instance=$ibridge" | cut -f2 -d.` + [ "$bridge" = "" ] && return $FAULT_CPE_INVALID_PARAMETER_NAME; + + local vb=`$UCI_ADD layer2_interface_vlan vlan_bridge` + local iv=`update_bridge_vlan_instance $vb $ibridge` + $UCI_SET layer2_interface_vlan.$vb.bridgekey=$ibridge + $UCI_SET layer2_interface_vlan.$vb.name="vlan_$ibridge.$iv" + $UCI_SET layer2_interface_vlan.$vb.enable=0 + $UCI_COMMIT + + get_cache_object_bridge_vlan "$ibridge" "$vb" "$iv" >> $cache_path/$filename + freecwmp_output "" "" "" "" "" "" "1" "$iv" + return $FAULT_CPE_NO_FAULT +} + +delete_layer2bridging_bridge_vlan() { + local instances="$2" + local filename="$3" + instances=${instances// /.} + local vb=`$UCI_SHOW layer2_interface_vlan | grep "layer2_interface_vlan\.@vlan_bridge\[[0-9]\+\]\.instance=$instances" | cut -f2 -d'.' | head -n1` + [ "$vb" = "" ] && return $FAULT_CPE_INVALID_PARAMETER_NAME + local bridge=`$UCI_SHOW network | grep "network\.[^.]\+\.bridge_instance=${instances%.*}" | cut -f2 -d.` + [ "$bridge" = "" ] && return $FAULT_CPE_INTERNAL_ERROR + + local vid=`$UCI_GET layer2_interface_vlan.$vb.vid` + local bifname="`$UCI_GET network.$bridge.ifname` " + bifname=${bifname//[aep]t[mh][0-9].$vid[^0-9]/} + bifname=${bifname// / }; bifname=${bifname// / } + $UCI_SET network.$bridge.ifname="${bifname% }" + $UCI_DELETE layer2_interface_vlan.$vb + $UCI_COMMIT + + delay_service reload "network" "1" + freecwmp_output "" "" "" "" "" "" "1" + sed -i "/$1/d" $cache_path/$filename + return $FAULT_CPE_NO_FAULT +} + add_object_InternetGatewayDevice_Layer2Bridging() { local filename="$2" local fault_code case $1 in + InternetGatewayDevice.Layer2Bridging.Bridge.[1-9]*.VLAN.) + freecwmp_parse_formated_parameter "$1" "InternetGatewayDevice.Layer2Bridging.Bridge.{i}.VLAN." "rc" "ibridge" + if [ "$rc" != "0" ]; then + return $FAULT_CPE_INVALID_PARAMETER_NAME; + fi + add_layer2bridging_bridge_vlan "$ibridge" "$filename" + fault_code="$?" + return $fault_code + ;; InternetGatewayDevice.Layer2Bridging.Bridge.) add_layer2bridging_bridge "$filename" fault_code="$?" return $fault_code ;; + InternetGatewayDevice.Layer2Bridging.Marking.) + add_layer2bridging_marking "$filename" + fault_code="$?" + return $fault_code + ;; esac return $FAULT_CPE_INVALID_PARAMETER_NAME } @@ -150,13 +575,26 @@ delete_object_InternetGatewayDevice_Layer2Bridging() { local filename="$2" local fault_code instances case $1 in + InternetGatewayDevice.Layer2Bridging.Bridge.[1-9]*.VLAN.[1-9]*.) + freecwmp_parse_formated_parameter "$1" "InternetGatewayDevice.Layer2Bridging.Bridge.{i}.VLAN.{i}." "rc" "instances" + if [ "$rc" != "0" ]; then return $FAULT_CPE_INVALID_PARAMETER_NAME; fi + delete_layer2bridging_bridge_vlan "$1" "$instances" "$filename" + fault_code="$?" + return $fault_code + ;; InternetGatewayDevice.Layer2Bridging.Bridge.[1-9]*.) freecwmp_parse_formated_parameter "$1" "InternetGatewayDevice.Layer2Bridging.Bridge.{i}." "rc" "instances" if [ "$rc" != "0" ]; then return $FAULT_CPE_INVALID_PARAMETER_NAME; fi delete_layer2bridging_bridge "$1" "$instances" "$filename" fault_code="$?" return $fault_code - + ;; + InternetGatewayDevice.Layer2Bridging.Marking.[1-9]*.) + freecwmp_parse_formated_parameter "$1" "InternetGatewayDevice.Layer2Bridging.Marking.{i}." "rc" "instances" + if [ "$rc" != "0" ]; then return $FAULT_CPE_INVALID_PARAMETER_NAME; fi + delete_layer2bridging_marking "$1" "$instances" "$filename" + fault_code="$?" + return $fault_code ;; esac return $FAULT_CPE_INVALID_PARAMETER_NAME