openmohaa/code/gamespy/common/nitro/wireless.c
2023-02-04 21:00:01 +01:00

1541 lines
35 KiB
C

#include "../nonport.h"
#include "wireless.h"
#include "screen.h"
#include "menu.h"
#include "backup.h"
#include "touch.h"
#define USE_DHCP
#define SUPPORT_SAVED_CONFIGS
#define AUTO_CONNECT
//static u8 MyBSSID[IW_BSSID_SIZE] = { 0x00, 0x0f, 0x66, 0x82, 0x38, 0x70 };
static u8 MyBSSID[IW_BSSID_SIZE] = { 0x00, 0x09, 0x5b, 0x3f, 0x4b, 0xfb };
static u8 MyWEP[IW_WEP_SIZE] = { WM_WEPMODE_NO };
/************************************************************************/
/* Wireless Menu */
/************************************************************************/
static const char mscUseSelectedConfiguration[] = "Use Selected Configuration";
static const char mscCreateNewConfiguration[] = "Create New Configuration";
static const char mscRenameSelectedConfiguration[] = "Rename Selected Configuration";
static const char mscDeleteSelectedConfiguration[] = "Delete Selected Configuration";
static const char mscExit[] = "Exit";
static const char mscYes[] = "Yes";
static const char mscNo[] = "No";
static const char mscOK[] = "OK";
static const char mscCancel[] = "Cancel";
static const char mscRename[] = "Rename";
static const char mscConnectToSelectedNetwork[] = "Connect to Selected Network";
static const char mscViewNetworkInformation[] = "View Network Information";
static const char mscBack[] = "Back";
static const char mscEnter[] = "Enter";
static const char mscUseKeyType[] = "Use Key Type";
static const char mscRetry[] = "Retry";
static const char mscContinue[] = "Continue";
static const char mscSave[] = "Save";
static const char mscDontSave[] = "Don't Save";
static void InitializingWirelessInit(void);
static void InitializingWirelessThink(void);
static void InitializingWirelessChose(const char * choice);
static MenuScreenConfiguration msInitializingWireless =
{
"Initializing Wireless",
{
{ mscCancel }
},
InitializingWirelessInit,
InitializingWirelessChose,
InitializingWirelessThink,
SCREEN_OPTION_ANIMATED
};
static void FailedToInitializeWirelessInit(void);
static void FailedToInitializeWirelessChose(const char * choice);
static MenuScreenConfiguration msFailedToInitializeWireless =
{
"Failed to Initialize Wireless",
{
{ mscOK }
},
FailedToInitializeWirelessInit,
FailedToInitializeWirelessChose,
NULL,
SCREEN_OPTION_EXTRAS_CENTERED
};
static void SelectNetworkConfigurationInit(void);
static void SelectNetworkConfigurationChose(const char * choice);
static MenuScreenConfiguration msSelectNetworkConfiguration =
{
"Select Network Configuration",
{
{ mscUseSelectedConfiguration, CHOICE_OPTION_NEEDS_LIST_SELECTION },
{ mscCreateNewConfiguration },
{ mscRenameSelectedConfiguration, CHOICE_OPTION_NEEDS_LIST_SELECTION },
{ mscDeleteSelectedConfiguration, CHOICE_OPTION_NEEDS_LIST_SELECTION },
{ mscExit }
},
SelectNetworkConfigurationInit,
SelectNetworkConfigurationChose,
NULL,
SCREEN_OPTION_LIST
};
static void RenameConfigurationInit(void);
static void RenameConfigurationChose(const char * choice);
static MenuScreenConfiguration msRenameConfiguration =
{
"Rename Configuration",
{
{ mscRename },
{ mscCancel }
},
RenameConfigurationInit,
RenameConfigurationChose,
NULL,
SCREEN_OPTION_KEYBOARD | SCREEN_OPTION_EXTRAS_CENTERED
};
static void ConfirmDeleteInit(void);
static void ConfirmDeleteChose(const char * choice);
static MenuScreenConfiguration msConfirmDelete =
{
"Confirm Delete",
{
{ mscYes },
{ mscNo }
},
ConfirmDeleteInit,
ConfirmDeleteChose,
NULL,
SCREEN_OPTION_EXTRAS_CENTERED
};
static void ConfigurationDeletedChose(const char * choice);
static MenuScreenConfiguration msConfigurationDeleted =
{
"Configuration Deleted",
{
{ mscOK }
},
NULL,
ConfigurationDeletedChose
};
static void SearchingForNetworksInit(void);
static void SearchingForNetworksThink(void);
static void SearchingForNetworksChose(const char * choice);
static MenuScreenConfiguration msSearchingForNetworks =
{
"Searching for Networks",
{
{ mscConnectToSelectedNetwork, CHOICE_OPTION_NEEDS_LIST_SELECTION },
{ mscViewNetworkInformation, CHOICE_OPTION_NEEDS_LIST_SELECTION },
{ mscCancel }
},
SearchingForNetworksInit,
SearchingForNetworksChose,
SearchingForNetworksThink,
SCREEN_OPTION_ANIMATED | SCREEN_OPTION_LIST
};
static void SearchingForSavedNetworkInit(void);
static void SearchingForSavedNetworkThink(void);
static void SearchingForSavedNetworkChose(const char * choice);
static MenuScreenConfiguration msSearchingForSavedNetwork =
{
"Searching for Saved Network",
{
{ mscCancel }
},
SearchingForSavedNetworkInit,
SearchingForSavedNetworkChose,
SearchingForSavedNetworkThink,
SCREEN_OPTION_ANIMATED
};
static void SearchFailedInit(void);
static void SearchFailedChose(const char * choice);
static MenuScreenConfiguration msSearchFailed =
{
"Search Failed",
{
{ mscOK }
},
SearchFailedInit,
SearchFailedChose,
NULL,
SCREEN_OPTION_EXTRAS_CENTERED
};
static void NetworkInformationInit(void);
static void NetworkInformationChose(const char * choice);
static MenuScreenConfiguration msNetworkInformation =
{
"Network Information",
{
{ mscBack }
},
NetworkInformationInit,
NetworkInformationChose,
NULL
};
static void SelectSecurityTypeInit(void);
static void SelectSecurityTypeChose(const char * choice);
static MenuScreenConfiguration msSelectSecurityType =
{
"Select Security Type",
{
{ mscUseKeyType, CHOICE_OPTION_NEEDS_LIST_SELECTION },
{ mscBack }
},
SelectSecurityTypeInit,
SelectSecurityTypeChose,
NULL,
SCREEN_OPTION_LIST
};
static void EnterSecurityKeyInit(void);
static void EnterSecurityKeyChose(const char * choice);
static MenuScreenConfiguration msEnterSecurityKey =
{
"Enter Security (WEP) Key",
{
{ mscEnter },
{ mscBack }
},
EnterSecurityKeyInit,
EnterSecurityKeyChose,
NULL,
SCREEN_OPTION_KEYBOARD
};
static void BadSecurityKeyEnteredInit(void);
static void BadSecurityKeyEnteredChose(const char * choice);
static MenuScreenConfiguration msBadSecurityKeyEntered =
{
"Bad Security Key Entered",
{
{ mscBack }
},
BadSecurityKeyEnteredInit,
BadSecurityKeyEnteredChose,
NULL,
SCREEN_OPTION_EXTRAS_CENTERED
};
static void ConnectingToNetworkInit(void);
static void ConnectingToNetworkChose(const char * choice);
static void ConnectingToNetworkThink(void);
static MenuScreenConfiguration msConnectingToNetwork =
{
"Connecting to Network",
{
{ mscCancel }
},
ConnectingToNetworkInit,
ConnectingToNetworkChose,
ConnectingToNetworkThink,
SCREEN_OPTION_ANIMATED
};
static void FailedToConnectToNetworkInit(void);
static void FailedToConnectToNetworkChose(const char * choice);
static MenuScreenConfiguration msFailedToConnectToNetwork =
{
"Failed to Connect to Network",
{
{ mscBack }
},
FailedToConnectToNetworkInit,
FailedToConnectToNetworkChose,
NULL,
SCREEN_OPTION_EXTRAS_CENTERED
};
static void ConnectingToInternetInit(void);
static void ConnectingToInternetChose(const char * choice);
static void ConnectingToInternetThink(void);
static MenuScreenConfiguration msConnectingToInternet =
{
"Connecting to Internet",
{
{ mscCancel }
},
ConnectingToInternetInit,
ConnectingToInternetChose,
ConnectingToInternetThink,
SCREEN_OPTION_ANIMATED
};
static void FailedToConnectToInternetInit(void);
static void FailedToConnectToInternetChose(const char * choice);
static MenuScreenConfiguration msFailedToConnectToInternet =
{
"Failed to Connect to Internet",
{
{ mscBack }
},
FailedToConnectToInternetInit,
FailedToConnectToInternetChose,
NULL,
SCREEN_OPTION_EXTRAS_CENTERED
};
static void ConnectedToInternetInit(void);
static void ConnectedToInternetChose(const char * choice);
static MenuScreenConfiguration msConnectedToInternet =
{
"Connected to Internet",
{
{ mscContinue }
},
ConnectedToInternetInit,
ConnectedToInternetChose
};
static void SaveNetworkConfigurationInit(void);
static void SaveNetworkConfigurationChose(const char * choice);
static MenuScreenConfiguration msSaveNetworkConfiguration =
{
"Save Network Configuration",
{
{ mscSave},
{ mscDontSave }
},
SaveNetworkConfigurationInit,
SaveNetworkConfigurationChose,
NULL,
SCREEN_OPTION_KEYBOARD
};
static void ConfigurationSavedChose(const char * choice);
static MenuScreenConfiguration msConfigurationSaved =
{
"Configuration Saved",
{
{ mscContinue }
},
NULL,
ConfigurationSavedChose
};
static MenuScreenConfiguration msCancelled =
{
"Wireless Setup Cancelled"
};
static MenuScreenConfiguration msFailed =
{
"Wireless Setup Failed"
};
/************************************************************************/
/* Wireless Funcs */
/************************************************************************/
#define APLIST_COUNT 8
#define MAX_SAVED_CONFIGS 3
#define MAX_CONFIG_NAME_LEN 32
#define BSSDESC_MAX 16
static const char MagicString[] = "GOA-SAVED-CONFIGS";
static const size_t MagicStringLen = sizeof(MagicString);
typedef struct SavedConfig
{
char name[MAX_CONFIG_NAME_LEN + 1];
u8 bssid[IW_BSSID_SIZE];
u8 wep[IW_WEP_SIZE];
} SavedConfig;
typedef struct SavedFile
{
char magic[MagicStringLen];
u8 numConfigs;
SavedConfig configs[MAX_SAVED_CONFIGS];
} SavedFile;
static SavedFile SavedSettings;
static u8 IWBuffer[IW_WORK_SIZE] ATTRIBUTE_ALIGN(32);
static u8 BSSID[IW_BSSID_SIZE];
static u8 WEPAny[IW_WEP_SIZE];
static char WEPEntered[256];
static u8 WEPKey[IW_WEP_SIZE];
static unsigned long BSSDescBuffer[IW_BSS_SIZE * BSSDESC_MAX / 4];
static IWConfig WirelessConfig =
{
3,
BSSDescBuffer,
IW_BSS_SIZE * BSSDESC_MAX,
0
};
static WMBssDesc APList[APLIST_COUNT];
static int APIndex;
static int WEPType;
static char FailureReason[MAX_EXTRA_TEXT_STRING_LEN + 1];
static int SelectedConfig;
static BOOL NewConfig;
static gsi_bool KeepPolling;
static void * soAlloc(u32 name, s32 size)
{
OSIntrMode nOSIntrMode;
void * alloc = NULL;
GSI_UNUSED(name);
nOSIntrMode = OS_DisableInterrupts();
alloc = OS_Alloc((u32)size);
OS_RestoreInterrupts(nOSIntrMode);
return alloc;
}
static void soFree(u32 name, void * ptr, s32 size)
{
OSIntrMode nOSIntrMode;
GSI_UNUSED(name);
GSI_UNUSED(size);
nOSIntrMode = OS_DisableInterrupts();
OS_Free(ptr);
OS_RestoreInterrupts(nOSIntrMode);
}
SOConfig SocketsConfig =
{
SOC_VENDOR_NINTENDO, // vendor
SOC_VERSION, // version
soAlloc, // alloc
soFree, // free
#if defined(USE_DHCP)
SOC_FLAG_DHCP, // flag
SOC_HtoNl(SOC_INADDR_ANY), // addr
SOC_HtoNl(SOC_INADDR_ANY), // netmask
SOC_HtoNl(SOC_INADDR_ANY), // router
SOC_HtoNl(SOC_INADDR_ANY), // dns1
SOC_HtoNl(SOC_INADDR_ANY), // dns2
#else
0, // flag
SOC_HtoNl(0xC0A8000C), // addr 192.168. 0. 12
SOC_HtoNl(0xFFFFFF00), // netmask 255.255.255. 0
SOC_HtoNl(0xC0A80001), // router 192.168. 0. 1
SOC_HtoNl(0xC0A80001), // dns1 192.168. 0. 1
SOC_HtoNl(SOC_INADDR_ANY), // dns2
#endif
4096, // timeWaitBuffer
4096, // reassemblyBuffer
0, // maximum transmission unit size
// TCP
0, // default TCP receive window size (default 2 x MSS)
0, // default TCP total retransmit timeout value (default 100 sec)
// PPP
NULL,
NULL,
// PPPoE
NULL,
// DHCP
"NintendoDS", // DHCP host name
50, // TCP total retransmit times (default 4)
// UDP
0, // default UDP send buffer size (default 1472)
0 // defualt UDP receive buffer size (default 4416)
};
static const char * IWResultToString(int result)
{
if(result == IW_RESULT_SUCCESS)
return "success";
if(result == IW_RESULT_FAILURE)
return "failure";
if(result == IW_RESULT_PROGRESS)
return "progress";
if(result == IW_RESULT_ACCEPT)
return "accept";
if(result == IW_RESULT_REJECT)
return "reject";
if(result == IW_RESULT_WMDISABLE)
return "wmdisable";
if(result == IW_RESULT_MEMORYERROR)
return "memoryerror";
if(result == IW_RESULT_FATALERROR)
return "fatalerror";
return "unknown result";
}
static const char * IWNotifyToString(int notify)
{
if(notify == IW_NOTIFY_COMMON)
return "common";
if(notify == IW_NOTIFY_STARTUP)
return "startup";
if(notify == IW_NOTIFY_CLEANUP)
return "cleanup";
if(notify == IW_NOTIFY_SEARCH_START)
return "search_start";
if(notify == IW_NOTIFY_SEARCH_END)
return "search_end";
if(notify == IW_NOTIFY_CONNECT)
return "connect";
if(notify == IW_NOTIFY_DISCONNECT)
return "disconnect";
if(notify == IW_NOTIFY_FOUND)
return "found";
if(notify == IW_NOTIFY_BEACON_LOST)
return "beacon_lost";
if(notify == IW_NOTIFY_FATALERROR)
return "fatalerror";
return "unknown notify";
}
static const char * IWPhaseToString(int phase)
{
if(phase == IW_PHASE_NULL)
return "null";
if(phase == IW_PHASE_WAIT)
return "wait";
if(phase == IW_PHASE_WAIT_IDLE)
return "wait_idle";
if(phase == IW_PHASE_IDLE)
return "idle";
if(phase == IW_PHASE_IDLE_WAIT)
return "idle_wait";
if(phase == IW_PHASE_IDLE_SCAN)
return "idle_scan";
if(phase == IW_PHASE_SCAN)
return "scan";
if(phase == IW_PHASE_SCAN_IDLE)
return "scan_idle";
if(phase == IW_PHASE_IDLE_LINK)
return "idle_link";
if(phase == IW_PHASE_LINK)
return "link";
if(phase == IW_PHASE_LINK_IDLE)
return "link_idle";
if(phase == IW_PHASE_FATALERROR)
return "fatalerror";
return "unknown phase";
}
static void IW_Callback(IWNotice * arg)
{
GSI_UNUSED(arg);
OS_TPrintf("Notify: %s | Result: %s\n", IWNotifyToString(arg->notify), IWResultToString(arg->result));
}
static gsi_bool IW_CheckResult(int result, const char * funcName)
{
assert(funcName);
OS_Printf("%s: %s\n", funcName, IWResultToString(result));
switch(result)
{
case IW_RESULT_SUCCESS:
case IW_RESULT_PROGRESS:
case IW_RESULT_ACCEPT:
return gsi_true;
case IW_RESULT_FAILURE:
case IW_RESULT_REJECT:
OS_Printf(" IW_Phase = %s\n", IWPhaseToString(IW_GetPhase()));
case IW_RESULT_WMDISABLE:
case IW_RESULT_MEMORYERROR:
case IW_RESULT_FATALERROR:
default:
snprintf(FailureReason, sizeof(FailureReason), "%s result: %s", funcName, IWResultToString(result));
return gsi_false;
}
}
static gsi_bool IW_Poll(int polling, int success, const char * funcName, gsi_bool * keepPolling)
{
int phase;
assert(funcName);
phase = IW_GetPhase();
if(phase == polling)
{
if(keepPolling)
*keepPolling = gsi_true;
return gsi_true;
}
if(keepPolling)
*keepPolling = gsi_false;
if(phase == success)
return gsi_true;
snprintf(FailureReason, sizeof(FailureReason), "%s phase: %s", funcName, IWPhaseToString(phase));
return gsi_false;
}
static void LoadSettings(void)
{
if(BackupExists())
{
// load the saved settings from the backup
ReadFromBackup(&SavedSettings, sizeof(SavedSettings));
}
else
{
// use a default when there isn't a backup device
// this makes debugging with the dev kit easier
SavedConfig config;
strcpy(config.name, "Default WEP");
memcpy(config.bssid, MyBSSID, sizeof(MyBSSID));
memcpy(config.wep, MyWEP, sizeof(MyWEP));
memcpy(SavedSettings.magic, MagicString, MagicStringLen);
SavedSettings.numConfigs = 1;
memcpy(&SavedSettings.configs[0], &config, sizeof(SavedConfig));
}
if(memcmp(SavedSettings.magic, MagicString, MagicStringLen) != 0)
SavedSettings.numConfigs = 0;
SavedSettings.numConfigs = (u8)min(SavedSettings.numConfigs, MAX_SAVED_CONFIGS);
}
static void SaveSettings(void)
{
if(BackupExists())
{
memcpy(SavedSettings.magic, MagicString, MagicStringLen);
WriteToBackup(&SavedSettings, sizeof(SavedSettings));
}
}
void WirelessInit(void)
{
// load wireless settings
LoadSettings();
// start the menu
StartMenuScreen(&msInitializingWireless);
}
void WirelessCleanup(void)
{
int result;
SOC_Cleanup();
result = IW_Disconnect();
IW_CheckResult(result, "IW_Disconnect");
do
{
if(!IW_Poll(IW_PHASE_LINK_IDLE, IW_PHASE_IDLE, "IW_Disconnect", &KeepPolling))
OS_TPrintf("Failuring waiting for wait phase\n");
} while(KeepPolling);
result = IW_Cleanup();
IW_CheckResult(result, "IW_Cleanup");
do
{
if(!IW_Poll(IW_PHASE_IDLE_WAIT, IW_PHASE_WAIT, "IW_Cleanup", &KeepPolling))
OS_TPrintf("Failuring waiting for wait phase\n");
} while(KeepPolling);
result = IW_Exit();
IW_CheckResult(result, "IW_Exit");
}
/************************************************************************/
/* Wireless Menu Funcs */
/************************************************************************/
static void InitializingWirelessInit(void)
{
int result;
// init the wireless library
result = IW_Init(IWBuffer, sizeof(IWBuffer));
if(!IW_CheckResult(result, "IW_Init"))
{
SetNextMenuScreen(&msFailedToInitializeWireless);
return;
}
// startup wireless
result = IW_Startup(&WirelessConfig, IW_Callback);
if(!IW_CheckResult(result, "IW_Startup"))
{
SetNextMenuScreen(&msFailedToInitializeWireless);
return;
}
KeepPolling = gsi_true;
}
static void InitializingWirelessChose(const char * choice)
{
if(choice == mscCancel)
SetNextMenuScreen(&msCancelled);
}
static void InitializingWirelessThink(void)
{
// poll the phase
if(KeepPolling)
{
if(!IW_Poll(IW_PHASE_WAIT_IDLE, IW_PHASE_IDLE, "IW_Startup", &KeepPolling))
{
SetNextMenuScreen(&msFailedToInitializeWireless);
return;
}
if(KeepPolling)
return;
}
#if defined(AUTO_CONNECT)
{
memcpy(WEPKey, MyWEP, sizeof(WEPKey));
memcpy(BSSID, MyBSSID, WM_SIZE_BSSID);
NewConfig = FALSE;
SetNextMenuScreen(&msSearchingForSavedNetwork);
return;
}
#endif
// we're done with the startup
#if defined(SUPPORT_SAVED_CONFIGS)
if(SavedSettings.numConfigs > 0)
SetNextMenuScreen(&msSelectNetworkConfiguration);
else
#endif
SetNextMenuScreen(&msSearchingForNetworks);
}
static void FailedToInitializeWirelessInit(void)
{
MenuScreen * screen = GetMenuScreen();
strncpy(screen->extraText[0], FailureReason, MAX_EXTRA_TEXT_STRING_LEN + 1);
screen->extraText[0][MAX_EXTRA_TEXT_STRING_LEN] = '\0';
}
static void FailedToInitializeWirelessChose(const char * choice)
{
if(choice == mscOK)
SetNextMenuScreen(&msFailed);
}
static void SelectNetworkConfigurationInit(void)
{
MenuScreen * screen = GetMenuScreen();
int i;
for(i = 0 ; i < SavedSettings.numConfigs ; i++)
{
strncpy(screen->list[i], SavedSettings.configs[i].name, MAX_LIST_STRING_LEN);
screen->list[i][MAX_LIST_STRING_LEN - 1] = '\0';
}
}
static void SelectNetworkConfigurationChose(const char * choice)
{
MenuScreen * screen = GetMenuScreen();
SelectedConfig = screen->listSelection;
if(choice == mscUseSelectedConfiguration)
{
memcpy(WEPKey, SavedSettings.configs[SelectedConfig].wep, sizeof(WEPKey));
memcpy(BSSID, SavedSettings.configs[SelectedConfig].bssid, WM_SIZE_BSSID);
NewConfig = FALSE;
//SetNextMenuScreen(&msConnectingToNetwork);
SetNextMenuScreen(&msSearchingForSavedNetwork);
}
else if(choice == mscCreateNewConfiguration)
{
SetNextMenuScreen(&msSearchingForNetworks);
}
else if(choice == mscRenameSelectedConfiguration)
{
SetNextMenuScreen(&msRenameConfiguration);
}
else if(choice == mscDeleteSelectedConfiguration)
{
SetNextMenuScreen(&msConfirmDelete);
}
else if(choice == mscExit)
{
SetNextMenuScreen(&msCancelled);
}
}
static void RenameConfigurationInit(void)
{
MenuScreen * screen = GetMenuScreen();
strncpy(screen->extraText[0], SavedSettings.configs[SelectedConfig].name, MAX_EXTRA_TEXT_STRING_LEN);
screen->extraText[0][MAX_EXTRA_TEXT_STRING_LEN - 1] = '\0';
strncpy(screen->keyboardText, SavedSettings.configs[SelectedConfig].name, MAX_KEYBOARD_TEXT_LEN);
screen->keyboardText[MAX_KEYBOARD_TEXT_LEN - 1] = '\0';
}
static void RenameConfigurationChose(const char * choice)
{
MenuScreen * screen = GetMenuScreen();
if(choice == mscRename)
{
strncpy(SavedSettings.configs[SelectedConfig].name, screen->keyboardText, MAX_CONFIG_NAME_LEN);
SavedSettings.configs[SelectedConfig].name[MAX_CONFIG_NAME_LEN - 1] = '\0';
SaveSettings();
SetNextMenuScreen(&msSelectNetworkConfiguration);
}
else if(choice == mscCancel)
{
SetNextMenuScreen(&msSelectNetworkConfiguration);
}
}
static void ConfirmDeleteInit(void)
{
MenuScreen * screen = GetMenuScreen();
strncpy(screen->extraText[0], SavedSettings.configs[SelectedConfig].name, MAX_EXTRA_TEXT_STRING_LEN);
screen->extraText[0][MAX_EXTRA_TEXT_STRING_LEN - 1] = '\0';
}
static void ConfirmDeleteChose(const char * choice)
{
int i;
if(choice == mscYes)
{
SavedSettings.numConfigs--;
for(i = SelectedConfig ; i < SavedSettings.numConfigs ; i++)
memcpy(&SavedSettings.configs[i], &SavedSettings.configs[i + 1], sizeof(SavedConfig));
SaveSettings();
SetNextMenuScreen(&msConfigurationDeleted);
}
else if(choice == mscNo)
{
SetNextMenuScreen(&msSelectNetworkConfiguration);
}
}
static void ConfigurationDeletedChose(const char * choice)
{
if(choice == mscOK)
{
if(SavedSettings.numConfigs > 0)
SetNextMenuScreen(&msSelectNetworkConfiguration);
else
SetNextMenuScreen(&msSearchingForNetworks);
}
}
static void SearchingForNetworksInit(void)
{
int result;
// search for access points
result = IW_Search(IW_BSSID_ANY, IW_ESSID_ANY, IW_OPT_CHANNEL_ALL|IW_OPT_SCANTYPE_PASSIVE);
if(!IW_CheckResult(result, "IW_Search"))
{
SetNextMenuScreen(&msSearchFailed);
return;
}
KeepPolling = gsi_true;
}
static void SearchingForNetworksChose(const char * choice)
{
MenuScreen * screen = GetMenuScreen();
APIndex = screen->listSelection;
if(choice == mscViewNetworkInformation)
{
SetNextMenuScreen(&msNetworkInformation);
return;
}
// we're connecting or cancelling, so stop searching
IW_Search(NULL, NULL, 0);
if(choice == mscConnectToSelectedNetwork)
{
SetNextMenuScreen(&msSelectSecurityType);
}
else if(choice == mscCancel)
{
#if defined(SUPPORT_SAVED_CONFIGS)
if(SavedSettings.numConfigs > 0)
SetNextMenuScreen(&msSelectNetworkConfiguration);
else
#endif
SetNextMenuScreen(&msCancelled);
}
}
static void SearchingForNetworksThink(void)
{
MenuScreen * screen;
int i;
int count;
WMBssDesc * desc;
if(KeepPolling)
{
// poll the search
if(!IW_Poll(IW_PHASE_IDLE_SCAN, IW_PHASE_SCAN, "IW_Search", &KeepPolling))
{
IW_Search(NULL, NULL, 0);
SetNextMenuScreen(&msSearchFailed);
return;
}
if(KeepPolling)
return;
}
// get the screen
screen = GetMenuScreen();
// lock the AP descriptions
IW_LockBssDesc(1);
// get a count
count = IW_CountBssDesc();
count = min(count, APLIST_COUNT);
// copy the access points
for(i = 0 ; i < count ; i++)
{
desc = IW_PointBssDesc(i);
if(!desc)
{
count = i;
break;
}
memcpy(&APList[i], desc, sizeof(WMBssDesc));
}
// unlock the APs
IW_LockBssDesc(0);
// fill the screen list
for(i = 0 ; i < MAX_LIST_STRINGS ; i++)
{
if(i < count)
{
if(APList[i].ssidLength > 0)
snprintf(screen->list[i], MAX_LIST_STRING_LEN, "%s", APList[i].ssid);
else
strcpy(screen->list[i], "[no name]");
}
else
{
screen->list[i][0] = '\0';
}
}
}
static void SearchingForSavedNetworkInit(void)
{
int result;
// search for access points
result = IW_Search(BSSID, IW_ESSID_ANY, IW_OPT_CHANNEL_ALL|IW_OPT_SCANTYPE_PASSIVE);
if(!IW_CheckResult(result, "IW_Search"))
{
SetNextMenuScreen(&msSearchFailed);
return;
}
KeepPolling = gsi_true;
}
static void SearchingForSavedNetworkChose(const char * choice)
{
if(choice == mscCancel)
{
// stop searching
IW_Search(NULL, NULL, 0);
SetNextMenuScreen(&msSelectNetworkConfiguration);
}
}
static void SearchingForSavedNetworkThink(void)
{
int count;
WMBssDesc * desc = NULL;
if(KeepPolling)
{
// poll the search
if(!IW_Poll(IW_PHASE_IDLE_SCAN, IW_PHASE_SCAN, "IW_Search", &KeepPolling))
{
IW_Search(NULL, NULL, 0);
SetNextMenuScreen(&msSearchFailed);
return;
}
if(KeepPolling)
return;
}
// lock the AP descriptions
IW_LockBssDesc(1);
// get a count
count = IW_CountBssDesc();
// if we found it, copy it
if(count > 0)
{
desc = IW_PointBssDesc(0);
if(desc)
{
memcpy(&APList[0], desc, sizeof(WMBssDesc));
APIndex = 0;
}
}
// unlock the APs
IW_LockBssDesc(0);
// check if we found it
if(desc)
{
// stop searching
IW_Search(NULL, NULL, 0);
// connect
SetNextMenuScreen(&msConnectingToNetwork);
}
}
static void SearchFailedInit(void)
{
MenuScreen * screen = GetMenuScreen();
strncpy(screen->extraText[0], FailureReason, MAX_EXTRA_TEXT_STRING_LEN + 1);
screen->extraText[0][MAX_EXTRA_TEXT_STRING_LEN] = '\0';
}
static void SearchFailedChose(const char * choice)
{
if(choice == mscOK)
{
#if defined(SUPPORT_SAVED_CONFIGS)
if(SavedSettings.numConfigs > 0)
SetNextMenuScreen(&msSelectNetworkConfiguration);
else
#endif
SetNextMenuScreen(&msFailed);
}
}
static void NetworkInformationInit(void)
{
MenuScreen * screen = GetMenuScreen();
// BSSID / MAC
snprintf(screen->extraText[0], MAX_EXTRA_TEXT_STRING_LEN,
" MAC: %02X:%02X:%02X:%02X:%02X:%02X",
APList[APIndex].bssid[0],
APList[APIndex].bssid[1],
APList[APIndex].bssid[2],
APList[APIndex].bssid[3],
APList[APIndex].bssid[4],
APList[APIndex].bssid[5]);
// channel
snprintf(screen->extraText[1], MAX_EXTRA_TEXT_STRING_LEN,
" Channel: %d",
APList[APIndex].channel);
}
static void NetworkInformationChose(const char * choice)
{
if(choice == mscBack)
SetNextMenuScreen(&msSearchingForNetworks);
}
static void SelectSecurityTypeInit(void)
{
MenuScreen * screen = GetMenuScreen();
strcpy(screen->list[0], "No WEP key");
strcpy(screen->list[1], "40/64 bit key");
strcpy(screen->list[2], "104 bit key");
strcpy(screen->list[3], "128 bit key");
}
static void SelectSecurityTypeChose(const char * choice)
{
MenuScreen * screen = GetMenuScreen();
WEPType = screen->listSelection;
if(choice == mscUseKeyType)
{
if(WEPType == WM_WEPMODE_NO)
{
memset(WEPKey, 0, sizeof(WEPKey));
memcpy(BSSID, APList[APIndex].bssid, WM_SIZE_BSSID);
NewConfig = TRUE;
SetNextMenuScreen(&msConnectingToNetwork);
}
else
{
SetNextMenuScreen(&msEnterSecurityKey);
}
}
else if(choice == mscBack)
{
SetNextMenuScreen(&msSearchingForNetworks);
}
}
static int HexToInt(char hex)
{
switch(hex)
{
case '0':
return 0;
case '1':
return 1;
case '2':
return 2;
case '3':
return 3;
case '4':
return 4;
case '5':
return 5;
case '6':
return 6;
case '7':
return 7;
case '8':
return 8;
case '9':
return 9;
case 'A':
return 10;
case 'B':
return 11;
case 'C':
return 12;
case 'D':
return 13;
case 'E':
return 14;
case 'F':
return 15;
}
return -1;
}
static void EnterSecurityKeyInit(void)
{
MenuScreen * screen = GetMenuScreen();
strncpy(screen->keyboardText, WEPEntered, sizeof(screen->keyboardText));
screen->keyboardText[sizeof(screen->keyboardText) - 1] = '\0';
}
static void EnterSecurityKeyChose(const char * choice)
{
MenuScreen * screen = GetMenuScreen();
// save off the key as entered
strncpy(WEPEntered, screen->keyboardText, sizeof(WEPEntered));
WEPEntered[sizeof(WEPEntered) - 1] = '\0';
if(choice == mscEnter)
{
int i;
int len;
int correctLen;
int index;
int val[2];
char badChar;
// get the key len
len = (int)strlen(screen->keyboardText);
// get the correct len for the type
if(WEPType == WM_WEPMODE_40BIT)
correctLen = (40 / 4);
else if(WEPType == WM_WEPMODE_104BIT)
correctLen = (104 / 4);
else if(WEPType == WM_WEPMODE_128BIT)
correctLen = (128 / 4);
else
correctLen = -1;
// check the len
if(len != correctLen)
{
snprintf(FailureReason, sizeof(FailureReason), "Bad length (%d instead of %d)", len, correctLen);
SetNextMenuScreen(&msBadSecurityKeyEntered);
return;
}
// convert the keyboard text to hex
memset(WEPKey, 0, sizeof(WEPKey));
WEPKey[0] = (u8)WEPType;
index = 2;
for(i = 0 ; i < len ; i += 2)
{
// convert the next two chars to ints
val[0] = HexToInt(screen->keyboardText[i]);
val[1] = HexToInt(screen->keyboardText[i + 1]);
// check the values
if((val[0] == -1) || (val[1] == -1))
{
if(val[0] == -1)
badChar = screen->keyboardText[i];
else
badChar = screen->keyboardText[i + 1];
snprintf(FailureReason, sizeof(FailureReason), "Bad value ('%c' instead of hex)", badChar);
SetNextMenuScreen(&msBadSecurityKeyEntered);
return;
}
// enter them in the WEP array
WEPKey[index++] = (u8)((val[0] << 4) | val[1]);
}
memcpy(BSSID, APList[APIndex].bssid, WM_SIZE_BSSID);
NewConfig = TRUE;
SetNextMenuScreen(&msConnectingToNetwork);
}
else if (choice == mscBack)
{
SetNextMenuScreen(&msSelectSecurityType);
}
}
static void BadSecurityKeyEnteredInit(void)
{
MenuScreen * screen = GetMenuScreen();
strncpy(screen->extraText[0], FailureReason, MAX_EXTRA_TEXT_STRING_LEN + 1);
screen->extraText[0][MAX_EXTRA_TEXT_STRING_LEN] = '\0';
}
static void BadSecurityKeyEnteredChose(const char * choice)
{
if(choice == mscBack)
SetNextMenuScreen(&msEnterSecurityKey);
}
static void ConnectingToNetworkInit(void)
{
int result;
// make sure we're idle
OS_TPrintf("Waiting for idle...\n");
while(IW_GetPhase() != IW_PHASE_IDLE)
;
// connect
result = IW_Connect(&APList[APIndex], WEPKey, IW_OPT_POWER_FULL);
if(!IW_CheckResult(result, "IW_Connect"))
{
SetNextMenuScreen(&msFailedToConnectToNetwork);
return;
}
KeepPolling = gsi_true;
}
static void ConnectingToNetworkChose(const char * choice)
{
if(choice == mscCancel)
{
// disconnect
IW_Disconnect();
#if defined(SUPPORT_SAVED_CONFIGS)
if(SavedSettings.numConfigs > 0)
SetNextMenuScreen(&msSelectNetworkConfiguration);
else
#endif
SetNextMenuScreen(&msSearchingForNetworks);
}
}
static void ConnectingToNetworkThink(void)
{
if(KeepPolling)
{
// poll the connect
if(!IW_Poll(IW_PHASE_IDLE_LINK, IW_PHASE_LINK, "IW_Connect", &KeepPolling))
{
IW_Disconnect();
SetNextMenuScreen(&msFailedToConnectToNetwork);
return;
}
if(KeepPolling)
return;
}
// we're connected to the network
SetNextMenuScreen(&msConnectingToInternet);
}
static void FailedToConnectToNetworkInit(void)
{
MenuScreen * screen = GetMenuScreen();
strncpy(screen->extraText[0], FailureReason, MAX_EXTRA_TEXT_STRING_LEN + 1);
screen->extraText[0][MAX_EXTRA_TEXT_STRING_LEN] = '\0';
}
static void FailedToConnectToNetworkChose(const char * choice)
{
if(choice == mscBack)
{
#if defined(SUPPORT_SAVED_CONFIGS)
if(SavedSettings.numConfigs > 0)
SetNextMenuScreen(&msSelectNetworkConfiguration);
else
#endif
SetNextMenuScreen(&msSearchingForNetworks);
}
}
static void ConnectingToInternetInit(void)
{
int result;
BOOL linkStatus = FALSE;
// init the sockets library
SOC_Init();
// get the IP link
do
{
IP_GetLinkState(NULL, &linkStatus);
}
while(!linkStatus);
// startup the sockets library
result = SOC_Startup(&SocketsConfig);
if(result < 0)
{
snprintf(FailureReason, sizeof(FailureReason), "SOC_Startup failed: %d", result);
SetNextMenuScreen(&msFailedToConnectToInternet);
return;
}
}
static void ConnectingToInternetChose(const char * choice)
{
if(choice == mscCancel)
{
SOC_Cleanup();
IW_Disconnect();
#if defined(SUPPORT_SAVED_CONFIGS)
if(SavedSettings.numConfigs > 0)
SetNextMenuScreen(&msSelectNetworkConfiguration);
else
#endif
SetNextMenuScreen(&msSearchingForNetworks);
}
}
static void ConnectingToInternetThink(void)
{
u32 localIP;
// check if we have been allocated an IP
localIP = (u32)SOC_GetHostID();
if(localIP != SOC_HtoNl(SOC_INADDR_ANY))
{
#if !defined(AUTO_CONNECT)
SetNextMenuScreen(&msConnectedToInternet);
#else
u8 ip[IP_ALEN];
SOInAddr dns1, dns2;
u8 mac[MAC_ALEN];
IP_GetAddr(NULL, ip);
OS_Printf("IP: %d.%d.%d.%d\n", ip[0], ip[1], ip[2], ip[3]);
IP_GetGateway (NULL, ip);
OS_Printf("Gateway: %d.%d.%d.%d\n", ip[0], ip[1], ip[2], ip[3]);
SOC_GetResolver(&dns1, &dns2);
OS_Printf("DNS1: %s\n", inet_ntoa(dns1));
OS_Printf("DNS2: %s\n", inet_ntoa(dns2));
IP_GetMacAddr(NULL, mac);
OS_Printf("MAC: %02X-%02X-%02X-%02X-%02X-%02X\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
ExitMenu();
#endif
}
}
static void FailedToConnectToInternetInit(void)
{
MenuScreen * screen = GetMenuScreen();
strncpy(screen->extraText[0], FailureReason, MAX_EXTRA_TEXT_STRING_LEN + 1);
screen->extraText[0][MAX_EXTRA_TEXT_STRING_LEN] = '\0';
}
static void FailedToConnectToInternetChose(const char * choice)
{
if(choice == mscBack)
{
#if defined(SUPPORT_SAVED_CONFIGS)
if(SavedSettings.numConfigs > 0)
SetNextMenuScreen(&msSelectNetworkConfiguration);
else
#endif
SetNextMenuScreen(&msSearchingForNetworks);
}
}
static void ConnectedToInternetInit(void)
{
MenuScreen * screen = GetMenuScreen();
u8 ip[IP_ALEN];
SOInAddr dns1, dns2;
u8 mac[MAC_ALEN];
int line = 0;
IP_GetAddr(NULL, ip);
snprintf(screen->extraText[line++], MAX_EXTRA_TEXT_STRING_LEN,
" IP: %d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]);
IP_GetAlias(NULL, ip);
snprintf(screen->extraText[line++], MAX_EXTRA_TEXT_STRING_LEN,
" Alias: %d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]);
IP_GetBroadcastAddr(NULL, ip);
snprintf(screen->extraText[line++], MAX_EXTRA_TEXT_STRING_LEN,
" Broadcast: %d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]);
IP_GetNetmask (NULL, ip);
snprintf(screen->extraText[line++], MAX_EXTRA_TEXT_STRING_LEN,
" Netmask: %d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]);
IP_GetGateway (NULL, ip);
snprintf(screen->extraText[line++], MAX_EXTRA_TEXT_STRING_LEN,
" Gateway: %d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]);
SOC_GetResolver(&dns1, &dns2);
snprintf(screen->extraText[line++], MAX_EXTRA_TEXT_STRING_LEN,
" DNS1: %s", inet_ntoa(dns1));
snprintf(screen->extraText[line++], MAX_EXTRA_TEXT_STRING_LEN,
" DNS2: %s", inet_ntoa(dns2));
IP_GetMacAddr(NULL, mac);
snprintf(screen->extraText[line++], MAX_EXTRA_TEXT_STRING_LEN,
" MAC: %02X-%02X-%02X-%02X-%02X-%02X",
mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
}
static void ConnectedToInternetChose(const char * choice)
{
if(choice == mscContinue)
{
#if defined(SUPPORT_SAVED_CONFIGS)
if(BackupExists() && NewConfig && (SavedSettings.numConfigs < MAX_SAVED_CONFIGS))
SetNextMenuScreen(&msSaveNetworkConfiguration);
else
#endif
ExitMenu();
}
}
static void SaveNetworkConfigurationInit(void)
{
MenuScreen * screen = GetMenuScreen();
strncpy(screen->keyboardText, (const char *)APList[APIndex].ssid, MAX_KEYBOARD_TEXT_LEN);
screen->keyboardText[MAX_KEYBOARD_TEXT_LEN - 1] = '\0';
}
static void SaveNetworkConfigurationChose(const char * choice)
{
MenuScreen * screen = GetMenuScreen();
if(choice == mscSave)
{
memcpy(SavedSettings.configs[SavedSettings.numConfigs].bssid, BSSID, IW_BSSID_SIZE);
memcpy(SavedSettings.configs[SavedSettings.numConfigs].wep, WEPKey, IW_WEP_SIZE);
strncpy(SavedSettings.configs[SavedSettings.numConfigs].name, screen->keyboardText, MAX_CONFIG_NAME_LEN);
SavedSettings.configs[SavedSettings.numConfigs].name[MAX_CONFIG_NAME_LEN - 1] = '\0';
SavedSettings.numConfigs++;
SaveSettings();
SetNextMenuScreen(&msConfigurationSaved);
}
else if(choice == mscDontSave)
{
ExitMenu();
}
}
static void ConfigurationSavedChose(const char * choice)
{
if(choice == mscContinue)
ExitMenu();
}