static void SetMode_NotIdle(UINT8 networkType) { #ifdef STACK_USE_CERTIFICATE_DEBUG DelayMs(100); #endif if(WF_INFRASTRUCTURE == networkType) { WF_CPSetNetworkType(iwconfigCb.cpId, WF_INFRASTRUCTURE); WF_CMConnect(iwconfigCb.cpId); } else if(WF_ADHOC == networkType) { WF_CASetListRetryCount(ADHOC_RETRY_COUNT); WF_CPSetNetworkType(iwconfigCb.cpId, WF_ADHOC); WF_CPSetAdHocBehavior(iwconfigCb.cpId, WF_ADHOC_CONNECT_THEN_START); WF_CMConnect(iwconfigCb.cpId); } else { //To be done } }
/******************************************************************************* Function: BOOL iwconfigSetMode(void) Summary: Set the mode to idle, managed or adhoc. Description: Idle mode - Force MRF24W module to disconnect from any currently connected network Managed mode - MRF24W module will connect to SSID in infrastructure mode. Ensure all network parameters are correct before this command is invoked. Adhoc mode - MRF24W module will connect to SSID in adhoc mode. Ensure all network parameters are correct before this command is invoked. Parameters: Mode - idle / managed /adhoc Returns: TRUE or FALSE Remarks: None. *****************************************************************************/ static BOOL iwconfigSetMode(void) { UINT8 networkType; WF_CPGetNetworkType(iwconfigCb.cpId, &networkType); if ( (3u <= ARGC) && (strcmppgm2ram((char*)ARGV[2], "idle") == 0) ) { if ( iwconfigCb.isIdle ) { WFConsolePrintRomStr("Already in the idle mode", TRUE); } else { if (WF_CMDisconnect() != WF_SUCCESS) { #if defined(STACK_USE_UART) putsUART("Disconnect failed. Disconnect is allowed only when module is in connected state\r\n"); #endif } WF_PsPollDisable(); } } else if ( (3u <= ARGC) && (strcmppgm2ram((char*)ARGV[2], "managed") == 0) ) { if ( iwconfigCb.isIdle ) { WF_CPSetNetworkType(iwconfigCb.cpId, WF_INFRASTRUCTURE); WF_CMConnect(iwconfigCb.cpId); } else { WF_CPGetNetworkType(iwconfigCb.cpId, &networkType); if (networkType == WF_INFRASTRUCTURE) { WFConsolePrintRomStr("Already in the managed mode", TRUE); } else { if (WF_CMDisconnect() != WF_SUCCESS) { #if defined(STACK_USE_UART) putsUART("Disconnect failed. Disconnect is allowed only when module is in connected state\r\n"); #endif } WF_CPSetNetworkType(iwconfigCb.cpId, WF_INFRASTRUCTURE); WF_CMConnect(iwconfigCb.cpId); } } } else if ( (3u <= ARGC) && (strcmppgm2ram((char*)ARGV[2], "adhoc") == 0) ) { if ( iwconfigCb.isIdle ) { WF_CASetListRetryCount(ADHOC_RETRY_COUNT); WF_CPSetNetworkType(iwconfigCb.cpId, WF_ADHOC); WF_CPSetAdHocBehavior(iwconfigCb.cpId, WF_ADHOC_CONNECT_THEN_START); WF_CMConnect(iwconfigCb.cpId); } else { WF_CPGetNetworkType(iwconfigCb.cpId, &networkType); if (networkType == WF_ADHOC) { WFConsolePrintRomStr("Already in the adhoc mode", TRUE); } else { if (WF_CMDisconnect() != WF_SUCCESS) { #if defined(STACK_USE_UART) putsUART("Disconnect failed. Disconnect is allowed only when module is in connected state\r\n"); #endif } WF_CPSetNetworkType(iwconfigCb.cpId, WF_ADHOC); WF_CMConnect(iwconfigCb.cpId); } } } else { WFConsolePrintRomStr("Unknown parameter", TRUE); return FALSE; } return TRUE; }
/***************************************************************************** * FUNCTION: void WF_Connect(void) * * RETURNS: None * * PARAMS: none * * NOTES: This routine creates a Connection Profile Entry, Initializes it * then creates the connection algorithm and establishes the WiFi * connection according to the Profile settings. * Customize this function as needed for your application. * * Wifi Direct, ensure following parameters are set up properly * - AppConfig.MySSID = "DIRECT-" * - sizeof(channelList) == 3) * - channelList[0] == 1 * - channelList[1] == 6 * - channelList[2] == 11 * *****************************************************************************/ void WF_Connect(void) { uint8_t ConnectionProfileID; uint8_t channelList[] = MY_DEFAULT_CHANNEL_LIST; uint8_t channelList_postscan[] = MY_DEFAULT_CHANNEL_LIST_POSTSCAN; /* create a Connection Profile */ WF_CPCreate(&ConnectionProfileID); AppConfig.passPhraseToKeyFlag = 0; // Enables or disables the MRF24W Regional Domain with RF module FW version 0x3106 or earlier // With RF module FW version 0x3107 and future releases, this function is NOT supported due to changes // in FCC requirements, which does not allow programming of the regional domain. WF_SetRegionalDomain(MY_DEFAULT_DOMAIN); if ((AppConfig.networkType == WF_SOFT_AP) || (AppConfig.networkType == WF_ADHOC)) { /**********************************************************************/ /* Append Last 4 digits to MAC address to SSID - Creating unique SSID */ /* Wifi comm demo SSID : MCHP_xxxx */ /* Wifi G demo SSID : MCHP_G_xxxx */ /**********************************************************************/ sprintf((char *) AppConfig.MySSID, "MCHP_G_%02x%02x", AppConfig.MyMACAddr.v[4], AppConfig.MyMACAddr.v[5]); sprintf((char *) AppConfig.NetBIOSName, "%s%02x%02x", MY_DEFAULT_HOST_NAME, AppConfig.MyMACAddr.v[4], AppConfig.MyMACAddr.v[5]); size_t i = 0; // in the following while loop, all lower case letters have been changed to upper case ones // because browser automatically translates lower case letters to upper case while (i < sizeof (AppConfig.NetBIOSName)) { if (((*((char *) AppConfig.NetBIOSName + i)) >= 'a') & ((*((char *) AppConfig.NetBIOSName + i)) <= 'z')) { *((char *) AppConfig.NetBIOSName + i) = *((char *) AppConfig.NetBIOSName + i) - 32; } else if (*((char *) AppConfig.NetBIOSName + i) == '\0') break; i++; } FormatNetBIOSName(AppConfig.NetBIOSName); } AppConfig.SsidLength = strlen((char *) (AppConfig.MySSID)); WF_CPSetSsid(ConnectionProfileID, AppConfig.MySSID, AppConfig.SsidLength); WF_CPSetNetworkType(ConnectionProfileID, AppConfig.networkType); if (AppConfig.networkType == WF_ADHOC) { WF_CPSetAdHocBehavior(ConnectionProfileID, WF_ADHOC_CONNECT_THEN_START); } #if !defined(MRF24WG) Delay10us(10); /* required for MRF24WB */ #endif #if WF_HOST_DERIVE_KEY_FROM_PASSPHRASE == WF_ENABLED if (AppConfig.SecurityMode == WF_SECURITY_WPA_AUTO_WITH_PASS_PHRASE) { WF_ConvPassphraseToKey(AppConfig.SecurityKeyLength, AppConfig.SecurityKey, AppConfig.SsidLength, AppConfig.MySSID); AppConfig.SecurityMode--; AppConfig.SecurityKeyLength = 32; AppConfig.passPhraseToKeyFlag = 1; } #endif /* #if WF_HOST_DERIVE_KEY_FROM_PASSPHRASE == WF_ENABLED */ switch (AppConfig.SecurityMode) { case WF_SECURITY_OPEN: WF_CPSetSecurity(ConnectionProfileID, WF_SECURITY_OPEN, 0, NULL, 0); break; case WF_SECURITY_WEP_40: // assume key 0 WF_CPSetSecurity(ConnectionProfileID, AppConfig.SecurityMode, 0, AppConfig.SecurityKey, 5); break; case WF_SECURITY_WEP_104: // assume key 0 WF_CPSetSecurity(ConnectionProfileID, AppConfig.SecurityMode, 0, AppConfig.SecurityKey, 13); break; case WF_SECURITY_WPA_AUTO_WITH_KEY: WF_CPSetSecurity(ConnectionProfileID, WF_SECURITY_WPA_AUTO_WITH_KEY, 0, AppConfig.SecurityKey, 32); break; default: WF_ASSERT(false); break; } WF_CASetScanType(MY_DEFAULT_SCAN_TYPE); if (((CFGCXT.type != WF_SOFT_AP)&&(CFGCXT.prevWLAN == WF_SOFT_AP)) || (AppConfig.networkType != WF_SOFT_AP)) { WF_CASetChannelList(channelList_postscan, sizeof (channelList_postscan)); } else { WF_CASetChannelList(channelList, sizeof (channelList)); } // The Retry Count parameter tells the WiFi Connection manager how many attempts to make when trying // to connect to an existing network. In the Infrastructure case, the default is to retry forever so that // if the AP is turned off or out of range, the radio will continue to attempt a connection until the // AP is eventually back on or in range. In the Adhoc case, the default is to retry 3 times since the // purpose of attempting to establish a network in the Adhoc case is only to verify that one does not // initially exist. If the retry count was set to WF_RETRY_FOREVER in the AdHoc mode, an AdHoc network // would never be established. The constants MY_DEFAULT_LIST_RETRY_COUNT_ADHOC and // MY_DEFAULT_LIST_RETRY_COUNT_INFRASTRUCTURE have been created specifically for the June 2011 MAL release. if ((AppConfig.networkType == CFG_WF_ADHOC) || (AppConfig.networkType == CFG_WF_SOFT_AP)) { WF_CASetListRetryCount(ADHOC_RETRY_COUNT); } else /* AppConfig.networkType == CFG_WF_INFRASTRUCTURE */ { WF_CASetListRetryCount(MY_DEFAULT_LIST_RETRY_COUNT_INFRASTRUCTURE); } WF_CASetEventNotificationAction(MY_DEFAULT_EVENT_NOTIFICATION_LIST); #if defined(WF_USE_POWER_SAVE_FUNCTIONS) #if (MY_DEFAULT_PS_POLL == WF_ENABLED) WF_PsPollEnable(true); #else WF_PsPollDisable(); #endif #endif WF_CASetBeaconTimeout(MY_DEFAULT_BEACON_TIMEOUT); #if defined(STACK_USE_UART) WF_OutputConnectionInfo(&AppConfig); #endif if (AppConfig.networkType == CFG_WF_SOFT_AP) { #if (WF_SOFTAP_SEND_KEEP_ALIVE == WF_ENABLED) WF_SetLinkDownThreshold(WF_SOFTAP_LINK_LOST_THRESHOLD); #endif } else { // AppConfig.networkType != CFG_WF_SOFT_AP #if (WF_CHECK_LINK_STATUS == WF_ENABLED) WF_SetLinkDownThreshold(WF_LINK_LOST_THRESHOLD); #endif } // Initiates connection to BSS WF_CMConnect(ConnectionProfileID); }
/***************************************************************************** * FUNCTION: WF_Connect * * RETURNS: None * * PARAMS: None * * NOTES: Connects to an 802.11 network. Customize this function as needed * for your application. *****************************************************************************/ static void WF_Connect(void) { UINT8 ConnectionProfileID; UINT8 channelList[] = MY_DEFAULT_CHANNEL_LIST; #if defined(WF_USE_POWER_SAVE_FUNCTIONS) BOOL PsPollEnabled; #endif /* create a Connection Profile */ WF_CPCreate(&ConnectionProfileID); #if defined(STACK_USE_UART) putrsUART("Set SSID ("); putsUART(AppConfig.MySSID); putrsUART(")\r\n"); #endif WF_CPSetSsid(ConnectionProfileID, AppConfig.MySSID, AppConfig.SsidLength); #if defined(STACK_USE_UART) putrsUART("Set Network Type\r\n"); #endif WF_CPSetNetworkType(ConnectionProfileID, AppConfig.networkType); if (AppConfig.networkType == WF_ADHOC) { WF_CPSetAdHocBehavior(ConnectionProfileID, WF_ADHOC_CONNECT_THEN_START); } #if defined(STACK_USE_UART) putrsUART("Set Security\r\n"); #endif switch(AppConfig.SecurityMode) { case WF_SECURITY_OPEN: WF_CPSetSecurity(ConnectionProfileID, WF_SECURITY_OPEN, 0, NULL, 0); break; case WF_SECURITY_WEP_40: // assume key 0 WF_CPSetSecurity(ConnectionProfileID, AppConfig.SecurityMode, 0, AppConfig.SecurityKey, 5); break; case WF_SECURITY_WEP_104: // assume key 0 WF_CPSetSecurity(ConnectionProfileID, AppConfig.SecurityMode, 0, AppConfig.SecurityKey, 13); break; case WF_SECURITY_WPA_AUTO_WITH_PASS_PHRASE: WF_CPSetSecurity(ConnectionProfileID, WF_SECURITY_WPA_AUTO_WITH_PASS_PHRASE, 0, AppConfig.SecurityKey, strlen((char*)AppConfig.SecurityKey)); break; case WF_SECURITY_WPA_AUTO_WITH_KEY: WF_CPSetSecurity(ConnectionProfileID, WF_SECURITY_WPA_AUTO_WITH_KEY, 0, AppConfig.SecurityKey, 32); break; default: { } //#if defined(STACK_USE_UART) // putrsUART("\r\n\r\nCaptain this should NOT happen.\r\n\r\n"); //#endif } #if defined(STACK_USE_UART) putrsUART("Set Scan Type\r\n"); #endif WF_CASetScanType(MY_DEFAULT_SCAN_TYPE); #if defined(STACK_USE_UART) putrsUART("Set Channel List\r\n"); #endif WF_CASetChannelList(channelList, sizeof(channelList)); #if defined(STACK_USE_UART) putrsUART("Set list retry count\r\n"); #endif WF_CASetListRetryCount(MY_DEFAULT_LIST_RETRY_COUNT); #if defined(STACK_USE_UART) putrsUART("Set Event Notify\r\n"); #endif WF_CASetEventNotificationAction(MY_DEFAULT_EVENT_NOTIFICATION_LIST); #if defined(WF_USE_POWER_SAVE_FUNCTIONS) PsPollEnabled = (MY_DEFAULT_PS_POLL == WF_ENABLED); if (!PsPollEnabled) { /* disable low power (PS-Poll) mode */ #if defined(STACK_USE_UART) putrsUART("Disable PS-Poll\r\n"); #endif WF_PsPollDisable(); } else { /* Enable low power (PS-Poll) mode */ #if defined(STACK_USE_UART) putrsUART("Enable PS-Poll\r\n"); #endif WF_PsPollEnable(TRUE); } #endif #if defined(STACK_USE_UART) putrsUART("Set Beacon Timeout\r\n"); #endif WF_CASetBeaconTimeout(40); #if defined(STACK_USE_UART) putrsUART("Start WiFi Connect\r\n"); #endif WF_CMConnect(ConnectionProfileID); }
/***************************************************************************** * FUNCTION: WF_Connect * * RETURNS: None * * PARAMS: None * * NOTES: Connects to an 802.11 network. Customize this function as needed * for your application. *****************************************************************************/ void WF_Connect(void) { //UINT8 ConnectionProfileID; UINT8 channelList[] = MY_DEFAULT_CHANNEL_LIST; #if (MY_DEFAULT_NETWORK_TYPE == WF_SOFT_AP) UINT8 channelList_postscan[] = MY_DEFAULT_CHANNEL_LIST_POSTSCAN; #endif /* create a Connection Profile */ WF_CPCreate(&ConnectionProfileID); WF_SetRegionalDomain(MY_DEFAULT_DOMAIN); WF_CPSetSsid(ConnectionProfileID, AppConfig.MySSID, AppConfig.SsidLength); WF_CPSetNetworkType(ConnectionProfileID, AppConfig.networkType); if (AppConfig.networkType == WF_ADHOC) { WF_CPSetAdHocBehavior(ConnectionProfileID, WF_ADHOC_CONNECT_THEN_START); } #if !defined(MRF24WG) // Delay10us(10); //If necessary, give time to Roadrunner to clean message buffer, because Security message is a big data package #endif switch(AppConfig.SecurityMode) { case WF_SECURITY_OPEN: WF_CPSetSecurity(ConnectionProfileID, WF_SECURITY_OPEN, 0, NULL, 0); break; case WF_SECURITY_WEP_40: // assume key 0 WF_CPSetSecurity(ConnectionProfileID, AppConfig.SecurityMode, 0, AppConfig.SecurityKey, 5); break; case WF_SECURITY_WEP_104: // assume key 0 WF_CPSetSecurity(ConnectionProfileID, AppConfig.SecurityMode, 0, AppConfig.SecurityKey, 13); break; case WF_SECURITY_WPA_AUTO_WITH_PASS_PHRASE: WF_CPSetSecurity(ConnectionProfileID, WF_SECURITY_WPA_AUTO_WITH_PASS_PHRASE, 0, AppConfig.SecurityKey, strlen((char*)AppConfig.SecurityKey)); break; case WF_SECURITY_WPA_AUTO_WITH_KEY: WF_CPSetSecurity(ConnectionProfileID, WF_SECURITY_WPA_AUTO_WITH_KEY, 0, AppConfig.SecurityKey, 32); break; default: putrsUART("\r\n\r\nCaptain this should NOT happen.\r\n\r\n"); } WF_CASetScanType(MY_DEFAULT_SCAN_TYPE); #if (MY_DEFAULT_NETWORK_TYPE == WF_SOFT_AP) if (((CFGCXT.type!=WF_SOFT_AP)&&(CFGCXT.prevWLAN==WF_SOFT_AP)) || (AppConfig.networkType!=WF_SOFT_AP)) { // putrsUART("\r\n\r\nWF_Connect: Channel list update when transitioning from SoftAP to non-SoftAP or NOT in SoftAP..\r\n\r\n"); WF_CASetChannelList(channelList_postscan, sizeof(channelList_postscan)); } else { WF_CASetChannelList(channelList, sizeof(channelList)); } #else WF_CASetChannelList(channelList, sizeof(channelList)); #endif // (MY_DEFAULT_NETWORK_TYPE == WF_SOFT_AP) // The Retry Count parameter tells the WiFi Connection manager how many attempts to make when trying // to connect to an existing network. In the Infrastructure case, the default is to retry forever so that // if the AP is turned off or out of range, the radio will continue to attempt a connection until the // AP is eventually back on or in range. In the Adhoc case, the default is to retry 3 times since the // purpose of attempting to establish a network in the Adhoc case is only to verify that one does not // initially exist. If the retry count was set to WF_RETRY_FOREVER in the AdHoc mode, an AdHoc network // would never be established. The constants MY_DEFAULT_LIST_RETRY_COUNT_ADHOC and // MY_DEFAULT_LIST_RETRY_COUNT_INFRASTRUCTURE have been created specifically for the June 2011 MAL release. WF_CASetListRetryCount(ADHOC_RETRY_COUNT); WF_CASetEventNotificationAction(MY_DEFAULT_EVENT_NOTIFICATION_LIST); #if defined(WF_USE_POWER_SAVE_FUNCTIONS) #if (MY_DEFAULT_PS_POLL == WF_ENABLED) WF_PsPollEnable(TRUE); #else WF_PsPollDisable(); #endif #endif WF_CASetBeaconTimeout(MY_DEFAULT_BEACON_TIMEOUT); #if defined(STACK_USE_UART) WF_OutputConnectionInfo(&AppConfig); #endif #if (SOFTAP_CHECK_LINK_STATUS == WF_ENABLED) WF_SetLinkDownThreshold(SOFTAP_LINK_FAILURE_THRESHOLD); #endif WF_CMConnect(ConnectionProfileID); }
/***************************************************************************** * FUNCTION: WF_Connect * * RETURNS: None * * PARAMS: None * * NOTES: Connects to an 802.11 network. Customize this function as needed * for your application. *****************************************************************************/ void WF_Connect(void) { //UINT8 ConnectionProfileID; UINT8 channelList[] = MY_DEFAULT_CHANNEL_LIST; /* create a Connection Profile */ WF_CPCreate(&ConnectionProfileID); WF_SetRegionalDomain(MY_DEFAULT_DOMAIN); WF_CPSetSsid(ConnectionProfileID, AppConfig.MySSID, AppConfig.SsidLength); #if defined(WF_USE_HIDDEN_SSID) WF_CPSetSsidType(ConnectionProfileID, FALSE); #endif WF_CPSetNetworkType(ConnectionProfileID, AppConfig.networkType); if (AppConfig.networkType == WF_ADHOC) { WF_CPSetAdHocBehavior(ConnectionProfileID, WF_ADHOC_CONNECT_THEN_START); } switch(AppConfig.SecurityMode) { case WF_SECURITY_OPEN: WF_CPSetSecurity(ConnectionProfileID, WF_SECURITY_OPEN, 0, NULL, 0); break; case WF_SECURITY_WEP_40: // assume key 0 WF_CPSetSecurity(ConnectionProfileID, AppConfig.SecurityMode, 0, AppConfig.SecurityKey, 5); break; case WF_SECURITY_WEP_104: // assume key 0 WF_CPSetSecurity(ConnectionProfileID, AppConfig.SecurityMode, 0, AppConfig.SecurityKey, 13); break; case WF_SECURITY_WPA_AUTO_WITH_PASS_PHRASE: WF_CPSetSecurity(ConnectionProfileID, WF_SECURITY_WPA_AUTO_WITH_PASS_PHRASE, 0, AppConfig.SecurityKey, strlen((char*)AppConfig.SecurityKey)); break; case WF_SECURITY_WPA_AUTO_WITH_KEY: WF_CPSetSecurity(ConnectionProfileID, WF_SECURITY_WPA_AUTO_WITH_KEY, 0, AppConfig.SecurityKey, 32); break; default: putrsUART("\r\n\r\nCaptain this should NOT happen.\r\n\r\n"); } WF_CASetScanType(MY_DEFAULT_SCAN_TYPE); WF_CASetChannelList(channelList, sizeof(channelList)); // The Retry Count parameter tells the WiFi Connection manager how many attempts to make when trying // to connect to an existing network. In the Infrastructure case, the default is to retry forever so that // if the AP is turned off or out of range, the radio will continue to attempt a connection until the // AP is eventually back on or in range. In the Adhoc case, the default is to retry 3 times since the // purpose of attempting to establish a network in the Adhoc case is only to verify that one does not // initially exist. If the retry count was set to WF_RETRY_FOREVER in the AdHoc mode, an AdHoc network // would never be established. The constants MY_DEFAULT_LIST_RETRY_COUNT_ADHOC and // MY_DEFAULT_LIST_RETRY_COUNT_INFRASTRUCTURE have been created specifically for the June 2011 MAL release. WF_CASetListRetryCount(ADHOC_RETRY_COUNT); WF_CASetEventNotificationAction(MY_DEFAULT_EVENT_NOTIFICATION_LIST); #if defined(WF_USE_POWER_SAVE_FUNCTIONS) #if (MY_DEFAULT_PS_POLL == WF_ENABLED) WF_PsPollEnable(TRUE); #else WF_PsPollDisable(); #endif #endif WF_CASetBeaconTimeout(MY_DEFAULT_BEACON_TIMEOUT); #if defined(STACK_USE_UART) WF_OutputConnectionInfo(&AppConfig); #endif WF_CMConnect(ConnectionProfileID); }
/***************************************************************************** Function: static HTTP_IO_RESULT HTTPPostWifiConfig(void) Summary: Processes the wifi config data Description: Accepts wireless configuration data from the www site and saves them to a structure to be applied by the ZG configuration manager. The following configurations are possible: i) Mode: adhoc or infrastructure ii) Security: - None - WPA/WPA2 passphrase - WPA/WPA2 pre-calculated key - WEP 64-bit - WEP 128-bit iii) Key material If an error occurs, such as data is invalid they will be redirected to a page informing the user of such results. NOTE: This code for modified originally from HTTPPostWifiConfig as distributed by Microchip. Precondition: None Parameters: None Return Values: HTTP_IO_DONE - all parameters have been processed HTTP_IO_NEED_DATA - data needed by this function has not yet arrived ***************************************************************************/ static HTTP_IO_RESULT HTTPPostWifiConfig(void) { // Check to see if the browser is attempting to submit more data than we // can parse at once. This function needs to receive all updated // parameters and validate them all before committing them to memory so that // orphaned configuration parameters do not get written (for example, if a // static IP address is given, but the subnet mask fails parsing, we // should not use the static IP address). Everything needs to be processed // in a single transaction. If this is impossible, fail and notify the user. // As a web devloper, if you add parameters to AppConfig and run into this // problem, you could fix this by to splitting your update web page into two // seperate web pages (causing two transactional writes). Alternatively, // you could fix it by storing a static shadow copy of AppConfig someplace // in memory and using it instead of newAppConfig. Lastly, you could // increase the TCP RX FIFO size for the HTTP server. This will allow more // data to be POSTed by the web browser before hitting this limit. UINT8 ConnectionProfileID; UINT8 ConnectionState; UINT8 ssidLen; WF_CMGetConnectionState(&ConnectionState, &ConnectionProfileID); if(curHTTP.byteCount > TCPIsGetReady(sktHTTP) + TCPGetRxFIFOFree(sktHTTP)) goto ConfigFailure; // Ensure that all data is waiting to be parsed. If not, keep waiting for // all of it to arrive. if(TCPIsGetReady(sktHTTP) < curHTTP.byteCount) return HTTP_IO_NEED_DATA; // Read all browser POST data while(curHTTP.byteCount) { // Read a form field name if(HTTPReadPostName(curHTTP.data, 6) != HTTP_READ_OK) goto ConfigFailure; // Read a form field value if(HTTPReadPostValue(curHTTP.data + 6, sizeof(curHTTP.data)-6-2) != HTTP_READ_OK) goto ConfigFailure; // Parse the value that was read // Read security type if(!strcmppgm2ram((char*)curHTTP.data, "sec")) { char security_type[7]; if (strlen((char*)(curHTTP.data+6)) > 6) /* Sanity check */ goto ConfigFailure; memcpy(security_type, (void*)(curHTTP.data+6), strlen((char*)(curHTTP.data+6))); security_type[strlen((char*)(curHTTP.data+6))] = 0; /* Terminate string */ printf("\r\nSecurity Mode: "); if (!strcmppgm2ram((char*)security_type, "no")) { CFGCXT.security = WF_SECURITY_OPEN; printf("OPEN"); } else if(!strcmppgm2ram((char*)security_type, "wpa")) { CFGCXT.security = WF_SECURITY_WPA_AUTO_WITH_PASS_PHRASE; printf("WPA w/PASSPHRASE"); } else if(!strcmppgm2ram((char*)security_type, "calc")) { /* Pre-calculated key */ CFGCXT.security = WF_SECURITY_WPA_AUTO_WITH_KEY; printf("WPA w/AUTO Key"); } else if(!strcmppgm2ram((char*)security_type, "wep40")) { CFGCXT.security = WF_SECURITY_WEP_40; printf("WEP 64-bit"); } else if(!strcmppgm2ram((char*)security_type, "wep104")) { CFGCXT.security = WF_SECURITY_WEP_104; printf("WEP 128-bit"); } else { //Security type no good :-( printf("\r\nUnknown key type!"); goto ConfigFailure; } } // Read new Security Key /* else if(!strcmppgm2ram((char*)curHTTP.data, "key")) { BYTE key_size = 0, ascii_key = 0; switch ((BYTE)CFGCXT.security) { case WF_SECURITY_OPEN: //keep compiler happy, nothing to do here! break; case WF_SECURITY_WPA_AUTO_WITH_PASS_PHRASE: //wpa passphrase printf("\r\nPassphrase type of key! "); ascii_key = 1; key_size = strlen((char *)(curHTTP.data+6)); //between 8-63 characters, passphrase if ((key_size < 8 ) || (key_size > 63)) goto ConfigFailure; break; case WF_SECURITY_WPA_AUTO_WITH_KEY: //wpa pre-calculated key!!! key_size = 64; break; case WF_SECURITY_WEP_40: key_size = 10; // Assume hex size if (strlen((char *)(curHTTP.data+6)) == 5) { key_size = 5; // ASCII key support ascii_key = 1; } CFGCXT.defaultWepKey = 0; // Example uses only key idx 0 (sometimes called 1) break; case WF_SECURITY_WEP_104: key_size = 26; // Assume hex size if (strlen((char *)(curHTTP.data+6)) == 13) { key_size = 13; // ASCII key support ascii_key = 1; } CFGCXT.defaultWepKey = 0; // Example uses only key idx 0 (sometimes called 1) break; default: break; } if (strlen((char *)(curHTTP.data + 6)) != key_size) { printf("\r\nIncomplete key received! "); goto ConfigFailure; } memcpy(CFGCXT.key, (void*)(curHTTP.data+6), key_size); CFGCXT.key[key_size] = 0; // terminate string if (!ascii_key) { //if ((cfg.security == sec_wep64) || (cfg.security == sec_wep128)) key_size /= 2; if (!convertAsciiToHexInPlace((INT8 *)&CFGCXT.key[0], key_size)) { printf("\r\nFailed to convert ASCII to hex! "); goto ConfigFailure; } } } */ // Get new ssid and make sure it is valid else if(!strcmppgm2ram((char*)curHTTP.data, "ssid")) { if(strlen((char*)(curHTTP.data+6)) < 33u) { memcpy(CFGCXT.ssid, (void*)(curHTTP.data+6), strlen((char*)(curHTTP.data+6))); CFGCXT.ssid[strlen((char*)(curHTTP.data+6))] = 0; /* Terminate string */ /* save current profile SSID for displaying later */ WF_CPGetSsid(ConnectionProfileID, (UINT8*)&CFGCXT.prevSSID, &ssidLen); CFGCXT.prevSSID[ssidLen] = 0; printf("\r\nSSID: %s",CFGCXT.ssid); } else { //Invalid SSID... fail :-( printf("\r\nInvalid SSID...! "); goto ConfigFailure; } } // Get the wlan mode: adhoc or infrastructure else if(!strcmppgm2ram((char*)curHTTP.data, (ROM char*)"wlan")) { char mode[6]; if (strlen((char*)(curHTTP.data+6)) > 5) /* Sanity check */ goto ConfigFailure; memcpy(mode, (void*)(curHTTP.data+6), strlen((char*)(curHTTP.data+6))); mode[strlen((char*)(curHTTP.data+6))] = 0; /* Terminate string */ if(!strcmppgm2ram((char*)mode, (ROM char*)"infra")) { printf("\r\nSetting mode to infrastructure! "); CFGCXT.type = WF_INFRASTRUCTURE; } else if(!strcmppgm2ram((char*)mode, "adhoc")) { printf("\r\nSetting mode to adhoc! "); CFGCXT.type = WF_ADHOC; // Always setup adhoc to attempt to connect first, then start WF_CPSetAdHocBehavior(ConnectionProfileID, WF_ADHOC_CONNECT_THEN_START); } else { //Mode type no good :-( printf("\r\nConfig WLAN Mode Failure! "); goto ConfigFailure; } // save old WLAN mode WF_CPGetNetworkType(ConnectionProfileID, &CFGCXT.prevWLAN); } } /* Check if WPA hasn't been selected with adhoc, if it has we choke! */ if ((CFGCXT.type == WF_ADHOC) && ((CFGCXT.security == WF_SECURITY_WPA_AUTO_WITH_PASS_PHRASE) || (CFGCXT.security == WF_SECURITY_WPA_AUTO_WITH_KEY))) goto ConfigFailure; /* * All parsing complete! If we have got to here all data has been validated and * we can handle what is necessary to start the reconfigure process of the WiFi device */ // Copy wifi cfg data to be committed memcpy(CPElements.ssid, CFGCXT.ssid, strlen((char*)(CFGCXT.ssid))); CPElements.ssidLength = strlen((char*)(CFGCXT.ssid)); /* Going to set security type */ CPElements.securityType = CFGCXT.security; /* Going to save the key, if required */ if (CFGCXT.security != WF_SECURITY_OPEN) { BYTE key_size =0; switch ((BYTE)CFGCXT.security) { case WF_SECURITY_WPA_AUTO_WITH_PASS_PHRASE: //wpa passphrase key_size = strlen((char*)(CFGCXT.key)); //ascii so use strlen break; case WF_SECURITY_WPA_AUTO_WITH_KEY: //wpa pre-calculated key!!! key_size = 32; break; case WF_SECURITY_WEP_40: key_size = 5; break; case WF_SECURITY_WEP_104: key_size = 13; break; } memcpy(CPElements.securityKey, CFGCXT.key, key_size); CPElements.securityKey[strlen((char*)(CFGCXT.key))] = 0; } /* Going to save the network type */ CPElements.networkType = CFGCXT.type; // Set the board to reboot and display reconnecting information strcpypgm2ram((char*)curHTTP.data, "/reconnect.htm"); curHTTP.httpStatus = HTTP_REDIRECT; /* * Set state here to inform that the Wifi device has config data and it is ready * to be acted upon. */ printf("\r\nFlagging to start config change!\r\n"); WF_START_EASY_CONFIG(); return HTTP_IO_DONE; ConfigFailure: //!lastFailure = TRUE; strcpypgm2ram((char*)curHTTP.data, "/error.htm"); curHTTP.httpStatus = HTTP_REDIRECT; return HTTP_IO_DONE; }