#!/bin/sh

# Dev mode local override
if [ `awk '{print $1}' /proc/cmdline` = dev\=1 ] && [ -f /nvram/wps ]; then
    source /nvram/wps
    exit
fi

alias stat="wpa_cli -iwlan0 -p/tmp/wpa_ctrl status | grep wpa_state"                            
alias wcmd="wpa_cli -iwlan0 -p/tmp/wpa_ctrl" 

usage() {
  echo "wps <pbc [address] | pin address code>"
  exit 1
}

wait_for_connected() {

  TIMEOUT=120
  unset FAIL
  while ! stat | grep -q COMPLETED; do
    stat
    [ "$TIMEOUT" -le "0" ] && FAIL=timeout && break
    if stat | grep -q DISCONNECTED; then
      FAIL=disassoc
      break
    fi
    usleep 100000
    let TIMEOUT=TIMEOUT-1
  done

  if [ $FAIL ]; then
    echo "!!! WPS failed: $FAIL"
    wcmd remove_network 0 >/dev/null
    wcmd disconnect >/dev/null
    return 1
  fi

  return 0
}

enable_p2p_scan() {
  VAL=$(cat /proc/net/rtl$(cat /tmp/wlan-module)/wlan0/ignore_go_and_low_rssi_in_scan)

  ORIG=$(echo $VAL | sed -e 's/ignore_go_in_scan=\(.*\), ignore_low_rssi_in_scan=\(.*\)/\1 \2/')

  echo 0 10 > /proc/net/rtl$(cat /tmp/wlan-module)/wlan0/ignore_go_and_low_rssi_in_scan

  echo $ORIG
}

disable_p2p_scan() {
  echo $1 > /proc/net/rtl$(cat /tmp/wlan-module)/wlan0/ignore_go_and_low_rssi_in_scan
}

if [ $# -lt 1 ]; then
    usage
fi

MODE=$1  
X=$(enable_p2p_scan)

wcmd disconnect >/dev/null && usleep 300000

case $MODE in
pbc)
     wcmd wps_pbc $2
     ;;
pin)
     # TODO
     echo "Not implemented"
     return 1
     ;;
*) usage
   ;;
esac

wait_for_connected

disable_p2p_scan "$X"

rm -f /tmp/wps-ssid
rm -f /tmp/wps-psk
rm -f /tmp/wps-results

if [ ! $FAIL ]; then
  ssid=$(wpa_cli -p /tmp/wpa_ctrl/ -i wlan0 status wps | grep "^ssid" | cut -d "=" -f 2)
  psk=$(wpa_cli -p /tmp/wpa_ctrl/ -i wlan0 status wps | grep "^psk" | cut -d "=" -f 2)

  echo $ssid > /tmp/wps-results
  echo $psk >> /tmp/wps-results

  exit 0
else
  wcmd flush
  exit 1
fi
