| #!/bin/sh | 
 |  | 
 | path_sh=`nv get path_sh` | 
 | . $path_sh/global.sh | 
 | echo "Info: psext_updown.sh $1 $2 start" >> $test_log | 
 |  | 
 | echo 1 > /proc/sys/net/ipv4/ip_forward | 
 | c_id=$2 | 
 | ps_if=`nv get pswan`$c_id | 
 | eth_if=`nv get "ps_ext"$c_id` | 
 | ext_br="br"$c_id | 
 | ps_ext_mode=`nv get need_jilian` | 
 | #Óû§ÉèÖþ²Ì¬ip¡¢gw£¬nmÔÚ´Ë´¦¼ÆËã | 
 | arp_proxy_kill() | 
 | { | 
 | 	ps > ${path_tmp}/zte_arp_proxy.$ext_br.$$ | 
 | 	arp_proxy_pid=`awk 'BEGIN{temp1="'"${ext_br}"'";temp2="zte_arp_proxy"}{if(index($0,temp1)>0 && index($0,temp2)>0){print $1}}' ${path_tmp}/zte_arp_proxy.$ext_br.$$` | 
 | 	rm -f ${path_tmp}/zte_arp_proxy.$ext_br.$$ | 
 | 	[ -n "$arp_proxy_pid" ] && { kill $arp_proxy_pid; echo "test: kill udhcpc $arp_proxy_pid " >> $test_log ; } | 
 | } | 
 |  | 
 | arp_proxy_set() | 
 | { | 
 | 	arp_proxy_kill | 
 | 	(zte_arp_proxy -i $ext_br 2>> $test_log || echo "Error: zte_arp_proxy -i $ext_br failed." >> $test_log) & | 
 | } | 
 |  | 
 | get_mask() | 
 | { | 
 |     mask=`echo ${ps_ip}"."${gw} | awk -F '.' '{ | 
 |         nm1=0;nm2=0;nm3=0 | 
 | 	    if($1 == $5) | 
 | 	       nm1=255 | 
 | 	 | 
 | 	    if(255 == nm1 && $2 == $6) | 
 | 	       nm2=255 | 
 | 	 | 
 | 	    if(255 == nm2 && $3 == $7) | 
 | 	       nm3=255 | 
 | 	 | 
 | 	    printf nm1"."nm2"."nm3".0" | 
 |     }'` | 
 | } | 
 |  | 
 | dhcp_set() | 
 | { | 
 |      | 
 | 	start=$pdp_ip  | 
 |     end=$pdp_ip | 
 | 	#nvÖµ·Ç¿ÕÔò±íʾÓû§ÉèÖÃÁ˾²Ì¬ip¡¢gw | 
 | 	gw=`nv get $ps_if"_gw"` | 
 | 	if [ "-$gw" == "-" -o "-$gw" == "-0.0.0.0" ]; then | 
 | 		gw=$br_ip | 
 | 		mask=$valid_mask | 
 |         echo psip $ps_ip br_ip  $br_ip valid_mask $valid_mask  $mask | 
 | 	else | 
 |         echo "no mask" | 
 | 	    get_mask | 
 | 	fi | 
 | 	nv set $ext_br"_nm"=$mask  | 
 | 	ifconfig $ext_br netmask $mask 2>>$test_log | 
 | 	if [ $? -ne 0 ];then | 
 | 	    echo "Error: ifconfig $eth_br netmask $mask failed." >> $test_log | 
 |     fi | 
 |     dns=`nv get $ps_if"_pridns"` | 
 |     dns2=`nv get $ps_if"_secdns"` | 
 |     lease="86400" | 
 | 	 | 
 |     #±¾µØÍøÂçÅäÖà | 
 |     if [ "-$dns" == "-" -o "-$dns" == "-0.0.0.0" ] && [ "-$dns2" == "-" -o "-$dns2" == "-0.0.0.0" ]; then | 
 |         echo "Error: no valid dns, use default dns." >> $test_log | 
 |         dns="114.114.114.114" | 
 |         dns2="8.8.8.8" | 
 |     fi | 
 |     rm -rf $path_conf"/udhcpd"$c_id".conf" | 
 | 	touch $path_conf"/udhcpd"$c_id".conf" | 
 | 	echo " " > $path_conf"/udhcpd"$c_id".conf" | 
 | 	 | 
 |     if [ "-$dns" != "-" -a "-$dns" != "-0.0.0.0" ]; then | 
 |         echo "nameserver $dns" >> /etc/resolv.conf | 
 |     fi | 
 |     if [ "-$dns2" != "-" -a "-$dns2" != "-0.0.0.0" ]; then | 
 |         echo "nameserver $dns2" >> /etc/resolv.conf | 
 |     fi | 
 |      | 
 |     pidfile=$path_conf"/udhcpd"$c_id".pid" | 
 |     leasesfile=$path_conf"/udhcpd"$c_id".leases" | 
 |  | 
 |     sh $path_sh/config-udhcpd.sh $c_id -s $start | 
 |     sh $path_sh/config-udhcpd.sh $c_id -e $end | 
 |     sh $path_sh/config-udhcpd.sh $c_id -i $ext_br | 
 |     sh $path_sh/config-udhcpd.sh $c_id -m $mask | 
 |     sh $path_sh/config-udhcpd.sh $c_id -d $dns $dns2 | 
 |     if [ "-$gw" != "-" ]; then | 
 |         sh $path_sh/config-udhcpd.sh $c_id -g $gw | 
 |     fi | 
 |     if [ "-$lease" != "-" ]; then | 
 |         sh $path_sh/config-udhcpd.sh $c_id -t $lease | 
 |     fi | 
 |     sh $path_sh/config-udhcpd.sh $c_id -p $pidfile | 
 |     sh $path_sh/config-udhcpd.sh $c_id -l $leasesfile | 
 | 	sh $path_sh/config-udhcpd.sh $c_id -r 1 | 
 | } | 
 | get_validnum() | 
 | { | 
 |     last4=${ipaddr##*.} | 
 |     ipaddr=${ipaddr%.*} | 
 |     mark=`expr $last4 % 2` | 
 |     last3=0 | 
 |     frag=`expr $frag + 1` | 
 |     echo $ipaddr $last4 $last3 | 
 |     if [ $last4 -eq 0 ] || [ $last4 -eq 255 ]; | 
 |     then | 
 |             last3=${ipaddr##*.} | 
 |     fi | 
 |     if [ $last4 -eq 0 ] && [ $last3 -eq 0 ]; | 
 |     then | 
 |         get_validnum | 
 |     elif [ $last4 -eq 255 ] && [ $last3 -eq 255 ]; | 
 |     then | 
 |         get_validnum | 
 |     else | 
 |         return | 
 |     fi | 
 | } | 
 | get_netmask_btrunk() | 
 | { | 
 | 	pdpip=$1 | 
 | 	pdp_ip4=${pdpip##*.} | 
 | 	front3=${pdpip%.*} | 
 | 	 | 
 | 	if [ $pdp_ip4 -eq 1 ];then  | 
 |         tmp_ip1=`expr $pdp_ip4 + 1` | 
 |         tmp_ip2=`expr $pdp_ip4 + 2` | 
 |         ps_ip="$front3.$tmp_ip1" | 
 |         br_ip="$front3.$tmp_ip2" | 
 |     elif  [ $pdp_ip4 -eq 254 ];then | 
 | 		tmp_ip1=`expr $pdp_ip4 - 2` | 
 | 		tmp_ip2=`expr $pdp_ip4 - 1` | 
 | 		ps_ip="$front3.$tmp_ip1" | 
 | 		br_ip="$front3.$tmp_ip2" | 
 | 	else | 
 | 		tmp_ip1=`expr $pdp_ip4 - 1` | 
 | 		tmp_ip2=`expr $pdp_ip4 + 1` | 
 | 		ps_ip="$front3.$tmp_ip1" | 
 | 		br_ip="$front3.$tmp_ip2" | 
 |     fi | 
 |  | 
 | 	nv set $ps_if"_ip"=$ps_ip | 
 | 	valid_mask="255.255.0.0" | 
 | } | 
 |  | 
 | get_netmask() | 
 | { | 
 |     ipaddr=$1 | 
 |     last4=0 | 
 |     last3=0 | 
 |     mark=0 | 
 |     frag=0 | 
 |      | 
 |     get_validnum | 
 |     echo $ipaddr $last4 $last3 $mark $frag | 
 |     #½«ÓÐЧ¶ÎÖÐÓÐЧλÖÃΪ1£¬¸Ãλ×ó±ß¶¼ÖÃΪ0 | 
 |     valid_num=0 | 
 |      | 
 |     if [ $mark -eq 1 -a $last3 -eq 0 ];then | 
 |         valid_num=`expr $last4 + 1` | 
 |     elif [ $mark -eq 0 -a $last3 -eq 0 ];then | 
 |         valid_num=$last4 | 
 |     elif [ $mark -eq 1 -a $last3 -ne 0 ];then | 
 |         valid_num=`expr $last3 + 1` | 
 |     elif [ $mark -eq 0 -a $last3 -ne 0 ];then | 
 |         valid_num=$last3 | 
 |     fi | 
 |     echo  $valid_num | 
 |     #´Ó×óÏòÓÒÕÒµ½ÓÐЧ¶ÎÖеÚÒ»¸ö1µÄλÖà | 
 |     place=1 | 
 |     while [ `expr $valid_num % 2` -eq 0 ] | 
 |     do | 
 |         place=`expr $place + 1` | 
 |         valid_num=`expr $valid_num / 2` | 
 |     done | 
 |  | 
 |     if [ $last3 -eq 0 ] | 
 |     then | 
 |         frag=`expr $frag - 1` | 
 |     fi | 
 |     count=1 | 
 |      | 
 |     if [ $place -gt 8 ] | 
 |     then | 
 |         place=`expr $place - 8` | 
 |         frag=`expr $frag + 1` | 
 |     fi | 
 |  | 
 |     tmp_place=$place | 
 |     while [ $tmp_place -gt 0 ] | 
 |     do | 
 |         count=`expr $count \* 2` | 
 |         tmp_place=`expr $tmp_place - 1` | 
 |     done | 
 |  | 
 |     #ÖÁÉÙÐèÒªÈý¸öÓÐЧipµØÖ·£¨ps¿Ú£¬pc£¬Íø¹Ø£©£¬ÑÚÂë×î´óΪ255.255.255.248 | 
 |     if [ $frag -eq 0  -a  $place -eq 2 ] | 
 |     then | 
 |         count=`expr $count + 3` | 
 |     else | 
 |         count=`expr $count - 1` | 
 |     fi | 
 |  | 
 |     before=$frag | 
 |      | 
 |     while [ $before -lt 3 ] | 
 |     do | 
 |         valid_mask=$valid_mask"255." | 
 |         before=`expr $before + 1` | 
 |     done | 
 |         valid_mask=$valid_mask"`expr 255 - $count`" | 
 |     while [ $frag -gt 0 ] | 
 |     do | 
 |         valid_mask=$valid_mask".0" | 
 |         frag=`expr $frag - 1` | 
 |     done | 
 |  | 
 |     pdpip=$1 | 
 |     pdp_ip4=${pdpip##*.} | 
 |     pdp_ip4_tmp=$pdp_ip4 | 
 |     front3=${pdpip%.*} | 
 |      | 
 |     tmp_count=0 | 
 |     com_num=0 | 
 |     while [ $tmp_count -lt 3 ] | 
 |     do | 
 |         valid_count=0 | 
 |          | 
 |         if [ `expr $pdp_ip4_tmp % 2` -eq 1 ] | 
 |         then | 
 |             tmp_count1=$tmp_count | 
 |             valid_count=1 | 
 |             while [ $tmp_count1 -gt 0 ] | 
 |             do | 
 |                 valid_count=`expr $valid_count \* 2` | 
 |                 tmp_count1=`expr $tmp_count1 - 1` | 
 |             done | 
 |         fi | 
 |         com_num=`expr $com_num + $valid_count` | 
 |         tmp_count=`expr $tmp_count + 1` | 
 |         pdp_ip4_tmp=`expr $pdp_ip4_tmp / 2` | 
 |     done | 
 |     echo com_num $com_num | 
 |      | 
 |     if [ $com_num -gt 2 ] | 
 |     then  | 
 |         tmp_ip1=`expr $pdp_ip4 - 1` | 
 |         tmp_ip2=`expr $pdp_ip4 - 2` | 
 |         ps_ip="$front3.$tmp_ip1" | 
 |         br_ip="$front3.$tmp_ip2" | 
 |     else | 
 |         tmp_ip1=`expr $pdp_ip4 + 1` | 
 |         tmp_ip2=`expr $pdp_ip4 + 2` | 
 |         ps_ip="$front3.$tmp_ip1" | 
 |         br_ip="$front3.$tmp_ip2" | 
 |     fi | 
 |  | 
 |     echo ps_ip $ps_ip br_ip $br_ip valid_mask $valid_mask | 
 |     nv set $ps_if"_ip"=$ps_ip | 
 | } | 
 | #»ñÈ¡ip²¢ÅäÖÃps¡¢eth | 
 | get_ipaddr() | 
 | { | 
 |     pdp_ip=`nv get $ps_if"_pdp_ip"` | 
 | #ÅжÏÊÇ·ÊÇñbtrunkÐͺŻú	 | 
 | 	btrunk=`cat /sys/module/fast_common/parameters/btrunk_fw` | 
 | 	if [ "$btrunk" -eq "0" ];then | 
 | 		get_netmask $pdp_ip | 
 |     else | 
 | 		get_netmask_btrunk $pdp_ip | 
 | 	fi | 
 | 	 | 
 | 	ifconfig $ps_if $ps_ip up 2>>$test_log | 
 | 	wan_nm=`nv get static_wan_netmask` | 
 | 	ifconfig $ps_if netmask $wan_nm 2>>$test_log | 
 | 	if [ $? -ne 0 ];then | 
 | 	    echo "Error: ifconfig $ps_if $ps_ip up failed." >> $test_log | 
 |     fi | 
 | 	nv set default_wan_rel=$ps_if | 
 | 	#nv set default_cid=$c_id | 
 | 	nv set $ext_br"_ip"=$br_ip | 
 | 	ifconfig $ext_br $br_ip 2>>$test_log | 
 | 	if [ $? -ne 0 ];then | 
 | 	    echo "Error: ifconfig $ext_br $br_ip up failed." >> $test_log | 
 |     fi | 
 | } | 
 | #·ÓɹæÔò£¬psÓëeth¼¶Áª | 
 | route_set() | 
 | { | 
 |     marknum=`expr $c_id + 20` | 
 |     iptables -t mangle -A PREROUTING -i $ps_if -j MARK --set-mark $marknum | 
 | 	rt_num=`expr $c_id + 120` | 
 |      | 
 |     ip route add default dev $ext_br table $rt_num 	 | 
 | 		 | 
 | 	ip rule add to $pdp_ip fwmark $marknum table $rt_num | 
 | 	 | 
 | 	marknum=`expr $c_id + 10` | 
 |     iptables -t mangle -A PREROUTING -i $ext_br -j MARK --set-mark $marknum | 
 | 	rt_num=`expr $c_id + 100` | 
 |  | 
 |     ip route add default dev $ps_if table $rt_num | 
 | 	ip rule add from $pdp_ip fwmark $marknum table $rt_num | 
 |  | 
 | 	ip route flush cache | 
 |      | 
 |     #±¾µØÍøÂçÅäÖà | 
 |     iptables -t nat -I POSTROUTING -s $ps_ip -o $ps_if -j SNAT --to $pdp_ip | 
 |      | 
 | 	route_info=`ip route|grep default` | 
 | 	 | 
 | 	if [ "$route_info" == "" ];then | 
 | 		route add default dev $ps_if | 
 | 	else | 
 | 		echo "Debug: default route already exist." >> $test_log | 
 | 	fi | 
 | } | 
 | #¹¹½¨ÍøÇÅ | 
 | br_up() | 
 | { | 
 |     br="br"$c_id | 
 |     brctl addbr $br | 
 |     brctl setfd $br 0.1 | 
 | 	if [ "$eth_if" != "zvnet"$c_id ]; then | 
 | 	ifconfig $br up 2>>$test_log | 
 | 	else | 
 | 	ifconfig $br -arp up  2>>$test_log | 
 | 	fi | 
 | 	if [ $? -ne 0 ];then | 
 | 	    echo "Error: ifconfig $br up failed." >> $test_log | 
 |     fi | 
 | 	 | 
 | 	ifconfig $ps_if up 2>>$test_log | 
 | 	if [ $? -ne 0 ];then | 
 | 	    echo "Error: ifconfig $ps_if up failed." >> $test_log | 
 |     fi | 
 |     brctl addif $br $ps_if 2>>$test_log | 
 | 	if [ $? -ne 0 ];then | 
 | 	    echo "Error: brctl addif $br $ps_if failed." >> $test_log | 
 |     fi | 
 |     brctl addif $br $eth_if 2>>$test_log | 
 | 	if [ $? -ne 0 ];then | 
 | 	    echo "Error: brctl addif $br $eth_if failed." >> $test_log | 
 |     fi | 
 | 	ifconfig $eth_if up 2>>$test_log | 
 | 	if [ $? -ne 0 ];then | 
 | 	    echo "Error: ifconfig $eth_if up failed." >> $test_log | 
 |     fi | 
 | 	    | 
 | } | 
 | #ɾ³ýÍøÇÅ | 
 | br_down() | 
 | { | 
 |     br="br"$c_id | 
 | 	brctl delif $br $eth_if 2>>$test_log | 
 | 	if [ $? -ne 0 ];then | 
 | 	    echo "Error: brctl delif $br $eth_if failed." >> $test_log | 
 |     fi | 
 | 	ifconfig $eth_if down 2>>$test_log | 
 | 	if [ $? -ne 0 ];then | 
 | 	    echo "Error: ifconfig $eth_if down failed." >> $test_log | 
 |     fi | 
 | 	brctl delif $br $ps_if 2>>$test_log | 
 | 	if [ $? -ne 0 ];then | 
 | 	    echo "Error: brctl delif $br $ps_if failed." >> $test_log | 
 |     fi | 
 | 	ifconfig $ps_if down 2>>$test_log | 
 | 	if [ $? -ne 0 ];then | 
 | 	    echo "Error: ifconfig $ps_if down failed." >> $test_log | 
 |     fi | 
 |     ifconfig $br down 2>>$test_log | 
 | 	if [ $? -ne 0 ];then | 
 | 	    echo "Error: ifconfig $br down failed." >> $test_log | 
 |     fi | 
 |     brctl delbr $br 2>>$test_log | 
 | 	if [ $? -ne 0 ];then | 
 | 	    echo "Error: brctl delbr $br failed." >> $test_log | 
 |     fi | 
 | } | 
 | #ɱËÀ¶ÔÓ¦µÄDHCP½ø³Ì | 
 | dhcp_kill() | 
 | { | 
 |     pidfile=$path_conf"/udhcpd"$c_id".pid" | 
 | 	kill `cat $pidfile` | 
 | } | 
 | #ɾ³ý¶ÔÓ¦µÄ·ÓɹæÔò | 
 | route_del() | 
 | { | 
 |     pdp_ip=`nv get $ps_if"_pdp_ip"` | 
 | #	ps_ip1=${pdp_ip%.*} | 
 | #	ps_ip2=${pdp_ip##*.} | 
 | #	[ "$ps_ip2" -ge "254" ] && { ps_ip2="250"; } | 
 | #	ps_ip2=`expr $ps_ip2 + 1` | 
 | 	ps_ip=`nv get $ps_if"_ip"` | 
 | 	br_ip=`nv get $ext_br"_ip"` | 
 | 	marknum=`expr $c_id + 10` | 
 | 	rt_num=`expr $c_id + 100` | 
 | 	 | 
 | 	iptables -t mangle -D PREROUTING -i $ext_br -j MARK --set-mark $marknum | 
 | 	ip rule del from $pdp_ip fwmark $marknum table $rt_num  | 
 |     ip route del default dev $ps_if table $rt_num | 
 | 	 | 
 |     marknum=`expr $c_id + 20` | 
 | 	rt_num=`expr $c_id + 120` | 
 |     iptables -t mangle -D PREROUTING -i $ps_if -j MARK --set-mark $marknum | 
 | 	ip rule del to $pdp_ip fwmark $marknum table $rt_num | 
 |     ip route del default dev $ext_br table $rt_num  | 
 | 	#±¾µØÍøÂçÅäÖà | 
 |     iptables -t nat -D POSTROUTING -s $ps_ip -o $ps_if -j SNAT --to $pdp_ip | 
 |     if [ $? -ne 0 ];then | 
 |         echo "cmd <<iptables -t nat -D POSTROUTING -s $ps_ip -o $ps_if -j SNAT --to $pdp_ip>> exec failed"  >> $test_log | 
 |     fi | 
 |     route delete default dev $ps_if | 
 |     if [ $? -ne 0 ];then | 
 |         echo "cmd <<route delete default dev $ps_if>> exec failed"  >> $test_log | 
 |     fi | 
 | 	 | 
 |     ifconfig $ext_br 0.0.0.0 | 
 | 	ifconfig $ext_br down 2>>$test_log | 
 | 	if [ $? -ne 0 ];then | 
 | 	    echo "Error: ifconfig $ext_br down failed." >> $test_log | 
 |     fi | 
 |      | 
 |     ifconfig $ps_if 0.0.0.0 | 
 | 	ifconfig $ps_if down 2>>$test_log | 
 | 	if [ $? -ne 0 ];then | 
 | 	    echo "Error: ifconfig $ps_if down failed." >> $test_log | 
 |     fi | 
 | 	 | 
 |     #reset nv | 
 |     nv set $ext_br"_ip"=0.0.0.0 | 
 |     nv set $ext_br"_nm"=0.0.0.0 | 
 |     nv set $ps_if"_pdp_ip"=0.0.0.0 | 
 |     nv set $ps_if"_pridns"=0.0.0.0 | 
 |     nv set $ps_if"_secdns"=0.0.0.0 | 
 |     nv set $ps_if"_ip"=0.0.0.0 | 
 | } | 
 |  | 
 | if [ "-$1" == "-linkup" ]; then | 
 | 	ra_mtu_enable=`nv get ra_mtu_enable` | 
 | 	if [ "$ra_mtu_enable" != "1" ]; then | 
 | 		mtu=`nv get mtu` | 
 | 		ifconfig $ps_if mtu $mtu | 
 |     	fi | 
 | 	if [ "-$ps_ext_mode" == "-1" ]; then | 
 |         brctl addbr $ext_br | 
 |         brctl setfd $ext_br 0.1 | 
 |         brctl addif $ext_br $eth_if | 
 | 		if [ "$eth_if" != "zvnet"$c_id ]; then | 
 | 		ifconfig $ext_br up 2>>$test_log | 
 | 		else | 
 | 		ifconfig $ext_br -arp up 2>>$test_log | 
 | 		fi | 
 |         get_ipaddr | 
 | 		dhcp_set | 
 | 	    route_set | 
 | 		arp_proxy_set | 
 |         ifconfig $eth_if up | 
 | 	ismbim=`ps |grep -v grep |grep -w mbim |awk '{printf $1}'` | 
 | 	if [ "-$ismbim" != "-" ]; then | 
 | 		eth_mac=`cat "/sys/class/net/"$eth_if"/address"` | 
 | 		arp -s $pdp_ip $eth_mac 2>>$test_log | 
 | 	fi | 
 | 		tc_tbf.sh up $c_id | 
 | 	elif [ "-$ps_ext_mode" == "-0" ]; then | 
 | 	    br_up | 
 | 	fi	 | 
 | elif [ "-$1" == "-linkdown" ]; then | 
 |     if [ "-$ps_ext_mode" == "-1" ]; then | 
 | 		tc_tbf.sh down $c_id | 
 | 		arp_proxy_kill | 
 |         dhcp_kill | 
 | 	    route_del | 
 |         ifconfig $eth_if down | 
 |         ifconfig $ext_br down | 
 |         brctl delif $ext_br $eth_if | 
 |         brctl delbr $ext_br  | 
 |         echo "" > /etc/resolv.conf | 
 | 	elif [ "-$ps_ext_mode" == "-0" ]; then | 
 | 	    br_down | 
 | 	fi	 | 
 | fi |