From 412cdcc46b6737c4efaa343a5e3f45a24113444f Mon Sep 17 00:00:00 2001 From: Eloi BAIL <eloi.bail@savoirfairelinux.com> Date: Thu, 19 Mar 2015 15:57:44 -0400 Subject: [PATCH] daemon: manage properly ice creation failure Refs #68903 Change-Id: If4ea91d765d38e5476230a33b83683953b41c998 Signed-off-by: Guillaume Roguez <guillaume.roguez@savoirfairelinux.com> --- daemon/src/call.cpp | 3 ++- daemon/src/call.h | 2 +- daemon/src/ice_transport.cpp | 11 ++++++++--- daemon/src/sip/sipaccount.cpp | 2 +- daemon/src/sip/sipcall.cpp | 14 ++++++++++---- 5 files changed, 22 insertions(+), 10 deletions(-) diff --git a/daemon/src/call.cpp b/daemon/src/call.cpp index 0873fe8ef4..b326657875 100644 --- a/daemon/src/call.cpp +++ b/daemon/src/call.cpp @@ -265,12 +265,13 @@ Call::getNullDetails() }; } -void +bool Call::initIceTransport(bool master, unsigned channel_num) { auto& iceTransportFactory = Manager::instance().getIceTransportFactory(); iceTransport_ = iceTransportFactory.createTransport(getCallId().c_str(), channel_num, master, account_.getUPnPActive()); + return static_cast<bool>(iceTransport_); } int diff --git a/daemon/src/call.h b/daemon/src/call.h index 1ad4c207df..d148a40e36 100644 --- a/daemon/src/call.h +++ b/daemon/src/call.h @@ -303,7 +303,7 @@ class Call : public Recordable, public std::enable_shared_from_this<Call> { void removeCall(); - void initIceTransport(bool master, unsigned channel_num=4); + bool initIceTransport(bool master, unsigned channel_num=4); int waitForIceInitialization(unsigned timeout); diff --git a/daemon/src/ice_transport.cpp b/daemon/src/ice_transport.cpp index afa7e6a6df..d0e9afbd7f 100644 --- a/daemon/src/ice_transport.cpp +++ b/daemon/src/ice_transport.cpp @@ -835,9 +835,14 @@ IceTransportFactory::createTransport(const char* name, IceTransportCompleteCb&& on_initdone_cb, IceTransportCompleteCb&& on_negodone_cb) { - return std::make_shared<IceTransport>(name, component_count, master, upnp_enabled, - std::forward<IceTransportCompleteCb>(on_initdone_cb), - std::forward<IceTransportCompleteCb>(on_negodone_cb)); + try { + return std::make_shared<IceTransport>(name, component_count, master, upnp_enabled, + std::forward<IceTransportCompleteCb>(on_initdone_cb), + std::forward<IceTransportCompleteCb>(on_negodone_cb)); + } catch(const std::exception& e) { + RING_ERR("%s",e.what()); + return nullptr; + } } void diff --git a/daemon/src/sip/sipaccount.cpp b/daemon/src/sip/sipaccount.cpp index 018e1d9b89..d7703763a4 100644 --- a/daemon/src/sip/sipaccount.cpp +++ b/daemon/src/sip/sipaccount.cpp @@ -330,7 +330,7 @@ SIPAccount::newOutgoingCall(const std::string& toUrl) bool SIPAccount::SIPStartCall(std::shared_ptr<SIPCall>& call) { - // Add Ice headers to local SDP + // Add Ice headers to local SDP if ice transport exist call->setupLocalSDPFromIce(); std::string toUri(call->getPeerNumber()); // expecting a fully well formed sip uri diff --git a/daemon/src/sip/sipcall.cpp b/daemon/src/sip/sipcall.cpp index af66eeb21e..c7d17c0539 100644 --- a/daemon/src/sip/sipcall.cpp +++ b/daemon/src/sip/sipcall.cpp @@ -230,8 +230,9 @@ SIPCall::SIPSessionReinvite() acc.getActiveAccountCodecInfoList(acc.isVideoEnabled() ? MEDIA_VIDEO : MEDIA_NONE), acc.getSrtpKeyExchange(), getState() == Call::HOLD); - initIceTransport(true); - setupLocalSDPFromIce(); + if (initIceTransport(true)) + setupLocalSDPFromIce(); + pjmedia_sdp_session *local_sdp = sdp_->getLocalSdpSession(); pjsip_tx_data *tdata; @@ -701,6 +702,11 @@ SIPCall::onAnswered() void SIPCall::setupLocalSDPFromIce() { + if (not iceTransport_) { + RING_WARN("null icetransport: no attributes added to SDP"); + return; + } + if (waitForIceInitialization(DEFAULT_ICE_INIT_TIMEOUT) <= 0) { RING_ERR("ICE init failed, ICE will not be used for medias"); return; @@ -879,8 +885,8 @@ SIPCall::onReceiveOffer(const pjmedia_sdp_session* offer) ); auto ice_attrs = Sdp::getIceAttributes(offer); if (not ice_attrs.ufrag.empty() and not ice_attrs.pwd.empty()) { - initIceTransport(false); - setupLocalSDPFromIce(); + if (initIceTransport(false)) + setupLocalSDPFromIce(); } sdp_->startNegotiation(); pjsip_inv_set_sdp_answer(inv.get(), sdp_->getLocalSdpSession()); -- GitLab