Esempio n. 1
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;
}
Esempio n. 2
0
int tdav_session_msrp_start(tmedia_session_t* self)
{
	tdav_session_msrp_t* msrp;
	int ret;

	TSK_DEBUG_INFO("tdav_session_msrp_start");

	if(!self){
		TSK_DEBUG_ERROR("Invalid parameter");
		return -1;
	}

	msrp = (tdav_session_msrp_t*)self;

	/* start the transport */
	if((ret = tnet_transport_start(msrp->transport))){
		goto bail;
	}

	switch(msrp->setup){
		case msrp_setup_active:
		case msrp_setup_actpass:
			{
				//
				//	ACTIVE
				//
				TSK_DEBUG_INFO("connectto(%s:%d)", msrp->remote_ip, msrp->remote_port);
				if((msrp->connectedFD = tnet_transport_connectto_2(msrp->transport, msrp->remote_ip, msrp->remote_port)) == TNET_INVALID_FD){
					TSK_DEBUG_ERROR("Failed to connect to the remote party");
					ret = -2;
					goto bail;
				}
				else{
					//TSK_DEBUG_INFO("Msrp connected FD=%d", msrp->connectedFD);
					//if((ret = tnet_sockfd_waitUntilWritable(msrp->connectedFD, TDAV_MSRP_CONNECT_TIMEOUT)) && msrp->offerer){
					//	TSK_DEBUG_ERROR("%d milliseconds elapsed and the socket is still not connected to (%s:%d).", TDAV_MSRP_CONNECT_TIMEOUT, msrp->remote_ip, msrp->remote_port);
					//	goto bail;
					//}
					/*	draft-denis-simple-msrp-comedia-02 - 4.2.3. Setting up the connection
						Once the TCP session is established, and if the answerer was the
						active connection endpoint, it MUST send an MSRP request.  In
						particular, if it has no pending data to send, it MUST send an empty
						MSRP SEND request.  That is necessary for the other endpoint to
						authenticate this TCP session.

						...RFC 4975 - 7.1
					*/
					msrp->send_bodiless = tsk_true;
				}
				break;
			}
		default:
			{
				//
				//	PASSIVE
				//
				break;
			}
	}
	
	// create and start the receiver
	if(!msrp->receiver){
		if((msrp->receiver = tmsrp_receiver_create(msrp->config, msrp->connectedFD))){
			tnet_transport_set_callback(msrp->transport, TNET_TRANSPORT_CB_F(tdav_transport_layer_stream_cb), msrp);
			if((ret = tmsrp_receiver_start(msrp->receiver, msrp, tdav_msrp_event_proxy_cb))){
				TSK_DEBUG_ERROR("Failed to start the MSRP receiver");
				goto bail;
			}
		}
	}

	// create and start the sender
	if(!msrp->sender){
		if((msrp->sender = tmsrp_sender_create(msrp->config, msrp->connectedFD))){
			msrp->sender->chunck_duration = msrp->chunck_duration;
			if((ret = tmsrp_sender_start(msrp->sender))){
				TSK_DEBUG_ERROR("Failed to start the MSRP sender");
				goto bail;
			}
		}
	}

bail:
	return ret;
}