mirror of
https://github.com/mii443/libdatachannel.git
synced 2025-08-22 15:15:28 +00:00
Added optional MTU setting in configuration
This commit is contained in:
@ -70,6 +70,7 @@ struct RTC_CPP_EXPORT Configuration {
|
|||||||
bool enableIceTcp = false;
|
bool enableIceTcp = false;
|
||||||
uint16_t portRangeBegin = 1024;
|
uint16_t portRangeBegin = 1024;
|
||||||
uint16_t portRangeEnd = 65535;
|
uint16_t portRangeEnd = 65535;
|
||||||
|
std::optional<size_t> mtu;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace rtc
|
} // namespace rtc
|
||||||
|
@ -77,6 +77,8 @@ const size_t RECV_QUEUE_LIMIT = 1024 * 1024; // Max per-channel queue size
|
|||||||
|
|
||||||
const int THREADPOOL_SIZE = 4; // Number of threads in the global thread pool
|
const int THREADPOOL_SIZE = 4; // Number of threads in the global thread pool
|
||||||
|
|
||||||
|
const size_t DEFAULT_IPV4_MTU = 1200; // IPv4 safe MTU value recommended by RFC 8261
|
||||||
|
|
||||||
// overloaded helper
|
// overloaded helper
|
||||||
template <class... Ts> struct overloaded : Ts... { using Ts::operator()...; };
|
template <class... Ts> struct overloaded : Ts... { using Ts::operator()...; };
|
||||||
template <class... Ts> overloaded(Ts...) -> overloaded<Ts...>;
|
template <class... Ts> overloaded(Ts...) -> overloaded<Ts...>;
|
||||||
|
@ -58,10 +58,11 @@ void DtlsSrtpTransport::Cleanup() { srtp_shutdown(); }
|
|||||||
|
|
||||||
DtlsSrtpTransport::DtlsSrtpTransport(std::shared_ptr<IceTransport> lower,
|
DtlsSrtpTransport::DtlsSrtpTransport(std::shared_ptr<IceTransport> lower,
|
||||||
shared_ptr<Certificate> certificate,
|
shared_ptr<Certificate> certificate,
|
||||||
|
std::optional<size_t> mtu,
|
||||||
verifier_callback verifierCallback,
|
verifier_callback verifierCallback,
|
||||||
message_callback srtpRecvCallback,
|
message_callback srtpRecvCallback,
|
||||||
state_callback stateChangeCallback)
|
state_callback stateChangeCallback)
|
||||||
: DtlsTransport(lower, certificate, std::move(verifierCallback),
|
: DtlsTransport(lower, certificate, mtu, std::move(verifierCallback),
|
||||||
std::move(stateChangeCallback)),
|
std::move(stateChangeCallback)),
|
||||||
mSrtpRecvCallback(std::move(srtpRecvCallback)) { // distinct from Transport recv callback
|
mSrtpRecvCallback(std::move(srtpRecvCallback)) { // distinct from Transport recv callback
|
||||||
|
|
||||||
|
@ -39,9 +39,9 @@ public:
|
|||||||
static void Init();
|
static void Init();
|
||||||
static void Cleanup();
|
static void Cleanup();
|
||||||
|
|
||||||
DtlsSrtpTransport(std::shared_ptr<IceTransport> lower, std::shared_ptr<Certificate> certificate,
|
DtlsSrtpTransport(std::shared_ptr<IceTransport> lower, certificate_ptr certificate,
|
||||||
verifier_callback verifierCallback, message_callback srtpRecvCallback,
|
std::optional<size_t> mtu, verifier_callback verifierCallback,
|
||||||
state_callback stateChangeCallback);
|
message_callback srtpRecvCallback, state_callback stateChangeCallback);
|
||||||
~DtlsSrtpTransport();
|
~DtlsSrtpTransport();
|
||||||
|
|
||||||
bool sendMedia(message_ptr message);
|
bool sendMedia(message_ptr message);
|
||||||
|
@ -50,8 +50,9 @@ void DtlsTransport::Init() {
|
|||||||
void DtlsTransport::Cleanup() { gnutls_global_deinit(); }
|
void DtlsTransport::Cleanup() { gnutls_global_deinit(); }
|
||||||
|
|
||||||
DtlsTransport::DtlsTransport(shared_ptr<IceTransport> lower, certificate_ptr certificate,
|
DtlsTransport::DtlsTransport(shared_ptr<IceTransport> lower, certificate_ptr certificate,
|
||||||
verifier_callback verifierCallback, state_callback stateChangeCallback)
|
std::optional<size_t> mtu, verifier_callback verifierCallback,
|
||||||
: Transport(lower, std::move(stateChangeCallback)), mCertificate(certificate),
|
state_callback stateChangeCallback)
|
||||||
|
: Transport(lower, std::move(stateChangeCallback)), mMtu(mtu), mCertificate(certificate),
|
||||||
mVerifierCallback(std::move(verifierCallback)),
|
mVerifierCallback(std::move(verifierCallback)),
|
||||||
mIsClient(lower->role() == Description::Role::Active), mCurrentDscp(0) {
|
mIsClient(lower->role() == Description::Role::Active), mCurrentDscp(0) {
|
||||||
|
|
||||||
@ -156,11 +157,15 @@ void DtlsTransport::postHandshake() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void DtlsTransport::runRecvLoop() {
|
void DtlsTransport::runRecvLoop() {
|
||||||
const size_t maxMtu = 4096;
|
const size_t bufferSize = 4096;
|
||||||
|
|
||||||
// Handshake loop
|
// Handshake loop
|
||||||
try {
|
try {
|
||||||
changeState(State::Connecting);
|
changeState(State::Connecting);
|
||||||
gnutls_dtls_set_mtu(mSession, 1280 - 40 - 8); // min MTU over UDP/IPv6
|
|
||||||
|
size_t mtu = mMtu.value_or(DEFAULT_IPV4_MTU + 20) - 8 - 40; // UDP/IPv6
|
||||||
|
gnutls_dtls_set_mtu(mSession, static_cast<unsigned int>(mtu));
|
||||||
|
PLOG_VERBOSE << "SSL MTU set to " << mtu;
|
||||||
|
|
||||||
int ret;
|
int ret;
|
||||||
do {
|
do {
|
||||||
@ -174,7 +179,7 @@ void DtlsTransport::runRecvLoop() {
|
|||||||
|
|
||||||
// RFC 8261: DTLS MUST support sending messages larger than the current path MTU
|
// RFC 8261: DTLS MUST support sending messages larger than the current path MTU
|
||||||
// See https://tools.ietf.org/html/rfc8261#section-5
|
// See https://tools.ietf.org/html/rfc8261#section-5
|
||||||
gnutls_dtls_set_mtu(mSession, maxMtu + 1);
|
gnutls_dtls_set_mtu(mSession, bufferSize + 1);
|
||||||
|
|
||||||
} catch (const std::exception &e) {
|
} catch (const std::exception &e) {
|
||||||
PLOG_ERROR << "DTLS handshake: " << e.what();
|
PLOG_ERROR << "DTLS handshake: " << e.what();
|
||||||
@ -188,7 +193,6 @@ void DtlsTransport::runRecvLoop() {
|
|||||||
postHandshake();
|
postHandshake();
|
||||||
changeState(State::Connected);
|
changeState(State::Connected);
|
||||||
|
|
||||||
const size_t bufferSize = maxMtu;
|
|
||||||
char buffer[bufferSize];
|
char buffer[bufferSize];
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
@ -314,8 +318,9 @@ void DtlsTransport::Cleanup() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
DtlsTransport::DtlsTransport(shared_ptr<IceTransport> lower, shared_ptr<Certificate> certificate,
|
DtlsTransport::DtlsTransport(shared_ptr<IceTransport> lower, shared_ptr<Certificate> certificate,
|
||||||
verifier_callback verifierCallback, state_callback stateChangeCallback)
|
std::optional<size_t> mtu, verifier_callback verifierCallback,
|
||||||
: Transport(lower, std::move(stateChangeCallback)), mCertificate(certificate),
|
state_callback stateChangeCallback)
|
||||||
|
: Transport(lower, std::move(stateChangeCallback)), mMtu(mtu), mCertificate(certificate),
|
||||||
mVerifierCallback(std::move(verifierCallback)),
|
mVerifierCallback(std::move(verifierCallback)),
|
||||||
mIsClient(lower->role() == Description::Role::Active), mCurrentDscp(0) {
|
mIsClient(lower->role() == Description::Role::Active), mCurrentDscp(0) {
|
||||||
PLOG_DEBUG << "Initializing DTLS transport (OpenSSL)";
|
PLOG_DEBUG << "Initializing DTLS transport (OpenSSL)";
|
||||||
@ -440,16 +445,18 @@ void DtlsTransport::postHandshake() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void DtlsTransport::runRecvLoop() {
|
void DtlsTransport::runRecvLoop() {
|
||||||
const size_t maxMtu = 4096;
|
const size_t bufferSize = 4096;
|
||||||
try {
|
try {
|
||||||
changeState(State::Connecting);
|
changeState(State::Connecting);
|
||||||
SSL_set_mtu(mSsl, 1280 - 40 - 8); // min MTU over UDP/IPv6
|
|
||||||
|
size_t mtu = mMtu.value_or(DEFAULT_IPV4_MTU + 20) - 8 - 40; // UDP/IPv6
|
||||||
|
SSL_set_mtu(mSsl, static_cast<unsigned int>(mtu));
|
||||||
|
PLOG_VERBOSE << "SSL MTU set to " << mtu;
|
||||||
|
|
||||||
// Initiate the handshake
|
// Initiate the handshake
|
||||||
int ret = SSL_do_handshake(mSsl);
|
int ret = SSL_do_handshake(mSsl);
|
||||||
openssl::check(mSsl, ret, "Handshake failed");
|
openssl::check(mSsl, ret, "Handshake failed");
|
||||||
|
|
||||||
const size_t bufferSize = maxMtu;
|
|
||||||
byte buffer[bufferSize];
|
byte buffer[bufferSize];
|
||||||
while (mIncomingQueue.running()) {
|
while (mIncomingQueue.running()) {
|
||||||
// Process pending messages
|
// Process pending messages
|
||||||
@ -466,7 +473,7 @@ void DtlsTransport::runRecvLoop() {
|
|||||||
if (SSL_is_init_finished(mSsl)) {
|
if (SSL_is_init_finished(mSsl)) {
|
||||||
// RFC 8261: DTLS MUST support sending messages larger than the current path
|
// RFC 8261: DTLS MUST support sending messages larger than the current path
|
||||||
// MTU See https://tools.ietf.org/html/rfc8261#section-5
|
// MTU See https://tools.ietf.org/html/rfc8261#section-5
|
||||||
SSL_set_mtu(mSsl, maxMtu + 1);
|
SSL_set_mtu(mSsl, bufferSize + 1);
|
||||||
|
|
||||||
PLOG_INFO << "DTLS handshake finished";
|
PLOG_INFO << "DTLS handshake finished";
|
||||||
postHandshake();
|
postHandshake();
|
||||||
|
@ -44,7 +44,8 @@ public:
|
|||||||
using verifier_callback = std::function<bool(const std::string &fingerprint)>;
|
using verifier_callback = std::function<bool(const std::string &fingerprint)>;
|
||||||
|
|
||||||
DtlsTransport(std::shared_ptr<IceTransport> lower, certificate_ptr certificate,
|
DtlsTransport(std::shared_ptr<IceTransport> lower, certificate_ptr certificate,
|
||||||
verifier_callback verifierCallback, state_callback stateChangeCallback);
|
std::optional<size_t> mtu, verifier_callback verifierCallback,
|
||||||
|
state_callback stateChangeCallback);
|
||||||
~DtlsTransport();
|
~DtlsTransport();
|
||||||
|
|
||||||
virtual void start() override;
|
virtual void start() override;
|
||||||
@ -57,6 +58,7 @@ protected:
|
|||||||
virtual void postHandshake();
|
virtual void postHandshake();
|
||||||
void runRecvLoop();
|
void runRecvLoop();
|
||||||
|
|
||||||
|
const std::optional<size_t> mMtu;
|
||||||
const certificate_ptr mCertificate;
|
const certificate_ptr mCertificate;
|
||||||
const verifier_callback mVerifierCallback;
|
const verifier_callback mVerifierCallback;
|
||||||
const bool mIsClient;
|
const bool mIsClient;
|
||||||
|
@ -22,8 +22,8 @@
|
|||||||
#include "include.hpp"
|
#include "include.hpp"
|
||||||
#include "logcounter.hpp"
|
#include "logcounter.hpp"
|
||||||
#include "processor.hpp"
|
#include "processor.hpp"
|
||||||
#include "threadpool.hpp"
|
|
||||||
#include "rtp.hpp"
|
#include "rtp.hpp"
|
||||||
|
#include "threadpool.hpp"
|
||||||
|
|
||||||
#include "dtlstransport.hpp"
|
#include "dtlstransport.hpp"
|
||||||
#include "icetransport.hpp"
|
#include "icetransport.hpp"
|
||||||
@ -75,6 +75,17 @@ PeerConnection::PeerConnection(const Configuration &config)
|
|||||||
|
|
||||||
if (config.portRangeEnd && config.portRangeBegin > config.portRangeEnd)
|
if (config.portRangeEnd && config.portRangeBegin > config.portRangeEnd)
|
||||||
throw std::invalid_argument("Invalid port range");
|
throw std::invalid_argument("Invalid port range");
|
||||||
|
|
||||||
|
if (config.mtu) {
|
||||||
|
if (*config.mtu < 576) // Min MTU for IPv4
|
||||||
|
throw std::invalid_argument("Invalid MTU value");
|
||||||
|
|
||||||
|
if (*config.mtu > 1500) { // Standard Ethernet
|
||||||
|
PLOG_WARNING << "MTU set to " << *config.mtu;
|
||||||
|
} else {
|
||||||
|
PLOG_VERBOSE << "MTU set to " << *config.mtu;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
PeerConnection::~PeerConnection() {
|
PeerConnection::~PeerConnection() {
|
||||||
@ -515,7 +526,7 @@ shared_ptr<DtlsTransport> PeerConnection::initDtlsTransport() {
|
|||||||
|
|
||||||
// DTLS-SRTP
|
// DTLS-SRTP
|
||||||
transport = std::make_shared<DtlsSrtpTransport>(
|
transport = std::make_shared<DtlsSrtpTransport>(
|
||||||
lower, certificate, verifierCallback,
|
lower, certificate, mConfig.mtu, verifierCallback,
|
||||||
weak_bind(&PeerConnection::forwardMedia, this, _1), stateChangeCallback);
|
weak_bind(&PeerConnection::forwardMedia, this, _1), stateChangeCallback);
|
||||||
#else
|
#else
|
||||||
PLOG_WARNING << "Ignoring media support (not compiled with media support)";
|
PLOG_WARNING << "Ignoring media support (not compiled with media support)";
|
||||||
@ -524,8 +535,8 @@ shared_ptr<DtlsTransport> PeerConnection::initDtlsTransport() {
|
|||||||
|
|
||||||
if (!transport) {
|
if (!transport) {
|
||||||
// DTLS only
|
// DTLS only
|
||||||
transport = std::make_shared<DtlsTransport>(lower, certificate, verifierCallback,
|
transport = std::make_shared<DtlsTransport>(lower, certificate, mConfig.mtu,
|
||||||
stateChangeCallback);
|
verifierCallback, stateChangeCallback);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::atomic_store(&mDtlsTransport, transport);
|
std::atomic_store(&mDtlsTransport, transport);
|
||||||
@ -557,7 +568,7 @@ shared_ptr<SctpTransport> PeerConnection::initSctpTransport() {
|
|||||||
uint16_t sctpPort = remote->application()->sctpPort().value_or(DEFAULT_SCTP_PORT);
|
uint16_t sctpPort = remote->application()->sctpPort().value_or(DEFAULT_SCTP_PORT);
|
||||||
auto lower = std::atomic_load(&mDtlsTransport);
|
auto lower = std::atomic_load(&mDtlsTransport);
|
||||||
auto transport = std::make_shared<SctpTransport>(
|
auto transport = std::make_shared<SctpTransport>(
|
||||||
lower, sctpPort, weak_bind(&PeerConnection::forwardMessage, this, _1),
|
lower, sctpPort, mConfig.mtu, weak_bind(&PeerConnection::forwardMessage, this, _1),
|
||||||
weak_bind(&PeerConnection::forwardBufferedAmount, this, _1, _2),
|
weak_bind(&PeerConnection::forwardBufferedAmount, this, _1, _2),
|
||||||
[this, weak_this = weak_from_this()](SctpTransport::State state) {
|
[this, weak_this = weak_from_this()](SctpTransport::State state) {
|
||||||
auto shared_this = weak_this.lock();
|
auto shared_this = weak_this.lock();
|
||||||
@ -663,8 +674,8 @@ void PeerConnection::forwardMessage(message_ptr message) {
|
|||||||
if (message->type == Message::Control && *message->data() == dataChannelOpenMessage &&
|
if (message->type == Message::Control && *message->data() == dataChannelOpenMessage &&
|
||||||
stream % 2 == remoteParity) {
|
stream % 2 == remoteParity) {
|
||||||
|
|
||||||
channel = std::make_shared<NegotiatedDataChannel>(shared_from_this(), sctpTransport,
|
channel =
|
||||||
stream);
|
std::make_shared<NegotiatedDataChannel>(shared_from_this(), sctpTransport, stream);
|
||||||
channel->onOpen(weak_bind(&PeerConnection::triggerDataChannel, this,
|
channel->onOpen(weak_bind(&PeerConnection::triggerDataChannel, this,
|
||||||
weak_ptr<DataChannel>{channel}));
|
weak_ptr<DataChannel>{channel}));
|
||||||
|
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "sctptransport.hpp"
|
#include "sctptransport.hpp"
|
||||||
|
#include "dtlstransport.hpp"
|
||||||
#include "logcounter.hpp"
|
#include "logcounter.hpp"
|
||||||
|
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
@ -25,16 +26,6 @@
|
|||||||
#include <thread>
|
#include <thread>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
// RFC 8261 5. DTLS considerations:
|
|
||||||
// If path MTU discovery is performed by the SCTP layer and IPv4 is used as the network-layer
|
|
||||||
// protocol, the DTLS implementation SHOULD allow the DTLS user to enforce that the
|
|
||||||
// corresponding IPv4 packet is sent with the Don't Fragment (DF) bit set. If controlling the DF
|
|
||||||
// bit is not possible (for example, due to implementation restrictions), a safe value for the
|
|
||||||
// path MTU has to be used by the SCTP stack. It is RECOMMENDED that the safe value not exceed
|
|
||||||
// 1200 bytes.
|
|
||||||
// See https://tools.ietf.org/html/rfc8261#section-5
|
|
||||||
#define DEFAULT_MTU 1200
|
|
||||||
|
|
||||||
// The IETF draft says:
|
// The IETF draft says:
|
||||||
// SCTP MUST support performing Path MTU discovery without relying on ICMP or ICMPv6 as specified in
|
// SCTP MUST support performing Path MTU discovery without relying on ICMP or ICMPv6 as specified in
|
||||||
// [RFC4821] using probing messages specified in [RFC4820].
|
// [RFC4821] using probing messages specified in [RFC4820].
|
||||||
@ -60,12 +51,9 @@
|
|||||||
#endif
|
#endif
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
using namespace std::chrono_literals;
|
using namespace std::chrono_literals;
|
||||||
using namespace std::chrono;
|
using namespace std::chrono;
|
||||||
|
|
||||||
using std::shared_ptr;
|
|
||||||
|
|
||||||
namespace rtc {
|
namespace rtc {
|
||||||
|
|
||||||
static LogCounter COUNTER_UNKNOWN_PPID(plog::warning,
|
static LogCounter COUNTER_UNKNOWN_PPID(plog::warning,
|
||||||
@ -112,7 +100,8 @@ void SctpTransport::Cleanup() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
SctpTransport::SctpTransport(std::shared_ptr<Transport> lower, uint16_t port,
|
SctpTransport::SctpTransport(std::shared_ptr<Transport> lower, uint16_t port,
|
||||||
message_callback recvCallback, amount_callback bufferedAmountCallback,
|
std::optional<size_t> mtu, message_callback recvCallback,
|
||||||
|
amount_callback bufferedAmountCallback,
|
||||||
state_callback stateChangeCallback)
|
state_callback stateChangeCallback)
|
||||||
: Transport(lower, std::move(stateChangeCallback)), mPort(port), mPendingRecvCount(0),
|
: Transport(lower, std::move(stateChangeCallback)), mPort(port), mPendingRecvCount(0),
|
||||||
mSendQueue(0, message_size_func), mBufferedAmountCallback(std::move(bufferedAmountCallback)) {
|
mSendQueue(0, message_size_func), mBufferedAmountCallback(std::move(bufferedAmountCallback)) {
|
||||||
@ -180,16 +169,34 @@ SctpTransport::SctpTransport(std::shared_ptr<Transport> lower, uint16_t port,
|
|||||||
struct sctp_paddrparams spp = {};
|
struct sctp_paddrparams spp = {};
|
||||||
// Enable SCTP heartbeats
|
// Enable SCTP heartbeats
|
||||||
spp.spp_flags = SPP_HB_ENABLE;
|
spp.spp_flags = SPP_HB_ENABLE;
|
||||||
|
|
||||||
|
// RFC 8261 5. DTLS considerations:
|
||||||
|
// If path MTU discovery is performed by the SCTP layer and IPv4 is used as the network-layer
|
||||||
|
// protocol, the DTLS implementation SHOULD allow the DTLS user to enforce that the
|
||||||
|
// corresponding IPv4 packet is sent with the Don't Fragment (DF) bit set. If controlling the DF
|
||||||
|
// bit is not possible (for example, due to implementation restrictions), a safe value for the
|
||||||
|
// path MTU has to be used by the SCTP stack. It is RECOMMENDED that the safe value not exceed
|
||||||
|
// 1200 bytes.
|
||||||
|
// See https://tools.ietf.org/html/rfc8261#section-5
|
||||||
#if USE_PMTUD
|
#if USE_PMTUD
|
||||||
// Enable SCTP path MTU discovery
|
if (!mtu.has_value()) {
|
||||||
spp.spp_flags |= SPP_PMTUD_ENABLE;
|
|
||||||
#else
|
#else
|
||||||
// Fall back to a safe MTU value.
|
if (false) {
|
||||||
spp.spp_flags |= SPP_PMTUD_DISABLE;
|
|
||||||
// The MTU value provided specifies the space available for chunks in the
|
|
||||||
// packet, so we also subtract the SCTP header size.
|
|
||||||
spp.spp_pathmtu = DEFAULT_MTU - 12 - 37 - 8 - 20; // SCTP/DTLS/UDP/IPv4
|
|
||||||
#endif
|
#endif
|
||||||
|
// Enable SCTP path MTU discovery
|
||||||
|
spp.spp_flags |= SPP_PMTUD_ENABLE;
|
||||||
|
PLOG_VERBOSE << "Path MTU discovery enabled";
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// Fall back to a safe MTU value.
|
||||||
|
spp.spp_flags |= SPP_PMTUD_DISABLE;
|
||||||
|
// The MTU value provided specifies the space available for chunks in the
|
||||||
|
// packet, so we also subtract the SCTP header size.
|
||||||
|
size_t pmtu = mtu.value_or(DEFAULT_IPV4_MTU + 20) - 12 - 37 - 8 - 40; // SCTP/DTLS/UDP/IPv6
|
||||||
|
spp.spp_pathmtu = uint32_t(pmtu);
|
||||||
|
PLOG_VERBOSE << "Path MTU discovery disabled, SCTP MTU set to " << pmtu;
|
||||||
|
}
|
||||||
|
|
||||||
if (usrsctp_setsockopt(mSock, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, &spp, sizeof(spp)))
|
if (usrsctp_setsockopt(mSock, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, &spp, sizeof(spp)))
|
||||||
throw std::runtime_error("Could not set socket option SCTP_PEER_ADDR_PARAMS, errno=" +
|
throw std::runtime_error("Could not set socket option SCTP_PEER_ADDR_PARAMS, errno=" +
|
||||||
std::to_string(errno));
|
std::to_string(errno));
|
||||||
|
@ -43,8 +43,9 @@ public:
|
|||||||
|
|
||||||
using amount_callback = std::function<void(uint16_t streamId, size_t amount)>;
|
using amount_callback = std::function<void(uint16_t streamId, size_t amount)>;
|
||||||
|
|
||||||
SctpTransport(std::shared_ptr<Transport> lower, uint16_t port, message_callback recvCallback,
|
SctpTransport(std::shared_ptr<Transport> lower, uint16_t port, std::optional<size_t> mtu,
|
||||||
amount_callback bufferedAmountCallback, state_callback stateChangeCallback);
|
message_callback recvCallback, amount_callback bufferedAmountCallback,
|
||||||
|
state_callback stateChangeCallback);
|
||||||
~SctpTransport();
|
~SctpTransport();
|
||||||
|
|
||||||
void start() override;
|
void start() override;
|
||||||
|
@ -40,11 +40,13 @@ size_t benchmark(milliseconds duration) {
|
|||||||
|
|
||||||
Configuration config1;
|
Configuration config1;
|
||||||
// config1.iceServers.emplace_back("stun:stun.l.google.com:19302");
|
// config1.iceServers.emplace_back("stun:stun.l.google.com:19302");
|
||||||
|
// config1.mtu = 1500;
|
||||||
|
|
||||||
auto pc1 = std::make_shared<PeerConnection>(config1);
|
auto pc1 = std::make_shared<PeerConnection>(config1);
|
||||||
|
|
||||||
Configuration config2;
|
Configuration config2;
|
||||||
// config2.iceServers.emplace_back("stun:stun.l.google.com:19302");
|
// config2.iceServers.emplace_back("stun:stun.l.google.com:19302");
|
||||||
|
// config2.mtu = 1500;
|
||||||
|
|
||||||
auto pc2 = std::make_shared<PeerConnection>(config2);
|
auto pc2 = std::make_shared<PeerConnection>(config2);
|
||||||
|
|
||||||
|
@ -36,6 +36,8 @@ void test_connectivity() {
|
|||||||
// STUN server example (not necessary to connect locally)
|
// STUN server example (not necessary to connect locally)
|
||||||
// Please do not use outside of libdatachannel tests
|
// Please do not use outside of libdatachannel tests
|
||||||
config1.iceServers.emplace_back("stun:stun.ageneau.net:3478");
|
config1.iceServers.emplace_back("stun:stun.ageneau.net:3478");
|
||||||
|
// Custom MTU example
|
||||||
|
config1.mtu = 1500;
|
||||||
|
|
||||||
auto pc1 = std::make_shared<PeerConnection>(config1);
|
auto pc1 = std::make_shared<PeerConnection>(config1);
|
||||||
|
|
||||||
@ -43,6 +45,8 @@ void test_connectivity() {
|
|||||||
// STUN server example (not necessary to connect locally)
|
// STUN server example (not necessary to connect locally)
|
||||||
// Please do not use outside of libdatachannel tests
|
// Please do not use outside of libdatachannel tests
|
||||||
config2.iceServers.emplace_back("stun:stun.ageneau.net:3478");
|
config2.iceServers.emplace_back("stun:stun.ageneau.net:3478");
|
||||||
|
// Custom MTU example
|
||||||
|
config2.mtu = 1500;
|
||||||
// Port range example
|
// Port range example
|
||||||
config2.portRangeBegin = 5000;
|
config2.portRangeBegin = 5000;
|
||||||
config2.portRangeEnd = 6000;
|
config2.portRangeEnd = 6000;
|
||||||
|
Reference in New Issue
Block a user