diff --git a/src/jamidht/channeled_transport.cpp b/src/jamidht/channeled_transport.cpp index ed0745294e6b15b0be71bd8e62c9a3061f752c66..90303e7eb03e1c49378445f04747cb5751bc2392 100644 --- a/src/jamidht/channeled_transport.cpp +++ b/src/jamidht/channeled_transport.cpp @@ -39,6 +39,7 @@ ChanneledSIPTransport::ChanneledSIPTransport(pjsip_endpoint* endpt, const IpAddr& remote, onShutdownCb&& cb) : socket_(socket) + , shutdownCb_(std::move(cb)) , local_ {local} , remote_ {remote} , trData_() @@ -150,9 +151,13 @@ ChanneledSIPTransport::ChanneledSIPTransport(pjsip_endpoint* endpt, // Register callbacks if (pjsip_transport_register(base.tpmgr, &base) != PJ_SUCCESS) throw std::runtime_error("Can't register PJSIP transport."); +} +void +ChanneledSIPTransport::start() +{ // Link to Channel Socket - socket->setOnRecv([this](const uint8_t* buf, size_t len) { + socket_->setOnRecv([this](const uint8_t* buf, size_t len) { pj_gettimeofday(&rdata_.pkt_info.timestamp); size_t remaining {len}; while (remaining) { @@ -176,7 +181,7 @@ ChanneledSIPTransport::ChanneledSIPTransport(pjsip_endpoint* endpt, } return len; }); - socket->onShutdown([cb = std::move(cb), this] { + socket_->onShutdown([this] { disconnected_ = true; if (auto state_cb = pjsip_tpmgr_get_state_cb(trData_.base.tpmgr)) { JAMI_WARN("[SIPS] process disconnect event"); @@ -185,7 +190,7 @@ ChanneledSIPTransport::ChanneledSIPTransport(pjsip_endpoint* endpt, state_info.status = PJ_SUCCESS; (*state_cb)(&trData_.base, PJSIP_TP_STATE_DISCONNECTED, &state_info); } - cb(); + shutdownCb_(); }); } diff --git a/src/jamidht/channeled_transport.h b/src/jamidht/channeled_transport.h index 42588e7afd9361100f0f3eb66e0ba29545d067bb..ed3a79b77845bdcc3d733838335ae342bb572ed4 100644 --- a/src/jamidht/channeled_transport.h +++ b/src/jamidht/channeled_transport.h @@ -56,6 +56,11 @@ public: onShutdownCb&& cb); ~ChanneledSIPTransport(); + /** + * Connect callbacks for channeled socket, must be done when the channel is ready to be used + */ + void start(); + pjsip_transport* getTransportBase() override { return &trData_.base; } IpAddr getLocalAddress() const override { return local_; } @@ -65,6 +70,7 @@ private: // The SIP transport uses a ChannelSocket to send and receive datas std::shared_ptr<ChannelSocket> socket_ {}; + onShutdownCb shutdownCb_ {}; IpAddr local_ {}; IpAddr remote_ {}; diff --git a/src/jamidht/jamiaccount.cpp b/src/jamidht/jamiaccount.cpp index 542cf42f24bd85c3021b9860dc601428f45dd9f2..69c02e34b3ef1179ee73820bfc325b9b0ff27d1b 100644 --- a/src/jamidht/jamiaccount.cpp +++ b/src/jamidht/jamiaccount.cpp @@ -4217,12 +4217,13 @@ JamiAccount::cacheSIPConnection(std::shared_ptr<ChannelSocket>&& socket, // SIP channel to make the call pass through shared->callConnectionClosed(key.second, false); }; - auto sip_tr = link_.sipTransportBroker->getChanneledTransport(socket, std::move(onShutdown)); + auto sip_tr = link_.sipTransportBroker->getChanneledTransport(shared(), + socket, + std::move(onShutdown)); if (!sip_tr) { JAMI_ERR() << "No channeled transport found"; return; } - sip_tr->setAccount(shared()); // Store the connection connections.emplace_back(SipConnection {sip_tr, socket}); JAMI_WARN("[Account %s] New SIP channel opened with %s", diff --git a/src/jamidht/multiplexed_socket.cpp b/src/jamidht/multiplexed_socket.cpp index e971968c9cac77bf71c762380ff9cf7653c7301c..5930a1561460a258283711afbb665ec456643f74 100644 --- a/src/jamidht/multiplexed_socket.cpp +++ b/src/jamidht/multiplexed_socket.cpp @@ -120,11 +120,16 @@ public: clearSockets(); } - std::shared_ptr<ChannelSocket> makeSocket(const std::string& name, uint16_t channel, bool isInitiator = false) + std::shared_ptr<ChannelSocket> makeSocket(const std::string& name, + uint16_t channel, + bool isInitiator = false) { auto& channelSocket = sockets[channel]; if (not channelSocket) - channelSocket = std::make_shared<ChannelSocket>(parent_.weak(), name, channel, isInitiator); + channelSocket = std::make_shared<ChannelSocket>(parent_.weak(), + name, + channel, + isInitiator); else { JAMI_WARN("A channel is already present on that socket, accepting " "the request will close the previous one %s", @@ -705,7 +710,10 @@ MultiplexedSocket::sendVersion() class ChannelSocket::Impl { public: - Impl(std::weak_ptr<MultiplexedSocket> endpoint, const std::string& name, const uint16_t& channel, bool isInitiator) + Impl(std::weak_ptr<MultiplexedSocket> endpoint, + const std::string& name, + const uint16_t& channel, + bool isInitiator) : name(name) , channel(channel) , endpoint(std::move(endpoint)) diff --git a/src/sip/siptransport.cpp b/src/sip/siptransport.cpp index ffdd0b001dca1083fb48d85e0039a926eec9dea7..5030edb135b481be7f275772a2e70766598c4a5a 100644 --- a/src/sip/siptransport.cpp +++ b/src/sip/siptransport.cpp @@ -397,7 +397,8 @@ SipTransportBroker::getTlsTransport(const std::shared_ptr<TlsListener>& l, } std::shared_ptr<SipTransport> -SipTransportBroker::getChanneledTransport(const std::shared_ptr<ChannelSocket>& socket, +SipTransportBroker::getChanneledTransport(const std::shared_ptr<SIPAccountBase>& account, + const std::shared_ptr<ChannelSocket>& socket, onShutdownCb&& cb) { auto ice = socket->underlyingICE(); @@ -415,7 +416,7 @@ SipTransportBroker::getChanneledTransport(const std::shared_ptr<ChannelSocket>& auto tr = sips_tr->getTransportBase(); auto sip_tr = std::make_shared<SipTransport>(tr); sip_tr->setDeviceId(socket->deviceId().toString()); - sips_tr.release(); // managed by PJSIP now + sip_tr->setAccount(account); { std::lock_guard<std::mutex> lock(transportMapMutex_); @@ -423,6 +424,9 @@ SipTransportBroker::getChanneledTransport(const std::shared_ptr<ChannelSocket>& // (member of new SipIceTransport instance) transports_.emplace(tr, sip_tr); } + + sips_tr->start(); + sips_tr.release(); // managed by PJSIP now return sip_tr; } diff --git a/src/sip/siptransport.h b/src/sip/siptransport.h index 6d81183cdcf18f6aabb08310e665cc423abcf875..914c68b4349c19ed49316c39c3b5f40378b57132 100644 --- a/src/sip/siptransport.h +++ b/src/sip/siptransport.h @@ -161,8 +161,10 @@ public: std::shared_ptr<SipTransport> addTransport(pjsip_transport*); - std::shared_ptr<SipTransport> getChanneledTransport(const std::shared_ptr<ChannelSocket>& socket, - onShutdownCb&& cb); + std::shared_ptr<SipTransport> getChanneledTransport( + const std::shared_ptr<SIPAccountBase>& account, + const std::shared_ptr<ChannelSocket>& socket, + onShutdownCb&& cb); /** * Start graceful shutdown procedure for all transports