1#!/bin/sh
2
3#[ -f /usr/local/sbin/igmpproxy ] || exit 0
4
5RETVAL=0
6prog="igmpproxy"
7PID_FILE="/var/run/igmpproxy.pid" #if the path/file changes, remember to modify snmp checking function
8CONFIG_FILE="/var/igmpproxy.conf"
9lan_ifname=`config get lan_ifname`
10wan_ifname=`config get wan_ifname`
11wan_hwifname=ethwan
12wan_proto=`config get wan_proto`
13current_language=`config get GUI_Region`
14
15kill_igmpproxy()
16{
17	IGMP_PID=`ps | grep igmpproxy | grep -v 'grep' | awk '{print $1}'`
18	for PID in $IGMP_PID ; do
19		kill -9 $PID
20	done
21}
22
23get_reg() # $1: reg_addr
24{
25	ssdk_sh debug reg get $1 4 | grep -v "^$" | awk -F ':' '{print $2}'
26}
27
28set_reg() # $1: reg_addr, $2: value, $3: mask
29{
30	if [ $# == 2 ]; then
31		ssdk_sh debug reg set $1 $2 4
32		return
33	fi
34
35	local v0=$(get_reg $1)
36	local v_value=$(($2 & $3))
37	local v_clear=$(($3 ^ 0xffffffff))
38	local real_value=$(($v0 & $v_clear | $v_value))
39	ssdk_sh debug reg set $1 $real_value 4
40}
41
42# Enable IGMP SNOOPING on LAN (0,2,3,4,5) ports
43sw_enable_igmp_snooping() #
44{
45	set_reg 0x624 0x7f000000 0x7f000000  # IGMP_JOIN_LEAVE_DP : flood IGMP/MLD
46	set_reg 0x210 0x06060606 0x06060606  # IGMP_LEAVE_EN & IGMP_JOIN_EN (0,1,2,3 ports)
47	set_reg 0x214 0x01000006 0x01000006  # IGMP_V3_EN,
48	                                     # IGMP_LEAVE_EN & IGMP_JOIN_EN (4 port)
49	set_reg 0x618 0x10000000 0x10000000  # IGMP_JOIN_NEW_EN
50}
51
52sw_disable_igmp_snooping() #
53{
54	set_reg 0x624 0x7f000000 0x7f000000  # IGMP_JOIN_LEAVE_DP : flood IGMP/MLD
55	set_reg 0x210 0x00000000 0x06060606  # IGMP_LEAVE_EN & IGMP_JOIN_EN (0,1,2,3 ports)
56	set_reg 0x214 0x00000000 0x01000006  # IGMP_V3_EN,
57	                                     # IGMP_LEAVE_EN & IGMP_JOIN_EN (4 port)
58	set_reg 0x618 0x00000000 0x10000000  # IGMP_JOIN_NEW_EN
59}
60
61start() {
62	# Start daemons.
63	local igmp_enable=`config get wan_endis_igmp`
64	kill_igmpproxy
65	if [ "$igmp_enable" = "0" ]; then	
66		return $RETVAL
67	fi
68	echo $"Starting $prog: "
69	echo "quickleave" > $CONFIG_FILE
70	echo "mode 2" >> $CONFIG_FILE
71	echo "" >> $CONFIG_FILE
72
73        case "$wan_proto" in
74                static|dhcp)
75                        wan_ifname_upstream=$wan_ifname
76                        ;;
77                pppoe|pptp|l2tp)
78                        if [ $current_language = "Russian" ]; then
79			        wan_ifname_upstream=$wan_hwifname
80			 else
81			        wan_ifname_upstream=ppp0
82			 fi
83                        ;;
84                *)
85                        wan_ifname_upstream=$wan_ifname
86        esac
87	
88	echo "phyint $wan_ifname_upstream upstream  ratelimit 0  threshold 1" >> $CONFIG_FILE
89	echo "" >> $CONFIG_FILE
90
91	echo "phyint $lan_ifname downstream  ratelimit 0  threshold 1" >> $CONFIG_FILE
92	echo "" >> $CONFIG_FILE
93
94	if [ "$wan_ifname_upstream" = "$wan_hwifname" ]; then
95		echo "phyint ppp0 disabled" >> $CONFIG_FILE
96	echo "" >> $CONFIG_FILE
97	fi
98
99	touch $PID_FILE
100
101	#ebtables -A OUTPUT -o ethwan -p ipv4 --ip-dst 239.255.255.250 -j ACCEPT
102	#ebtables -A OUTPUT -o ethwan -p ipv4 --ip-dstrange 224.0.1.0-239.255.255.255 -j DROP
103
104	#echo 1 > /proc/igmpsnoop
105
106	#enable BT IGMP
107	WAN_PROTO=`/bin/config get wan_proto`
108	ENABLE_BT_IGMP=`/bin/config get enable_bt_igmp`
109	[ "$WAN_PROTO" = "pppoe" -a "$ENABLE_BT_IGMP" = "1" ] && echo 1 > /proc/bt_igmp_group
110
111	sw_enable_igmp_snooping
112	${prog} -c $CONFIG_FILE &
113	RETVAL=$?
114	echo
115	return $RETVAL
116}
117
118stop() {
119	# Stop daemons.
120	echo $"Shutting down $prog: "
121	kill_igmpproxy
122	[ -f $PID_FILE ] && sw_disable_igmp_snooping
123	rm -f ${PID_FILE}
124	#ebtables -D OUTPUT -o ethwan -p ipv4 --ip-dst 239.255.255.250 -j ACCEPT
125        #ebtables -D OUTPUT -o ethwan -p ipv4 --ip-dstrange 224.0.1.0-239.255.255.255 -j DROP
126
127	# disable BT IGMP
128	echo 0 > /proc/bt_igmp_group
129
130	RETVAL=$?
131	echo
132	return $RETVAL
133}
134
135# See how we were called.
136case "$1" in
137  start)
138	stop
139	start
140	;;
141  stop)
142	stop
143	;;
144  restart|reload)
145	stop
146	start
147	RETVAL=$?
148	;;
149  *)
150	echo $"Usage: $0 {start|stop|restart}"
151	exit 1
152esac
153
154exit $RETVAL
155
156