#!/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin; export PATH
CHANNEL=1
RADIOS=/run/radio

yesno()
{
	if [ -n "$1" ]; then
		v=$(echo "$1" | tr [:upper:] [:lower:])
		case ${v} in
			yes)	echo 1		;;
			[1-9])	echo ${v}	;;
		esac
        fi
}

up () {
	INTERFACE=$1
	MAC=$2
        
        if [ -n "$(uci -q get keenfalcon.${MAC})" ]; then
                p=$(yesno $(uci -q get keenfalcon.${MAC}.ignore))
                if [ -z "$p" ]; then
                        RADIO=${MAC}
                else
                        return
                fi
        else
                RADIO="radio"
        fi                        	

        COUNTRY=$(uci -q get keenfalcon.${RADIO}.country)
        FREQ=$(uci -q get keenfalcon.${RADIO}.freq)
        CHANNEL=$(uci -q get keenfalcon.${RADIO}.channel)
        MODE=$(uci -q get keenfalcon.${RADIO}.mode)
        POWER=$(uci -q get keenfalcon.${RADIO}.power)
        INDEX=$(uci -q get keenfalcon.${RADIO}.index)
        TXPATH=$(uci -q get keenfalcon.${RADIO}.txpath)
        RXPATH=$(uci -q get keenfalcon.${RADIO}.rxpath)
        
        if [ "${RADIO}" != "radio" ]; then
        	if [ -z "${COUNTRY}" ]; then
			COUNTRY=$(uci -q get keenfalcon.radio.country)
		elif [ "${FREQ}" == "''" ]; then
			COUNTRY=''
                fi

        	if [ -z "${FREQ}" ]; then
			FREQ=$(uci -q get keenfalcon.radio.freq)
		elif [ "${FREQ}" == "''" ]; then
			FREQ=''
                fi

        	if [ -z "${CHANNEL}" ]; then
			CHANNEL=$(uci -q get keenfalcon.radio.channel)
		elif [ "${CHANNEL}" == "''" ]; then
			CHANNEL=''
                fi

        	if [ -z "${MODE}" ]; then
			MODE=$(uci -q get keenfalcon.radio.mode)
		elif [ "${MODE}" == "''" ]; then
			MODE=''
                fi

        	if [ -z "${POWER}" ]; then
			POWER=$(uci -q get keenfalcon.radio.power)
		elif [ "${POWER}" == "''" ]; then
			POWER=''
                fi

        	if [ -z "${INDEX}" ]; then
			INDEX=$(uci -q get keenfalcon.radio.index)
		elif [ "${INDEX}" == "''" ]; then
			INDEX=''
                fi

        	if [ -z "${TXPATH}" ]; then
			INDEX=$(uci -q get keenfalcon.radio.txpath)
		elif [ "${TXPATH}" == "''" ]; then
			TXPATH=''
                fi

        	if [ -z "${RXPATH}" ]; then
			INDEX=$(uci -q get keenfalcon.radio.rxpath)
		elif [ "${RXPATH}" == "''" ]; then
			RXPATH=''
                fi
        fi
       
        ifconfig ${INTERFACE} down
        if [ -n "${COUNTRY}" ]; then
        	iw reg set ${COUNTRY}
        fi
        iw dev ${INTERFACE} set monitor otherbss
        ifconfig ${INTERFACE} up

        if [ -n "${FREQ}" ]; then
                BAND="freq ${FREQ}"
        elif [ -n "${CHANNEL}" ]; then
                BAND="channel ${CHANNEL}"
        fi

        if [ -n "${MODE}" ]; then
                BAND="${BAND} ${MODE}"
        fi

        if [ -n "${BAND}" ]; then
                iw dev ${INTERFACE} set ${BAND}
        fi

	DRIVER=''        
        for driver in rtl88XXau rtl88xxau; do
        	if [ -d /proc/net/${driver} ]; then 
        		DRIVER=${driver}
        		break
        	fi
        done

        if [ -z "${INDEX}" ]; then
        	if [ -z "${POWER}" ]; then
                	POWER=75
                fi
                
                case ^${MAC} in
                	# HuiZhou
                        ^0c62a6*) 	INDEX=48 ;;
                        ^0c9160*) 	INDEX=48 ;;
                        ^103d0a*) 	INDEX=48 ;;
                        ^1c1ee3*) 	INDEX=48 ;;
                        ^1c3008*) 	INDEX=48 ;;
                        ^20f543*)	INDEX=48 ;;
                        ^28ad18*)	INDEX=48 ;;
                        ^2cd974*)	INDEX=48 ;;
                        ^34f150*)	INDEX=48 ;;
                        ^44d878*)	INDEX=48 ;;
                        ^64e003*)	INDEX=48 ;;
                        ^7cb232*)	INDEX=48 ;;
                        ^c0d2f3*)	INDEX=48 ;;
                        ^c4985c*)	INDEX=48 ;;
                        ^d4abcd*)	INDEX=48 ;;
                        ^d81399*)	INDEX=48 ;;
                        ^dc7223*)	INDEX=48 ;;
                        ^f0a3b2*)	INDEX=48 ;;
                        ^f84fad*)	INDEX=48 ;;

			# green whistle up                        
			^bcec23*)       INDEX=57 ;;
                       
                        # ASUS
                        ^50ebf6*)       INDEX=63 ;;
                        ^04421a*)       INDEX=63 ;;
                        ^7c10c9*)       INDEX=63 ;;
                        ^fc3497*)       INDEX=63 ;;
                        ^f02f74*)       INDEX=63 ;;
                        ^3c7c3f*)       INDEX=63 ;;
                        ^244bfe*)       INDEX=63 ;;
                        ^d45d64*)       INDEX=63 ;;
                        ^a85e45*)       INDEX=63 ;;
                        ^fcc233*)       INDEX=63 ;;
                        ^04d9f5*)       INDEX=63 ;;
                        ^04d4c4*)       INDEX=63 ;;
                        ^40b076*)       INDEX=63 ;;
                        ^049226*)       INDEX=63 ;;
                        ^0c9d92*)       INDEX=63 ;;
                        ^4cedfb*)       INDEX=63 ;;
                        ^1831bf*)       INDEX=63 ;;
                        ^2cfda1*)       INDEX=63 ;;
                        ^b06ebf*)       INDEX=63 ;;
                        ^107b44*)       INDEX=63 ;;
                        ^88d7f6*)       INDEX=63 ;;
                        ^6045cb*)       INDEX=63 ;;
                        ^2c4d54*)       INDEX=63 ;;
                        ^704d7b*)       INDEX=63 ;;
                        ^38d547*)       INDEX=63 ;;
                        ^708bcd*)       INDEX=63 ;;
                        ^3497f6*)       INDEX=63 ;;
                        ^d017c2*)       INDEX=63 ;;
                        ^9c5c8e*)       INDEX=63 ;;
                        ^2c56dc*)       INDEX=63 ;;
                        ^f832e4*)       INDEX=63 ;;
                        ^f46d04*)       INDEX=63 ;;
                        ^f07959*)       INDEX=63 ;;
                        ^e0cb4e*)       INDEX=63 ;;
                        ^e03f49*)       INDEX=63 ;;
                        ^d850e6*)       INDEX=63 ;;
                        ^c86000*)       INDEX=63 ;;
                        ^bcee7b*)       INDEX=63 ;;
                        ^bcaec5*)       INDEX=63 ;;
                        ^ac9e17*)       INDEX=63 ;;
                        ^ac220b*)       INDEX=63 ;;
                        ^90e6ba*)       INDEX=63 ;;
                        ^7824af*)       INDEX=63 ;;
                        ^74d02b*)       INDEX=63 ;;
                        ^60a44c*)       INDEX=63 ;;
                        ^54a050*)       INDEX=63 ;;
                        ^5404a6*)       INDEX=63 ;;
                        ^50465d*)       INDEX=63 ;;
                        ^485b39*)       INDEX=63 ;;
                        ^40167e*)       INDEX=63 ;;
                        ^382c4a*)       INDEX=63 ;;
                        ^3085a9*)       INDEX=63 ;;
                        ^305a3a*)       INDEX=63 ;;
                        ^20cf30*)       INDEX=63 ;;
                        ^1cb72c*)       INDEX=63 ;;
                        ^1c872c*)       INDEX=63 ;;
                        ^14dda9*)       INDEX=63 ;;
                        ^14dae9*)       INDEX=63 ;;
                        ^10c37b*)       INDEX=63 ;;
                        ^10bf48*)       INDEX=63 ;;
                        ^086266*)       INDEX=63 ;;
                        ^08606e*)       INDEX=63 ;;
                        ^00e018*)       INDEX=63 ;;
                        ^002618*)       INDEX=63 ;;
                        ^00248c*)       INDEX=63 ;;
                        ^002354*)       INDEX=63 ;;
                        ^002215*)       INDEX=63 ;;
                        ^001fc6*)       INDEX=63 ;;
                        ^001e8c*)       INDEX=63 ;;
                        ^001d60*)       INDEX=63 ;;
                        ^001bfc*)       INDEX=63 ;;
                        ^001a92*)       INDEX=63 ;;
                        ^0018f3*)       INDEX=63 ;;
                        ^001731*)       INDEX=63 ;;
                        ^0015f2*)       INDEX=63 ;;
                        ^0013d4*)       INDEX=63 ;;
                        ^0011d8*)       INDEX=63 ;;
                        ^00112f*)       INDEX=63 ;;
                        ^000ea6*)       INDEX=63 ;;
                        ^000c6e*)       INDEX=63 ;;
                
                        # BL-R8812AF1 (V.1)
                        ^54ef33*)	INDEX=18 ;;
                        ^54f15f*)	INDEX=18 ;;
                        ^d4b761*)	INDEX=18 ;;
                        
                        # ZhouSam, Local MAC addresses:
                        #   x2:xx:xx:xx:xx:xx
                        #   x6:xx:xx:xx:xx:xx
                        #   xA:xx:xx:xx:xx:xx
                        #   xE:xx:xx:xx:xx:xx
                        
                        #  02:03:04:00:00:00 ???
                        ^1234*)		INDEX=63 ;;
                        
                        *)		INDEX=16 ;;
                esac
 		INDEX=$((${INDEX}*${POWER}/100))
        fi
        
        if [ -n "${INDEX}" -a -n "${DRIVER}" -a -e /proc/net/${DRIVER}/${INTERFACE}/tx_pwr_idx_override ]; then
 		echo ${INDEX} > /proc/net/${DRIVER}/${INTERFACE}/tx_pwr_idx_override
        fi
        
        if [ -n "${RXPATH}" ]; then
        	/sbin/rtwpriv ${INTERFACE} mp_ant_rx ${RXPATH} >/dev/null 2>&1
        fi

        if [ -n "${TXPATH}" ]; then
        	/sbin/rtwpriv ${INTERFACE} mp_ant_tx ${TXPATH} >/dev/null 2>&1
        fi
        
        echo ${INTERFACE}
}

network () {
        find /sys/class/net -name 'kf*' | while read p; do
                INTERFACE=$(basename $p)
                DRIVER=$(grep DRIVER $p/device/uevent | sed 's/[^=]\+=//')
                case "$DRIVER" in
                rt2800usb|ath9k_htc|mt7601u|rtl88xxau|rtl88XXau|*881[24]au)
                	MAC=$(cat /proc/net/rtl88xxau/${INTERFACE}/efuse_map | grep '^0xd0' | tail -1 | awk  '{print $9 $10 $11 $12 $13 $14}' | tr '[[:upper:]]' '[[:lower:]]')
                        up ${INTERFACE} ${MAC}
                        ;;
                esac
        done
}

[ -f /run/setup ] && exit 0

case $1 in
start|restart)
        sleep 1
        
        if [ -x /usr/sbin/rfkill ]; then
                /usr/sbin/rfkill unblock all
        fi
        FOUND=$(network start)
        if [ -n "${FOUND}" ]; then
                echo ${FOUND} >${RADIOS}
        else
                rm -f ${RADIOS}
        fi
        ;;

stop)
        if [ -f ${RADIOS} ]; then
                for INTERFACE in $(cat ${RADIOS}); do
                        ifconfig ${INTERFACE} down
                done
                rm ${RADIOS}
        fi
        ;;

status)
        if [ -f ${RADIOS} ]; then
                cat ${RADIOS}
        fi
        ;;                    
esac
exit 0
