netutils/websocket: add handshake retry routine
authorJunyeon Lee <junyeon2.lee@samsung.com>
Mon, 20 Mar 2017 14:44:05 +0000 (23:44 +0900)
committerHeesub Shin <heesub.shin@samsung.com>
Mon, 17 Apr 2017 10:56:46 +0000 (19:56 +0900)
This commit adds client handshake retry routine for connection stability.
And retry number set by definition of WEBSOCKET_MAX_TLS_HANDSHAKE.

Change-Id: I6191605272d8b436227ae9c12a67cb5fb79804c9
Signed-off-by: Junyeon Lee <junyeon2.lee@samsung.com>
apps/include/netutils/websocket.h
apps/netutils/websocket/websocket.c

index bb52a55..3f08427 100644 (file)
 /**
  * @brief Websocket event handler select() timeout value, msec.
  */
-#define WEBSOCKET_HANDLER_TIMEOUT                    (300)     //mili second
+#define WEBSOCKET_HANDLER_TIMEOUT                    (100)     //mili second
 
 /**
  * @brief Ping message limits without pong.
  */
 #define WEBSOCKET_MAX_CLIENT                         (3)
 
+/**
+ * @brief The maximun retry of tls handshake.
+ */
+#define WEBSOCKET_MAX_TLS_HANDSHAKE                  (3)
+
 /*
  *  Pre-definition variables from wslay below.
  *  just not to include wslay.h on application side.
index 06774cf..a4b60f3 100644 (file)
@@ -362,10 +362,33 @@ int connect_socket(websocket_t *client, const char *addr, const char *port)
 int websocket_connect(websocket_t *client, const char *addr, const char *port)
 {
        int r;
+       int tls_hs_retry = WEBSOCKET_MAX_TLS_HANDSHAKE;
 
-       r = connect_socket(client, addr, port);
-       if (r == WEBSOCKET_SUCCESS && client->tls_enabled) {
+TLS_HS_RETRY:
+       if ((r = connect_socket(client, addr, port)) != WEBSOCKET_SUCCESS) {
+               return r;
+       }
+
+       websocket_update_state(client, WEBSOCKET_RUNNING);
+
+       if (websocket_make_block(client->fd) != WEBSOCKET_SUCCESS) {
+               close(client->fd);
+               return WEBSOCKET_SOCKET_ERROR;
+       }
+
+       if (client->tls_enabled) {
                if ((r = websocket_tls_handshake(client, WEBSOCKET_SERVERNAME, MBEDTLS_SSL_VERIFY_REQUIRED)) != WEBSOCKET_SUCCESS) {
+                       if (r == MBEDTLS_ERR_NET_SEND_FAILED ||
+                               r == MBEDTLS_ERR_NET_RECV_FAILED ||
+                               r == MBEDTLS_ERR_SSL_CONN_EOF) {
+                               if (tls_hs_retry-- > 0) {
+                                       WEBSOCKET_DEBUG("Handshake again.... \n");
+                                       mbedtls_net_free(&(client->tls_net));
+                                       mbedtls_ssl_free(client->tls_ssl);
+                                       mbedtls_ssl_init(client->tls_ssl);
+                                       goto TLS_HS_RETRY;
+                               }
+                       }
                        return WEBSOCKET_TLS_HANDSHAKE_ERROR;
                }
        }