/* 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; }
/* 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; } }
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 }
/** * 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); }
/* 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; } }