[T106][ZXW-22]7520V3SCV2.01.01.02P42U09_VEC_V0.8_AP_VEC origin source commit

Change-Id: Ic6e05d89ecd62fc34f82b23dcf306c93764aec4b
diff --git a/ap/app/Script/scripts/psext_updown.sh b/ap/app/Script/scripts/psext_updown.sh
new file mode 100755
index 0000000..7723f5b
--- /dev/null
+++ b/ap/app/Script/scripts/psext_updown.sh
@@ -0,0 +1,476 @@
+#!/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
+	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=`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
+    ifconfig $br up 2>>$test_log
+	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
+	mtu=`nv get mtu`
+	ifconfig $ps_if mtu $mtu
+	if [ "-$ps_ext_mode" == "-1" ]; then
+        brctl addbr $ext_br
+        brctl setfd $ext_br 0.1
+        brctl addif $ext_br $eth_if
+        ifconfig $ext_br up
+        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