diff options
author | Daniel Campora <daniel@wipy.io> | 2015-05-23 19:56:22 +0200 |
---|---|---|
committer | Daniel Campora <daniel@wipy.io> | 2015-05-24 11:44:06 +0200 |
commit | 9f8c5456befbf33cf8e02de99b6b9f5a417f006a (patch) | |
tree | dc1339e90c801a2361dd19b0a3b4430a930a1ae5 /cc3200 | |
parent | 0d31bbc7fa3bdf10a14d92bb010a5016dc6101af (diff) | |
download | micropython-9f8c5456befbf33cf8e02de99b6b9f5a417f006a.tar.gz micropython-9f8c5456befbf33cf8e02de99b6b9f5a417f006a.zip |
cc3200: Reset the servers and close user sockets on WLAN disconection.
This is needed to avoid half-open connections.
Diffstat (limited to 'cc3200')
-rw-r--r-- | cc3200/ftp/ftp.c | 20 | ||||
-rw-r--r-- | cc3200/ftp/ftp.h | 1 | ||||
-rw-r--r-- | cc3200/mods/modusocket.c | 2 | ||||
-rw-r--r-- | cc3200/mods/modwlan.c | 4 | ||||
-rw-r--r-- | cc3200/serverstask.c | 23 | ||||
-rw-r--r-- | cc3200/serverstask.h | 1 | ||||
-rw-r--r-- | cc3200/telnet/telnet.c | 15 | ||||
-rw-r--r-- | cc3200/telnet/telnet.h | 1 |
8 files changed, 41 insertions, 26 deletions
diff --git a/cc3200/ftp/ftp.c b/cc3200/ftp/ftp.c index d812f563af..9619d92a8d 100644 --- a/cc3200/ftp/ftp.c +++ b/cc3200/ftp/ftp.c @@ -224,7 +224,6 @@ static ftp_result_t ftp_list_dir (char *list, uint32_t maxlistsize, uint32_t *li static void ftp_open_child (char *pwd, char *dir); static void ftp_close_child (char *pwd); static void ftp_return_to_previous_path (char *pwd, char *dir); -static void ftp_reset (void); /****************************************************************************** DEFINE PUBLIC FUNCTIONS @@ -408,6 +407,16 @@ void ftp_disable (void) { ftp_data.state = E_FTP_STE_DISABLED; } +void ftp_reset (void) { + // close all connections and start all over again + servers_close_socket(&ftp_data.lc_sd); + servers_close_socket(&ftp_data.ld_sd); + ftp_close_cmd_data(); + ftp_data.state = E_FTP_STE_START; + ftp_data.substate.data = E_FTP_STE_SUB_DISCONNECTED; + SOCKETFIFO_Flush(); +} + /****************************************************************************** DEFINE PRIVATE FUNCTIONS ******************************************************************************/ @@ -1079,12 +1088,3 @@ static void ftp_return_to_previous_path (char *pwd, char *dir) { } } -static void ftp_reset (void) { - // close all connections and start all over again - servers_close_socket(&ftp_data.lc_sd); - servers_close_socket(&ftp_data.ld_sd); - ftp_close_cmd_data(); - ftp_data.state = E_FTP_STE_START; - ftp_data.substate.data = E_FTP_STE_SUB_DISCONNECTED; - SOCKETFIFO_Flush(); -} diff --git a/cc3200/ftp/ftp.h b/cc3200/ftp/ftp.h index 14f07e0df7..13b044dcfa 100644 --- a/cc3200/ftp/ftp.h +++ b/cc3200/ftp/ftp.h @@ -34,5 +34,6 @@ extern void ftp_init (void); extern void ftp_run (void); extern void ftp_enable (void); extern void ftp_disable (void); +extern void ftp_reset (void); #endif /* FTP_H_ */ diff --git a/cc3200/mods/modusocket.c b/cc3200/mods/modusocket.c index 68a3252c98..1a7cbe8525 100644 --- a/cc3200/mods/modusocket.c +++ b/cc3200/mods/modusocket.c @@ -94,7 +94,6 @@ void modusocket_enter_sleep (void) { fd_set socketset; int16_t maxfd = 0; - sl_LockObjLock (&modusocket_LockObj, SL_OS_WAIT_FOREVER); for (int i = 0; i < MOD_NETWORK_MAX_SOCKETS; i++) { int16_t sd; if ((sd = modusocket_sockets[i].sd) >= 0) { @@ -105,7 +104,6 @@ void modusocket_enter_sleep (void) { // wait for any of the sockets to become ready... sl_Select(maxfd + 1, &socketset, NULL, NULL, NULL); - sl_LockObjUnlock (&modusocket_LockObj); } void modusocket_close_all_user_sockets (void) { diff --git a/cc3200/mods/modwlan.c b/cc3200/mods/modwlan.c index cdcd375e66..88dc065215 100644 --- a/cc3200/mods/modwlan.c +++ b/cc3200/mods/modwlan.c @@ -230,7 +230,7 @@ void SimpleLinkWlanEventHandler(SlWlanEvent_t *pWlanEvent) { { CLR_STATUS_BIT(wlan_obj.status, STATUS_BIT_CONNECTION); CLR_STATUS_BIT(wlan_obj.status, STATUS_BIT_IP_ACQUIRED); - // TODO reset the servers + servers_reset(); } break; case SL_WLAN_STA_CONNECTED_EVENT: @@ -245,7 +245,7 @@ void SimpleLinkWlanEventHandler(SlWlanEvent_t *pWlanEvent) { break; case SL_WLAN_STA_DISCONNECTED_EVENT: wlan_obj.staconnected = false; - // TODO reset the servers + servers_reset(); break; case SL_WLAN_P2P_DEV_FOUND_EVENT: // TODO diff --git a/cc3200/serverstask.c b/cc3200/serverstask.c index 80f22987fe..732e6bbcca 100644 --- a/cc3200/serverstask.c +++ b/cc3200/serverstask.c @@ -53,12 +53,13 @@ typedef struct { volatile bool enabled; volatile bool do_disable; volatile bool do_enable; + volatile bool do_reset; }servers_Data_t; /****************************************************************************** DECLARE PRIVATE DATA ******************************************************************************/ -static servers_Data_t servers_data = {.enabled = false, .do_disable = false, .do_enable = false}; +static servers_Data_t servers_data = {.enabled = false, .do_disable = false, .do_enable = false, .do_reset = false}; static volatile bool sleep_sockets = false; /****************************************************************************** @@ -103,11 +104,21 @@ void TASK_Servers (void *pvParameters) { servers_data.enabled = false; } - if (cycle) { - telnet_run(); + if (servers_data.do_reset) { + telnet_reset(); + ftp_reset(); + servers_data.do_reset = false; + // resetting the servers is needed to preven half-open sockets + // and we should also close all user sockets + modusocket_close_all_user_sockets(); } else { - ftp_run(); + if (cycle) { + telnet_run(); + } + else { + ftp_run(); + } } // set the alive flag for the wdt @@ -137,6 +148,10 @@ void servers_stop (void) { HAL_Delay (SERVERS_CYCLE_TIME_MS * 5); } +void servers_reset (void) { + servers_data.do_reset = true; +} + bool servers_are_enabled (void) { return servers_data.enabled; } diff --git a/cc3200/serverstask.h b/cc3200/serverstask.h index 6607283136..cd9930a4e5 100644 --- a/cc3200/serverstask.h +++ b/cc3200/serverstask.h @@ -56,6 +56,7 @@ extern char servers_pass[]; extern void TASK_Servers (void *pvParameters); extern void servers_start (void); extern void servers_stop (void); +extern void servers_reset (void); extern bool servers_are_enabled (void); extern void servers_close_socket (int16_t *sd); extern void servers_set_login (char *user, char *pass); diff --git a/cc3200/telnet/telnet.c b/cc3200/telnet/telnet.c index 0edc00cdb1..3b77d6be00 100644 --- a/cc3200/telnet/telnet.c +++ b/cc3200/telnet/telnet.c @@ -132,7 +132,6 @@ static void telnet_process (void); static int telnet_process_credential (char *credential, _i16 rxLen); static void telnet_parse_input (uint8_t *str, int16_t *len); static bool telnet_send_with_retries (int16_t sd, const void *pBuf, int16_t len); -static void telnet_reset (void); static void telnet_reset_buffer (void); /****************************************************************************** @@ -293,6 +292,13 @@ void telnet_disable (void) { telnet_data.state = E_TELNET_STE_DISABLED; } +void telnet_reset (void) { + // close the connection and start all over again + servers_close_socket(&telnet_data.n_sd); + servers_close_socket(&telnet_data.sd); + telnet_data.state = E_TELNET_STE_START; +} + bool telnet_is_enabled (void) { return telnet_data.enabled; } @@ -499,13 +505,6 @@ static bool telnet_send_with_retries (int16_t sd, const void *pBuf, int16_t len) return false; } -static void telnet_reset (void) { - // close the connection and start all over again - servers_close_socket(&telnet_data.n_sd); - servers_close_socket(&telnet_data.sd); - telnet_data.state = E_TELNET_STE_START; -} - static void telnet_reset_buffer (void) { // erase any characters present in the current line memset (telnet_data.rxBuffer, '\b', TELNET_RX_BUFFER_SIZE / 2); diff --git a/cc3200/telnet/telnet.h b/cc3200/telnet/telnet.h index 913cd73e15..983a774c8b 100644 --- a/cc3200/telnet/telnet.h +++ b/cc3200/telnet/telnet.h @@ -38,6 +38,7 @@ extern bool telnet_rx_any (void); extern int telnet_rx_char (void); extern void telnet_enable (void); extern void telnet_disable (void); +extern void telnet_reset (void); extern bool telnet_is_enabled (void); extern bool telnet_is_active (void); |