From 392e70ad4f0318a9899c9f6aa97d5d6a7f1da549 Mon Sep 17 00:00:00 2001 From: Stepan Salenikovich <stepan.salenikovich@savoirfairelinux.com> Date: Fri, 16 Jan 2015 13:54:30 -0500 Subject: [PATCH] daemon: refactor ICE transport master/slave role Added a flag to ICE transport constructor indicating whether it will be master or slave so this can be choosen without relying on 'on_initdone_cb'. Refs #63303 Change-Id: I3896c6c0738d792091d23385fe6b67ab60764282 --- daemon/src/call.cpp | 10 +--------- daemon/src/ice_transport.cpp | 13 ++++++++++++- daemon/src/ice_transport.h | 4 ++++ daemon/src/ringdht/ringaccount.cpp | 8 ++++---- 4 files changed, 21 insertions(+), 14 deletions(-) diff --git a/daemon/src/call.cpp b/daemon/src/call.cpp index 218fbaa555..dd3356177d 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 52b9a2becf..c0f0709713 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 5d5a389ecb..a268f0303f 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 c7c8841108..775203b3ce 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, -- GitLab