icwmp/scripts/functions/layer_3_forwarding
MOHAMED Kallel 01c8fae1b7 load of function scripts changed.
The prefix of the related script is added in the load of the script

Signed-off-by: MOHAMED Kallel <mohamed.kallel@pivasoftware.com>
2014-11-12 16:29:22 +01:00

401 lines
11 KiB
Bash

#!/bin/sh
# Copyright (C) 2014 Inteno Broadband Technology AB
# Author Mohamed Kallel <mohamed.kallel@pivasoftware.com>
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" "" "xsd:boolean"
get_param_cache_generic "InternetGatewayDevice.Layer3Forwarding.Forwarding.$il.Status" "0" "get_layer3_status \"$route\""
get_param_cache_generic "InternetGatewayDevice.Layer3Forwarding.Forwarding.$il.Type" "0" "get_layer3_type \"$route\""
get_param_cache_generic "InternetGatewayDevice.Layer3Forwarding.Forwarding.$il.DestIPAddress" "$p" "get_layer3_destip \"$route\"" "set_layer3_destip $route \$val"
get_param_cache_generic "InternetGatewayDevice.Layer3Forwarding.Forwarding.$il.DestSubnetMask" "$p" "get_layer3_destmask \"$route\"" "set_layer3_destmask $route \$val"
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"
get_param_cache_generic "InternetGatewayDevice.Layer3Forwarding.Forwarding.$il.Interface" "$p" "" "set_layer3_interface_linker_parameter $route \$val" "get_layer3_interface_linker_parameter $(get_layer3_interface "$route")"
get_param_cache_generic "InternetGatewayDevice.Layer3Forwarding.Forwarding.$il.ForwardingMetric" "$p" "get_layer3_metric \"$route\"" "set_layer3_metric $route \$val"
get_param_cache_generic "InternetGatewayDevice.Layer3Forwarding.Forwarding.$il.MTU" "$p" "get_layer3_mtu \"$route\"" "set_layer3_mtu $route \$val"
}
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" "" "set_layer3_def_conn_serv \$val" "get_parameter_by_linker linker_interface:\$default_wan"
get_param_cache_generic "InternetGatewayDevice.Layer3Forwarding.ForwardNumberOfEntries" "0" "" "" "get_layer3_nbr_entry" "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
}