Skip to content

Commit 0458833

Browse files
mattandeDaniel Campora
authored andcommitted
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.
1 parent abea1c3 commit 0458833

5 files changed

Lines changed: 57 additions & 35 deletions

File tree

cc3200/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ include ../py/mkenv.mk
1616
CROSS_COMPILE ?= arm-none-eabi-
1717

1818
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
19-
CFLAGS = -Wall -Wpointer-arith -Werror -ansi -std=gnu99 -nostdlib $(CFLAGS_CORTEX_M4)
19+
CFLAGS = -Wall -Wpointer-arith -Werror -ansi -std=gnu99 -nostdlib -lgcc $(CFLAGS_CORTEX_M4)
2020
CFLAGS += -g -ffunction-sections -fdata-sections -fno-common -fsigned-char -mno-unaligned-access
2121
CFLAGS += -Iboards/$(BOARD)
2222

cc3200/ftp/ftp.c

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -671,20 +671,21 @@ static void ftp_process_cmd (void) {
671671
case E_FTP_CMD_USER:
672672
ftp_pop_param (&bufptr, ftp_scratch_buffer);
673673
if (!memcmp(ftp_scratch_buffer, servers_user, MAX(strlen(ftp_scratch_buffer), strlen(servers_user)))) {
674-
ftp_data.loggin.uservalid = true;
674+
ftp_data.loggin.uservalid = true && (strlen(servers_user) == strlen(ftp_scratch_buffer));
675675
}
676676
ftp_send_reply(331, NULL);
677677
break;
678678
case E_FTP_CMD_PASS:
679679
ftp_pop_param (&bufptr, ftp_scratch_buffer);
680680
if (!memcmp(ftp_scratch_buffer, servers_pass, MAX(strlen(ftp_scratch_buffer), strlen(servers_pass))) &&
681681
ftp_data.loggin.uservalid) {
682-
ftp_data.loggin.passvalid = true;
683-
ftp_send_reply(230, NULL);
684-
}
685-
else {
686-
ftp_send_reply(530, NULL);
682+
ftp_data.loggin.passvalid = true && (strlen(servers_pass) == strlen(ftp_scratch_buffer));
683+
if (ftp_data.loggin.passvalid) {
684+
ftp_send_reply(230, NULL);
685+
break;
686+
}
687687
}
688+
ftp_send_reply(530, NULL);
688689
break;
689690
case E_FTP_CMD_PASV:
690691
{

cc3200/serverstask.c

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,14 @@
2525
*/
2626

2727
#include <stdint.h>
28+
#include <string.h>
2829

2930
#include "py/mpconfig.h"
3031
#include MICROPY_HAL_H
3132
#include "py/misc.h"
32-
#include "simplelink.h"
3333
#include "serverstask.h"
34-
#include "modwlan.h"
34+
#include "simplelink.h"
3535
#include "debug.h"
36-
#include "mpexception.h"
3736
#include "telnet.h"
3837
#include "ftp.h"
3938
#include "pybwdt.h"
@@ -67,8 +66,8 @@ static servers_Data_t servers_data = {.enabled = false, .do_disable = false, .do
6766
/******************************************************************************
6867
DECLARE PUBLIC DATA
6968
******************************************************************************/
70-
char *servers_user;
71-
char *servers_pass;
69+
char servers_user[SERVERS_USER_PASS_LEN_MAX + 1];
70+
char servers_pass[SERVERS_USER_PASS_LEN_MAX + 1];
7271

7372
/******************************************************************************
7473
DECLARE PUBLIC FUNCTIONS
@@ -77,8 +76,6 @@ void TASK_Servers (void *pvParameters) {
7776

7877
bool cycle = false;
7978

80-
ASSERT ((servers_user = mem_Malloc(SERVERS_USER_LEN_MAX + 1)) != NULL);
81-
ASSERT ((servers_pass = mem_Malloc(SERVERS_PASS_LEN_MAX + 1)) != NULL);
8279
strcpy (servers_user, SERVERS_DEF_USER);
8380
strcpy (servers_pass, SERVERS_DEF_PASS);
8481

@@ -148,8 +145,8 @@ void servers_close_socket (int16_t *sd) {
148145
}
149146

150147
void servers_set_login (char *user, char *pass) {
151-
memcpy(servers_user, user, SERVERS_USER_LEN_MAX);
152-
memcpy(servers_pass, pass, SERVERS_PASS_LEN_MAX);
148+
memcpy(servers_user, user, SERVERS_USER_PASS_LEN_MAX);
149+
memcpy(servers_pass, pass, SERVERS_USER_PASS_LEN_MAX);
153150
}
154151

155152
/******************************************************************************

cc3200/serverstask.h

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,7 @@
3636
#define SERVERS_SSID_LEN_MAX 16
3737
#define SERVERS_KEY_LEN_MAX 16
3838

39-
#define SERVERS_USER_LEN_MAX 16
40-
#define SERVERS_PASS_LEN_MAX 16
39+
#define SERVERS_USER_PASS_LEN_MAX 16
4140

4241
#define SERVERS_CYCLE_TIME_MS 5
4342

@@ -48,8 +47,8 @@
4847
/******************************************************************************
4948
EXPORTED DATA
5049
******************************************************************************/
51-
extern char *servers_user;
52-
extern char *servers_pass;
50+
extern char servers_user[];
51+
extern char servers_pass[];
5352

5453
/******************************************************************************
5554
DECLARE PUBLIC FUNCTIONS

cc3200/telnet/telnet.c

Lines changed: 40 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,28 @@ void telnet_init (void) {
142142
telnet_data.state = E_TELNET_STE_DISABLED;
143143
}
144144

145+
146+
static int telnet_process_credential (char *credential, _i16 rxLen) {
147+
telnet_data.rxWindex += rxLen;
148+
if (telnet_data.rxWindex >= SERVERS_USER_PASS_LEN_MAX) {
149+
telnet_data.rxWindex = SERVERS_USER_PASS_LEN_MAX;
150+
}
151+
152+
uint8_t *p = telnet_data.rxBuffer + SERVERS_USER_PASS_LEN_MAX;
153+
// if a '\r' is found, or the length exceeds the max username length
154+
if ((p = memchr(telnet_data.rxBuffer, '\r', telnet_data.rxWindex)) || (telnet_data.rxWindex >= SERVERS_USER_PASS_LEN_MAX)) {
155+
uint8_t len = p - telnet_data.rxBuffer;
156+
157+
telnet_data.rxWindex = 0;
158+
if ((len > 0) && (memcmp(credential, telnet_data.rxBuffer, MAX(len, strlen(credential))) == 0)) {
159+
return 1;
160+
}
161+
return -1;
162+
}
163+
return 0;
164+
}
165+
166+
145167
void telnet_run (void) {
146168
_i16 rxLen;
147169
switch (telnet_data.state) {
@@ -170,12 +192,14 @@ void telnet_run (void) {
170192
telnet_send_and_proceed((void *)telnet_request_user, strlen(telnet_request_user), E_TELNET_STE_SUB_GET_USER);
171193
break;
172194
case E_TELNET_STE_SUB_GET_USER:
173-
if (E_TELNET_RESULT_OK == telnet_recv_text_non_blocking(telnet_data.rxBuffer, TELNET_RX_BUFFER_SIZE, &rxLen)) {
174-
// Skip /r/n
175-
if (rxLen < 2 || memcmp(servers_user, (const char *)telnet_data.rxBuffer, MAX((rxLen - 2), strlen(servers_user)))) {
176-
telnet_data.credentialsValid = false;
195+
if (E_TELNET_RESULT_OK == telnet_recv_text_non_blocking(telnet_data.rxBuffer + telnet_data.rxWindex,
196+
TELNET_RX_BUFFER_SIZE - telnet_data.rxWindex,
197+
&rxLen)) {
198+
int result;
199+
if ((result = telnet_process_credential (servers_user, rxLen))) {
200+
telnet_data.credentialsValid = result > 0 ? true : false;
201+
telnet_data.substate.connected = E_TELNET_STE_SUB_REQ_PASSWORD;
177202
}
178-
telnet_data.substate.connected = E_TELNET_STE_SUB_REQ_PASSWORD;
179203
}
180204
break;
181205
case E_TELNET_STE_SUB_REQ_PASSWORD:
@@ -187,16 +211,17 @@ void telnet_run (void) {
187211
telnet_send_and_proceed((void *)telnet_options_pass, sizeof(telnet_options_pass), E_TELNET_STE_SUB_GET_PASSWORD);
188212
break;
189213
case E_TELNET_STE_SUB_GET_PASSWORD:
190-
if (E_TELNET_RESULT_OK == telnet_recv_text_non_blocking(telnet_data.rxBuffer, TELNET_RX_BUFFER_SIZE, &rxLen)) {
191-
// skip /r/n
192-
if (rxLen < 2 || memcmp(servers_pass, (const char *)telnet_data.rxBuffer, MAX((rxLen - 2), strlen(servers_pass)))) {
193-
telnet_data.credentialsValid = false;
194-
}
195-
if (telnet_data.credentialsValid) {
196-
telnet_data.substate.connected = E_TELNET_STE_SUB_SND_REPL_OPTIONS;
197-
}
198-
else {
199-
telnet_data.substate.connected = E_TELNET_STE_SUB_INVALID_LOGGIN;
214+
if (E_TELNET_RESULT_OK == telnet_recv_text_non_blocking(telnet_data.rxBuffer + telnet_data.rxWindex,
215+
TELNET_RX_BUFFER_SIZE - telnet_data.rxWindex,
216+
&rxLen)) {
217+
int result;
218+
if ((result = telnet_process_credential (servers_pass, rxLen))) {
219+
if ((telnet_data.credentialsValid = telnet_data.credentialsValid && (result > 0 ? true : false))) {
220+
telnet_data.substate.connected = E_TELNET_STE_SUB_SND_REPL_OPTIONS;
221+
}
222+
else {
223+
telnet_data.substate.connected = E_TELNET_STE_SUB_INVALID_LOGGIN;
224+
}
200225
}
201226
}
202227
break;

0 commit comments

Comments
 (0)