TwlToolsRED/build/tools/sctools/copy_dst/src/wifi_cfg.c

477 lines
13 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <twl.h>
#include <nitro/types.h>
#include <nitro/wm.h>
#include <nitroWiFi.h>
#include <nitroWiFi/ncfg/ncfg_backup.h>
#include <nitroWiFi/ncfg/ncfg_info.h>
#include "mynvram.h"
#include "wifi_cfg.h"
static u8 my_work[sizeof(NCFGConfigEx)];
static NCFGConfigEx *my_configEx = NULL;
static MATHCRC16Table my_tbl; // CRC ŒvŽZƒe<C692>[ƒuƒ
static char SSID_STR[256];
static int SSID_LEN = 0;
static int key_mode = 0; /* 0->str 1->bin */
static char KEY_STR[256];
static u8 KEY_BIN[80];
static int KEY_STR_LEN = 0;
static int KEY_BIN_LEN = 0;
static int MODE = 0;
static int DHCP_MODE = 0;
static u32 IPADDR = 0;
static u32 NETMASK = 0;
static u32 GATEWAY = 0;
static u32 DNS1 = 0;
static u32 DNS2 = 0;
BOOL wifi_config_nvram_get( void )
{
// OS_TPrintf("sizeof(NCFGConfigEx) = %d(0x%0x)\n", sizeof(NCFGConfigEx),sizeof(NCFGConfigEx));
if( TRUE == nvram_get(my_work) ) {
my_configEx = (NCFGConfigEx *)my_work;
}
else {
my_configEx = (NCFGConfigEx *)NULL;
return FALSE;
}
return TRUE;
}
BOOL wifi_config_nvram_set( void )
{
int i;
if( my_configEx != NULL ) {
MATH_CRC16InitTable(&my_tbl);
for (i = 0; i < 3; i++) {
my_configEx->slot[i].crc = MATH_CalcCRC16(&my_tbl, &my_configEx->slot[i], sizeof(my_configEx->slot[i])-2);
}
my_configEx->rsv.crc = MATH_CalcCRC16(&my_tbl, &my_configEx->rsv, sizeof(my_configEx->rsv)-2);
for (i = 0; i < 3; i++) {
my_configEx->slotEx[i].crc = MATH_CalcCRC16(&my_tbl, &my_configEx->slotEx[i], 0xFE);
my_configEx->slotEx[i].crcEx = MATH_CalcCRC16(&my_tbl, (u8*)&my_configEx->slotEx[i] + 0x100, 0xFE);
}
if( TRUE == nvram_set(my_work) ) {
return TRUE;
}
}
return FALSE;
}
BOOL wifi_config_clear_slot(int slot_no)
{
if( my_configEx != NULL ) {
if( (0 <= slot_no) && (slot_no <= 2) ) {
STD_MemSet((void *)&(my_configEx->slotEx[slot_no]), 0, sizeof(NCFGSlotInfoEx) );
return TRUE;
}
else if( (3 <= slot_no) && (slot_no <= 5) ) {
STD_MemSet((void *)&(my_configEx->slot[slot_no]), 0, sizeof(NCFGSlotInfo) );
return TRUE;
}
}
return FALSE;
}
#if 0
enum tagWEPNOTATION {
WEP_NOTATION_HEX, // 16<31>i<EFBFBD>”•\L
WEP_NOTATION_ASCII, // ASCII ƒR<C692>[ƒh•\L
};
// WPA ƒ<C692>[ƒhŽí•Ê
typedef enum
{
NCFG_WPAMODE_WPA_PSK_TKIP = 0x04, /* WPA-PSK ( TKIP ) ˆÃ<CB86>† */
NCFG_WPAMODE_WPA2_PSK_TKIP = 0x05, /* WPA2-PSK ( TKIP ) ˆÃ<CB86>† */
NCFG_WPAMODE_WPA_PSK_AES = 0x06, /* WPA-PSK ( AES ) ˆÃ<CB86>† */
NCFG_WPAMODE_WPA2_PSK_AES = 0x07 /* WPA2-PSK ( AES ) ˆÃ<CB86>† */
} NCFGWPAMode
#endif
// BOOL wifi_config_set_proxy(int slot_no, u8 proxymode, u8 authtype, u8 *host, int host_len, u16 port)
BOOL wifi_config_set_wpa_key_str(int slot_no, int wpamode, char *wpakey )
{
// if( wpakey_len > 0x20 ) error;
u8 ncfg_wpamode;
if( my_configEx != NULL ) {
if( (0 <= slot_no) && (slot_no <= 2) ) {
switch(wpamode) {
case WCM_WEPMODE_WPA_TKIP:
ncfg_wpamode = NCFG_WPAMODE_WPA_PSK_TKIP;
break;
case WCM_WEPMODE_WPA2_TKIP:
ncfg_wpamode = NCFG_WPAMODE_WPA2_PSK_TKIP;
break;
case WCM_WEPMODE_WPA_AES:
ncfg_wpamode = NCFG_WPAMODE_WPA_PSK_AES;
break;
case WCM_WEPMODE_WPA2_AES:
ncfg_wpamode = NCFG_WPAMODE_WPA2_PSK_AES;
break;
default:
return FALSE;
}
my_configEx->slotEx[slot_no].ap.setType = NCFG_SETTYPE_MANUAL_WPA;
/* NCFGWPAMode: WPA-AES | WPA2-AES | WPA-TKIP WPA2-TKIP */
my_configEx->slotEx[slot_no].apEx.wpa.wpaMode = ncfg_wpamode;
STD_MemSet((void *)(my_configEx->slotEx[slot_no].apEx.wpa.wpaPassphrase), 0, 0x40 );
// u8 wpaPassphrase[0x40]; // WPA ƒpƒXƒtƒŒ<C692>[ƒY (NULL <20>I[•¶Žš—ñ or 64Œ… HEX)
STD_MemCpy((void *)(my_configEx->slotEx[slot_no].apEx.wpa.wpaPassphrase), (void *)wpakey,
(unsigned long)STD_StrLen(wpakey) + 1 );
NWM_Passphrase2PSK(my_configEx->slotEx[slot_no].apEx.wpa.wpaPassphrase,
my_configEx->slotEx[slot_no].ap.ssid[0],
my_configEx->slotEx[slot_no].ap.ssidLength[0],
my_configEx->slotEx[slot_no].apEx.wpa.wpaKey);
return TRUE;
}
}
return FALSE;
}
BOOL wifi_config_set_wpa_key_bin(int slot_no, int wpamode, u8 *wpakey , int wpakey_len)
{
// if( wpakey_len > 0x20 ) error;
u8 ncfg_wpamode;
if( my_configEx != NULL ) {
if( (0 <= slot_no) && (slot_no <= 2) ) {
switch(wpamode) {
case WCM_WEPMODE_WPA_TKIP:
ncfg_wpamode = NCFG_WPAMODE_WPA_PSK_TKIP;
break;
case WCM_WEPMODE_WPA2_TKIP:
ncfg_wpamode = NCFG_WPAMODE_WPA2_PSK_TKIP;
break;
case WCM_WEPMODE_WPA_AES:
ncfg_wpamode = NCFG_WPAMODE_WPA_PSK_AES;
break;
case WCM_WEPMODE_WPA2_AES:
ncfg_wpamode = NCFG_WPAMODE_WPA2_PSK_AES;
break;
default:
return FALSE;
}
my_configEx->slotEx[slot_no].ap.setType = NCFG_SETTYPE_MANUAL_WPA;
/* NCFGWPAMode: WPA-AES | WPA2-AES | WPA-TKIP WPA2-TKIP */
my_configEx->slotEx[slot_no].apEx.wpa.wpaMode = ncfg_wpamode;
// u8 wpaPassphrase[0x40]; // WPA ƒpƒXƒtƒŒ<C692>[ƒY (NULL <20>I[•¶Žš—ñ or 64Œ… HEX)
STD_MemSet((void *)(my_configEx->slotEx[slot_no].apEx.wpa.wpaPassphrase), 0, 0x40 );
STD_MemCpy((void *)(my_configEx->slotEx[slot_no].apEx.wpa.wpaPassphrase), (void *)wpakey, (unsigned long)wpakey_len );
NWM_Passphrase2PSK(my_configEx->slotEx[slot_no].apEx.wpa.wpaPassphrase,
my_configEx->slotEx[slot_no].ap.ssid[0],
my_configEx->slotEx[slot_no].ap.ssidLength[0],
my_configEx->slotEx[slot_no].apEx.wpa.wpaKey);
return TRUE;
}
}
return FALSE;
}
BOOL wifi_config_set_wep_key_bin(int slot_no, int wepmode, u8 *wepkey, int wepkey_len )
{
u8 ncfg_wepmode;
if( my_configEx != NULL ) {
switch(wepmode) {
case WCM_WEPMODE_40:
ncfg_wepmode = NCFG_WEPMODE_40;
break;
case WCM_WEPMODE_104:
ncfg_wepmode = NCFG_WEPMODE_104;
break;
case WCM_WEPMODE_128:
ncfg_wepmode = NCFG_WEPMODE_128;
break;
case WCM_WEPMODE_NONE:
ncfg_wepmode = NCFG_WEPMODE_NONE;
break;
default:
return FALSE;
}
if( (0 <= slot_no) && (slot_no <= 2) ) {
my_configEx->slotEx[slot_no].ap.wepNotation = 0; // WEP_NOTATION_HEX
my_configEx->slotEx[slot_no].ap.wepMode = ncfg_wepmode;
STD_MemSet(my_configEx->slotEx[slot_no].ap.wep[0], 0, 0x10 );
STD_MemCpy((char *)(my_configEx->slotEx[slot_no].ap.wep[0]), wepkey, (unsigned long)wepkey_len);
return TRUE;
}
else if( (3 <= slot_no) && (slot_no <= 5) ) {
my_configEx->slot[slot_no].ap.wepNotation = 0; // WEP_NOTATION_HEX
my_configEx->slot[slot_no].ap.wepMode = ncfg_wepmode;
STD_MemSet(my_configEx->slot[slot_no].ap.wep[0], 0, 0x10 );
STD_MemCpy((char *)(my_configEx->slot[slot_no].ap.wep[0]), wepkey, (unsigned long)wepkey_len);
return TRUE;
}
}
return FALSE;
}
BOOL wifi_config_set_wep_key_str(int slot_no, int wepmode, char *wepkey )
{
u8 ncfg_wepmode;
if( my_configEx != NULL ) {
switch(wepmode) {
case WCM_WEPMODE_40:
ncfg_wepmode = NCFG_WEPMODE_40;
break;
case WCM_WEPMODE_104:
ncfg_wepmode = NCFG_WEPMODE_104;
break;
case WCM_WEPMODE_128:
ncfg_wepmode = NCFG_WEPMODE_128;
break;
case WCM_WEPMODE_NONE:
ncfg_wepmode = NCFG_WEPMODE_NONE;
break;
default:
return FALSE;
}
if( (0 <= slot_no) && (slot_no <= 2) ) {
my_configEx->slotEx[slot_no].ap.wepNotation = 1; // WEP_NOTATION_ASCII
my_configEx->slotEx[slot_no].ap.wepMode = ncfg_wepmode;
STD_MemSet(my_configEx->slotEx[slot_no].ap.wep[0], 0, 0x10 );
STD_StrCpy((char *)(my_configEx->slotEx[slot_no].ap.wep[0]), wepkey);
return TRUE;
}
else if( (3 <= slot_no) && (slot_no <= 5) ) {
my_configEx->slot[slot_no].ap.wepNotation = 1; // WEP_NOTATION_ASCII
my_configEx->slot[slot_no].ap.wepMode = ncfg_wepmode;
STD_MemSet(my_configEx->slot[slot_no].ap.wep[0], 0, 0x10 );
STD_StrCpy((char *)(my_configEx->slot[slot_no].ap.wep[0]), wepkey);
return TRUE;
}
}
return FALSE;
}
BOOL wifi_config_set_netmask(int slot_no, u32 mask)
{
u8 buf[4];
if( my_configEx != NULL ) {
NCFGi_ConvMaskAddr((int)mask, buf);
if( (0 <= slot_no) && (slot_no <= 2) ) {
my_configEx->slotEx[slot_no].ap.netmask = NCFGi_ConvMaskCidr(buf);
return TRUE;
}
else if( (3 <= slot_no) && (slot_no <= 5) ) {
my_configEx->slot[slot_no].ap.netmask = NCFGi_ConvMaskCidr(buf);
return TRUE;
}
}
return FALSE;
}
BOOL wifi_config_set_ip_addr(int slot_no, u32 ipaddr)
{
/* auto<74>ÝèÌÆ«Í ipaddr = 0 */
int i;
if( my_configEx != NULL ) {
if( (0 <= slot_no) && (slot_no <= 2) ) {
for( i = 0 ; i < 4 ; i++ ) {
my_configEx->slotEx[slot_no].ap.ip[i] = (u8)(0xff & (ipaddr >> (24 - i*8)) );
}
return TRUE;
}
else if( (3 <= slot_no) && (slot_no <= 5) ) {
for( i = 0 ; i < 4 ; i++ ) {
my_configEx->slot[slot_no].ap.ip[i] = (u8)(0xff & (ipaddr >> (24 - i*8)) );
}
return TRUE;
}
}
return FALSE;
}
BOOL wifi_config_set_gateway(int slot_no, u32 ipaddr)
{
/* auto<74>ÝèÌÆ«Í ipaddr = 0 */
int i;
if( my_configEx != NULL ) {
if( (0 <= slot_no) && (slot_no <= 2) ) {
for( i = 0 ; i < 4 ; i++ ) {
my_configEx->slotEx[slot_no].ap.gateway[i] = (u8)(0xff & (ipaddr >> (24 - i*8)) );
}
return TRUE;
}
else if( (3 <= slot_no) && (slot_no <= 5) ) {
for( i = 0 ; i < 4 ; i++ ) {
my_configEx->slot[slot_no].ap.gateway[i] = (u8)(0xff & (ipaddr >> (24 - i*8)) );
}
return TRUE;
}
}
return FALSE;
}
BOOL wifi_config_set_dns(int slot_no, int dns_no, u32 dnsaddr)
{
/* auto<74>ÝèÌÆ«Í dnsaddr = 0 */
int i;
if( my_configEx != NULL ) {
if( (0 <= slot_no) && (slot_no <= 2) ) {
for( i = 0 ; i < 4 ; i++ ) {
my_configEx->slotEx[slot_no].ap.dns[dns_no][i] = (u8)(0xff & (dnsaddr >> (24 - i*8)) );
}
return TRUE;
}
else if( (3 <= slot_no) && (slot_no <= 5) ) {
for( i = 0 ; i < 4 ; i++ ) {
my_configEx->slot[slot_no].ap.dns[dns_no][i] = (u8)(0xff & (dnsaddr >> (24 - i*8)) );
}
return TRUE;
}
}
return FALSE;
}
BOOL wifi_config_set_ssid(int slot_no, char *ssid_str, int ssid_len)
{
int i;
char *str;
if( (ssid_len <= 0) || (0x20 <= ssid_len) ) {
return FALSE;
}
if( ssid_str == NULL ) {
return FALSE;
}
str = ssid_str;
if( my_configEx != NULL ) {
if( (0 <= slot_no) && (slot_no <= 2) ) {
for( i = 0 ; i < ssid_len ; i++ ) {
my_configEx->slotEx[slot_no].ap.ssid[0][i] = (u8)*str++;
}
my_configEx->slotEx[slot_no].ap.ssidLength[0] = (u8)ssid_len;
return TRUE;
}
else if( (3 <= slot_no) && (slot_no <= 5) ) {
for( i = 0 ; i < ssid_len ; i++ ) {
my_configEx->slot[slot_no].ap.ssid[0][i] = (u8)*str++;
}
my_configEx->slot[slot_no].ap.ssidLength[0] = (u8)ssid_len;
return TRUE;
}
}
return FALSE;
}
void wifi_config_print(void)
{
int i,j;
int slot_no;
OS_TPrintf("sizeof= %d, %x\n",sizeof(NCFGConfigEx), sizeof(NCFGConfigEx)) ;
if( my_configEx != NULL ) {
slot_no = 0;
for( j = 0 ; j < 3 ; j++ ) {
OS_TPrintf("%d SSID:\n", slot_no);
for( i = 0 ; i < 0x10 ; i++ ) {
OS_TPrintf("0x%02x ",my_configEx->slotEx[j].ap.ssid[0][i]);
}
OS_TPrintf("\n");
for( i = 0x10 ; i < 0x20 ; i++ ) {
OS_TPrintf("0x%02x ",my_configEx->slotEx[j].ap.ssid[0][i]);
}
OS_TPrintf("\n");
OS_TPrintf("wpaKey:0x");
for( i = 0 ; i < 0x20 ; i++ ) {
OS_TPrintf("%02x",my_configEx->slotEx[j].apEx.wpa.wpaKey[i]);
}
OS_TPrintf("\n");
OS_TPrintf("wpaPassphrase:0x");
for( i = 0 ; i < 0x40 ; i++ ) {
OS_TPrintf("%02x",my_configEx->slotEx[j].apEx.wpa.wpaPassphrase[i]);
}
OS_TPrintf("\n");
#if 0
OS_TPrintf("IP addr:");
for( i = 0 ; i < 4 ; i++ ) {
OS_TPrintf("%3d.",my_configEx->slotEx[j].ap.ip[i]);
}
OS_TPrintf("\n");
#endif
slot_no++;
}
#if 0
for( j = 0 ; j < 3 ; j++ ) {
OS_TPrintf("%d SSID:\n", slot_no);
for( i = 0 ; i < 0x10 ; i++ ) {
OS_TPrintf("0x%02x ",my_configEx->slot[j].ap.ssid[0][i]);
}
OS_TPrintf("\n");
for( i = 0x10 ; i < 0x20 ; i++ ) {
OS_TPrintf("0x%02x ",my_configEx->slot[j].ap.ssid[0][i]);
}
OS_TPrintf("\n");
OS_TPrintf("IP addr:");
for( i = 0 ; i < 4 ; i++ ) {
OS_TPrintf("%3d.",my_configEx->slot[j].ap.ip[i]);
}
OS_TPrintf("\n");
slot_no++;
}
#endif
}
else {
OS_TPrintf("NCFG_ReadConfigEx failed.\n");
}
//BOOL nvram_set(my_work);
}