mirror of
https://dev.iopsys.eu/feed/iopsys.git
synced 2025-12-10 07:44:50 +01:00
The mcastmngr read the uci file and configures the corresponding
multicast daemon accordingly. It is for now doing this for broadcom's
mcpd utility. Here are a few examples of what UCI config gets converted
to what /var/mcpd.conf
Snooping:
config snooping 'msnoop_1'
option enable '1'
option proto 'igmp'
option version '2'
option robustness '2'
option aggregation '0'
option interface 'br-wan100'
root@iopsys:~# cat /var/mcpd.conf
igmp-default-version 2
igmp-robustness-value 2
igmp-max-groups 20
igmp-max-sources 10
igmp-max-members 20
igmp-snooping-enable 1
igmp-proxy-enable 0
igmp-query-interval 125
igmp-query-response-interval 100
igmp-last-member-query-interval 10
igmp-mcast-interfaces eth5.100
igmp-snooping-interfaces br-wan100
Proxy:
config proxy 'mproxy_1'
option enable '1'
option proto 'igmp'
option version '2'
option robustness '2'
option aggregation '0'
option last_member_query_interval '10'
option query_interval '120'
option query_response_interval '100'
list downstream_interface 'br-lan'
list upstream_interface 'eth5.1'
root@iopsys:~# cat /var/mcpd.conf
igmp-default-version 2
igmp-robustness-value 2
igmp-max-groups 20
igmp-max-sources 10
igmp-max-members 20
igmp-snooping-enable 2
igmp-proxy-enable 1
igmp-fast-leave 1
igmp-query-interval 120
igmp-query-response-interval 100
igmp-last-member-query-interval 10
igmp-proxy-interfaces eth5.1
igmp-mcast-interfaces eth5.1
igmp-snooping-interfaces br-lan
238 lines
5.8 KiB
Bash
Executable file
238 lines
5.8 KiB
Bash
Executable file
#!/bin/sh
|
|
|
|
. /lib/functions.sh
|
|
. /usr/share/libubox/jshn.sh
|
|
|
|
include /lib/network
|
|
|
|
CONFFILE=/var/mcpd.conf
|
|
PROG_EXE=/usr/sbin/mcpd
|
|
|
|
# Parameters available in snooping configuration
|
|
s_enable=0
|
|
s_version=2
|
|
s_robustness=2
|
|
s_interface=""
|
|
s_exceptions=""
|
|
|
|
# Parameters available in proxy configuration
|
|
p_enable=0
|
|
p_version=2
|
|
query_interval=125
|
|
q_resp_interval=100
|
|
last_mem_q_int=10
|
|
max_groups=25
|
|
max_msf=10
|
|
max_members=25
|
|
fast_leave=1
|
|
p_robustness=2
|
|
p_up_interfaces=""
|
|
p_down_interfaces=""
|
|
p_exceptions=""
|
|
|
|
# Standard parameters need by BCM's multicast daemon
|
|
l_2_l_mcast=0
|
|
bcm_mcast_p=1
|
|
allow_brdevice=0
|
|
|
|
proxdevs=""
|
|
ethwan="$(db -q get hw.board.ethernetWanPort)"
|
|
|
|
read_snooping() {
|
|
local config="$1"
|
|
config_get s_enable "$config" enable 0
|
|
|
|
if [ "$s_enable" == "0" ]; then
|
|
return
|
|
fi
|
|
|
|
config_get s_version "$config" version 2
|
|
config_get s_robustness "$config" robustness 2
|
|
config_get s_interface "$config" interface
|
|
config_get s_exceptions "$config" filter
|
|
}
|
|
|
|
read_proxy() {
|
|
local config="$1"
|
|
config_get p_enable "$config" enable 0
|
|
|
|
if [ "$p_enable" == "0" ]; then
|
|
return
|
|
fi
|
|
|
|
config_get p_version "$config" version 2
|
|
config_get query_interval "$config" query_interval
|
|
config_get q_resp_interval "$config" query_response_interval
|
|
config_get last_mem_q_int "$config" last_member_query_interval
|
|
config_get fast_leave "$config" fast_leave 1
|
|
config_get p_robustness "$config" robustness 2
|
|
config_get p_up_interfaces "$config" upstream_interface
|
|
config_get p_down_interfaces "$config" downstream_interface
|
|
config_get p_exceptions "$config" filter
|
|
}
|
|
|
|
config_igmps_common_params() {
|
|
echo "igmp-default-version $1" >> $CONFFILE
|
|
echo "igmp-robustness-value $2" >> $CONFFILE
|
|
echo "igmp-max-groups $max_groups" >> $CONFFILE
|
|
echo "igmp-max-sources $max_msf" >> $CONFFILE
|
|
echo "igmp-max-members $max_members" >> $CONFFILE
|
|
echo "igmp-snooping-enable $3" >> $CONFFILE
|
|
}
|
|
|
|
config_igmp_querier_params() {
|
|
echo "igmp-query-interval $query_interval" >> $CONFFILE
|
|
echo "igmp-query-response-interval $q_resp_interval" >> $CONFFILE
|
|
echo "igmp-last-member-query-interval $last_mem_q_int" >> $CONFFILE
|
|
}
|
|
|
|
config_snooping_on_bridge() {
|
|
echo "igmp-snooping-interfaces $1" >> $CONFFILE
|
|
|
|
for snpif in $1; do
|
|
case "$snpif" in
|
|
br-*)
|
|
# set snooping mode on the bridge
|
|
bcmmcastctl mode -i $snpif -p $bcm_mcast_p -m $2
|
|
# set L2L snooping mode on the bridge
|
|
bcmmcastctl l2l -i $snpif -p $bcm_mcast_p -e $l_2_l_mcast # set L2L snooping mode on the bridge
|
|
;;
|
|
esac
|
|
done
|
|
}
|
|
|
|
handle_bridged_proxy_interface() {
|
|
bridged=1
|
|
if [ $p_enable -eq 1 -a $allow_brdevice -eq 1 ]
|
|
then
|
|
proxdevs="$proxdevs $1"
|
|
echo "upstream-interface $1" >>$CONFFILE
|
|
else
|
|
json_load "$(devstatus $1)"
|
|
itr=1
|
|
json_select bridge-members
|
|
while json_get_var dev $itr; do
|
|
case "$dev" in
|
|
*.*)
|
|
port="$(echo "$dev" | cut -d'.' -f 1)"
|
|
if [ $port == $ethwan ]; then
|
|
ifconfig $dev | grep RUNNING >/dev/null && proxdevs="$proxdevs $dev" && break
|
|
fi
|
|
;;
|
|
esac
|
|
itr=$(($itr + 1))
|
|
done
|
|
json_select ..
|
|
fi
|
|
}
|
|
|
|
config_igmp_proxy_interface() {
|
|
local itr
|
|
|
|
for proxif in $1; do
|
|
case "$proxif" in
|
|
br-*)
|
|
handle_bridged_proxy_interface $proxif
|
|
;;
|
|
*)
|
|
proxdevs="$proxdevs $proxif"
|
|
;;
|
|
esac
|
|
done
|
|
|
|
if [ $p_enable -eq 1 ]; then
|
|
echo "igmp-proxy-interfaces $proxdevs" >> $CONFFILE
|
|
fi
|
|
|
|
[ -n "$proxdevs" ] && echo "igmp-mcast-interfaces $proxdevs" >> $CONFFILE
|
|
}
|
|
|
|
configure_mcpd_snooping() {
|
|
# Configure snooping related params
|
|
config_igmps_common_params $s_version $s_robustness $s_enable
|
|
echo "igmp-proxy-enable 0" >> $CONFFILE
|
|
|
|
# BCM's mcpd always acts as queries, so configure some default values to prevent flooding
|
|
# of queries towards the clients or early leaves even in pure snooping with what will be
|
|
# default values for these params
|
|
config_igmp_querier_params
|
|
|
|
config_igmp_proxy_interface $s_interface
|
|
|
|
# set snooping mode on the bridge
|
|
config_snooping_on_bridge $s_interface $s_enable
|
|
|
|
[ -n "$s_exceptions" ] && echo "igmp-mcast-snoop-exceptions $s_exceptions" >> $CONFFILE
|
|
}
|
|
|
|
configure_mcpd_proxy() {
|
|
local s_mode=2
|
|
|
|
# Configure snooping related params
|
|
config_igmps_common_params $p_version $p_robustness $s_mode
|
|
echo "igmp-proxy-enable $p_enable" >> $CONFFILE
|
|
echo "igmp-fast-leave $fast_leave" >> $CONFFILE
|
|
|
|
config_igmp_querier_params
|
|
|
|
config_igmp_proxy_interface $p_up_interfaces
|
|
|
|
config_snooping_on_bridge $p_down_interfaces $s_mode
|
|
|
|
[ -n "$p_exceptions" ] && echo "igmp-mcast-snoop-exceptions $p_exceptions" >> $CONFFILE
|
|
}
|
|
|
|
configure_mcpd() {
|
|
for br in $(brctl show | grep 'br-' | awk '{print$1}' | tr '\n' ' '); do
|
|
bcmmcastctl mode -i $br -p $bcm_mcast_p -m 0 # disable snooping on all bridges
|
|
bcmmcastctl l2l -i $br -p $bcm_mcast_p -e 0 # disable L2L snooping on all bridges
|
|
done
|
|
|
|
# BCM's mcpd does not allow configuration of proxy and L2 snooping simultaneously, hence
|
|
# here, if proxy is to be configured then the configuration params of snooping are ignored.
|
|
if [ "$p_enable" == "1" ]; then
|
|
configure_mcpd_proxy
|
|
elif [ "$s_enable" == "1" ]; then
|
|
configure_mcpd_snooping
|
|
fi
|
|
}
|
|
|
|
read_igmp_snooping_params() {
|
|
config_load mcast
|
|
config_foreach read_snooping snooping
|
|
}
|
|
|
|
read_igmp_proxy_params() {
|
|
config_load mcast
|
|
config_foreach read_proxy proxy
|
|
}
|
|
|
|
config_global_igmp_params() {
|
|
local qrv
|
|
local force_version
|
|
|
|
config_load mcast
|
|
config_get max_groups igmp max_groups 25
|
|
config_get max_msf igmp max_msf 10
|
|
config_get max_members igmp max_membership 25
|
|
config_get qrv igmp qrv 2
|
|
config_get force_version igmp force_version 0
|
|
|
|
echo $max_members >/proc/sys/net/ipv4/igmp_max_memberships
|
|
echo $max_msf > /proc/sys/net/ipv4/igmp_max_msf
|
|
echo $qrv > /proc/sys/net/ipv4/igmp_qrv
|
|
echo $force_version > /proc/sys/net/ipv4/conf/all/force_igmp_version
|
|
|
|
}
|
|
|
|
configure_mcast_igmp() {
|
|
rm -f $CONFFILE
|
|
touch $CONFFILE
|
|
|
|
config_global_igmp_params
|
|
|
|
read_igmp_snooping_params
|
|
read_igmp_proxy_params
|
|
|
|
configure_mcpd
|
|
}
|