Ejemplo n.º 1
0
/*
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;
}
Ejemplo n.º 2
0
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;
}