/***************************************************************************** * FUNCTION: do_iwpriv_cmd * * RETURNS: None * * PARAMS: None * * NOTES: Responds to the user invoking ifconfig *****************************************************************************/ tZGVoidReturn do_iwpriv_cmd(tZGVoidInput) { tZGU8 i; tZGU8 temp; tZGBool cont_parse; tZGS8* ptrString; gLineParseState = kZGWaitingForParamKeyword; // if user only typed in iwpriv with no other parameters if (ARGC == 1u) { IwprivDisplayStatus(); } // else loop through each parameter else { // parse each param and set state variables for (i = 1; i < ARGC; ++i) { switch (gLineParseState) { case kZGWaitingForParamKeyword: if ( !getParam(i) ) { return; } break; case kZGWaitingForWpaPsk: /* Can only set security in idle state */ if ( ZG_IS_CONNECTED() == kZGBoolTrue ) { ZG_PUTRSUART("Security context may only be set in idle state\n\r"); return; } /* The ARGV buffer is modified in place */ if ( !ExtractandValidateWpaPSK( ARGV[i] ) ) { ZG_PUTRSUART("WPA PSK must be exactly 64 bytes\n\r"); return; } ZG_SET_WPAPSK( (tZGU8Ptr) ARGV[i] ); gLineParseState = kZGWaitingForParamKeyword; break; case kZGWaitingForWpaStr: /* Can only set security in idle state */ if ( ZG_IS_CONNECTED() == kZGBoolTrue ) { ZG_PUTRSUART("Security context may only be set in idle state\n\r"); return; } ptrString = ARGV[i++]; /* if the start char is found, gobble that char */ if ( (cont_parse = ExtractWpaStrStart(ptrString)) == kZGBoolTrue) { ptrString++; } /* this code concats tokens together with whitespace */ /* until no more tokens or the EOS " char is found */ while ( cont_parse && (i++ < ARGC)) { cont_parse = ExtractWpaStrEnd( ptrString ); } /* if the EOS char is not found then cont parse is true */ if (cont_parse) { ZG_PUTRSUART("Passphrase missing EOS '\"' \n\r"); return; } /* temp contains the string length after call */ if ( !ValidateWpaStr(&ptrString, &temp) ) { ZG_PUTRSUART("Passphrase must be between 8 and 63 chars\n\r"); return; } ZG_SET_WPA_PASSPHRASE( ptrString, temp ); gLineParseState = kZGWaitingForParamKeyword; break; case kZGWaitingForEnc: /* Can only set security in idle state */ if ( ZG_IS_CONNECTED() == kZGBoolTrue ) { ZG_PUTRSUART("Security context may only be set in idle state\n\r"); return; } /* temp contains the encryption type enum */ if ( !ExtractandValidateEncType(ARGV[i], &temp) ) { ZG_PUTRSUART("Invalid encyption type\n\r"); return; } ZG_SET_ENC_TYPE( temp ); gLineParseState = kZGWaitingForParamKeyword; break; case kZGWaitingForWepAuth: /* Can only set security in idle state */ if ( ZG_IS_CONNECTED() == kZGBoolTrue ) { ZG_PUTRSUART("Security context may only be set in idle state\n\r"); return; } /* temp contains the Wep Auth type enum */ if ( !ExtractandValidateAuthType(ARGV[i], &temp) ) { ZG_PUTRSUART("Invalid WEP Auth type\n\r"); return; } ZG_SET_AUTH_TYPE( temp ); gLineParseState = kZGWaitingForParamKeyword; break; case kZGWaitingForWepKey: /* Can only set security in idle state */ if ( ZG_IS_CONNECTED() == kZGBoolTrue ) { ZG_PUTRSUART("Security context may only be set in idle state\n\r"); return; } /* temp contains the active WEP key index 1 of 4 */ if ( !ExtractandValidateWepIndex(ARGV[i], &temp) ) { ZG_PUTRSUART("Invalid WEP key index\n\r"); return; } /* check for a 3rd optional parameter */ if ( (i+1 < ARGC) && (getParamType(ARGV[i+1]) == kZGUnknownParam) ) { i++; /* advance to the optional param */ /* The ARGV buffer is modified in place */ if ( ExtractandValidateWepLong( ARGV[i] ) ) { ZG_SET_WEP_KEY_LONG( (tZGU8Ptr) ARGV[i], temp ); } else if ( ExtractandValidateWepShort( ARGV[i] ) ) { ZG_SET_WEP_KEY_SHORT( (tZGU8Ptr) ARGV[i], temp ); } else { ZG_PUTRSUART("\n\rWarning, 64/128bit WEP key format not valid \n\r\t"); return; } } ZG_SET_WEP_ACTIVE_INDEX(temp); gLineParseState = kZGWaitingForParamKeyword; break; default: ZGSYS_MODULE_ASSERT(2, (ROM FAR char*)"iwpriv param"); break; } // end switch } // end for } switch (gLineParseState) { case kZGWaitingForBeacon: // Send an untampered frame that looks like a Beacon. iwpriv_beacon(); gLineParseState = kZGWaitingForParamKeyword; break; default: //do nothing break; } if (gLineParseState != (tZGU8)kZGWaitingForParamKeyword) { ZG_PUTRSUART("Missing value after last parameter\n\r"); } }
/***************************************************************************** * FUNCTION: do_ifconfig_cmd * * RETURNS: None * * PARAMS: None * * NOTES: Responds to the user invoking ifconfig *****************************************************************************/ tZGVoidReturn do_ifconfig_cmd(tZGVoidInput) { tZGU8 i; tZGU8 address[6]; #if defined(ZG_CONFIG_DHCP) && defined(STACK_USE_DHCP_CLIENT) tZGU16 tmp[4]; // uip requires these be 2-byte words. #endif gLineParseState = kZGWaitingForParamKeyword; // if user only typed in ifconfig with no other parameters if (ARGC == 1u) { IfconfigDisplayStatus(); } // else if 2 arguments and the second arg is IP address else if ( (ARGC == 2u) && (isIPAddress(ARGV[1], address)) ) { if ( ZG_GET_DHCP_STATE() == DHCP_ENABLED ) { sprintf( (char *) g_ConsoleContext.txBuf, "Static IP address should not be set with DHCP enabled.\n\r"); ZG_PUTSUART( (char *) g_ConsoleContext.txBuf ); return; } AppConfig.MyIPAddr.v[0] = address[0]; AppConfig.MyIPAddr.v[1] = address[1]; AppConfig.MyIPAddr.v[2] = address[2]; AppConfig.MyIPAddr.v[3] = address[3]; /* Microchip DHCP client clobbers static ip on every iteration of loop, even if dhcp is turned off*/ AppConfig.DefaultIPAddr.v[0] = address[0]; AppConfig.DefaultIPAddr.v[1] = address[1]; AppConfig.DefaultIPAddr.v[2] = address[2]; AppConfig.DefaultIPAddr.v[3] = address[3]; #ifdef USE_LCD LCDDisplayIPValue(AppConfig.MyIPAddr); #endif } // else if 2 args and second arg is MAC address else if ( (ARGC == 2u) && isMacAddress(ARGV[1], address)) { /* Can only set MAC address in idle state */ if ( ZG_IS_CONNECTED() == kZGBoolTrue ) { sprintf( (char *) g_ConsoleContext.txBuf, "HW MAC address can only be set in idle mode"); ZG_PUTSUART( (char *) g_ConsoleContext.txBuf ); return; } /* update G2100 */ ZG_SET_MAC_ADDR( address ); } // else loop through each parameter else { // parse each param and set state variables for (i = 1; i < ARGC; ++i) { switch (gLineParseState) { case kZGWaitingForParamKeyword: if ( !getParam(i) ) { return; } break; case kZGWaitingForNetmaskValue: if ( ZG_GET_DHCP_STATE() == DHCP_ENABLED ) { sprintf( (char *) g_ConsoleContext.txBuf, "The Netmask should not be set with DHCP enabled.\n\r"); ZG_PUTSUART( (char *) g_ConsoleContext.txBuf ); return; } if ( !isIPAddress(ARGV[i], address) ) { sprintf( (char *) g_ConsoleContext.txBuf, "Invalid netmask value"); ZG_PUTSUART( (char *) g_ConsoleContext.txBuf ); return; } AppConfig.MyMask.v[0] = address[0]; AppConfig.MyMask.v[1] = address[1]; AppConfig.MyMask.v[2] = address[2]; AppConfig.MyMask.v[3] = address[3]; /* Microchip DHCP client clobbers static netmask on every iteration of loop, even if dhcp is turned off*/ AppConfig.DefaultMask.v[0] = address[0]; AppConfig.DefaultMask.v[1] = address[1]; AppConfig.DefaultMask.v[2] = address[2]; AppConfig.DefaultMask.v[3] = address[3]; gLineParseState = kZGWaitingForParamKeyword; break; #if defined(ZG_CONFIG_DHCP) && defined(STACK_USE_DHCP_CLIENT) case kZGWaitingForDHCP: /* buf[4] contains DHCP enable/disable enum */ if ( !ExtractandValidateDHCP(ARGV[i], (tZGU8 *) &tmp[0]) ) { return; } ZG_SET_DHCP_STATE( (tZGBool) tmp[0] ); gLineParseState = kZGWaitingForParamKeyword; break; #endif case kZGWaitingForGateway: if ( !isIPAddress(ARGV[i], address) ) { sprintf( (char *) g_ConsoleContext.txBuf, "Invalid gateway value"); ZG_PUTSUART( (char *) g_ConsoleContext.txBuf ); return; } AppConfig.MyGateway.v[0] = address[0]; AppConfig.MyGateway.v[1] = address[1]; AppConfig.MyGateway.v[2] = address[2]; AppConfig.MyGateway.v[3] = address[3]; // There is no such thing as AppConfig.DefaultGateway gLineParseState = kZGWaitingForParamKeyword; break; } // end switch // ZGConsolePrintf("%s ", ARGV[i]); } // end for } if (gLineParseState != (tZGU8)kZGWaitingForParamKeyword) { sprintf( (char *) g_ConsoleContext.txBuf, "Missing value after last parameter"); ZG_PUTSUART( (char *) g_ConsoleContext.txBuf ); } }