#!/bin/sh

WSCUPNP_FILE="/var/run/wscupnp.file"
CONFIG_FILE="/etc/Wireless/RT2860AP/RT2860AP.dat"
IWPRIV="/usr/sbin/iwpriv"

CSID_CONFMODE="0x0019a100"
CSID_CONFSTATUS="0x0019a200"
CSID_MODE="0x0019a300"
CSID_ENROLLEECODE="0x80190100"
CSID_TRIGGER="0x80190101"
CSID_WPSSTATUS="0x80190103"
CSID_APPINCODE="0x0019a001"

CSID_SSID1="0x00190400"
CSID_AUTHMODE="0x00191300"
CSID_ENCRYPTYPE="0x00191400"
#CSID_WPAPSK="0x00191F00"

# Client mode WPS
CSID_CLICONFSTATUS="0x001ca100"
CSID_CLIMODE="0x001ca200"
CSID_CLITRIGGER="0x001ca300"
CSID_CLIWPSSTATUS="0x001ca301"

CONFMODE=`rdcsman $CSID_CONFMODE u8`
CONFSTATUS=`rdcsman $CSID_CONFSTATUS u8`
MODE=`rdcsman $CSID_MODE u8`
TRIGGER=`rdcsman $CSID_TRIGGER u8`
APPINCODE=`rdcsman $CSID_APPINCODE str`
ENROLLEECODE=`rdcsman $CSID_ENROLLEECODE str`

# Client mode WPS
CLICONFSTATUS=`rdcsman $CSID_CLICONFSTATUS u8`
CLIMODE=`rdcsman $CSID_CLIMODE u8`
CLITRIGGER=`rdcsman $CSID_CLITRIGGER u8`
WPSCLISTATUS=`rdcsman $CSID_CLIWPSSTATUS u8`

STATUS_TIMEOUT=120

WLAN="wlan0"


wps_status()
{
#echo "WPS STATUS DEBUG"
	if [ -e /tmp/wscd_status ]; then
		status=`cat /tmp/wscd_status`
	else
		status=0
	fi

	case $status in
		0) # WPS START
			s=3 
			;;
		1) # WPS PBC OVERLAPPING
			s=2
			;;
		2) # WPS TIMEOUT
			s=2
			;;
		3) # WPS SUCCESS
			s=34
			;;
		*)
			s=3
			;;
	esac

	return $s
}

wps_stop()
{
#echo "WPS-STOP DEBUG"

	# Cancel the WPS
	echo 1 > /tmp/wscd_cancel

    if [ -e /var/run/wscd-wlan0.pid ]; then
        killall wscd
        rm /var/run/wscd-wlan0.pid
    fi

	if [ -e /var/wscd-wlan0.fifo ]; then
		rm -rf /var/wscd-wlan0.fifo
	fi

	if [ -e /var/wsc.conf ]; then
		rm -rf /var/wsc.conf
	fi

	if [ -e /var/wps ]; then
		rm -rf /var/wps
	fi

	if [ -e /tmp/wscd_status ]; then
		rm -rf /tmp/wscd_status
	fi

	if [ -e /tmp/wscd_config ]; then
		rm -rf /tmp/wscd_config
	fi

	if [ -e /tmp/flash_param ]; then
		rm -rf /tmp/flash_param
	fi

#	wlanapp.sh start
	# clear the status
	if [ $CONFSTATUS -eq 1 ]; then
		wrcsman "$CSID_WPSSTATUS 0"
	fi

	return 0
}

wps_coldstart()
{
#echo "WPS COLDSTART DEBUG"
	if [ ! -f /var/wps/simplecfgservice.xml ]; then
		mkdir -p /var/wps
		cp -a /usr/mv2ram/etc/simplecfgservice.xml /var/wps/
	fi

	UPNP=`rdcsman 0x0015000B u8`
	_CMD="-start"

#	if [ $UPNP -eq 1 ]; then # FIXME: maybe not $WLAN
#		route del -net 239.0.0.0 netmask 255.0.0.0 $WLAN
#		route add -net 239.0.0.0 netmask 255.0.0.0 $WLAN
#
#		mini_upnpd -wsc /tmp/wscd_config -igd /tmp/igd_config &
#	else
#		mini_upnpd -wsc /tmp/wscd_config &
#	fi

	wlantool wps /var/wsc.conf
	_CMD="$_CMD -c /var/wsc.conf -w $WLAN"

	DEBUG_ON=0
	if [ $DEBUG_ON -eq 1 ]; then
		_CMD="$_CMD -debug"
	fi

	USE_IWCONTROL=1
	if [ $USE_IWCONTROL -eq 1 ]; then
		_CMD="$_CMD -fi /var/wscd-wlan0.fifo"
	fi

	WSC_CMD=$_CMD
	wscd $WSC_CMD &

	WAIT=1
	while [ $USE_IWCONTROL != 0 -a $WAIT != 0 ]
	do
		if [ -e /var/wscd-wlan0.fifo ]; then
			WAIT=0
		else
			sleep 1
		fi
	done			

#	iwcontrol $WLAN
	wlanapp.sh start

	return 1	
}

wps_wait ()
{
	# Monitor the status
	TIME=0	
	status_pre=0
	while [ true ] ; do
		wps_status
		status=$?
		
#echo "WPS WAIT DEBUG"
		if [ $status != $status_pre ] ; then
			status_pre=$status
			wrcsman "$CSID_WPSSTATUS $status"
			TIME=0
		fi

		CSID_ENABLE="0x0019a000"
		ENABLE=`rdcsman $CSID_ENABLE u8`

		if [ $ENABLE -eq "0" ] ; then
#echo  "DEBUG ENABLE = $ENABLE"	
			break;
		fi

		if [ $status = 34 ] ; then
	
			# Record the WPAPSK setting
			#if [ $CONFSTATUS = 1 ] ; then
			#	record_security_setting
			#fi
	
			# CONFIGURED
			wrcsman "$CSID_CONFSTATUS 2"
			return 0
   		fi
		
		sleep 1
   		TIME=$(($TIME + 1))
   		if [ $TIME -gt $STATUS_TIMEOUT ] ; then
#echo "WPS TIMEOUT DEBUG"
			break
   		fi	
	done

	echo 4 > /proc/gpio

	# UNCONFIGURED
	wrcsman "$CSID_CONFSTATUS 1"

	# NOUSED
	wrcsman "$CSID_WPSSTATUS 0"
}


wps_start_pin()
{
#echo "WPS START PIN DEBUG"
    echo 3 > /proc/gpio
    echo W00000006 > /proc/gpio_freq

#echo "DEBUG WPS MODE=$CONFMODE"
	if [ $CONFMODE -eq 1 ]; then
#echo "DEBUG WPS AP PINCODE=$APPINCODE"
		# mode = 1, AP: Enrollee
		iwpriv $WLAN set_mib pin=$APPINCODE
	else
#echo "DEBUG WPS ENROLLEE CODE=$ENROLLEECODE"
		# mode = 4, AP: Registrar
		iwpriv $WLAN set_mib pin=$ENROLLEECODE
	fi
	wps_wait
}

wps_start_pbc()
{
#echo "WPS START PBC DEBUG"
    echo 3 > /proc/gpio
    echo W00000006 > /proc/gpio_freq
	wscd -sig_pbc
	wps_wait
}

wps_client_start()
{
#echo "WPSCLI START DEBUG"
    if [ ! -f /var/wps/simplecfgservice.xml ]; then
        mkdir -p /var/wps
        cp -a /usr/mv2ram/etc/simplecfg*.xml /var/wps/
    fi

	ifconfig $WLAN up

	UPNP=0
	if [ $UPNP = 0 ]; then
		_CMD="-mode 2"
	fi

	wlantool wps_client /var/wsc.conf
	_CMD="$_CMD -c /var/wsc.conf -w $WLAN"

	USE_IWCONTROL=1
	if [ $USE_IWCONTROL = 1 ]; then
		_CMD="$_CMD -fi /var/wscd-$WLAN.fifo"
	fi

	WSC_CMD=$_CMD
	wscd $WSC_CMD &

    WAIT=1
    while [ $USE_IWCONTROL != 0 -a $WAIT != 0 ]
    do
        if [ -e /var/wscd-wlan0.fifo ]; then
            WAIT=0
        else
            sleep 1
        fi
    done

#	iwcontrol $WLAN
	wlanapp.sh start
}

wpscli_wait()
{
	# Monitor the status
	TIME=0
	status_pre=0
	while [ true ] ; do
		wps_status
		status=$?

#echo "WPSCLI WAIT DEBUG"
		if [ $status != $status_pre ] ; then
			status_pre=$status
			wrcsman "$CSID_CLIWPSSTATUS $status"
			TIME=0
		fi

		CSID_CLIENABLE="0x001ca000"
		CLIENABLE=`rdcsman $CSID_CLIENABLE u8`

		if [ $CLIENABLE -eq "0" ] ; then
#echo "DEBUG CLIENABLE = $CLIENABLE"
			break;
		fi

		if [ $status = 34 ] ; then

            # Record the WPAPSK setting
            #if [ $CONFSTATUS = 1 ] ; then
            #   record_security_setting
            #fi

            # CONFIGURED
			wrcsman "$CSID_CLICONFSTATUS 2"
			return 0
		fi

		sleep 1
		TIME=$(($TIME + 1))
		if [ $TIME -gt $STATUS_TIMEOUT ] ; then
#echo "WPSCLI TIMEOUT DEBUG"
			break
		fi
	done

	echo 4 > /proc/gpio

    # UNCONFIGURED
	wrcsman "$CSID_CLICONFSTATUS 1"

	# NOUSED
	wrcsman "$CSID_CLIWPSSTATUS 0"

	wrcsman "$CSID_CLITRIGGER 0"
}

wps_client_stop()
{
#echo "WPSCLI STOP DEBUG"

	# Cancel the WPS
	echo 1 > /tmp/wscd_cancel

    if [ -e /var/run/wscd-wlan0.pid ]; then
        killall wscd
        rm /var/run/wscd-wlan0.pid
    fi

	if [ -e /var/wscd-wlan0.fifo ]; then
		rm -rf /var/wscd-wlan0.fifo
	fi

	if [ -e /var/wsc.conf ]; then
		rm -rf /var/wsc.conf
	fi

	if [ -e /var/wps ]; then
		rm -rf /var/wps
	fi

	if [ -e /tmp/wscd_status ]; then
		rm -rf /tmp/wscd_status
	fi

	if [ -e /tmp/wscd_config ]; then
		rm -rf /tmp/wscd_config
	fi

	if [ -e /tmp/flash_param ]; then
		rm -rf /tmp/flash_param
	fi

#	wlanapp.sh start
    # clear the status
	if [ $CLICONFSTATUS -eq 1 ]; then
    	wrcsman "$CSID_CLIWPSSTATUS 0"
	fi

}

wpscli_start_pin()
{
#echo "WPSCLI START PIN DEBUG"
    echo 3 > /proc/gpio
    echo W00000006 > /proc/gpio_freq
	iwpriv $WLAN set_mib pin=$APPINCODE
	wscd -sig_start
	wpscli_wait
}

wpscli_start_pbc()
{
#echo "WPSCLI START PBC DEBUG"
    echo 3 > /proc/gpio
    echo W00000006 > /proc/gpio_freq
    wscd -sig_pbc
    wpscli_wait
}

## Main ##############
case "$1" in

	coldstart)
#echo "WPS COLDSTART DEBUG"
		wps_coldstart
#		wlanapp.sh start
		;;

	pin)
#echo "WPS PIN DEBUG"
		wps_start_pin
		# clear Trigger
		wrcsman "$CSID_TRIGGER 0"
		;;

	pbc)
#echo "WPS PBC DEBUG"
		wps_start_pbc
		# clear Trigger
		wrcsman "$CSID_TRIGGER 0"
		;;

	client-pin)
		wpscli_start_pin
#echo "WPS CLIENT PIN DEBUG"
		wrcsman "$CSID_CLITRIGGER 0"
		;;

	client-pbc)
		wpscli_start_pbc
#echo "WPS CLIENT PBC DEBUG"
		wrcsman "$CSID_CLITRIGGER 0"
		;;

	start)
#echo "WPS START DEBUG"
		wps_stop
		wps_coldstart
		;;
	
	stop)
#echo "WPS STOP DEBUG"
		wps_stop
		;;
		
	gennewpin)
#echo "WPS GENNEWPIN DEBUG"
		wlantool genpin 0
		;;

	getappin)
#echo "WPS GET APPIN DEBUG"
		wlantool genpin 0
		;;

	client-start)
#echo "WPS CLIENT MODE START"
		wps_stop
		wps_client_stop
		wps_client_start
		;;

	client-stop)
#echo "WPS CLIENT MODE STOP"
		wps_client_stop
		;;

	status)
#echo "WPS STATUS DEBUG"
		wps_status
		echo "status $?"
		;;
	
	*)
echo "NO SUCH INPUT $1"
		exit 1 ;;
esac

exit 0	

	


