diff --git a/daemon/src/sip/sdp.cpp b/daemon/src/sip/sdp.cpp index 4a97ab3ba15ad2b104e0daada74370eed66c7ddf..baf845593c320616a2ea4fb5f8f65aed724ecc77 100644 --- a/daemon/src/sip/sdp.cpp +++ b/daemon/src/sip/sdp.cpp @@ -39,7 +39,6 @@ #include "sipaccount.h" #include "manager.h" #include "logger.h" -#include "ip_utils.h" #ifdef SFL_VIDEO #include "video/libav_utils.h" @@ -64,7 +63,7 @@ Sdp::Sdp(pj_pool_t *pool) , sessionAudioMedia_() , sessionVideoMedia_() , publishedIpAddr_() - , publishedIpAddrStr_() + , publishedIpAddrType_() , remoteIpAddr_() , localAudioDataPort_(0) , localAudioControlPort_(0) @@ -342,8 +341,9 @@ Sdp::setMediaDescriptorLines(bool audio) void Sdp::addRTCPAttribute(pjmedia_sdp_media *med) { + auto ip = ip_utils::strToAddr(publishedIpAddr_); pj_sockaddr outputAddr; - pj_sockaddr_cp(&outputAddr, &publishedIpAddr_); + pj_sockaddr_cp(&outputAddr, &ip); pj_sockaddr_set_port(&outputAddr, localAudioControlPort_); pjmedia_sdp_attr *attr = pjmedia_sdp_attr_create_rtcp(memPool_, &outputAddr); if (attr) @@ -351,29 +351,28 @@ void Sdp::addRTCPAttribute(pjmedia_sdp_media *med) } void -Sdp::setPublishedIP(const std::string &ip_addr) +Sdp::setPublishedIP(const std::string &addr, pj_uint16_t addr_type) { - setPublishedIP(ip_utils::strToAddr(ip_addr)); -} - -void -Sdp::setPublishedIP(const pj_sockaddr& ip_addr) -{ - publishedIpAddr_ = ip_addr; - publishedIpAddrStr_ = ip_utils::addrToStr(publishedIpAddr_); - + publishedIpAddr_ = addr; + publishedIpAddrType_ = addr_type; if (localSession_) { - if (publishedIpAddr_.addr.sa_family == pj_AF_INET6()) + if (addr_type == pj_AF_INET6()) localSession_->origin.addr_type = pj_str((char*) "IP6"); else localSession_->origin.addr_type = pj_str((char*) "IP4"); - localSession_->origin.addr = pj_str((char*) publishedIpAddrStr_.c_str()); + localSession_->origin.addr = pj_str((char*) publishedIpAddr_.c_str()); localSession_->conn->addr = localSession_->origin.addr; if (pjmedia_sdp_validate(localSession_) != PJ_SUCCESS) ERROR("Could not validate SDP"); } } +void +Sdp::setPublishedIP(const pj_sockaddr& ip_addr) +{ + setPublishedIP(ip_utils::addrToStr(ip_addr), ip_addr.addr.sa_family); +} + void Sdp::updatePorts(const std::vector<pj_sockaddr> &sockets) { @@ -474,11 +473,11 @@ int Sdp::createLocalSession(const vector<int> &selectedAudioCodecs, const vector // Use Network Time Protocol format timestamp to ensure uniqueness. localSession_->origin.id = tv.sec + 2208988800UL; localSession_->origin.net_type = pj_str((char*) "IN"); - if (publishedIpAddr_.addr.sa_family == pj_AF_INET6()) + if (publishedIpAddrType_ == pj_AF_INET6()) localSession_->origin.addr_type = pj_str((char*) "IP6"); else localSession_->origin.addr_type = pj_str((char*) "IP4"); - localSession_->origin.addr = pj_str((char*) publishedIpAddrStr_.c_str()); + localSession_->origin.addr = pj_str((char*) publishedIpAddr_.c_str()); localSession_->name = pj_str((char*) PACKAGE); diff --git a/daemon/src/sip/sdp.h b/daemon/src/sip/sdp.h index 08764f62582d386288d9260d2d81c9071fa517e1..d263f64fd168271e0043a131a32a0d2122cde638 100644 --- a/daemon/src/sip/sdp.h +++ b/daemon/src/sip/sdp.h @@ -34,6 +34,7 @@ #include "global.h" #include "noncopyable.h" +#include "ip_utils.h" #include <pjmedia/sdp.h> #include <pjmedia/sdp_neg.h> @@ -154,13 +155,17 @@ class Sdp { /* * Write accessor. Set the local IP address that will be used in the sdp session */ - void setPublishedIP(const std::string &ip_addr); - void setPublishedIP(const pj_sockaddr& ip_addr); + void setPublishedIP(const std::string &addr, pj_uint16_t addr_type = pj_AF_UNSPEC()); + void setPublishedIP(const pj_sockaddr& addr); /* * Read accessor. Get the local IP address */ - pj_sockaddr getPublishedIP() const { + pj_sockaddr getPublishedIPAddr() const { + return ip_utils::strToAddr(publishedIpAddr_); + } + + std::string getPublishedIP() const { return publishedIpAddr_; } @@ -311,8 +316,9 @@ class Sdp { std::vector<sfl::AudioCodec *> sessionAudioMedia_; std::vector<std::string> sessionVideoMedia_; - pj_sockaddr publishedIpAddr_; - std::string publishedIpAddrStr_; + std::string publishedIpAddr_; + pj_uint16_t publishedIpAddrType_; + std::string remoteIpAddr_; int localAudioDataPort_;