#!/bin/sh # Copyright (C) 2014 Inteno Broadband Technology AB # Author Mohamed Kallel prefix_list="$prefix_list InternetGatewayDevice.Layer3Forwarding." hex_to_ip() { local hex="$1" printf "%d.%d.%d.%d" 0x${hex:0:2} 0x${hex:2:2} 0x${hex:4:2} 0x${hex:6:2} } ip_to_hex() { local ip="$1" local ip1=${ip%%.*}; ip=${ip#*.} local ip2=${ip%%.*}; ip=${ip#*.} local ip3=${ip%%.*}; ip=${ip#*.} local ip4=${ip%%.*} printf "%02X%02X%02X%02X" $ip1 $ip2 $ip3 $ip4 } proc_get_route_var_by_conf() { local route="$1" local varn="$2" local dest=`$UCI_GET network.$route.target` dest=`ip_to_hex $dest` local mask=`$UCI_GET network.$route.netmask` mask=${mask:-255.255.255.255} mask=`ip_to_hex $mask` awk '$2=="'"$dest"'" && $8=="'"$mask"'"{print $'"$varn"'}' /proc/net/route } set_layer3_def_conn_serv() { local val="$1" local linker=`get_linker_by_parameter "$val"` local interface=${linker#*:} [ "$interface" = "" ] && return $UCI_SET cwmp.cpe.default_wan_interface=$interface delay_service reload "network" "1" } get_layer3_nbr_entry() { local pr=`cat /proc/net/route | wc -l` local proute ln=0 pr=0 while read proute; do [ "$ln" = "0" ] && { let ln++; continue; } local found="0" local dest=`echo $proute | awk '{print $2}'`; dest=`hex_to_ip $dest` local mask=`echo $proute | awk '{print $8}'`; mask=`hex_to_ip $mask` local route routes=`$UCI_SHOW network | grep "network\.@route[^=]\+=route" | cut -d. -f2 | cut -d= -f1` for route in $routes; do cdest=`$UCI_GET network.$route.target`; cdest=${cdest:-0.0.0.0} cmask=`$UCI_GET network.$route.netmask`;cmask=${cmask:-255.255.255.255} if [ "$cdest" = "$dest" -a "$cmask" = "$mask" ]; then found="1" break fi done [ "$found" = "0" ] && let pr++ done < /proc/net/route local dr=`$UCI_SHOW network | grep "network\.@route_disabled\[[0-9]\+\]=route_disabled" | wc -l` local cr=`$UCI_SHOW network | grep "network\.@route\[[0-9]\+\]=route" | wc -l` echo $((pr+dr+cr)) } get_layer3_enable() { local route="$1" case $route in "@route_disabled["*) echo 0 ;; "@route["*) [ "`proc_get_route_var_by_conf $route 1`" = "" ] && echo 0 || echo 1 ;; *) echo 1 ;; esac } set_layer3_enable() { local route="$1" local val="$2" local droute sroute="$route" val=`echo $val|tr '[A-Z]' '[a-z]'` if [ "$val" = "true" -o "$val" = "1" ]; then case $route in "@route_disabled["*) droute="route" ;; *) return ;; esac elif [ "$val" = "false" -o "$val" = "0" ]; then case $route in "@route["*) droute="route_disabled" ;; *) return ;; esac else return fi local rc rconfigs=`$UCI_SHOW network.$sroute |sed -n "s/network\.[^.]\+\.//p"` route=`$UCI_ADD network $droute` for rc in $rconfigs; do $UCI_SET network.$route.$rc done $UCI_DELETE network.$sroute delay_service reload "network" "1" } get_layer3_status() { [ "`get_layer3_enable $1`" = "1" ] && echo "Enabled" || echo "Disabled" } get_layer3_type() { local route="$1" local val case "$route" in *"@route"*) val=`$UCI_GET network.$route.netmask` ;; *) val=`echo $route | awk '{print $8}'` val=`hex_to_ip $val` ;; esac [ "$val" = "255.255.255.255" -o "$val" = "" ] && echo "Host" || echo "Network" } get_layer3_destip() { local route="$1" local val case "$route" in *"@route"*) val=`$UCI_GET network.$route.target` ;; *) val=`echo $route | awk '{print $2}'` val=`hex_to_ip $val` ;; esac [ "$val" = "" ] && echo "0.0.0.0" || echo "$val" } set_layer3_destip() { local route="$1" local val="$2" $UCI_SET network.$route.target=$val delay_service reload "network" "1" } get_layer3_destmask() { local route="$1" local val case "$route" in *"@route"*) val=`$UCI_GET network.$route.netmask` ;; *) val=`echo $route | awk '{print $8}'` val=`hex_to_ip $val` ;; esac [ "$val" = "" ] && echo "255.255.255.255" || echo "$val" } set_layer3_destmask() { local route="$1" local val="$2" $UCI_SET network.$route.netmask=$val delay_service reload "network" "1" } get_layer3_gatewayip() { local route="$1" local val case "$route" in *"@route"*) val=`$UCI_GET network.$route.gateway` ;; *) val=`echo $route | awk '{print $3}'` val=`hex_to_ip $val` ;; esac [ "$val" = "" ] && echo "0.0.0.0" || echo "$val" } set_layer3_gatewayip() { local route="$1" local val="$2" $UCI_SET network.$route.gateway=$val delay_service reload "network" "1" } get_layer3_interface() { local route="$1" local val="" case "$route" in *"@route"*) val=`$UCI_GET network.$route.interface` ;; *) bval=`echo $route | awk '{print $1}'` local val=${bval/br-/} if [ "$bval" = "$val" ]; then local device iface ifaces=`$UCI_SHOW network | grep "network\.[^.]\+\.ifname=.*$val" | cut -f2 -d.` for iface in $ifaces; do json_load "$(ifstatus $iface)" json_get_var device device if [ "$device" = "$val" ]; then val="$iface" break fi done fi ;; esac echo "$val" } get_layer3_interface_linker_parameter() { local iface="$1" local val="" [ "$iface" = "" ] && return val="$(get_parameter_by_linker linker_interface:$iface)" echo $val } set_layer3_interface_linker_parameter() { local route="$1" local val="$2" local linker=`get_linker_by_parameter "$val"` local interface=${linker#*:} [ "$interface" = "" ] && return $UCI_SET network.$route.interface=$interface delay_service reload "network" "1" } get_layer3_metric() { local route="$1" local val case "$route" in *"@route"*) val=`$UCI_GET network.$route.metric` ;; *) val=`echo $route | awk '{print $7}'` ;; esac val=${val:-0} echo "$val" } set_layer3_metric() { local route="$1" local val="$2" $UCI_SET network.$route.metric=$val delay_service reload "network" "1" } get_layer3_mtu() { local route="$1" local val case "$route" in *"@route"*) val=`$UCI_GET network.$route.mtu` ;; *) val=`echo $route | awk '{print $9}'` ;; esac val=${val:-1500} echo "$val" } set_layer3_mtu() { local route="$1" local val="$2" $UCI_SET network.$route.mtu=$val delay_service reload "network" "1" } update_layer3_instance() { local route="$1" local inst=`$UCI_GET network.$route.layer3_instance` if [ "$inst" != "" ]; then echo "$inst" else local inst=`$UCI_SHOW network |sed -n "s/network\.@route[^.]\+\.layer3_instance=//p" | sort -rn | head -n1` inst=${inst:-0} $UCI_SET network.$route.layer3_instance="$((++inst))" $UCI_COMMIT echo $inst fi } get_cache_object_layer3() { local route="$1" local il="$2" local p="$3" get_object_cache_generic "InternetGatewayDevice.Layer3Forwarding.Forwarding.$il." "0" get_param_cache_generic "InternetGatewayDevice.Layer3Forwarding.Forwarding.$il.Enable" "$p" "get_layer3_enable \"$route\"" "set_layer3_enable $route \$val" "" "$([ $p = 1 ] && echo network.$route)" "xsd:boolean" get_param_cache_generic "InternetGatewayDevice.Layer3Forwarding.Forwarding.$il.Status" "0" "get_layer3_status \"$route\"" "" "" "$([ $p = 1 ] && echo network.$route)" get_param_cache_generic "InternetGatewayDevice.Layer3Forwarding.Forwarding.$il.Type" "0" "get_layer3_type \"$route\"" "" "" "$([ $p = 1 ] && echo network.$route.netmask)" get_param_cache_generic "InternetGatewayDevice.Layer3Forwarding.Forwarding.$il.DestIPAddress" "$p" "get_layer3_destip \"$route\"" "set_layer3_destip $route \$val" "" "$([ $p = 1 ] && echo network.$route.target)" get_param_cache_generic "InternetGatewayDevice.Layer3Forwarding.Forwarding.$il.DestSubnetMask" "$p" "get_layer3_destmask \"$route\"" "set_layer3_destmask $route \$val" "" "$([ $p = 1 ] && echo network.$route.netmask)" get_param_cache_generic "InternetGatewayDevice.Layer3Forwarding.Forwarding.$il.SourceIPAddress" "0" "echo 0.0.0.0" get_param_cache_generic "InternetGatewayDevice.Layer3Forwarding.Forwarding.$il.SourceSubnetMask" "0" "echo 0.0.0.0" get_param_cache_generic "InternetGatewayDevice.Layer3Forwarding.Forwarding.$il.GatewayIPAddress" "$p" "get_layer3_gatewayip \"$route\"" "set_layer3_gatewayip $route \$val" "" "$([ $p = 1 ] && echo network.$route.gateway)" get_param_cache_generic "InternetGatewayDevice.Layer3Forwarding.Forwarding.$il.Interface" "$p" "get_layer3_interface_linker_parameter $(get_layer3_interface "$route")" "set_layer3_interface_linker_parameter $route \$val" "1" "$([ $p = 1 ] && echo network.$route.interface)" get_param_cache_generic "InternetGatewayDevice.Layer3Forwarding.Forwarding.$il.ForwardingMetric" "$p" "get_layer3_metric \"$route\"" "set_layer3_metric $route \$val" "" "$([ $p = 1 ] && echo network.$route.metric)" get_param_cache_generic "InternetGatewayDevice.Layer3Forwarding.Forwarding.$il.MTU" "$p" "get_layer3_mtu \"$route\"" "set_layer3_mtu $route \$val" "" "$([ $p = 1 ] && echo network.$route.mtu)" } get_cache_InternetGatewayDevice_Layer3Forwarding() { local il=0 route get_object_cache_generic "InternetGatewayDevice.Layer3Forwarding." "0" get_object_cache_generic "InternetGatewayDevice.Layer3Forwarding.Forwarding." "0" get_param_cache_generic "InternetGatewayDevice.Layer3Forwarding.DefaultConnectionService" "1" "get_parameter_by_linker linker_interface:\$default_wan" "set_layer3_def_conn_serv \$val" "1" get_param_cache_generic "InternetGatewayDevice.Layer3Forwarding.ForwardNumberOfEntries" "0" "get_layer3_nbr_entry" "" "1" "" "xsd:unsignedInt" local route routes=`$UCI_SHOW network | grep "network\.@route[^=]\+=route" | cut -d. -f2 | cut -d= -f1` for route in $routes; do il=`update_layer3_instance $route` get_cache_object_layer3 "$route" "$il" "1" done } get_dynamic_InternetGatewayDevice_Layer3Forwarding() { case "$1" in ""|\ InternetGatewayDevice.|\ InternetGatewayDevice.Layer3Forwarding.|\ InternetGatewayDevice.Layer3Forwarding.Forwarding.|\ InternetGatewayDevice.Layer3Forwarding.Forwarding.[1-9].|\ InternetGatewayDevice.Layer3Forwarding.Forwarding.[1-9].*|\ InternetGatewayDevice.Layer3Forwarding.Forwarding.[1-9][0-9].|\ InternetGatewayDevice.Layer3Forwarding.Forwarding.[1-9][0-9].*|\ InternetGatewayDevice.Layer3Forwarding.Forwarding.[1-9][0-9][0-9].|\ InternetGatewayDevice.Layer3Forwarding.Forwarding.[1-9][0-9][0-9].*) local inst=`$UCI_SHOW network |sed -n "s/network\.@route[^.]\+\.layer3_instance=//p" | sort -rn | head -n1` inst=${inst:-0} local proute cat /proc/net/route | tail -n+2 | while read proute; do local found="0" local dest=`echo $proute | awk '{print $2}'`; dest=`hex_to_ip $dest` local mask=`echo $proute | awk '{print $8}'`; mask=`hex_to_ip $mask` local route routes=`$UCI_SHOW network | grep "network\.@route[^=]\+=route" | cut -d. -f2 | cut -d= -f1` for route in $routes; do cdest=`$UCI_GET network.$route.target`; cdest=${cdest:-0.0.0.0} cmask=`$UCI_GET network.$route.netmask`;cmask=${cmask:-255.255.255.255} if [ "$cdest" = "$dest" -a "$cmask" = "$mask" ]; then found="1" break fi done if [ "$found" = "0" ]; then get_cache_object_layer3 "$proute" "$((++inst))" "0" fi done esac return $FAULT_CPE_NO_FAULT } get_dynamic_linker_InternetGatewayDevice_Layer3Forwarding() { case "$action" in get_value|set_value) case "$1" in ""|\ InternetGatewayDevice.|\ InternetGatewayDevice.Layer3Forwarding.|\ InternetGatewayDevice.Layer3Forwarding.DefaultConnectionService|\ InternetGatewayDevice.Layer3Forwarding.Forwarding.|\ InternetGatewayDevice.Layer3Forwarding.Forwarding.[1-9].|\ InternetGatewayDevice.Layer3Forwarding.Forwarding.[1-9][0-9].|\ InternetGatewayDevice.Layer3Forwarding.Forwarding.[1-9][0-9][0-9].|\ InternetGatewayDevice.Layer3Forwarding.Forwarding.[1-9]*.Interface) local current_action="$action" action="get_linker" get_dynamic_InternetGatewayDevice_WANDevice action="$current_action" ;; esac ;; esac return $FAULT_CPE_NO_FAULT } add_object_InternetGatewayDevice_Layer3Forwarding() { return $FAULT_CPE_INVALID_PARAMETER_NAME } delete_object_InternetGatewayDevice_Layer3Forwarding() { return $FAULT_CPE_INVALID_PARAMETER_NAME }