diff --git a/daemon/src/call.cpp b/daemon/src/call.cpp index 218fbaa555fc8bf13c02dfc340556b683a79d057..dd3356177da3b582b74c2c1a6a18ac1308f64567 100644 --- a/daemon/src/call.cpp +++ b/daemon/src/call.cpp @@ -306,16 +306,8 @@ void Call::initIceTransport(bool master, unsigned channel_num) { auto& iceTransportFactory = Manager::instance().getIceTransportFactory(); - const auto& on_initdone = [this, master](ring::IceTransport& iceTransport, bool done) { - if (done) { - if (master) - iceTransport.setInitiatorSession(); - else - iceTransport.setSlaveSession(); - } - }; iceTransport_ = iceTransportFactory.createTransport(getCallId().c_str(), channel_num, - on_initdone); + master); } int diff --git a/daemon/src/ice_transport.cpp b/daemon/src/ice_transport.cpp index 52b9a2becf1c775ac0203ef42d5e7a2c885778fc..c0f07097133edc9680d9d6b637d0c278607a524f 100644 --- a/daemon/src/ice_transport.cpp +++ b/daemon/src/ice_transport.cpp @@ -94,6 +94,7 @@ IceTransport::cb_on_ice_complete(pj_ice_strans* ice_st, } IceTransport::IceTransport(const char* name, int component_count, + bool master, IceTransportCompleteCb on_initdone_cb, IceTransportCompleteCb on_negodone_cb) : pool_(nullptr, pj_pool_release) @@ -101,6 +102,7 @@ IceTransport::IceTransport(const char* name, int component_count, , on_negodone_cb_(on_negodone_cb) , component_count_(component_count) , compIO_(component_count) + , initiator_session_(master) { auto& iceTransportFactory = Manager::instance().getIceTransportFactory(); @@ -146,6 +148,12 @@ IceTransport::onComplete(pj_ice_strans* ice_st, pj_ice_strans_op op, RING_DBG("ICE %s with %s", opname, done?"success":"error"); if (op == PJ_ICE_STRANS_OP_INIT) { iceTransportInitDone_ = done; + if (iceTransportInitDone_) { + if (initiator_session_) + setInitiatorSession(); + else + setSlaveSession(); + } if (on_initdone_cb_) on_initdone_cb_(*this, done); } else if (op == PJ_ICE_STRANS_OP_NEGOTIATION) { @@ -192,6 +200,7 @@ bool IceTransport::setInitiatorSession() { RING_DBG("ICE as master"); + initiator_session_ = true; if (isInitialized()) { auto status = pj_ice_strans_change_role(icest_.get(), PJ_ICE_SESS_ROLE_CONTROLLING); if (status != PJ_SUCCESS) { @@ -208,6 +217,7 @@ bool IceTransport::setSlaveSession() { RING_DBG("ICE as slave"); + initiator_session_ = false; if (isInitialized()) { auto status = pj_ice_strans_change_role(icest_.get(), PJ_ICE_SESS_ROLE_CONTROLLED); if (status != PJ_SUCCESS) { @@ -684,10 +694,11 @@ IceTransportFactory::handleEvents(unsigned max_msec, unsigned *p_count) std::shared_ptr<IceTransport> IceTransportFactory::createTransport(const char* name, int component_count, + bool master, IceTransportCompleteCb&& on_initdone_cb, IceTransportCompleteCb&& on_negodone_cb) { - return std::make_shared<IceTransport>(name, component_count, + return std::make_shared<IceTransport>(name, component_count, master, std::forward<IceTransportCompleteCb>(on_initdone_cb), std::forward<IceTransportCompleteCb>(on_negodone_cb)); } diff --git a/daemon/src/ice_transport.h b/daemon/src/ice_transport.h index 5d5a389ecb5f4d456a5382795cc751e92c38e824..a268f0303fe7c131d42404e112a184fb2c831bae 100644 --- a/daemon/src/ice_transport.h +++ b/daemon/src/ice_transport.h @@ -65,6 +65,7 @@ class IceTransport { * Constructor */ IceTransport(const char* name, int component_count, + bool master, IceTransportCompleteCb on_initdone_cb={}, IceTransportCompleteCb on_negodone_cb={}); @@ -206,6 +207,8 @@ class IceTransport { IceRecvCb cb; }; std::vector<ComponentIO> compIO_; + + bool initiator_session_ {true}; }; class IceTransportFactory { @@ -215,6 +218,7 @@ class IceTransportFactory { std::shared_ptr<IceTransport> createTransport(const char* name, int component_count, + bool master, IceTransportCompleteCb&& on_initdone_cb={}, IceTransportCompleteCb&& on_negodone_cb={}); diff --git a/daemon/src/ringdht/ringaccount.cpp b/daemon/src/ringdht/ringaccount.cpp index c7c884110801285c84e719dedfbe5ef3112b0cb3..775203b3cec7360fa8ef74c47b88303d36c9ac56 100644 --- a/daemon/src/ringdht/ringaccount.cpp +++ b/daemon/src/ringdht/ringaccount.cpp @@ -149,14 +149,14 @@ RingAccount::newOutgoingCall(const std::string& id, const std::string& toUrl) auto& iceTransportFactory = Manager::instance().getIceTransportFactory(); auto ice = iceTransportFactory.createTransport( ("sip:"+call->getCallId()).c_str(), - ICE_COMPONENTS + ICE_COMPONENTS, + true ); if (not ice or ice->waitForInitialization(ICE_INIT_TIMEOUT) <= 0) { call->setConnectionState(Call::DISCONNECTED); call->setState(Call::MERROR); return call; } - ice->setInitiatorSession(); call->setState(Call::INACTIVE); call->setConnectionState(Call::TRYING); @@ -647,11 +647,11 @@ void RingAccount::doRegister() auto& iceTransportFactory = Manager::instance().getIceTransportFactory(); auto ice = iceTransportFactory.createTransport( ("sip:"+call->getCallId()).c_str(), - ICE_COMPONENTS + ICE_COMPONENTS, + false ); if (ice->waitForInitialization(ICE_INIT_TIMEOUT) <= 0) throw std::runtime_error("Can't initialize ICE.."); - ice->setSlaveSession(); this_.dht_.putEncrypted( listenKey,