Skip to content

Commit cc20482

Browse files
author
Daniel Campora
committed
cc3200: Add method to configure the servers timeout.
With network.server_timeout(secs) the timeout can be changed. The default value is 300 secs. Minimmum accpeted is 5 secs. Without params the function returns the current configured timeout.
1 parent a546acd commit cc20482

8 files changed

Lines changed: 91 additions & 50 deletions

File tree

cc3200/ftp/ftp.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,6 @@
6868
#define FTP_UNIX_TIME_20150101 1420070400
6969
#define FTP_UNIX_SECONDS_180_DAYS 15552000
7070
#define FTP_DATA_TIMEOUT_MS 5000 // 5 seconds
71-
#define FTP_CMD_TIMEOUT_MS 120000 // 2 minutes
7271
#define FTP_SOCKETFIFO_ELEMENTS_MAX 4
7372
#define FTP_CYCLE_TIME_MS (SERVERS_CYCLE_TIME_MS * 2)
7473

@@ -253,7 +252,7 @@ void ftp_run (void) {
253252
ftp_wait_for_enabled();
254253
break;
255254
case E_FTP_STE_START:
256-
if (ftp_create_listening_socket(&ftp_data.lc_sd, FTP_CMD_PORT, FTP_CMD_CLIENTS_MAX )) {
255+
if (wlan_is_connected() && ftp_create_listening_socket(&ftp_data.lc_sd, FTP_CMD_PORT, FTP_CMD_CLIENTS_MAX)) {
257256
ftp_data.state = E_FTP_STE_READY;
258257
}
259258
break;
@@ -838,7 +837,7 @@ static void ftp_process_cmd (void) {
838837
}
839838
}
840839
else if (result == E_FTP_RESULT_CONTINUE) {
841-
if (ftp_data.ctimeout++ > (FTP_CMD_TIMEOUT_MS / FTP_CYCLE_TIME_MS)) {
840+
if (ftp_data.ctimeout++ > (servers_get_timeout() / FTP_CYCLE_TIME_MS)) {
842841
ftp_send_reply(221, NULL);
843842
}
844843
}

cc3200/mods/modnetwork.c

Lines changed: 35 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -37,47 +37,64 @@
3737

3838
/// \module network - network configuration
3939
///
40-
/// This module provides network drivers and routing configuration.
40+
/// This module provides network drivers and server configuration.
4141

4242
void mod_network_init0(void) {
4343
}
4444

4545
#if (MICROPY_PORT_HAS_TELNET || MICROPY_PORT_HAS_FTP)
46-
STATIC mp_obj_t network_server_start(void) {
47-
servers_start();
48-
return mp_const_none;
49-
}
50-
STATIC MP_DEFINE_CONST_FUN_OBJ_0(network_server_start_obj, network_server_start);
51-
52-
STATIC mp_obj_t network_server_stop(void) {
53-
servers_stop();
54-
return mp_const_none;
46+
STATIC mp_obj_t network_server_running(mp_uint_t n_args, const mp_obj_t *args) {
47+
if (n_args > 0) {
48+
// set
49+
if (mp_obj_is_true(args[0])) {
50+
servers_start();
51+
} else {
52+
servers_stop();
53+
}
54+
return mp_const_none;
55+
} else {
56+
// get
57+
return MP_BOOL(servers_are_enabled());
58+
}
5559
}
56-
STATIC MP_DEFINE_CONST_FUN_OBJ_0(network_server_stop_obj, network_server_stop);
57-
58-
STATIC mp_obj_t network_server_running(void) {
59-
return MP_BOOL(servers_are_enabled());
60-
}
61-
STATIC MP_DEFINE_CONST_FUN_OBJ_0(network_server_running_obj, network_server_running);
60+
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(network_server_running_obj, 0, 1, network_server_running);
6261

6362
STATIC mp_obj_t network_server_login(mp_obj_t user, mp_obj_t pass) {
6463
const char *_user = mp_obj_str_get_str(user);
6564
const char *_pass = mp_obj_str_get_str(pass);
65+
if (strlen(user) > SERVERS_USER_PASS_LEN_MAX || strlen(pass) > SERVERS_USER_PASS_LEN_MAX) {
66+
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, mpexception_value_invalid_arguments));
67+
}
6668
servers_set_login ((char *)_user, (char *)_pass);
6769
return mp_const_none;
6870
}
6971
STATIC MP_DEFINE_CONST_FUN_OBJ_2(network_server_login_obj, network_server_login);
72+
73+
// timeout value given in seconds
74+
STATIC mp_obj_t network_server_timeout(mp_uint_t n_args, const mp_obj_t *args) {
75+
if (n_args > 0) {
76+
uint32_t _timeout = mp_obj_get_int(args[0]);
77+
if (!servers_set_timeout(_timeout * 1000)) {
78+
// timeout is too low
79+
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, mpexception_value_invalid_arguments));
80+
}
81+
return mp_const_none;
82+
} else {
83+
// get
84+
return mp_obj_new_int(servers_get_timeout() / 1000);
85+
}
86+
}
87+
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(network_server_timeout_obj, 0, 1, network_server_timeout);
7088
#endif
7189

7290
STATIC const mp_map_elem_t mp_module_network_globals_table[] = {
7391
{ MP_OBJ_NEW_QSTR(MP_QSTR___name__), MP_OBJ_NEW_QSTR(MP_QSTR_network) },
7492
{ MP_OBJ_NEW_QSTR(MP_QSTR_WLAN), (mp_obj_t)&mod_network_nic_type_wlan },
7593

7694
#if (MICROPY_PORT_HAS_TELNET || MICROPY_PORT_HAS_FTP)
77-
{ MP_OBJ_NEW_QSTR(MP_QSTR_start_server), (mp_obj_t)&network_server_start_obj },
78-
{ MP_OBJ_NEW_QSTR(MP_QSTR_stop_server), (mp_obj_t)&network_server_stop_obj },
7995
{ MP_OBJ_NEW_QSTR(MP_QSTR_server_running), (mp_obj_t)&network_server_running_obj },
8096
{ MP_OBJ_NEW_QSTR(MP_QSTR_server_login), (mp_obj_t)&network_server_login_obj },
97+
{ MP_OBJ_NEW_QSTR(MP_QSTR_server_timeout), (mp_obj_t)&network_server_timeout_obj },
8198
#endif
8299
};
83100

cc3200/mods/modwlan.c

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,6 @@ STATIC void wlan_reenable (SlWlanMode_t mode);
193193
STATIC void wlan_servers_start (void);
194194
STATIC void wlan_servers_stop (void);
195195
STATIC void wlan_get_sl_mac (void);
196-
STATIC bool wlan_is_connected (void);
197196
STATIC modwlan_Status_t wlan_do_connect (const char* ssid, uint32_t ssid_len, const char* bssid, uint8_t sec,
198197
const char* key, uint32_t key_len, uint32_t timeout);
199198
STATIC void wlan_lpds_callback_enable (mp_obj_t self_in);
@@ -224,6 +223,11 @@ void SimpleLinkWlanEventHandler(SlWlanEvent_t *pWlanEvent) {
224223
memcpy(wlan_obj.ssid_o, pEventData->ssid_name, pEventData->ssid_len);
225224
wlan_obj.ssid_o[pEventData->ssid_len] = '\0';
226225
SET_STATUS_BIT(wlan_obj.status, STATUS_BIT_CONNECTION);
226+
#if (MICROPY_PORT_HAS_TELNET || MICROPY_PORT_HAS_FTP)
227+
// we must reset the servers in case that the last connection
228+
// was lost without any notification being received
229+
servers_reset();
230+
#endif
227231
}
228232
break;
229233
case SL_WLAN_DISCONNECT_EVENT:
@@ -241,6 +245,11 @@ void SimpleLinkWlanEventHandler(SlWlanEvent_t *pWlanEvent) {
241245
memcpy(wlan_obj.ssid_o, pEventData->go_peer_device_name, pEventData->go_peer_device_name_len);
242246
wlan_obj.ssid_o[pEventData->go_peer_device_name_len] = '\0';
243247
wlan_obj.staconnected = true;
248+
#if (MICROPY_PORT_HAS_TELNET || MICROPY_PORT_HAS_FTP)
249+
// we must reset the servers in case that the last connection
250+
// was lost without any notification being received
251+
servers_reset();
252+
#endif
244253
}
245254
break;
246255
case SL_WLAN_STA_DISCONNECTED_EVENT:
@@ -547,12 +556,17 @@ void wlan_get_ip (uint32_t *ip) {
547556
}
548557
}
549558

559+
bool wlan_is_connected (void) {
560+
return ((GET_STATUS_BIT(wlan_obj.status, STATUS_BIT_CONNECTION) &&
561+
GET_STATUS_BIT(wlan_obj.status, STATUS_BIT_IP_ACQUIRED)) || wlan_obj.staconnected);
562+
}
563+
550564
//*****************************************************************************
551565
// DEFINE STATIC FUNCTIONS
552566
//*****************************************************************************
553567

554568
STATIC void wlan_initialize_data (void) {
555-
wlan_obj.status = 0;
569+
CLR_STATUS_BIT_ALL(wlan_obj.status);
556570
wlan_obj.dns = 0;
557571
wlan_obj.gateway = 0;
558572
wlan_obj.ip = 0;
@@ -567,7 +581,8 @@ STATIC void wlan_reenable (SlWlanMode_t mode) {
567581
// stop and start again
568582
sl_LockObjLock (&wlan_LockObj, SL_OS_WAIT_FOREVER);
569583
sl_Stop(SL_STOP_TIMEOUT);
570-
wlan_obj.status = 0;
584+
CLR_STATUS_BIT_ALL(wlan_obj.status);
585+
wlan_obj.staconnected = false;
571586
wlan_obj.mode = sl_Start(0, 0, 0);
572587
sl_LockObjUnlock (&wlan_LockObj);
573588
ASSERT (wlan_obj.mode == mode);
@@ -620,11 +635,6 @@ STATIC void wlan_get_sl_mac (void) {
620635
sl_NetCfgGet(SL_MAC_ADDRESS_GET, NULL, &macAddrLen, wlan_obj.mac);
621636
}
622637

623-
STATIC bool wlan_is_connected (void) {
624-
return ((GET_STATUS_BIT(wlan_obj.status, STATUS_BIT_CONNECTION) &&
625-
GET_STATUS_BIT(wlan_obj.status, STATUS_BIT_IP_ACQUIRED)) || wlan_obj.staconnected);
626-
}
627-
628638
/// \method init(mode, ssid=None, *, security=wlan.OPEN, key=None, channel=5)
629639
///
630640
/// Initialise the WLAN engine with the given parameters:

cc3200/mods/modwlan.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ extern void wlan_stop (uint32_t timeout);
6262
extern void wlan_start (void);
6363
extern void wlan_get_mac (uint8_t *macAddress);
6464
extern void wlan_get_ip (uint32_t *ip);
65+
extern bool wlan_is_connected (void);
6566

6667
extern int wlan_gethostbyname(const char *name, mp_uint_t len, uint8_t *out_ip, uint8_t family);
6768
extern int wlan_socket_socket(mod_network_socket_obj_t *s, int *_errno);

cc3200/qstrdefsport.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -237,10 +237,9 @@ Q(IPPROTO_RAW)
237237

238238
// for network class
239239
Q(network)
240-
Q(start_server)
241-
Q(stop_server)
242240
Q(server_running)
243241
Q(server_login)
242+
Q(server_timeout)
244243

245244
// for WLAN class
246245
Q(WLAN)

cc3200/serverstask.c

Lines changed: 30 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -43,23 +43,27 @@
4343
DECLARE PRIVATE DEFINITIONS
4444
******************************************************************************/
4545

46-
#define SERVERS_DEF_USER "micro"
47-
#define SERVERS_DEF_PASS "python"
46+
#define SERVERS_DEF_USER "micro"
47+
#define SERVERS_DEF_PASS "python"
48+
#define SERVERS_DEF_TIMEOUT_MS 300000 // 5 minutes
49+
#define SERVERS_MIN_TIMEOUT_MS 5000 // 5 seconds
4850

4951
/******************************************************************************
5052
DEFINE PRIVATE TYPES
5153
******************************************************************************/
5254
typedef struct {
53-
volatile bool enabled;
54-
volatile bool do_disable;
55-
volatile bool do_enable;
56-
volatile bool do_reset;
57-
}servers_Data_t;
55+
uint32_t timeout;
56+
bool enabled;
57+
bool do_disable;
58+
bool do_enable;
59+
bool do_reset;
60+
} servers_data_t;
5861

5962
/******************************************************************************
6063
DECLARE PRIVATE DATA
6164
******************************************************************************/
62-
static servers_Data_t servers_data = {.enabled = false, .do_disable = false, .do_enable = false, .do_reset = false};
65+
static servers_data_t servers_data = {.timeout = SERVERS_DEF_TIMEOUT_MS, .enabled = false, .do_disable = false,
66+
.do_enable = false, .do_reset = false};
6367
static volatile bool sleep_sockets = false;
6468

6569
/******************************************************************************
@@ -103,22 +107,20 @@ void TASK_Servers (void *pvParameters) {
103107
servers_data.do_disable = false;
104108
servers_data.enabled = false;
105109
}
106-
107-
if (servers_data.do_reset) {
110+
else if (servers_data.do_reset && servers_data.enabled) {
108111
telnet_reset();
109112
ftp_reset();
110113
servers_data.do_reset = false;
111114
// resetting the servers is needed to preven half-open sockets
112115
// and we should also close all user sockets
113116
modusocket_close_all_user_sockets();
114117
}
118+
119+
if (cycle) {
120+
telnet_run();
121+
}
115122
else {
116-
if (cycle) {
117-
telnet_run();
118-
}
119-
else {
120-
ftp_run();
121-
}
123+
ftp_run();
122124
}
123125

124126
if (sleep_sockets) {
@@ -176,6 +178,18 @@ void servers_set_login (char *user, char *pass) {
176178
memcpy(servers_pass, pass, SERVERS_USER_PASS_LEN_MAX);
177179
}
178180

181+
bool servers_set_timeout (uint32_t timeout) {
182+
if (timeout < SERVERS_MIN_TIMEOUT_MS) {
183+
return false;
184+
}
185+
servers_data.timeout = timeout;
186+
return true;
187+
}
188+
189+
uint32_t servers_get_timeout (void) {
190+
return servers_data.timeout;
191+
}
192+
179193
/******************************************************************************
180194
DEFINE PRIVATE FUNCTIONS
181195
******************************************************************************/

cc3200/serverstask.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,5 +61,7 @@ extern bool servers_are_enabled (void);
6161
extern void servers_close_socket (int16_t *sd);
6262
extern void servers_set_login (char *user, char *pass);
6363
extern void server_sleep_sockets (void);
64+
extern bool servers_set_timeout (uint32_t timeout);
65+
extern uint32_t servers_get_timeout (void);
6466

6567
#endif /* SERVERSTASK_H_ */

cc3200/telnet/telnet.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,6 @@
4949
#define TELNET_TX_RETRIES_MAX 25
5050
#define TELNET_WAIT_TIME_MS 5
5151
#define TELNET_LOGIN_RETRIES_MAX 3
52-
#define TELNET_TIMEOUT_MS 300000 // 5 minutes
5352
#define TELNET_CYCLE_TIME_MS (SERVERS_CYCLE_TIME_MS * 2)
5453

5554
/******************************************************************************
@@ -151,7 +150,7 @@ void telnet_run (void) {
151150
telnet_wait_for_enabled();
152151
break;
153152
case E_TELNET_STE_START:
154-
if (telnet_create_socket()) {
153+
if (wlan_is_connected() && telnet_create_socket()) {
155154
telnet_data.state = E_TELNET_STE_LISTEN;
156155
}
157156
break;
@@ -237,7 +236,7 @@ void telnet_run (void) {
237236
}
238237

239238
if (telnet_data.state >= E_TELNET_STE_CONNECTED) {
240-
if (telnet_data.timeout++ > (TELNET_TIMEOUT_MS / TELNET_CYCLE_TIME_MS)) {
239+
if (telnet_data.timeout++ > (servers_get_timeout() / TELNET_CYCLE_TIME_MS)) {
241240
telnet_reset();
242241
}
243242
}

0 commit comments

Comments
 (0)