diff --git a/libs/sofia-sip/.update b/libs/sofia-sip/.update index b9f2e8ad18..b824aceab0 100644 --- a/libs/sofia-sip/.update +++ b/libs/sofia-sip/.update @@ -1 +1 @@ -Wed Jul 27 14:15:49 CDT 2016 +Sat Aug 6 11:48:53 CDT 2016 diff --git a/libs/sofia-sip/libsofia-sip-ua/tport/tport_type_ws.c b/libs/sofia-sip/libsofia-sip-ua/tport/tport_type_ws.c index 050b2f8364..1390689513 100644 --- a/libs/sofia-sip/libsofia-sip-ua/tport/tport_type_ws.c +++ b/libs/sofia-sip/libsofia-sip-ua/tport/tport_type_ws.c @@ -461,6 +461,7 @@ int tport_ws_init_secondary(tport_t *self, int socket, int accepted, tport_ws_t *wstp = (tport_ws_t *)self; self->tp_has_connection = 1; + self->tp_params->tpp_keepalive = 5000; /* override the default 30 minute timeout on tport connections */ self->tp_params->tpp_idle = UINT_MAX; @@ -496,7 +497,7 @@ int tport_ws_init_secondary(tport_t *self, int socket, int accepted, wstp->ws_initialized = 1; self->tp_pre_framed = 1; - + tport_set_secondary_timer(self); return 0; } @@ -592,6 +593,20 @@ int tport_ws_next_timer(tport_t *self, su_time_t *return_target, char const **return_why) { + tport_ws_t *wstp = (tport_ws_t *)self; + + if (establish_logical_layer(&wstp->ws) < 0) { + if (wstp->tos++ == 1) { + tport_close(self); + SU_DEBUG_7(("%s(%p): %s to " TPN_FORMAT "%s\n", + __func__, (void *)self, + "timeout establishing connection\n", TPN_ARGS(self->tp_name), "")); + return -1; + } + } else { + self->tp_params->tpp_keepalive = 30000; + } + return tport_next_recv_timeout(self, return_target, return_why) | tport_next_keepalive(self, return_target, return_why); diff --git a/libs/sofia-sip/libsofia-sip-ua/tport/tport_ws.h b/libs/sofia-sip/libsofia-sip-ua/tport/tport_ws.h index d48101e5cb..4e2e0f474d 100644 --- a/libs/sofia-sip/libsofia-sip-ua/tport/tport_ws.h +++ b/libs/sofia-sip/libsofia-sip-ua/tport/tport_ws.h @@ -59,6 +59,7 @@ typedef struct tport_ws_s { char wstp_buffer[65536]; size_t wstp_buflen; SU_S8_T ws_initialized; + unsigned char tos; unsigned ws_secure:1; unsigned:0; } tport_ws_t; diff --git a/libs/sofia-sip/libsofia-sip-ua/tport/ws.c b/libs/sofia-sip/libsofia-sip-ua/tport/ws.c index 7fe9f182bf..5e5bbd638d 100644 --- a/libs/sofia-sip/libsofia-sip-ua/tport/ws.c +++ b/libs/sofia-sip/libsofia-sip-ua/tport/ws.c @@ -500,7 +500,7 @@ static int restore_socket(ws_socket_t sock) #endif -static int establish_logical_layer(wsh_t *wsh) +int establish_logical_layer(wsh_t *wsh) { if (!wsh->sanity) { diff --git a/libs/sofia-sip/libsofia-sip-ua/tport/ws.h b/libs/sofia-sip/libsofia-sip-ua/tport/ws.h index 045ff32acc..83a6890cca 100644 --- a/libs/sofia-sip/libsofia-sip-ua/tport/ws.h +++ b/libs/sofia-sip/libsofia-sip-ua/tport/ws.h @@ -119,7 +119,7 @@ typedef struct wsh_s { ssize_t ws_send_buf(wsh_t *wsh, ws_opcode_t oc); ssize_t ws_feed_buf(wsh_t *wsh, void *data, size_t bytes); - +int establish_logical_layer(wsh_t *wsh); ssize_t ws_raw_read(wsh_t *wsh, void *data, size_t bytes, int block); ssize_t ws_raw_write(wsh_t *wsh, void *data, size_t bytes); ssize_t ws_read_frame(wsh_t *wsh, ws_opcode_t *oc, uint8_t **data);