/* Enable or disable DTLS on the transport and all coresponding sockets *@param handle The transport for which to enable or disable DTLS *@param enabled Whether to enable or disable DTLS *@param sockets List of all sockets for which to enable or disable DLS could be null. You should include the master socket in this list. *@param sockets_count The number of sockets *@return 0 if succeed, otherwise non-zero error code */ int tnet_transport_dtls_set_enabled(tnet_transport_handle_t *handle, tsk_bool_t enabled, struct tnet_socket_s** sockets, tsk_size_t sockets_count) { tnet_transport_t *transport = handle; tnet_socket_type_t type; int ret; if(!transport){ TSK_DEBUG_ERROR("Invalid parameter"); return -1; } type = tnet_transport_get_type(transport); if(!TNET_SOCKET_TYPE_IS_DTLS(type) && !TNET_SOCKET_TYPE_IS_UDP(type)){ TSK_DEBUG_ERROR("Trying to enable/disable DTLS on invalid transport type: %d", type); return -3; } if(enabled & !tnet_dtls_is_supported()){ TSK_DEBUG_ERROR("Trying to enable DTLS but code source not built with this feature"); return -1; } if((transport->dtls.enabled = enabled)){ TNET_SOCKET_TYPE_SET_DTLS(transport->type); if((ret = _tnet_transport_ssl_init(transport))){ return ret; } } else{ TNET_SOCKET_TYPE_SET_UDP(transport->type); ret = _tnet_transport_ssl_deinit(transport); } if(sockets && sockets_count){ tsk_size_t i; for(i = 0; i < sockets_count; ++i){ if(!sockets[i]){ continue; } if(enabled){ if(!sockets[i]->dtlshandle){ if(!(sockets[i]->dtlshandle = tnet_dtls_socket_create(sockets[i]->fd, transport->dtls.ctx))){ return -4; } } if(transport->dtls.use_srtp){ tnet_dtls_socket_use_srtp(sockets[i]->dtlshandle); } TNET_SOCKET_TYPE_SET_DTLS(sockets[i]->type); tnet_dtls_socket_set_callback(sockets[i]->dtlshandle, transport, _tnet_transport_dtls_cb); } else{ TSK_OBJECT_SAFE_FREE(sockets[i]->dtlshandle); TNET_SOCKET_TYPE_SET_UDP(sockets[i]->type); } } } return ret; }
static tsk_object_t* tnet_transport_dtor(tsk_object_t * self) { tnet_transport_t *transport = self; if (transport){ tnet_transport_set_callback(transport, tsk_null, tsk_null); tnet_transport_shutdown(transport); TSK_OBJECT_SAFE_FREE(transport->master); TSK_OBJECT_SAFE_FREE(transport->context); TSK_OBJECT_SAFE_FREE(transport->natt_ctx); TSK_FREE(transport->local_ip); TSK_FREE(transport->local_host); // proxy TSK_OBJECT_SAFE_FREE(transport->proxy.info); // (tls and dtls) = ssl TSK_FREE(transport->tls.ca); TSK_FREE(transport->tls.pbk); TSK_FREE(transport->tls.pvk); _tnet_transport_ssl_deinit(transport); // openssl contexts TSK_DEBUG_INFO("*** Transport (%s) destroyed ***", transport->description); TSK_FREE(transport->description); } return self; }