Esempio n. 1
0
/* Initialize the ZRTP transport and the user callbacks */
pjmedia_transport* on_create_media_transport(pjsua_call_id call_id,
                                             unsigned media_idx,
                                             pjmedia_transport *base_tp,
                                             unsigned flags)
{
    pjmedia_transport *zrtp_tp = NULL;
    pj_status_t status;
    pjmedia_endpt* endpt = pjsua_get_pjmedia_endpt();
    
    PJ_LOG(3,(THIS_FILE, "ZRTP transport created"));
    status = pjmedia_transport_zrtp_create(endpt, NULL, base_tp,
                                           &zrtp_tp, flags);
    usercb.userData = zrtp_tp;
    
    /* this is optional but highly recommended to enable the application
     * to report status information to the user, such as verfication status,
     * SAS code, etc
     */
    pjmedia_transport_zrtp_setUserCallback(zrtp_tp, &usercb);
    
    /*
     * Initialize the transport. Just the filename of the ZID file that holds
     * our partners ZID, shared data etc. If the files does not exists it will
     * be created an initialized.
     */
    pjmedia_transport_zrtp_initialize(zrtp_tp, "simple.zid", PJ_TRUE);
    return zrtp_tp;
}
Esempio n. 2
0
/* Initialize the ZRTP transport and the user callbacks */
pjmedia_transport* on_zrtp_transport_created(pjsua_call_id call_id,
        unsigned media_idx,
        pjmedia_transport *base_tp,
        unsigned flags) {

    pjmedia_transport *zrtp_tp = NULL;
    pj_status_t status;
    pjmedia_endpt* endpt = pjsua_get_pjmedia_endpt();

    status = pjmedia_transport_zrtp_create(endpt, NULL, base_tp,
                                           &zrtp_tp, (flags & PJSUA_MED_TP_CLOSE_MEMBER));



    if(status == PJ_SUCCESS) {
        PJ_LOG(3,(THIS_FILE, "ZRTP transport created"));

        // Build callback data ponter
        zrtp_cb_user_data* zrtp_cb_data = PJ_POOL_ZALLOC_T(css_var.pool, zrtp_cb_user_data);
        zrtp_cb_data->zrtp_tp = zrtp_tp;
        zrtp_cb_data->call_id = call_id;
        zrtp_cb_data->cipher = pj_str("");
        zrtp_cb_data->sas = pj_str("");


        // Build callback struct
        zrtp_UserCallbacks* zrtp_cbs = PJ_POOL_ZALLOC_T(css_var.pool, zrtp_UserCallbacks);
        zrtp_cbs->zrtp_secureOn = &zrtpSecureOn;
        zrtp_cbs->zrtp_secureOff = &zrtpSecureOff;
        zrtp_cbs->zrtp_showSAS = &zrtpShowSas;
        zrtp_cbs->zrtp_confirmGoClear = &confirmGoClear;
        zrtp_cbs->zrtp_showMessage = &showMessage;
        zrtp_cbs->zrtp_zrtpNegotiationFailed = &zrtpNegotiationFailed;
        zrtp_cbs->zrtp_zrtpNotSuppOther = &zrtpNotSuppOther;
        zrtp_cbs->zrtp_zrtpAskEnrollment = &zrtpAskEnrollment;
        zrtp_cbs->zrtp_zrtpInformEnrollment = &zrtpInformEnrollment;
        zrtp_cbs->zrtp_signSAS = &signSAS;
        zrtp_cbs->zrtp_checkSASSignature = &checkSASSignature;
        zrtp_cbs->userData = zrtp_cb_data;

        pjmedia_transport_zrtp_setUserCallback(zrtp_tp, zrtp_cbs);


        /*
        * Initialize the transport. Just the filename of the ZID file that holds
        * our partners ZID, shared data etc. If the files does not exists it will
        * be created an initialized. The ZRTP configuration is not yet implemented
        * thus the parameter is NULL.
        */
        pjmedia_transport_zrtp_initialize(zrtp_tp, css_var.zid_file, PJ_TRUE);

        return zrtp_tp;
    } else {
        PJ_LOG(1, (THIS_FILE, "ZRTP transport problem : %d", status));
        return base_tp;
    }
}
Esempio n. 3
0
void OIUC::prepare() {

    /*---------------- ICS  -----------------*/
    ics_pool_init(&app_data.ics);
    ics_pjsua_init(&app_data.ics);
    ics_init(&app_data.ics);

    //qDebug() << "INIT DONE";
#if 1
    SET_LOG_LEVEL(4);
    pj_log_set_level(3);

    ics_set_default_callback(&on_reg_start_default);
    ics_set_reg_start_callback(&on_reg_start_impl);
    ics_set_reg_state_callback(&on_reg_state_impl);
    ics_set_incoming_call_callback(&on_incoming_call_impl);
    ics_set_call_state_callback(&on_call_state_impl);
    ics_set_call_transfer_callback(&on_call_transfer_impl);
    ics_set_call_media_state_callback(&on_call_media_state_impl);

    ics_start(&app_data.ics);
    config->getPortAsterisk(); // Don't need anymore, now set default bind to any port
    ics_connect(&app_data.ics, config->getPortAsterisk());

    qDebug() << "ICS STARTED";
#endif
    /*---------------- PTTC  -----------------*/
#if 0
    pttc_init(&app_data.serial, &app_data.pttc, on_pttc_ptt, app_data.ics.pool);
    pttc_start(&app_data.serial, config->getSerialFile().toLocal8Bit().data());
#endif
    /*---------------- NODE  -----------------*/
#if 1
    memset(&app_data.node, 0, sizeof(app_data.node));

    gm_cs = "udp:" + config->getArbiterIP() + ":" + QString::number(config->getPortSendToArbiter());
    gmc_cs = "udp:" + config->getOIUCIP() + ":" + QString::number(config->getPortOIUCListen());
    adv_cs = "udp:0.0.0.0:2015";

    init_adv_server(&app_data, adv_cs.toLocal8Bit().data(), &app_data.node, app_data.ics.pool);
    app_data.node.on_leaving_server_f = &on_leaving_server;
    node_init(&app_data.node,
              config->getOIUCName().toLocal8Bit().data(),
              config->getLocation().toLocal8Bit().data(),
              config->getOIUCDescription().toLocal8Bit().data(),
              -1,
              gm_cs.toLocal8Bit().data(),
              gmc_cs.toLocal8Bit().data(),
              app_data.ics.pool);
    node_add_adv_server(&app_data.node, &app_data.adv_server);

    qDebug() << "NODE INIT DONE";
#endif
    /*---------------- GB  -----------------*/
#if 1
    memset(&app_data.gr, 0, sizeof(app_data.gr));
    app_data.gr.on_online_report_f = &on_online_report;
    app_data.gr.on_tx_report_f = &on_tx_report;
    app_data.gr.on_rx_report_f = &on_rx_report;
    app_data.gr.on_sq_report_f = &on_sq_report;
    gb_receiver_init(&app_data.gr, (char *)GB_CS, app_data.ics.pool);

    qDebug() << "GB DONE";
#endif
    /*---------------- STREAM  -----------------*/
#if 1
    node_media_config(&app_data.node, &app_data.streamer, &app_data.receiver);
    app_data.node.streamer->pool = app_data.node.receiver->pool = app_data.ics.pool;
    app_data.node.streamer->ep = app_data.node.receiver->ep = pjsua_get_pjmedia_endpt();
    pjmedia_codec_g711_init(app_data.node.streamer->ep);
    pjmedia_codec_g711_init(app_data.node.receiver->ep);

    streamer_init(app_data.node.streamer, app_data.node.streamer->ep, app_data.node.streamer->pool);
    receiver_init(app_data.node.receiver, app_data.node.receiver->ep, app_data.node.receiver->pool, config->getNumberChannels());

    streamer_config_dev_source(app_data.node.streamer, config->getSoundStreamerIdx());
    receiver_config_dev_sink(app_data.node.receiver, config->getSoundReceiverIdx());
    //streamer_config_dev_source(app_data.node.streamer, 2);
    //receiver_config_dev_sink(app_data.node.receiver, 2);
    //qDebug() << "STREAM INIT...DONE\n";
#endif
}
Esempio n. 4
0
/**
 * Create ipv6 transport
 */
PJ_DECL(pj_status_t) media_transports_create_ipv6(pjsua_transport_config rtp_cfg) {
    pjsua_media_transport tp[PJSUA_MAX_CALLS];
    pj_status_t status;
    int port = rtp_cfg.port;
    unsigned i;

    //TODO : here should be get from config
    for (i=0; i<PJSUA_MAX_CALLS; ++i) {
	enum { MAX_RETRY = 10 };
	pj_sock_t sock[2];
	pjmedia_sock_info si;
	unsigned j;

	/* Get rid of uninitialized var compiler warning with MSVC */
	status = PJ_SUCCESS;

	for (j=0; j<MAX_RETRY; ++j) {
	    unsigned k;

	    for (k=0; k<2; ++k) {
		pj_sockaddr bound_addr;

		status = pj_sock_socket(pj_AF_INET6(), pj_SOCK_DGRAM(), 0, &sock[k]);
		if (status != PJ_SUCCESS)
		    break;

		status = pj_sockaddr_init(pj_AF_INET6(), &bound_addr,
					  &rtp_cfg.bound_addr,
					  (unsigned short)(port+k));
		if (status != PJ_SUCCESS)
		    break;

		status = pj_sock_bind(sock[k], &bound_addr,
				      pj_sockaddr_get_len(&bound_addr));
		if (status != PJ_SUCCESS)
		    break;
	    }
	    if (status != PJ_SUCCESS) {
		if (k==1)
		    pj_sock_close(sock[0]);

		if (port != 0)
		    port += 10;
		else
		    break;

		continue;
	    }

	    pj_bzero(&si, sizeof(si));
	    si.rtp_sock = sock[0];
	    si.rtcp_sock = sock[1];

	    pj_sockaddr_init(pj_AF_INET6(), &si.rtp_addr_name,
			     &rtp_cfg.public_addr,
			     (unsigned short)(port));
	    pj_sockaddr_init(pj_AF_INET6(), &si.rtcp_addr_name,
			     &rtp_cfg.public_addr,
			     (unsigned short)(port+1));

	    status = pjmedia_transport_udp_attach(pjsua_get_pjmedia_endpt(),
						  NULL,
						  &si,
						  0,
						  &tp[i].transport);
	    if (port != 0)
		port += 10;
	    else
		break;

	    if (status == PJ_SUCCESS)
		break;
	}

	if (status != PJ_SUCCESS) {
	    pjsua_perror(THIS_FILE, "Error creating IPv6 UDP media transport",
			 status);
	    for (j=0; j<i; ++j) {
		pjmedia_transport_close(tp[j].transport);
	    }
	    return status;
	}
    }

    return pjsua_media_transports_attach(tp, i, PJ_TRUE);
}
Esempio n. 5
0
/* Initialize the ZRTP transport and the user callbacks */
pjmedia_transport* on_zrtp_transport_created(pjsua_call_id call_id,
	unsigned media_idx,
	pjmedia_transport *base_tp,
	unsigned flags) {
        pjsua_call *call;
		pjmedia_transport *zrtp_tp = NULL;
		pj_status_t status;
		pjmedia_endpt* endpt = pjsua_get_pjmedia_endpt();

		// For now, do zrtp only on audio stream
        call = &pjsua_var.calls[call_id];
        if (media_idx < call->med_prov_cnt) {
            pjsua_call_media *call_med = &call->media_prov[media_idx];
            if (call_med->tp && call_med->type != PJMEDIA_TYPE_AUDIO) {
                PJ_LOG(2, (THIS_FILE, "ZRTP transport not yet supported for : %d", call_med->type));
                return base_tp;
            }
        }

	    // Create zrtp transport adapter
		status = pjmedia_transport_zrtp_create(endpt, NULL, base_tp,
											   &zrtp_tp, (flags & PJSUA_MED_TP_CLOSE_MEMBER));

		if(status == PJ_SUCCESS){
			PJ_LOG(4,(THIS_FILE, "ZRTP transport created"));
			// TODO : we should use our own pool
			// Build callback data ponter
			zrtp_cb_user_data* zrtp_cb_data = PJ_POOL_ZALLOC_T(css_var.pool, zrtp_cb_user_data);
			zrtp_cb_data->zrtp_tp = zrtp_tp;
			zrtp_cb_data->call_id = call_id;
			zrtp_cb_data->cipher = pj_str("");
			zrtp_cb_data->sas = pj_str("");
			zrtp_cb_data->sas_verified = PJ_FALSE;


			// Build callback struct
			zrtp_UserCallbacks* zrtp_cbs = PJ_POOL_ZALLOC_T(css_var.pool, zrtp_UserCallbacks);
			zrtp_cbs->zrtp_secureOn = &zrtpSecureOn;
			zrtp_cbs->zrtp_secureOff = &zrtpSecureOff;
			zrtp_cbs->zrtp_showSAS = &zrtpShowSas;
			zrtp_cbs->zrtp_confirmGoClear = &confirmGoClear;
			zrtp_cbs->zrtp_showMessage = &showMessage;
			zrtp_cbs->zrtp_zrtpNegotiationFailed = &zrtpNegotiationFailed;
			zrtp_cbs->zrtp_zrtpNotSuppOther = &zrtpNotSuppOther;
			zrtp_cbs->zrtp_zrtpAskEnrollment = &zrtpAskEnrollment;
			zrtp_cbs->zrtp_zrtpInformEnrollment = &zrtpInformEnrollment;
			zrtp_cbs->zrtp_signSAS = &signSAS;
			zrtp_cbs->zrtp_checkSASSignature = &checkSASSignature;
			zrtp_cbs->userData = zrtp_cb_data;

			pjmedia_transport_zrtp_setUserCallback(zrtp_tp, zrtp_cbs);


			/*
			* Initialize the transport. Just the filename of the ZID file that holds
			* our partners ZID, shared data etc. If the files does not exists it will
			* be created an initialized. The ZRTP configuration is not yet implemented
			* thus the parameter is NULL.
			*/
			pjmedia_transport_zrtp_initialize(zrtp_tp, css_var.zid_file, PJ_TRUE);
#if 0
			// This is a crappy hack for buggy versions of sip servers that does not correctly manage hello
			ZrtpContext* zrtpContext = pjmedia_transport_zrtp_getZrtpContext(zrtp_tp);
			zrtp_setMandatoryOnly(zrtpContext);
#endif

			return zrtp_tp;
		} else {
			PJ_LOG(1, (THIS_FILE, "ZRTP transport problem : %d", status));
			return base_tp;
		}
}