diff --git a/src/media/socket_pair.cpp b/src/media/socket_pair.cpp index 0b7045aca93be2125c667c1501b8695a36ffa752..db6cf84102ad00c204bca5512de2f0b58b9866eb 100644 --- a/src/media/socket_pair.cpp +++ b/src/media/socket_pair.cpp @@ -148,7 +148,7 @@ udp_set_url(struct sockaddr_storage* addr, const char* hostname, int port) } static int -udp_socket_create(sockaddr_storage* addr, socklen_t* addr_len, int local_port) +udp_socket_create(sockaddr_storage* addr, socklen_t* addr_len, int local_port, int& family) { int udp_fd = -1; struct addrinfo* res0 = nullptr; @@ -160,12 +160,14 @@ udp_socket_create(sockaddr_storage* addr, socklen_t* addr_len, int local_port) for (res = res0; res; res=res->ai_next) { #ifdef __APPLE__ udp_fd = socket(res->ai_family, SOCK_DGRAM, 0); - if (udp_fd != -1 && fcntl(udp_fd, F_SETFL, O_NONBLOCK) != -1) + if (udp_fd != -1 && fcntl(udp_fd, F_SETFL, O_NONBLOCK) != -1) { #else udp_fd = socket(res->ai_family, SOCK_DGRAM | SOCK_NONBLOCK, 0); - if (udp_fd != -1) + if (udp_fd != -1) { #endif - break; + family = res->ai_family; + break; + } RING_ERR("socket error"); } @@ -317,8 +319,8 @@ SocketPair::openSockets(const char* uri, int local_rtp_port) socklen_t rtp_len, rtcp_len; // Open sockets and store addresses for sending - if ((rtpHandle_ = udp_socket_create(&rtp_addr, &rtp_len, local_rtp_port)) == -1 or - (rtcpHandle_ = udp_socket_create(&rtcp_addr, &rtcp_len, local_rtcp_port)) == -1 or + if ((rtpHandle_ = udp_socket_create(&rtp_addr, &rtp_len, local_rtp_port, rtpFamily_)) == -1 or + (rtcpHandle_ = udp_socket_create(&rtcp_addr, &rtcp_len, local_rtcp_port, rtcpFamily_)) == -1 or (rtpDestAddrLen_ = udp_set_url(&rtpDestAddr_, hostname, rtp_port)) == 0 or (rtcpDestAddrLen_ = udp_set_url(&rtcpDestAddr_, hostname, rtcp_port)) == 0) { @@ -334,7 +336,13 @@ SocketPair::openSockets(const char* uri, int local_rtp_port) MediaIOHandle* SocketPair::createIOContext(const uint16_t mtu) { - auto ip_header_size = rtp_sock_->getTransportOverhead(); + unsigned ip_header_size; + if (rtp_sock_) + ip_header_size = rtp_sock_->getTransportOverhead(); + else if (rtpFamily_ == AF_INET6) + ip_header_size = 40; + else + ip_header_size = 20; return new MediaIOHandle( mtu - (srtpContext_ ? SRTP_OVERHEAD : 0) - UDP_HEADER_SIZE - ip_header_size, true, [](void* sp, uint8_t* buf, int len){ return static_cast<SocketPair*>(sp)->readCallback(buf, len); }, diff --git a/src/media/socket_pair.h b/src/media/socket_pair.h index 95fc503473a72e7058179a6a4138a8fd1a4beada..022fb0dc7b0294ff21b5282ea0717b4e66a2b0ea 100644 --- a/src/media/socket_pair.h +++ b/src/media/socket_pair.h @@ -129,6 +129,8 @@ class SocketPair { int rtpHandle_ {-1}; int rtcpHandle_ {-1}; + int rtpFamily_ {0}; + int rtcpFamily_ {0}; sockaddr_storage rtpDestAddr_; socklen_t rtpDestAddrLen_; sockaddr_storage rtcpDestAddr_; diff --git a/src/security/tls_session.cpp b/src/security/tls_session.cpp index 526638a2854a2dd7471d1306bd78f04588e63b5d..a6fc829713eca3f2833a60b31d7648e53ad3dc82 100644 --- a/src/security/tls_session.cpp +++ b/src/security/tls_session.cpp @@ -44,8 +44,6 @@ namespace ring { namespace tls { static constexpr const char* TLS_CERT_PRIORITY_STRING {"SECURE192:-VERS-TLS-ALL:+VERS-DTLS-ALL:-RSA:%SERVER_PRECEDENCE:%SAFE_RENEGOTIATION"}; static constexpr const char* TLS_FULL_PRIORITY_STRING {"SECURE192:-KX-ALL:+ANON-ECDH:+ANON-DH:+SECURE192:-VERS-TLS-ALL:+VERS-DTLS-ALL:-RSA:%SERVER_PRECEDENCE:%SAFE_RENEGOTIATION"}; -static constexpr int DTLS_MTU {1232}; // (1280 from IPv6 minimum MTU - 40 IPv6 header - 8 UDP header) -static constexpr uint16_t MIN_MTU {512}; static constexpr uint16_t INPUT_BUFFER_SIZE {16*1024}; // to be coherent with the maximum size advised in path mtu discovery static constexpr std::size_t INPUT_MAX_SIZE {1000}; // Maximum packet to store before dropping (pkt size = DTLS_MTU) static constexpr ssize_t FLOOD_THRESHOLD {4*1024}; diff --git a/src/security/tls_session.h b/src/security/tls_session.h index c66c903706bdffcbf9afcce178fe5873d6b343fc..b1854b6c9fd0ed8c1a3329f51a01999e076db78f 100644 --- a/src/security/tls_session.h +++ b/src/security/tls_session.h @@ -55,6 +55,8 @@ struct PrivateKey; namespace ring { namespace tls { static constexpr uint8_t MTUS_TO_TEST = 4; //number of mtus to test in path mtu discovery. +static constexpr int DTLS_MTU {1232}; // (1280 from IPv6 minimum MTU - 40 IPv6 header - 8 UDP header) +static constexpr uint16_t MIN_MTU {512}; enum class TlsSessionState { SETUP, diff --git a/src/sip/siptransport.cpp b/src/sip/siptransport.cpp index ee54f1107737a90feb6b937ef72576f9a358702d..f293332219f03b1ae5c3ba21c3f0746bf941dc02 100644 --- a/src/sip/siptransport.cpp +++ b/src/sip/siptransport.cpp @@ -23,6 +23,7 @@ #include "sip_utils.h" #include "ip_utils.h" #include "ice_transport.h" +#include "security/tls_session.h" #include "ringdht/sip_transport_ice.h" #include "ringdht/sips_transport_ice.h" @@ -174,9 +175,13 @@ SipTransport::removeStateListener(uintptr_t lid) } uint16_t -SipTransport::getTlsMtu(){ - auto tls_tr = reinterpret_cast<tls::SipsIceTransport::TransportData*>(transport_.get())->self; - return tls_tr->getTlsSessionMtu(); +SipTransport::getTlsMtu() +{ + if (isIceTransport_ && isSecure()) { + auto tls_tr = reinterpret_cast<tls::SipsIceTransport::TransportData*>(transport_.get())->self; + return tls_tr->getTlsSessionMtu(); + } + return ring::tls::DTLS_MTU; } SipTransportBroker::SipTransportBroker(pjsip_endpoint *endpt, @@ -431,6 +436,7 @@ SipTransportBroker::getIceTransport(const std::shared_ptr<IceTransport>& ice, new SipIceTransport(endpt_, pool_, ice_pj_transport_type_, ice, comp_id)); auto tr = sip_ice_tr->getTransportBase(); auto sip_tr = std::make_shared<SipTransport>(tr); + sip_tr->setIsIceTransport(); sip_ice_tr.release(); // managed by PJSIP now { @@ -453,6 +459,7 @@ SipTransportBroker::getTlsIceTransport(const std::shared_ptr<ring::IceTransport> new tls::SipsIceTransport(endpt_, type, params, ice, comp_id)); auto tr = sip_ice_tr->getTransportBase(); auto sip_tr = std::make_shared<SipTransport>(tr); + sip_tr->setIsIceTransport(); sip_ice_tr.release(); // managed by PJSIP now { diff --git a/src/sip/siptransport.h b/src/sip/siptransport.h index 0e4919e16edaf50e35eb532e1a29d62f4955496c..ab4fbbf39d1f5196d255c210843efc20a72e20e6 100644 --- a/src/sip/siptransport.h +++ b/src/sip/siptransport.h @@ -138,6 +138,8 @@ class SipTransport /** Only makes sense for connection-oriented transports */ bool isConnected() const noexcept { return connected_; } + void setIsIceTransport() { isIceTransport_ = true; } + uint16_t getTlsMtu(); private: @@ -151,6 +153,7 @@ class SipTransport std::mutex stateListenersMutex_; bool connected_ {false}; + bool isIceTransport_ {false}; TlsInfos tlsInfos_; };