From 04588330726547fd10e1f9df05580fc29da0e0e4 Mon Sep 17 00:00:00 2001 From: Matt Anderson Date: Sun, 26 Apr 2015 08:34:01 -0400 Subject: [PATCH] cc3200: Make telnet login procedure work with Tera Term. This is actually a workaround Ter Term's issue of not obeying to the telnet options that the server is sending. Therefore, we must buffer chars until either a '\r' or the max length of the username/password is received. --- cc3200/Makefile | 2 +- cc3200/ftp/ftp.c | 13 +++++----- cc3200/serverstask.c | 15 +++++------- cc3200/serverstask.h | 7 +++--- cc3200/telnet/telnet.c | 55 ++++++++++++++++++++++++++++++------------ 5 files changed, 57 insertions(+), 35 deletions(-) diff --git a/cc3200/Makefile b/cc3200/Makefile index 29318d44ec..cdc6bddb1d 100644 --- a/cc3200/Makefile +++ b/cc3200/Makefile @@ -16,7 +16,7 @@ include ../py/mkenv.mk CROSS_COMPILE ?= arm-none-eabi- CFLAGS_CORTEX_M4 = -mthumb -mtune=cortex-m4 -march=armv7e-m -mabi=aapcs -mcpu=cortex-m4 -msoft-float -mfloat-abi=soft -fsingle-precision-constant -Wdouble-promotion -CFLAGS = -Wall -Wpointer-arith -Werror -ansi -std=gnu99 -nostdlib $(CFLAGS_CORTEX_M4) +CFLAGS = -Wall -Wpointer-arith -Werror -ansi -std=gnu99 -nostdlib -lgcc $(CFLAGS_CORTEX_M4) CFLAGS += -g -ffunction-sections -fdata-sections -fno-common -fsigned-char -mno-unaligned-access CFLAGS += -Iboards/$(BOARD) diff --git a/cc3200/ftp/ftp.c b/cc3200/ftp/ftp.c index 8a2afa2728..ebc9dcd9a0 100644 --- a/cc3200/ftp/ftp.c +++ b/cc3200/ftp/ftp.c @@ -671,7 +671,7 @@ static void ftp_process_cmd (void) { case E_FTP_CMD_USER: ftp_pop_param (&bufptr, ftp_scratch_buffer); if (!memcmp(ftp_scratch_buffer, servers_user, MAX(strlen(ftp_scratch_buffer), strlen(servers_user)))) { - ftp_data.loggin.uservalid = true; + ftp_data.loggin.uservalid = true && (strlen(servers_user) == strlen(ftp_scratch_buffer)); } ftp_send_reply(331, NULL); break; @@ -679,12 +679,13 @@ static void ftp_process_cmd (void) { ftp_pop_param (&bufptr, ftp_scratch_buffer); if (!memcmp(ftp_scratch_buffer, servers_pass, MAX(strlen(ftp_scratch_buffer), strlen(servers_pass))) && ftp_data.loggin.uservalid) { - ftp_data.loggin.passvalid = true; - ftp_send_reply(230, NULL); - } - else { - ftp_send_reply(530, NULL); + ftp_data.loggin.passvalid = true && (strlen(servers_pass) == strlen(ftp_scratch_buffer)); + if (ftp_data.loggin.passvalid) { + ftp_send_reply(230, NULL); + break; + } } + ftp_send_reply(530, NULL); break; case E_FTP_CMD_PASV: { diff --git a/cc3200/serverstask.c b/cc3200/serverstask.c index 55c0bbfbf8..528c480ee1 100644 --- a/cc3200/serverstask.c +++ b/cc3200/serverstask.c @@ -25,15 +25,14 @@ */ #include +#include #include "py/mpconfig.h" #include MICROPY_HAL_H #include "py/misc.h" -#include "simplelink.h" #include "serverstask.h" -#include "modwlan.h" +#include "simplelink.h" #include "debug.h" -#include "mpexception.h" #include "telnet.h" #include "ftp.h" #include "pybwdt.h" @@ -67,8 +66,8 @@ static servers_Data_t servers_data = {.enabled = false, .do_disable = false, .do /****************************************************************************** DECLARE PUBLIC DATA ******************************************************************************/ -char *servers_user; -char *servers_pass; +char servers_user[SERVERS_USER_PASS_LEN_MAX + 1]; +char servers_pass[SERVERS_USER_PASS_LEN_MAX + 1]; /****************************************************************************** DECLARE PUBLIC FUNCTIONS @@ -77,8 +76,6 @@ void TASK_Servers (void *pvParameters) { bool cycle = false; - ASSERT ((servers_user = mem_Malloc(SERVERS_USER_LEN_MAX + 1)) != NULL); - ASSERT ((servers_pass = mem_Malloc(SERVERS_PASS_LEN_MAX + 1)) != NULL); strcpy (servers_user, SERVERS_DEF_USER); strcpy (servers_pass, SERVERS_DEF_PASS); @@ -148,8 +145,8 @@ void servers_close_socket (int16_t *sd) { } void servers_set_login (char *user, char *pass) { - memcpy(servers_user, user, SERVERS_USER_LEN_MAX); - memcpy(servers_pass, pass, SERVERS_PASS_LEN_MAX); + memcpy(servers_user, user, SERVERS_USER_PASS_LEN_MAX); + memcpy(servers_pass, pass, SERVERS_USER_PASS_LEN_MAX); } /****************************************************************************** diff --git a/cc3200/serverstask.h b/cc3200/serverstask.h index ae44ac4376..04b1367ff2 100644 --- a/cc3200/serverstask.h +++ b/cc3200/serverstask.h @@ -36,8 +36,7 @@ #define SERVERS_SSID_LEN_MAX 16 #define SERVERS_KEY_LEN_MAX 16 -#define SERVERS_USER_LEN_MAX 16 -#define SERVERS_PASS_LEN_MAX 16 +#define SERVERS_USER_PASS_LEN_MAX 16 #define SERVERS_CYCLE_TIME_MS 5 @@ -48,8 +47,8 @@ /****************************************************************************** EXPORTED DATA ******************************************************************************/ -extern char *servers_user; -extern char *servers_pass; +extern char servers_user[]; +extern char servers_pass[]; /****************************************************************************** DECLARE PUBLIC FUNCTIONS diff --git a/cc3200/telnet/telnet.c b/cc3200/telnet/telnet.c index 4100cec61a..b96a09521e 100644 --- a/cc3200/telnet/telnet.c +++ b/cc3200/telnet/telnet.c @@ -142,6 +142,28 @@ void telnet_init (void) { telnet_data.state = E_TELNET_STE_DISABLED; } + +static int telnet_process_credential (char *credential, _i16 rxLen) { + telnet_data.rxWindex += rxLen; + if (telnet_data.rxWindex >= SERVERS_USER_PASS_LEN_MAX) { + telnet_data.rxWindex = SERVERS_USER_PASS_LEN_MAX; + } + + uint8_t *p = telnet_data.rxBuffer + SERVERS_USER_PASS_LEN_MAX; + // if a '\r' is found, or the length exceeds the max username length + if ((p = memchr(telnet_data.rxBuffer, '\r', telnet_data.rxWindex)) || (telnet_data.rxWindex >= SERVERS_USER_PASS_LEN_MAX)) { + uint8_t len = p - telnet_data.rxBuffer; + + telnet_data.rxWindex = 0; + if ((len > 0) && (memcmp(credential, telnet_data.rxBuffer, MAX(len, strlen(credential))) == 0)) { + return 1; + } + return -1; + } + return 0; +} + + void telnet_run (void) { _i16 rxLen; switch (telnet_data.state) { @@ -170,12 +192,14 @@ void telnet_run (void) { telnet_send_and_proceed((void *)telnet_request_user, strlen(telnet_request_user), E_TELNET_STE_SUB_GET_USER); break; case E_TELNET_STE_SUB_GET_USER: - if (E_TELNET_RESULT_OK == telnet_recv_text_non_blocking(telnet_data.rxBuffer, TELNET_RX_BUFFER_SIZE, &rxLen)) { - // Skip /r/n - if (rxLen < 2 || memcmp(servers_user, (const char *)telnet_data.rxBuffer, MAX((rxLen - 2), strlen(servers_user)))) { - telnet_data.credentialsValid = false; + if (E_TELNET_RESULT_OK == telnet_recv_text_non_blocking(telnet_data.rxBuffer + telnet_data.rxWindex, + TELNET_RX_BUFFER_SIZE - telnet_data.rxWindex, + &rxLen)) { + int result; + if ((result = telnet_process_credential (servers_user, rxLen))) { + telnet_data.credentialsValid = result > 0 ? true : false; + telnet_data.substate.connected = E_TELNET_STE_SUB_REQ_PASSWORD; } - telnet_data.substate.connected = E_TELNET_STE_SUB_REQ_PASSWORD; } break; case E_TELNET_STE_SUB_REQ_PASSWORD: @@ -187,16 +211,17 @@ void telnet_run (void) { telnet_send_and_proceed((void *)telnet_options_pass, sizeof(telnet_options_pass), E_TELNET_STE_SUB_GET_PASSWORD); break; case E_TELNET_STE_SUB_GET_PASSWORD: - if (E_TELNET_RESULT_OK == telnet_recv_text_non_blocking(telnet_data.rxBuffer, TELNET_RX_BUFFER_SIZE, &rxLen)) { - // skip /r/n - if (rxLen < 2 || memcmp(servers_pass, (const char *)telnet_data.rxBuffer, MAX((rxLen - 2), strlen(servers_pass)))) { - telnet_data.credentialsValid = false; - } - if (telnet_data.credentialsValid) { - telnet_data.substate.connected = E_TELNET_STE_SUB_SND_REPL_OPTIONS; - } - else { - telnet_data.substate.connected = E_TELNET_STE_SUB_INVALID_LOGGIN; + if (E_TELNET_RESULT_OK == telnet_recv_text_non_blocking(telnet_data.rxBuffer + telnet_data.rxWindex, + TELNET_RX_BUFFER_SIZE - telnet_data.rxWindex, + &rxLen)) { + int result; + if ((result = telnet_process_credential (servers_pass, rxLen))) { + if ((telnet_data.credentialsValid = telnet_data.credentialsValid && (result > 0 ? true : false))) { + telnet_data.substate.connected = E_TELNET_STE_SUB_SND_REPL_OPTIONS; + } + else { + telnet_data.substate.connected = E_TELNET_STE_SUB_INVALID_LOGGIN; + } } } break;