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