#!/bin/sh 
 | 
  
 | 
SSID= 
 | 
WIFISSID=$1 
 | 
WIFIPWD=$2 
 | 
VSSID= 
 | 
VPWD= 
 | 
VVAILD= 
 | 
IPADDR= 
 | 
NETMASK= 
 | 
WPAPID="" 
 | 
NETMASK= 
 | 
GW= 
 | 
DNS= 
 | 
up_cnt=0 
 | 
insmod_cnt=0 
 | 
check_cnt=0 
 | 
FORCE_CONFIG_WIFI=$3 
 | 
NEW_SSID= 
 | 
getdhcp_cnt=0 
 | 
connect_cnt=0 
 | 
wpa_cnt=0 
 | 
NET_NEW_CONFIG=0 
 | 
IPADDR_TEST= 
 | 
tcpka_cnt=0 
 | 
  
 | 
trap "echo 'ifconfig wlan0 down'; ifconfig wlan0 down; exit" SIGTERM 
 | 
  
 | 
function udhcpcd() { 
 | 
    echo "udhcpc ..." 
 | 
  
 | 
    if [ "$NET_NEW_CONFIG" == "0" ];then 
 | 
        echo "get dhcp info from vendor" 
 | 
        IPADDR=`vendor_storage -r VENDOR_CUSTOM_ID_1E -t string |  sed -n '4p' | awk '{print $3}' | awk -F, '{print $4}'` 
 | 
        NETMASK=`vendor_storage -r VENDOR_CUSTOM_ID_1E -t string |  sed -n '4p' | awk '{print $3}' | awk -F, '{print $5}'` 
 | 
        GW=`vendor_storage -r VENDOR_CUSTOM_ID_1E -t string |  sed -n '4p' | awk '{print $3}' | awk -F, '{print $6}'` 
 | 
        DNS=`vendor_storage -r VENDOR_CUSTOM_ID_1E -t string |  sed -n '4p' | awk '{print $3}' | awk -F, '{print $7}'` 
 | 
  
 | 
        ifconfig wlan0 $IPADDR netmask $NETMASK 
 | 
        route add default gw $GW 
 | 
        echo "nameserver $DNS" > /etc/resolv.conf 
 | 
        echo $IPADDR $NETMASK $GW $DNS 
 | 
        echo none > /sys/class/leds/blue/trigger 
 | 
        echo 5 > /sys/class/leds/blue/brightness 
 | 
        wl PM 0 
 | 
        exit 
 | 
    fi 
 | 
  
 | 
    echo "get dhcp by udhcpc" 
 | 
    udhcpc -i wlan0 -t 15 -q 
 | 
  
 | 
    IPADDR_TEST=`ifconfig wlan0 | grep inet | awk '{print $2}' | awk -F: '{print $2}' | awk -F. '{print $1}'` 
 | 
    if [ "$IPADDR_TEST" != "" ] && [ "$IPADDR_TEST" != "127" ] && [ "$IPADDR_TEST" != "169" ];then 
 | 
        IPADDR=`ifconfig wlan0 | grep inet | awk '{print $2}' | awk -F: '{print $2}'` 
 | 
        NETMASK=`ifconfig wlan0 | grep inet | awk '{print $4}' | awk -F: '{print $2}'` 
 | 
        GW=`route -n | awk '{print $2}' | sed -n '3p'` 
 | 
        DNS=`cat /etc/resolv.conf | grep nameserver | awk '{print $2}'` 
 | 
        echo "ip_info: $IPADDR $NETMASK $GW $DNS" 
 | 
        vendor_storage -w VENDOR_CUSTOM_ID_1E -t string -i 1,$WIFISSID,$WIFIPWD,$IPADDR,$NETMASK,$GW,$DNS 
 | 
        echo none > /sys/class/leds/blue/trigger 
 | 
        echo 5 > /sys/class/leds/blue/brightness 
 | 
        wl PM 0 
 | 
    else 
 | 
        echo "dhcp failed !!!" 
 | 
        echo 0 > /sys/class/leds/blue/brightness 
 | 
        exit 
 | 
    fi 
 | 
} 
 | 
  
 | 
function getdhcp() { 
 | 
    while true 
 | 
    do 
 | 
        IPADDR=`dhd_priv wl dhcpc_dump | awk '{print $5}' | sed -n '3p'` 
 | 
        if [ "$IPADDR" != "0.0.0.0" ];then 
 | 
            NETMASK=`dhd_priv wl dhcpc_dump | awk '{print $7}' | sed -n '3p'` 
 | 
            GW=`dhd_priv wl dhcpc_dump | awk '{print $9}' | sed -n '3p'` 
 | 
            DNS=`dhd_priv wl dhcpc_dump | awk '{print $11}' | sed -n '3p'` 
 | 
  
 | 
            ifconfig wlan0 $IPADDR netmask $NETMASK 
 | 
            route add default gw $GW 
 | 
            echo "nameserver $DNS" > /etc/resolv.conf 
 | 
  
 | 
            echo $IPADDR $NETMASK $GW $DNS 
 | 
            echo none > /sys/class/leds/blue/trigger 
 | 
            echo 5 > /sys/class/leds/blue/brightness 
 | 
  
 | 
            if [ "$FORCE_CONFIG_WIFI" == "true" ];then 
 | 
                echo "reconnect, restart mediaserver..." 
 | 
                killall -9 mediaserver 
 | 
                sleep 1 
 | 
                mediaserver -a -d -c /usr/share/mediaserver/tb.conf > /dev/kmsg 2>&1 & 
 | 
            fi 
 | 
  
 | 
            break 
 | 
        fi 
 | 
  
 | 
        sleep 0.01 
 | 
  
 | 
        let getdhcp_cnt++ 
 | 
        if [ "$getdhcp_cnt" -gt 3000 ]; then 
 | 
            echo "$NEW_SSID getdhcp failed!!!" 
 | 
            echo 0 > /sys/class/leds/blue/brightness 
 | 
            exit 
 | 
        fi 
 | 
    done 
 | 
} 
 | 
  
 | 
function check_wlan0() { 
 | 
    echo "check wlan0 ..." 
 | 
    while true 
 | 
    do 
 | 
        lsmod | grep bcmdhd 
 | 
        if [ $? -ne 0 ]; then 
 | 
            echo "wait bcmdhd.ko ..." 
 | 
            sleep .2 
 | 
        else 
 | 
            echo "ismod bcmdhd.ko okay" 
 | 
            break 
 | 
        fi 
 | 
  
 | 
        let insmod_cnt++ 
 | 
        if [ "$insmod_cnt" -gt 3 ]; then 
 | 
            echo "insmod failed !!!" 
 | 
            echo 0 > /sys/class/leds/blue/brightness 
 | 
            exit 
 | 
        fi 
 | 
    done 
 | 
  
 | 
    while true 
 | 
    do 
 | 
        ifconfig -a wlan0 | grep wlan0 
 | 
        if [ $? -ne 0 ]; then 
 | 
            echo "wait wlan0 ..." 
 | 
            sleep .2 
 | 
        else 
 | 
            echo "wlan0 exist" 
 | 
            break 
 | 
        fi 
 | 
  
 | 
        let check_cnt++ 
 | 
        if [ "$check_cnt" -gt 3 ]; then 
 | 
            echo "check wlan0 failed!!!" 
 | 
            echo 0 > /sys/class/leds/blue/brightness 
 | 
            exit 
 | 
        fi 
 | 
    done 
 | 
} 
 | 
  
 | 
function check_wakeup_cause() { 
 | 
    echo "check_wakeup_cause ..." 
 | 
    CAUSE=`dhd_priv wl wowl_wakeind | awk -F= '{print $3}' | sed -n '3p' | cut -d ' ' -f 1` 
 | 
    if [ "$CAUSE" != "0x0" ]; then 
 | 
        touch /tmp/wifi_wake 
 | 
    fi 
 | 
} 
 | 
  
 | 
function tcpka_del() { 
 | 
    echo "tcpka_del ..." 
 | 
    while true 
 | 
    do 
 | 
        IPID=`dhd_priv wl tcpka_conn_sess_info 1 | grep ipid` 
 | 
        if [ "$IPID" != "" ]; then 
 | 
            sleep 0.05 
 | 
            dhd_priv wl tcpka_conn_enable 1 0 0 0 0 
 | 
            sleep 0.05 
 | 
            dhd_priv wl tcpka_conn_del 1 
 | 
            sleep 0.05 
 | 
        else 
 | 
            break 
 | 
        fi 
 | 
  
 | 
        let tcpka_cnt++ 
 | 
        if [ "$tcpka_cnt" -gt 3 ]; then 
 | 
            echo "tcpka_conn_del failed" 
 | 
            exit 
 | 
        fi 
 | 
  
 | 
    done 
 | 
} 
 | 
  
 | 
function wlan_up() { 
 | 
    echo "wlan up ..." 
 | 
    while true 
 | 
    do 
 | 
        ifconfig wlan0 up 
 | 
        if [ $? -ne 0 ]; then 
 | 
            echo "wlan0 up failed" 
 | 
            sleep 0.1 
 | 
        else 
 | 
            echo "wlan0 up succeed" 
 | 
            break 
 | 
        fi 
 | 
  
 | 
        let up_cnt++ 
 | 
        if [ "$up_cnt" -gt 3 ]; then 
 | 
            echo "wlan0 up failed!!!" 
 | 
            echo 0 > /sys/class/leds/blue/brightness 
 | 
            exit 
 | 
        fi 
 | 
    done 
 | 
} 
 | 
  
 | 
function connect_wifi() { 
 | 
echo "connect wifi ..." 
 | 
SSID=`dhd_priv isam_status | awk -F, '{print $5}' | sed -n '4p' | cut -d '"' -f 2` 
 | 
  
 | 
if [ "$SSID" ==  "" ] || [ "$FORCE_CONFIG_WIFI" == "true" ];then 
 | 
  
 | 
    if [ "$FORCE_CONFIG_WIFI" != "true" ];then 
 | 
  
 | 
        VVAILD=`vendor_storage -r VENDOR_CUSTOM_ID_1E -t string |  sed -n '4p' | awk '{print $3}' | awk -F, '{print $1}'` 
 | 
        echo "vvaild: $VVAILD" 
 | 
        VSSID=`vendor_storage -r VENDOR_CUSTOM_ID_1E -t string |  sed -n '4p' | awk '{print $3}' | awk -F, '{print $2}'` 
 | 
        echo "vssid: $VSSID" 
 | 
        VPSK=`vendor_storage -r VENDOR_CUSTOM_ID_1E -t string |  sed -n '4p' | awk '{print $3}' | awk -F, '{print $3}'` 
 | 
        echo "vpsk: $VPSK" 
 | 
  
 | 
        if [ "$VVAILD" == "1" ];then 
 | 
            WIFISSID=$VSSID 
 | 
            WIFIPWD=$VPSK 
 | 
        fi 
 | 
  
 | 
        echo "vendor storage: vaild: $VVAILD ssid: $WIFISSID, psk: $WIFIPWD" 
 | 
    fi 
 | 
  
 | 
    if [ "$SSID" ==  "" ] && [ "$FORCE_CONFIG_WIFI" != "true" ] && [ "$VVAILD" != "1" ];then 
 | 
        echo "SSID is empty, and FORCE_CONFIG_WIFI not true and vendor is empty, exit" 
 | 
        echo 0 > /sys/class/leds/blue/brightness 
 | 
        exit 
 | 
    fi 
 | 
  
 | 
    if [ "$SSID" == "$WIFISSID" ];then 
 | 
        echo "$WIFISSID already connected" 
 | 
        return 
 | 
    fi 
 | 
  
 | 
    echo "WIFI INFO: $SSID, CONFIG: $FORCE_CONFIG_WIFI" 
 | 
    cp /etc/wpa_supplicant.conf /tmp/ 
 | 
    echo "connect to WiFi ssid: $WIFISSID, Passwd: $WIFIPWD" 
 | 
    sed -i "s/SSID/$WIFISSID/g" /tmp/wpa_supplicant.conf 
 | 
    sed -i "s/PASSWORD/$WIFIPWD/g" /tmp/wpa_supplicant.conf 
 | 
  
 | 
    WPAPID=`busybox ps | grep wpa_supplicant | grep -v grep | awk '{print $1}'` 
 | 
    if [ "$WPAPID" != "" ];then 
 | 
        killall wpa_supplicant 
 | 
        sleep 0.5 
 | 
    fi 
 | 
  
 | 
    ifconfig wlan0 down 
 | 
    sleep 0.5 
 | 
    ifconfig wlan0 up 
 | 
    sleep 0.5 
 | 
  
 | 
    while true 
 | 
    do 
 | 
        wpa_supplicant -B -i wlan0 -c /tmp/wpa_supplicant.conf 
 | 
        WPAPID=`busybox ps | grep wpa_supplicant | grep -v grep | awk '{print $1}'` 
 | 
        if [ "$WPAPID" == "" ];then 
 | 
            sleep 0.2 
 | 
        else 
 | 
            echo "wpa_supplicant running" 
 | 
            break 
 | 
        fi 
 | 
  
 | 
        let wpa_cnt++ 
 | 
        if [ "$wpa_cnt" -gt 3 ]; then 
 | 
            echo "wpa_supplicant up failed!!!" 
 | 
            echo 0 > /sys/class/leds/blue/brightness 
 | 
            exit 
 | 
        fi 
 | 
    done 
 | 
  
 | 
    while true 
 | 
    do 
 | 
        NEW_SSID=`dhd_priv isam_status | awk -F, '{print $5}' | sed -n '4p' | cut -d '"' -f 2` 
 | 
        if [ "$NEW_SSID" ==  "" ];then 
 | 
            echo "$WIFISSID connecting..." 
 | 
            sleep 1 
 | 
        elif [ "$NEW_SSID" == "$SSID" ];then 
 | 
            echo "waiting $SSID disconnect ..." 
 | 
            sleep 1 
 | 
        else [ "$NEW_SSID" == "$WIFISSID" ] 
 | 
            echo "$NEW_SSID connected to getdhcp" 
 | 
            NET_NEW_CONFIG=1 
 | 
            break 
 | 
        fi 
 | 
  
 | 
        let connect_cnt++ 
 | 
        if [ "$connect_cnt" -gt 35 ]; then 
 | 
            echo "connect $NEW_SSID failed!!!" 
 | 
            echo 0 > /sys/class/leds/blue/brightness 
 | 
            exit 
 | 
        fi 
 | 
    done 
 | 
fi 
 | 
} 
 | 
  
 | 
check_wlan0 
 | 
wlan_up 
 | 
check_wakeup_cause 
 | 
tcpka_del 
 | 
connect_wifi 
 | 
udhcpcd 
 |