diff --git a/src/sip/sipaccount.cpp b/src/sip/sipaccount.cpp index 7e4c807adb76b5a0057886a60deba26feafe0529..39375b668860c89d0dbf298f5d8a1f4a88a13997 100644 --- a/src/sip/sipaccount.cpp +++ b/src/sip/sipaccount.cpp @@ -87,6 +87,7 @@ using yaml_utils::parseValue; using yaml_utils::parseVectorMap; using sip_utils::CONST_PJ_STR; +static constexpr int KEEP_ALIVE_DELAY = 10; // seconds static constexpr int MIN_REGISTRATION_TIME = 60; // seconds static constexpr unsigned DEFAULT_REGISTRATION_TIME = 3600; // seconds static constexpr unsigned REGISTRATION_FIRST_RETRY_INTERVAL = 60; // seconds @@ -222,7 +223,7 @@ SIPAccount::newOutgoingCall(std::string_view toUrl, // FIXME : for now, use the same address family as the SIP transport family = pjsip_transport_type_get_af(getTransportType()); - JAMI_DBG("UserAgent: New registered account call to %.*s", (int)toUrl.size(), toUrl.data()); + JAMI_DBG("UserAgent: New registered account call to %.*s", (int) toUrl.size(), toUrl.data()); } auto toUri = getToUri(to); @@ -408,6 +409,8 @@ SIPAccount::SIPStartCall(std::shared_ptr<SIPCall>& call) return false; } + setUpTransmissionData(tdata, tp_sel.u.transport->key.type); + // Add user-agent header sip_utils::addUserAgenttHeader(getUserAgentName(), tdata); @@ -908,8 +911,6 @@ SIPAccount::doUnregister(std::function<void(bool)> released_cb) std::unique_lock<std::mutex> lock(configurationMutex_); tlsListener_.reset(); - if (transport_) - setTransport(); if (!isIP2IP()) { try { @@ -918,6 +919,9 @@ SIPAccount::doUnregister(std::function<void(bool)> released_cb) JAMI_ERR("doUnregister %s", e.what()); } } + + if (transport_) + setTransport(); resetAutoRegistration(); lock.unlock(); @@ -968,10 +972,10 @@ SIPAccount::startKeepAliveTimer() pj_time_val keepAliveDelay_; if (registrationExpire_ == 0) { JAMI_DBG("Registration Expire: 0, taking 60 instead"); - keepAliveDelay_.sec = 3600; + keepAliveDelay_.sec = MIN_REGISTRATION_TIME; } else { JAMI_DBG("Registration Expire: %d", registrationExpire_); - keepAliveDelay_.sec = registrationExpire_ + MIN_REGISTRATION_TIME; + keepAliveDelay_.sec = registrationExpire_ + KEEP_ALIVE_DELAY; } keepAliveDelay_.msec = 0; keepAliveTimerActive_ = true; @@ -988,7 +992,7 @@ SIPAccount::stopKeepAliveTimer() keepAliveTimerActive_ = false; link_.cancelKeepAliveTimer(keepAliveTimer_); if (keepAliveTimer_.user_data) { - delete ((std::weak_ptr<SIPAccount>*)keepAliveTimer_.user_data); + delete ((std::weak_ptr<SIPAccount>*) keepAliveTimer_.user_data); keepAliveTimer_.user_data = nullptr; } } @@ -1070,26 +1074,18 @@ SIPAccount::sendRegister() pjsip_regc_add_headers(regc, &hdr_list); pjsip_tx_data* tdata; - if (pjsip_regc_register(regc, PJ_TRUE, &tdata) != PJ_SUCCESS) + if (pjsip_regc_register(regc, PJ_FALSE, &tdata) != PJ_SUCCESS) throw VoipLinkException("Unable to initialize transaction data for account registration"); const pjsip_tpselector tp_sel = getTransportSelector(); if (pjsip_regc_set_transport(regc, &tp_sel) != PJ_SUCCESS) throw VoipLinkException("Unable to set transport"); - if (hostIp_) { - auto ai = &tdata->dest_info; - ai->name = pj_strdup3(tdata->pool, hostname_.c_str()); - ai->addr.count = 1; - ai->addr.entry[0].type = (pjsip_transport_type_e) tp_sel.u.transport->key.type; - pj_memcpy(&ai->addr.entry[0].addr, hostIp_.pjPtr(), sizeof(pj_sockaddr)); - ai->addr.entry[0].addr_len = hostIp_.getLength(); - ai->cur_addr = 0; - } + setUpTransmissionData(tdata, tp_sel.u.transport->key.type); // pjsip_regc_send increment the transport ref count by one, if ((status = pjsip_regc_send(regc, tdata)) != PJ_SUCCESS) { - JAMI_ERR("pjsip_regc_init failed with error %d: %s", + JAMI_ERR("pjsip_regc_send failed with error %d: %s", status, sip_utils::sip_strerror(status).c_str()); throw VoipLinkException("Unable to send account registration request"); @@ -1098,6 +1094,31 @@ SIPAccount::sendRegister() setRegistrationInfo(regc); } +void +SIPAccount::setUpTransmissionData(pjsip_tx_data* tdata, long transportKeyType) +{ + if (hasServiceRoute()) { + IpAddr proxyServer {getServiceRoute()}; + if (proxyServer.getPort() == 0) + proxyServer.setPort(sip_utils::DEFAULT_SIP_PORT); + auto ai = &tdata->dest_info; + ai->name = pj_strdup3(tdata->pool, hostname_.c_str()); + ai->addr.count = 1; + ai->addr.entry[0].type = (pjsip_transport_type_e) transportKeyType; + pj_memcpy(&ai->addr.entry[0].addr, proxyServer.pjPtr(), sizeof(pj_sockaddr)); + ai->addr.entry[0].addr_len = proxyServer.getLength(); + ai->cur_addr = 0; + } else if (hostIp_) { + auto ai = &tdata->dest_info; + ai->name = pj_strdup3(tdata->pool, hostname_.c_str()); + ai->addr.count = 1; + ai->addr.entry[0].type = (pjsip_transport_type_e) transportKeyType; + pj_memcpy(&ai->addr.entry[0].addr, hostIp_.pjPtr(), sizeof(pj_sockaddr)); + ai->addr.entry[0].addr_len = hostIp_.getLength(); + ai->cur_addr = 0; + } +} + void SIPAccount::onRegister(pjsip_regc_cbparam* param) { @@ -1208,6 +1229,12 @@ SIPAccount::sendUnregister() if (pjsip_regc_unregister(regc, &tdata) != PJ_SUCCESS) throw VoipLinkException("Unable to unregister sip account"); + const pjsip_tpselector tp_sel = getTransportSelector(); + if (pjsip_regc_set_transport(regc, &tp_sel) != PJ_SUCCESS) + throw VoipLinkException("Unable to set transport"); + + setUpTransmissionData(tdata, tp_sel.u.transport->key.type); + pj_status_t status; if ((status = pjsip_regc_send(regc, tdata)) != PJ_SUCCESS) { JAMI_ERR("pjsip_regc_send failed with error %d: %s", @@ -1807,17 +1834,25 @@ SIPAccount::matches(std::string_view userName, std::string_view server) const { if (fullMatch(userName, server)) { JAMI_DBG("Matching account id in request is a fullmatch %.*s@%.*s", - (int)userName.size(), userName.data(), - (int)server.size(), server.data()); + (int) userName.size(), + userName.data(), + (int) server.size(), + server.data()); return MatchRank::FULL; } else if (hostnameMatch(server)) { - JAMI_DBG("Matching account id in request with hostname %.*s", (int)server.size(), server.data()); + JAMI_DBG("Matching account id in request with hostname %.*s", + (int) server.size(), + server.data()); return MatchRank::PARTIAL; } else if (userMatch(userName)) { - JAMI_DBG("Matching account id in request with username %.*s", (int)userName.size(), userName.data()); + JAMI_DBG("Matching account id in request with username %.*s", + (int) userName.size(), + userName.data()); return MatchRank::PARTIAL; } else if (proxyMatch(server)) { - JAMI_DBG("Matching account id in request with proxy %.*s", (int)server.size(), server.data()); + JAMI_DBG("Matching account id in request with proxy %.*s", + (int) server.size(), + server.data()); return MatchRank::PARTIAL; } else { return MatchRank::NONE; @@ -1839,7 +1874,7 @@ SIPAccount::resetAutoRegistration() auto_rereg_.active = PJ_FALSE; auto_rereg_.attempt_cnt = 0; if (auto_rereg_.timer.user_data) { - delete ((std::weak_ptr<SIPAccount>*)auto_rereg_.timer.user_data); + delete ((std::weak_ptr<SIPAccount>*) auto_rereg_.timer.user_data); auto_rereg_.timer.user_data = nullptr; } } @@ -2203,6 +2238,8 @@ SIPAccount::sendTextMessage(const std::string& to, return; } + setUpTransmissionData(tdata, tp_sel.u.transport->key.type); + im::fillPJSIPMessageBody(*tdata, payloads); // Send message request with callback SendMessageOnComplete diff --git a/src/sip/sipaccount.h b/src/sip/sipaccount.h index f959612ef7146acd47f49630a03b51cb4785f352..f367907edc8586b12b98207f5c165cb0e38cc397 100644 --- a/src/sip/sipaccount.h +++ b/src/sip/sipaccount.h @@ -463,13 +463,11 @@ public: #ifndef _MSC_VER template<class T = SIPCall> std::shared_ptr<enable_if_base_of<T, SIPCall>> newOutgoingCall( - std::string_view toUrl, - const std::map<std::string, std::string>& volatileCallDetails = {}); + std::string_view toUrl, const std::map<std::string, std::string>& volatileCallDetails = {}); #else template<class T> std::shared_ptr<T> newOutgoingCall( - std::string_view toUrl, - const std::map<std::string, std::string>& volatileCallDetails = {}); + std::string_view toUrl, const std::map<std::string, std::string>& volatileCallDetails = {}); #endif /** @@ -507,6 +505,8 @@ private: void doRegister1_(); void doRegister2_(); + void setUpTransmissionData(pjsip_tx_data* tdata, long transportKeyType); + /** * Set the internal state for this account, mainly used to manage account details from the * client application. @@ -642,7 +642,7 @@ private: int registrationExpire_; /** - * Optional list of SIP service this + * Input Outbound Proxy Server Address */ std::string serviceRoute_;