#!/bin/sh

RETVAL=0
prog="igmpproxy"
CONFIG_FILE="/var/mcpd.conf"
lan_ifname=`config get lan_ifname`
wan_ifname=`config get wan_ifname`
wan_proto=`config get wan_proto`

print_mcpd_options(){
cat <<EOF
#
#Begin IGMP configuration
#
igmp-default-version $2
igmp-query-interval 125
igmp-query-response-interval 10
igmp-last-member-query-interval 10
igmp-robustness-value 2
igmp-max-groups 25
igmp-max-sources 10
igmp-max-members 25
igmp-fast-leave 1
igmp-flood-enable 0
igmp-admission-required 0
igmp-proxy-interfaces $3
igmp-snooping-interfaces $1
igmp-mcast-interfaces $3
#
#End IGMP configuration
#
#
#Begin MLD configuration
#
mld-default-version 2
mld-query-interval 125
mld-query-response-interval 10
mld-last-member-query-interval 10
mld-robustness-value 2
mld-max-groups 10
mld-max-sources 10
mld-max-members 10
mld-fast-leave 1
mld-flood-enable 0
mld-admission-required 0
mld-proxy-interfaces $3
mld-snooping-interfaces $1 
mld-mcast-interfaces $3
#
#End MLD configuration
#
#
#Begin mcast configuration
#
mcast-max-groups-port-list
mcpd-strict-wan 0
igmp-mcast-snoop-exceptions 239.255.255.250/255.255.255.255 224.0.255.135/255.255.255.255
mld-mcast-snoop-exceptions ff05::0001:0003/ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff
#
#End mcast configuration
#
EOF
}

kill_igmpproxy()
{
	IGMP_PID=`ps | grep mcpd | grep -v 'grep' | awk '{print $1}'`
	for PID in $IGMP_PID ; do
		kill -9 $PID
	done
}

start() {
	# Start daemons.
	local igmp_enable=`config get wan_endis_igmp`
	local enable_bt_igmp=`config get enable_bt_igmp`
	[ "$wan_proto" = "pppoe" -a "$enable_bt_igmp" = "1" ] && echo 1 > /proc/bt_igmp_group


	 case "$wan_proto" in
                static|dhcp)
                        wan_ifname_upstream=$wan_ifname
                        ;;
                pppoe|pptp|l2tp)
			if [ "x$(config get wan_pppoe_intranet_wan_enable)" = "x1" ] ;then
				wan_ifname_upstream=$wan_ifname
			else	
				wan_ifname_upstream=ppp0
			fi
			;;
                *)
                        wan_ifname_upstream=$wan_ifname
        esac

	# Orange IPTV/VOD service with igmpproxy
    echo "****** start ISP IPTV/VOD service with igmpproxy ******"
    local enable_iptv=`config get enable_vlan`
    local vlan_type=`config get vlan_type`
    local enable_frorg_iptv=`config get enable_orange`
    local enable_spvoda_iptv=`config get voda_spain_iptv`
    local enable_spmovistar_iptv=`config get movistar_spain_iptv`
    local enable_sporange_iptv=`config get orange_spain_iptv`
    local Enable_IPTV=0
    if [ $enable_iptv -eq 1 ] && [ $vlan_type -eq 1 ]; then
        for i in 0 1 2 3 4 5 6 7 8 9 10; do
            tv=`config get vlan_tag_$i`
            [ -n "$tv" ] || continue
            set - $(echo $tv)
            # $1: enable, $2: name, $3: vid, $4: pri, $5:wports, $6:wlports
            [ "$1" = "1" ] || continue
            vlan_id=$3
            if [ "$enable_frorg_iptv" = "1" ] && [ "$vlan_id" = "838" -o "$vlan_id" = "840" ]; then
                Enable_IPTV=1
            elif [ "$enable_spvoda_iptv" = "1" ] && [ "$vlan_id" = "105" ]; then
                Enable_IPTV=1
            elif [ "$enable_spmovistar_iptv" = "1" ] && [ "$vlan_id" = "2" ]; then
                Enable_IPTV=1
            elif [ "$enable_sporange_iptv" = "1" ] && [ "$vlan_id" = "838" ]; then
                Enable_IPTV=1
            else
                Enable_IPTV=0
            fi
        done
        if [ "$Enable_IPTV" = "1" ]; then
            wan_ifname_upstream="brotv"
            lan_ifname="br0"
        fi
    fi

	igmp_version=`/bin/config get force_igmp_version`
	if [ "x$igmp_version" = "x2" -o "x$igmp_version" = "x0" ];then
		igmp_config_version=3
	else
		igmp_config_version=2
	fi

	if [ "$igmp_enable" = "0" ]; then	
		kill_igmpproxy
		print_mcpd_options "$lan_ifname" "3" > $CONFIG_FILE
		mcpd &
	else
		kill_igmpproxy
		print_mcpd_options "$lan_ifname" "$igmp_config_version" "$wan_ifname_upstream"  > $CONFIG_FILE
		mcpd &
	fi

	RETVAL=$?

	echo "Start mcpd by igmp module"
	return $RETVAL
}

stop() {
	# Stop daemons.
	echo $"Shutting down $prog: "
	kill_igmpproxy
	
	# disable BT IGMP
	echo 0 > /proc/bt_igmp_group

	RETVAL=$?
	echo
	return $RETVAL
}

# See how we were called.
case "$1" in
  start)
	stop
	start
	;;
  stop)
	stop
	;;
  restart|reload)
	stop
	start
	RETVAL=$?
	;;
  *)
	echo $"Usage: $0 {start|stop|restart}"
	exit 1
esac

exit $RETVAL

