mirror of
https://dev.iopsys.eu/feed/iopsys.git
synced 2025-12-09 23:34:51 +01:00
If the WAN device is a bridge then generate a default configuration using snooping instead of proxying.
183 lines
5.1 KiB
Bash
183 lines
5.1 KiB
Bash
#!/bin/sh
|
|
|
|
. /lib/functions.sh
|
|
|
|
generate_igmp_global_params(){
|
|
uci add mcast igmp
|
|
uci rename mcast.@igmp[-1]="igmp"
|
|
uci set mcast.@igmp[-1].max_membership="20"
|
|
uci set mcast.@igmp[-1].max_msf="10"
|
|
uci set mcast.@igmp[-1].qrv="2"
|
|
uci set mcast.@igmp[-1].force_version="0"
|
|
|
|
uci add mcast mld
|
|
uci rename mcast.@mld[-1]="mld"
|
|
uci set mcast.@mld[-1].mldv1_unsolicited_report_interval="10"
|
|
uci set mcast.@mld[-1].mldv2_unsolicited_report_interval="1"
|
|
uci set mcast.@mld[-1].qrv="2"
|
|
uci set mcast.@mld[-1].force_version="0"
|
|
}
|
|
|
|
generate_mld_proxy_config(){
|
|
local u_itf="$1"
|
|
|
|
uci add mcast proxy
|
|
uci rename mcast.@proxy[-1]="mc_proxy_MLD"
|
|
uci set mcast.@proxy[-1].enable="1"
|
|
uci set mcast.@proxy[-1].proto="mld"
|
|
uci set mcast.@proxy[-1].version="2"
|
|
uci set mcast.@proxy[-1].robustness="2"
|
|
uci set mcast.@proxy[-1].query_interval="125"
|
|
uci set mcast.@proxy[-1].query_response_interval="100"
|
|
uci set mcast.@proxy[-1].last_member_query_interval="10"
|
|
uci set mcast.@proxy[-1].fast_leave="1"
|
|
uci set mcast.@proxy[-1].snooping_mode="2"
|
|
uci add_list mcast.@proxy[-1].downstream_interface="br-lan"
|
|
|
|
IFS=" "
|
|
for itf in $u_itf; do
|
|
uci add_list mcast.@proxy[-1].upstream_interface="$itf"
|
|
done
|
|
|
|
}
|
|
|
|
generate_igmp_proxy_config(){
|
|
local u_itf="$1"
|
|
|
|
uci add mcast proxy
|
|
uci rename mcast.@proxy[-1]="igmp_proxy_1"
|
|
uci set mcast.@proxy[-1].enable="1"
|
|
uci set mcast.@proxy[-1].proto="igmp"
|
|
uci set mcast.@proxy[-1].version="2"
|
|
uci set mcast.@proxy[-1].robustness="2"
|
|
uci set mcast.@proxy[-1].query_interval="125"
|
|
uci set mcast.@proxy[-1].query_response_interval="100"
|
|
uci set mcast.@proxy[-1].last_member_query_interval="10"
|
|
uci set mcast.@proxy[-1].fast_leave="1"
|
|
uci set mcast.@proxy[-1].snooping_mode="2"
|
|
uci add_list mcast.@proxy[-1].downstream_interface="br-lan"
|
|
|
|
IFS=" "
|
|
for itf in $u_itf; do
|
|
uci add_list mcast.@proxy[-1].upstream_interface="$itf"
|
|
done
|
|
|
|
uci add_list mcast.@proxy[-1].filter="239.0.0.0/8"
|
|
}
|
|
|
|
generate_mld_snooping_config(){
|
|
local u_itf="$1"
|
|
|
|
uci add mcast snooping
|
|
uci rename mcast.@snooping[-1]="mc_snooping_MLD"
|
|
uci set mcast.@snooping[-1].enable="1"
|
|
uci set mcast.@snooping[-1].proto="mld"
|
|
uci set mcast.@snooping[-1].version="2"
|
|
uci set mcast.@snooping[-1].robustness="2"
|
|
uci set mcast.@snooping[-1].query_interval="125"
|
|
uci set mcast.@snooping[-1].query_response_interval="100"
|
|
uci set mcast.@snooping[-1].last_member_query_interval="10"
|
|
uci set mcast.@snooping[-1].fast_leave="1"
|
|
uci set mcast.@snooping[-1].snooping_mode="2"
|
|
uci set mcast.@snooping[-1].interface="$u_itf"
|
|
}
|
|
|
|
generate_igmp_snooping_config(){
|
|
local u_itf="$1"
|
|
|
|
uci add mcast snooping
|
|
uci rename mcast.@snooping[-1]="igmp_snooping_1"
|
|
uci set mcast.@snooping[-1].enable="1"
|
|
uci set mcast.@snooping[-1].proto="igmp"
|
|
uci set mcast.@snooping[-1].version="2"
|
|
uci set mcast.@snooping[-1].robustness="2"
|
|
uci set mcast.@snooping[-1].query_interval="125"
|
|
uci set mcast.@snooping[-1].query_response_interval="100"
|
|
uci set mcast.@snooping[-1].last_member_query_interval="10"
|
|
uci set mcast.@snooping[-1].fast_leave="1"
|
|
uci set mcast.@snooping[-1].snooping_mode="2"
|
|
uci set mcast.@snooping[-1].interface="$u_itf"
|
|
|
|
uci add_list mcast.@snooping[-1].filter="239.0.0.0/8"
|
|
}
|
|
|
|
check_wan_bridge() {
|
|
local config="$1"
|
|
local wan_device="$2"
|
|
local name type
|
|
|
|
[ $((is_wan_bridge)) -ne 0 ] && return
|
|
|
|
config_get type "$config" type
|
|
config_get name "$config" name
|
|
|
|
[ "$type" = "bridge" -a "$wan_device" = "$name" ] && is_wan_bridge=1
|
|
}
|
|
|
|
generate_mcast_config(){
|
|
local up_itf="$(uci -q get network.wan.device)"
|
|
local is_wan_bridge=0
|
|
|
|
config_load network
|
|
config_foreach check_wan_bridge device "$up_itf"
|
|
|
|
if [ $((is_wan_bridge)) -eq 0 ]; then
|
|
generate_igmp_proxy_config "$up_itf"
|
|
generate_mld_proxy_config "$up_itf"
|
|
else
|
|
generate_igmp_snooping_config "$up_itf"
|
|
generate_mld_snooping_config "$up_itf"
|
|
fi
|
|
}
|
|
|
|
interfaces_ok(){
|
|
local section_name=$1
|
|
|
|
local up_interf=$(uci -q get ${section_name}.upstream_interface)
|
|
[ -z "$up_interf" ] && return 1
|
|
|
|
local down_interf=$(uci -q get ${section_name}.downstream_interface)
|
|
[ -z "$down_interf" ] && return 1
|
|
|
|
# check if upstream untagged
|
|
IFS=" "
|
|
for itf in $up_interf; do
|
|
# check if there exist a interface section for this upstream interface, if yes the
|
|
# do nothing, if no then generate config as mcast config is outdated
|
|
local dev_section=$(uci show network | grep -E "\.device=\'$itf\'" | head -n 1 | cut -d'.' -f2)
|
|
|
|
# mcast config is outdated, simply generate as per new logic
|
|
if [ -z "$dev_section" ]; then
|
|
# check if the itf is a native interface && return 1
|
|
return 1
|
|
else
|
|
section_type=$(uci get network.$dev_section)
|
|
if [ "$section_type" == "interface" ]; then
|
|
# interface section exits, hence, sync has already happened
|
|
# nothing to do further, just return
|
|
return 0
|
|
else
|
|
# mcast config is outdated
|
|
return 1
|
|
fi
|
|
fi
|
|
done
|
|
return 0
|
|
}
|
|
|
|
|
|
if [ -s "/etc/config/mcast" ]; then
|
|
if uci -q get mcast.@proxy[0] >/dev/null; then
|
|
interfaces_ok "mcast.@proxy[0]" && exit
|
|
elif uci -q get mcast.@snooping[0] >/dev/null; then
|
|
# return if there is any valid content
|
|
exit
|
|
fi
|
|
fi
|
|
|
|
rm -f /etc/config/mcast
|
|
touch /etc/config/mcast
|
|
|
|
generate_igmp_global_params
|
|
|
|
generate_mcast_config
|