From 04588330726547fd10e1f9df05580fc29da0e0e4 Mon Sep 17 00:00:00 2001 From: Matt Anderson Date: Sun, 26 Apr 2015 08:34:01 -0400 Subject: 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/telnet/telnet.c | 55 ++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 40 insertions(+), 15 deletions(-) (limited to 'cc3200/telnet') diff --git a/cc3200/telnet/telnet.c b/cc3200/telnet/telnet.c index 4100cec61..b96a09521 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; -- cgit v1.2.3