mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-27 01:11:14 +00:00
be09c5a3cd
Latest netifd allows us to setup network bridges with implicit vlan tagging. For this to work, we need to setup several additional uci sections. This feature is particularly usefull for DSA tupe devices. Add board.d and uci-defaults support for generating the sections. Signed-off-by: John Crispin <john@phrozen.org>
630 lines
12 KiB
Bash
Executable File
630 lines
12 KiB
Bash
Executable File
#!/bin/ash
|
|
|
|
. /lib/functions.sh
|
|
. /usr/share/libubox/jshn.sh
|
|
|
|
json_select_array() {
|
|
local _json_no_warning=1
|
|
|
|
json_select "$1"
|
|
[ $? = 0 ] && return
|
|
|
|
json_add_array "$1"
|
|
json_close_array
|
|
|
|
json_select "$1"
|
|
}
|
|
|
|
json_select_object() {
|
|
local _json_no_warning=1
|
|
|
|
json_select "$1"
|
|
[ $? = 0 ] && return
|
|
|
|
json_add_object "$1"
|
|
json_close_object
|
|
|
|
json_select "$1"
|
|
}
|
|
|
|
ucidef_set_interface() {
|
|
local network=$1; shift
|
|
|
|
[ -z "$network" ] && return
|
|
|
|
json_select_object network
|
|
json_select_object "$network"
|
|
|
|
while [ -n "$1" ]; do
|
|
local opt=$1; shift
|
|
local val=$1; shift
|
|
|
|
[ -n "$opt" -a -n "$val" ] || break
|
|
|
|
json_add_string "$opt" "$val"
|
|
done
|
|
|
|
if ! json_is_a protocol string; then
|
|
case "$network" in
|
|
lan) json_add_string protocol static ;;
|
|
wan) json_add_string protocol dhcp ;;
|
|
*) json_add_string protocol none ;;
|
|
esac
|
|
fi
|
|
|
|
json_select ..
|
|
json_select ..
|
|
}
|
|
|
|
ucidef_set_board_id() {
|
|
json_select_object model
|
|
json_add_string id "$1"
|
|
json_select ..
|
|
}
|
|
|
|
ucidef_set_model_name() {
|
|
json_select_object model
|
|
json_add_string name "$1"
|
|
json_select ..
|
|
}
|
|
|
|
ucidef_set_compat_version() {
|
|
json_select_object system
|
|
json_add_string compat_version "${1:-1.0}"
|
|
json_select ..
|
|
}
|
|
|
|
ucidef_set_interface_lan() {
|
|
ucidef_set_interface "lan" ifname "$1" protocol "${2:-static}"
|
|
}
|
|
|
|
ucidef_set_interface_wan() {
|
|
ucidef_set_interface "wan" ifname "$1" protocol "${2:-dhcp}"
|
|
}
|
|
|
|
ucidef_set_interfaces_lan_wan() {
|
|
local lan_if="$1"
|
|
local wan_if="$2"
|
|
|
|
ucidef_set_interface_lan "$lan_if"
|
|
ucidef_set_interface_wan "$wan_if"
|
|
}
|
|
|
|
ucidef_set_bridge_device() {
|
|
json_add_string bridge "${1:switch0}"
|
|
}
|
|
|
|
_ucidef_add_switch_port() {
|
|
# inherited: $num $device $need_tag $want_untag $role $index $prev_role
|
|
# inherited: $n_cpu $n_ports $n_vlan $cpu0 $cpu1 $cpu2 $cpu3 $cpu4 $cpu5
|
|
|
|
n_ports=$((n_ports + 1))
|
|
|
|
json_select_array ports
|
|
json_add_object
|
|
json_add_int num "$num"
|
|
[ -n "$device" ] && json_add_string device "$device"
|
|
[ -n "$need_tag" ] && json_add_boolean need_tag "$need_tag"
|
|
[ -n "$want_untag" ] && json_add_boolean want_untag "$want_untag"
|
|
[ -n "$role" ] && json_add_string role "$role"
|
|
[ -n "$index" ] && json_add_int index "$index"
|
|
json_close_object
|
|
json_select ..
|
|
|
|
# record pointer to cpu entry for lookup in _ucidef_finish_switch_roles()
|
|
[ -n "$device" ] && {
|
|
export "cpu$n_cpu=$n_ports"
|
|
n_cpu=$((n_cpu + 1))
|
|
}
|
|
|
|
# create/append object to role list
|
|
[ -n "$role" ] && {
|
|
json_select_array roles
|
|
|
|
if [ "$role" != "$prev_role" ]; then
|
|
json_add_object
|
|
json_add_string role "$role"
|
|
json_add_string ports "$num"
|
|
json_close_object
|
|
|
|
prev_role="$role"
|
|
n_vlan=$((n_vlan + 1))
|
|
else
|
|
json_select_object "$n_vlan"
|
|
json_get_var port ports
|
|
json_add_string ports "$port $num"
|
|
json_select ..
|
|
fi
|
|
|
|
json_select ..
|
|
}
|
|
}
|
|
|
|
_ucidef_finish_switch_roles() {
|
|
# inherited: $name $n_cpu $n_vlan $cpu0 $cpu1 $cpu2 $cpu3 $cpu4 $cpu5
|
|
local index role roles num device need_tag want_untag port ports
|
|
|
|
json_select switch
|
|
json_select "$name"
|
|
json_get_keys roles roles
|
|
json_select ..
|
|
json_select ..
|
|
|
|
for index in $roles; do
|
|
eval "port=\$cpu$(((index - 1) % n_cpu))"
|
|
|
|
json_select switch
|
|
json_select "$name"
|
|
json_select ports
|
|
json_select "$port"
|
|
json_get_vars num device need_tag want_untag
|
|
json_select ..
|
|
json_select ..
|
|
|
|
if [ ${need_tag:-0} -eq 1 -o ${want_untag:-0} -ne 1 ]; then
|
|
num="${num}t"
|
|
device="${device}.${index}"
|
|
fi
|
|
|
|
json_select roles
|
|
json_select "$index"
|
|
json_get_vars role ports
|
|
json_add_string ports "$ports $num"
|
|
json_add_string device "$device"
|
|
json_select ..
|
|
json_select ..
|
|
json_select ..
|
|
json_select ..
|
|
|
|
json_select_object network
|
|
local devices
|
|
|
|
json_select_object "$role"
|
|
# attach previous interfaces (for multi-switch devices)
|
|
json_get_var devices ifname
|
|
if ! list_contains devices "$device"; then
|
|
devices="${devices:+$devices }$device"
|
|
fi
|
|
json_select ..
|
|
json_select ..
|
|
|
|
ucidef_set_interface "$role" ifname "$devices"
|
|
done
|
|
}
|
|
|
|
ucidef_set_ar8xxx_switch_mib() {
|
|
local name="$1"
|
|
local type="$2"
|
|
local interval="$3"
|
|
|
|
json_select_object switch
|
|
json_select_object "$name"
|
|
json_add_int ar8xxx_mib_type $type
|
|
json_add_int ar8xxx_mib_poll_interval $interval
|
|
json_select ..
|
|
json_select ..
|
|
}
|
|
|
|
ucidef_add_switch() {
|
|
local name="$1"; shift
|
|
local port num role device index need_tag prev_role
|
|
local cpu0 cpu1 cpu2 cpu3 cpu4 cpu5
|
|
local n_cpu=0 n_vlan=0 n_ports=0
|
|
|
|
json_select_object switch
|
|
json_select_object "$name"
|
|
json_add_boolean enable 1
|
|
json_add_boolean reset 1
|
|
|
|
for port in "$@"; do
|
|
case "$port" in
|
|
[0-9]*@*)
|
|
num="${port%%@*}"
|
|
device="${port##*@}"
|
|
need_tag=0
|
|
want_untag=0
|
|
[ "${num%t}" != "$num" ] && {
|
|
num="${num%t}"
|
|
need_tag=1
|
|
}
|
|
[ "${num%u}" != "$num" ] && {
|
|
num="${num%u}"
|
|
want_untag=1
|
|
}
|
|
;;
|
|
[0-9]*:*:[0-9]*)
|
|
num="${port%%:*}"
|
|
index="${port##*:}"
|
|
role="${port#[0-9]*:}"; role="${role%:*}"
|
|
;;
|
|
[0-9]*:*)
|
|
num="${port%%:*}"
|
|
role="${port##*:}"
|
|
;;
|
|
esac
|
|
|
|
if [ -n "$num" ] && [ -n "$device$role" ]; then
|
|
_ucidef_add_switch_port
|
|
fi
|
|
|
|
unset num device role index need_tag want_untag
|
|
done
|
|
json_select ..
|
|
json_select ..
|
|
|
|
_ucidef_finish_switch_roles
|
|
}
|
|
|
|
ucidef_add_switch_attr() {
|
|
local name="$1"
|
|
local key="$2"
|
|
local val="$3"
|
|
|
|
json_select_object switch
|
|
json_select_object "$name"
|
|
|
|
case "$val" in
|
|
true|false) [ "$val" != "true" ]; json_add_boolean "$key" $? ;;
|
|
[0-9]) json_add_int "$key" "$val" ;;
|
|
*) json_add_string "$key" "$val" ;;
|
|
esac
|
|
|
|
json_select ..
|
|
json_select ..
|
|
}
|
|
|
|
ucidef_add_switch_port_attr() {
|
|
local name="$1"
|
|
local port="$2"
|
|
local key="$3"
|
|
local val="$4"
|
|
local ports i num
|
|
|
|
json_select_object switch
|
|
json_select_object "$name"
|
|
|
|
json_get_keys ports ports
|
|
json_select_array ports
|
|
|
|
for i in $ports; do
|
|
json_select "$i"
|
|
json_get_var num num
|
|
|
|
if [ -n "$num" ] && [ $num -eq $port ]; then
|
|
json_select_object attr
|
|
|
|
case "$val" in
|
|
true|false) [ "$val" != "true" ]; json_add_boolean "$key" $? ;;
|
|
[0-9]) json_add_int "$key" "$val" ;;
|
|
*) json_add_string "$key" "$val" ;;
|
|
esac
|
|
|
|
json_select ..
|
|
fi
|
|
|
|
json_select ..
|
|
done
|
|
|
|
json_select ..
|
|
json_select ..
|
|
json_select ..
|
|
}
|
|
|
|
ucidef_set_interface_macaddr() {
|
|
local network="$1"
|
|
local macaddr="$2"
|
|
|
|
ucidef_set_interface "$network" macaddr "$macaddr"
|
|
}
|
|
|
|
ucidef_set_label_macaddr() {
|
|
local macaddr="$1"
|
|
|
|
json_select_object system
|
|
json_add_string label_macaddr "$macaddr"
|
|
json_select ..
|
|
}
|
|
|
|
ucidef_add_atm_bridge() {
|
|
local vpi="$1"
|
|
local vci="$2"
|
|
local encaps="$3"
|
|
local payload="$4"
|
|
local nameprefix="$5"
|
|
|
|
json_select_object dsl
|
|
json_select_object atmbridge
|
|
json_add_int vpi "$vpi"
|
|
json_add_int vci "$vci"
|
|
json_add_string encaps "$encaps"
|
|
json_add_string payload "$payload"
|
|
json_add_string nameprefix "$nameprefix"
|
|
json_select ..
|
|
json_select ..
|
|
}
|
|
|
|
ucidef_add_adsl_modem() {
|
|
local annex="$1"
|
|
local firmware="$2"
|
|
|
|
json_select_object dsl
|
|
json_select_object modem
|
|
json_add_string type "adsl"
|
|
json_add_string annex "$annex"
|
|
json_add_string firmware "$firmware"
|
|
json_select ..
|
|
json_select ..
|
|
}
|
|
|
|
ucidef_add_vdsl_modem() {
|
|
local annex="$1"
|
|
local tone="$2"
|
|
local xfer_mode="$3"
|
|
|
|
json_select_object dsl
|
|
json_select_object modem
|
|
json_add_string type "vdsl"
|
|
json_add_string annex "$annex"
|
|
json_add_string tone "$tone"
|
|
json_add_string xfer_mode "$xfer_mode"
|
|
json_select ..
|
|
json_select ..
|
|
}
|
|
|
|
ucidef_set_led_ataport() {
|
|
_ucidef_set_led_trigger "$1" "$2" "$3" ata"$4"
|
|
}
|
|
|
|
_ucidef_set_led_common() {
|
|
local cfg="led_$1"
|
|
local name="$2"
|
|
local sysfs="$3"
|
|
|
|
json_select_object led
|
|
|
|
json_select_object "$1"
|
|
json_add_string name "$name"
|
|
json_add_string sysfs "$sysfs"
|
|
}
|
|
|
|
ucidef_set_led_default() {
|
|
local default="$4"
|
|
|
|
_ucidef_set_led_common "$1" "$2" "$3"
|
|
|
|
json_add_string default "$default"
|
|
json_select ..
|
|
|
|
json_select ..
|
|
}
|
|
|
|
ucidef_set_led_gpio() {
|
|
local gpio="$4"
|
|
local inverted="$5"
|
|
|
|
_ucidef_set_led_common "$1" "$2" "$3"
|
|
|
|
json_add_string trigger "$trigger"
|
|
json_add_string type gpio
|
|
json_add_int gpio "$gpio"
|
|
json_add_boolean inverted "$inverted"
|
|
json_select ..
|
|
|
|
json_select ..
|
|
}
|
|
|
|
ucidef_set_led_ide() {
|
|
_ucidef_set_led_trigger "$1" "$2" "$3" disk-activity
|
|
}
|
|
|
|
ucidef_set_led_netdev() {
|
|
local dev="$4"
|
|
local mode="${5:-link tx rx}"
|
|
|
|
_ucidef_set_led_common "$1" "$2" "$3"
|
|
|
|
json_add_string type netdev
|
|
json_add_string device "$dev"
|
|
json_add_string mode "$mode"
|
|
json_select ..
|
|
|
|
json_select ..
|
|
}
|
|
|
|
ucidef_set_led_oneshot() {
|
|
_ucidef_set_led_timer $1 $2 $3 "oneshot" $4 $5
|
|
}
|
|
|
|
ucidef_set_led_portstate() {
|
|
local port_state="$4"
|
|
|
|
_ucidef_set_led_common "$1" "$2" "$3"
|
|
|
|
json_add_string trigger port_state
|
|
json_add_string type portstate
|
|
json_add_string port_state "$port_state"
|
|
json_select ..
|
|
|
|
json_select ..
|
|
}
|
|
|
|
ucidef_set_led_rssi() {
|
|
local iface="$4"
|
|
local minq="$5"
|
|
local maxq="$6"
|
|
local offset="${7:-0}"
|
|
local factor="${8:-1}"
|
|
|
|
_ucidef_set_led_common "$1" "$2" "$3"
|
|
|
|
json_add_string type rssi
|
|
json_add_string name "$name"
|
|
json_add_string iface "$iface"
|
|
json_add_string minq "$minq"
|
|
json_add_string maxq "$maxq"
|
|
json_add_string offset "$offset"
|
|
json_add_string factor "$factor"
|
|
json_select ..
|
|
|
|
json_select ..
|
|
}
|
|
|
|
ucidef_set_led_switch() {
|
|
local trigger_name="$4"
|
|
local port_mask="$5"
|
|
local speed_mask="$6"
|
|
local mode="$7"
|
|
|
|
_ucidef_set_led_common "$1" "$2" "$3"
|
|
|
|
json_add_string trigger "$trigger_name"
|
|
json_add_string type switch
|
|
json_add_string mode "$mode"
|
|
json_add_string port_mask "$port_mask"
|
|
json_add_string speed_mask "$speed_mask"
|
|
json_select ..
|
|
|
|
json_select ..
|
|
}
|
|
|
|
_ucidef_set_led_timer() {
|
|
local trigger_name="$4"
|
|
local delayon="$5"
|
|
local delayoff="$6"
|
|
|
|
_ucidef_set_led_common "$1" "$2" "$3"
|
|
|
|
json_add_string type "$trigger_name"
|
|
json_add_string trigger "$trigger_name"
|
|
json_add_int delayon "$delayon"
|
|
json_add_int delayoff "$delayoff"
|
|
json_select ..
|
|
|
|
json_select ..
|
|
}
|
|
|
|
ucidef_set_led_timer() {
|
|
_ucidef_set_led_timer $1 $2 $3 "timer" $4 $5
|
|
}
|
|
|
|
_ucidef_set_led_trigger() {
|
|
local trigger_name="$4"
|
|
|
|
_ucidef_set_led_common "$1" "$2" "$3"
|
|
|
|
json_add_string trigger "$trigger_name"
|
|
json_select ..
|
|
|
|
json_select ..
|
|
}
|
|
|
|
ucidef_set_led_usbdev() {
|
|
local dev="$4"
|
|
|
|
_ucidef_set_led_common "$1" "$2" "$3"
|
|
|
|
json_add_string type usb
|
|
json_add_string device "$dev"
|
|
json_select ..
|
|
|
|
json_select ..
|
|
}
|
|
|
|
ucidef_set_led_usbhost() {
|
|
_ucidef_set_led_trigger "$1" "$2" "$3" usb-host
|
|
}
|
|
|
|
ucidef_set_led_usbport() {
|
|
local obj="$1"
|
|
local name="$2"
|
|
local sysfs="$3"
|
|
shift
|
|
shift
|
|
shift
|
|
|
|
_ucidef_set_led_common "$obj" "$name" "$sysfs"
|
|
|
|
json_add_string type usbport
|
|
json_select_array ports
|
|
for port in "$@"; do
|
|
json_add_string port "$port"
|
|
done
|
|
json_select ..
|
|
json_select ..
|
|
|
|
json_select ..
|
|
}
|
|
|
|
ucidef_set_led_wlan() {
|
|
_ucidef_set_led_trigger "$1" "$2" "$3" "$4"
|
|
}
|
|
|
|
ucidef_set_rssimon() {
|
|
local dev="$1"
|
|
local refresh="$2"
|
|
local threshold="$3"
|
|
|
|
json_select_object rssimon
|
|
|
|
json_select_object "$dev"
|
|
[ -n "$refresh" ] && json_add_int refresh "$refresh"
|
|
[ -n "$threshold" ] && json_add_int threshold "$threshold"
|
|
json_select ..
|
|
|
|
json_select ..
|
|
}
|
|
|
|
ucidef_add_gpio_switch() {
|
|
local cfg="$1"
|
|
local name="$2"
|
|
local pin="$3"
|
|
local default="${4:-0}"
|
|
|
|
json_select_object gpioswitch
|
|
json_select_object "$cfg"
|
|
json_add_string name "$name"
|
|
json_add_string pin "$pin"
|
|
json_add_int default "$default"
|
|
json_select ..
|
|
json_select ..
|
|
}
|
|
|
|
ucidef_set_hostname() {
|
|
local hostname="$1"
|
|
|
|
json_select_object system
|
|
json_add_string hostname "$hostname"
|
|
json_select ..
|
|
}
|
|
|
|
ucidef_set_ntpserver() {
|
|
local server
|
|
|
|
json_select_object system
|
|
json_select_array ntpserver
|
|
for server in "$@"; do
|
|
json_add_string "" "$server"
|
|
done
|
|
json_select ..
|
|
json_select ..
|
|
}
|
|
|
|
board_config_update() {
|
|
json_init
|
|
[ -f ${CFG} ] && json_load "$(cat ${CFG})"
|
|
|
|
# auto-initialize model id and name if applicable
|
|
if ! json_is_a model object; then
|
|
json_select_object model
|
|
[ -f "/tmp/sysinfo/board_name" ] && \
|
|
json_add_string id "$(cat /tmp/sysinfo/board_name)"
|
|
[ -f "/tmp/sysinfo/model" ] && \
|
|
json_add_string name "$(cat /tmp/sysinfo/model)"
|
|
json_select ..
|
|
fi
|
|
}
|
|
|
|
board_config_flush() {
|
|
json_dump -i -o ${CFG}
|
|
}
|