mirror of
https://github.com/openmoh/openmohaa.git
synced 2025-04-28 21:57:57 +03:00
1541 lines
35 KiB
C
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();
|
|
}
|