mirror of
https://github.com/mii443/libdatachannel.git
synced 2025-08-24 16:09:22 +00:00
Compare commits
4 Commits
Author | SHA1 | Date | |
---|---|---|---|
5a8725dac1 | |||
cd66a3f987 | |||
fc4091a9fc | |||
7a49a0cfd8 |
@ -8,26 +8,23 @@ set(CMAKE_POSITION_INDEPENDENT_CODE ON)
|
|||||||
set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake/Modules)
|
set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake/Modules)
|
||||||
|
|
||||||
set(LIBDATACHANNEL_SOURCES
|
set(LIBDATACHANNEL_SOURCES
|
||||||
candidate.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/src/candidate.cpp
|
||||||
certificate.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/src/certificate.cpp
|
||||||
channel.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/src/channel.cpp
|
||||||
configuration.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/src/configuration.cpp
|
||||||
datachannel.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/src/datachannel.cpp
|
||||||
description.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/src/description.cpp
|
||||||
dtlstransport.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/src/dtlstransport.cpp
|
||||||
icetransport.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/src/icetransport.cpp
|
||||||
peerconnection.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/src/peerconnection.cpp
|
||||||
rtc.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/src/rtc.cpp
|
||||||
sctptransport.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/src/sctptransport.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
set(TESTS_SOURCES
|
set(TESTS_SOURCES
|
||||||
main.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/test/main.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
list(TRANSFORM LIBDATACHANNEL_SOURCES PREPEND ${CMAKE_CURRENT_SOURCE_DIR}/src/)
|
|
||||||
list(TRANSFORM TESTS_SOURCES PREPEND ${CMAKE_CURRENT_SOURCE_DIR}/test/)
|
|
||||||
|
|
||||||
# Hack because usrsctp uses CMAKE_SOURCE_DIR instead of CMAKE_CURRENT_SOURCE_DIR
|
# Hack because usrsctp uses CMAKE_SOURCE_DIR instead of CMAKE_CURRENT_SOURCE_DIR
|
||||||
set(CMAKE_REQUIRED_FLAGS "-I${CMAKE_CURRENT_SOURCE_DIR}/usrsctp/usrsctplib")
|
set(CMAKE_REQUIRED_FLAGS "-I${CMAKE_CURRENT_SOURCE_DIR}/usrsctp/usrsctplib")
|
||||||
|
|
||||||
@ -39,10 +36,19 @@ target_include_directories(usrsctp-static PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/usr
|
|||||||
if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
|
if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
|
||||||
# using regular Clang or AppleClang: Needed since they don't have -Wno-error=format-truncation
|
# using regular Clang or AppleClang: Needed since they don't have -Wno-error=format-truncation
|
||||||
target_compile_options(usrsctp-static PRIVATE -Wno-error=address-of-packed-member)
|
target_compile_options(usrsctp-static PRIVATE -Wno-error=address-of-packed-member)
|
||||||
|
else()
|
||||||
|
if (CMAKE_CXX_COMPILER_ID MATCHES "GNU")
|
||||||
|
if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS "9.0")
|
||||||
|
# GCC version below 9.0 does not support option address-of-packed-member
|
||||||
|
target_compile_options(usrsctp-static PRIVATE -Wno-error=format-truncation)
|
||||||
|
else()
|
||||||
|
target_compile_options(usrsctp-static PRIVATE -Wno-error=address-of-packed-member -Wno-error=format-truncation)
|
||||||
|
endif()
|
||||||
else()
|
else()
|
||||||
# all other compilers
|
# all other compilers
|
||||||
target_compile_options(usrsctp-static PRIVATE -Wno-error=address-of-packed-member -Wno-error=format-truncation)
|
target_compile_options(usrsctp-static PRIVATE -Wno-error=address-of-packed-member -Wno-error=format-truncation)
|
||||||
endif()
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
option(USE_GNUTLS "Use GnuTLS instead of OpenSSL" OFF)
|
option(USE_GNUTLS "Use GnuTLS instead of OpenSSL" OFF)
|
||||||
|
|
||||||
|
@ -85,17 +85,19 @@ DtlsTransport::DtlsTransport(shared_ptr<IceTransport> lower, shared_ptr<Certific
|
|||||||
}
|
}
|
||||||
|
|
||||||
DtlsTransport::~DtlsTransport() {
|
DtlsTransport::~DtlsTransport() {
|
||||||
resetLower();
|
|
||||||
|
|
||||||
mIncomingQueue.stop();
|
|
||||||
mRecvThread.join();
|
|
||||||
|
|
||||||
gnutls_bye(mSession, GNUTLS_SHUT_RDWR);
|
gnutls_bye(mSession, GNUTLS_SHUT_RDWR);
|
||||||
gnutls_deinit(mSession);
|
gnutls_deinit(mSession);
|
||||||
}
|
}
|
||||||
|
|
||||||
DtlsTransport::State DtlsTransport::state() const { return mState; }
|
DtlsTransport::State DtlsTransport::state() const { return mState; }
|
||||||
|
|
||||||
|
void DtlsTransport::stop() {
|
||||||
|
Transport::stop();
|
||||||
|
|
||||||
|
mIncomingQueue.stop();
|
||||||
|
mRecvThread.join();
|
||||||
|
}
|
||||||
|
|
||||||
bool DtlsTransport::send(message_ptr message) {
|
bool DtlsTransport::send(message_ptr message) {
|
||||||
if (!message || mState != State::Connected)
|
if (!message || mState != State::Connected)
|
||||||
return false;
|
return false;
|
||||||
@ -356,16 +358,18 @@ DtlsTransport::DtlsTransport(shared_ptr<IceTransport> lower, shared_ptr<Certific
|
|||||||
}
|
}
|
||||||
|
|
||||||
DtlsTransport::~DtlsTransport() {
|
DtlsTransport::~DtlsTransport() {
|
||||||
resetLower();
|
|
||||||
|
|
||||||
mIncomingQueue.stop();
|
|
||||||
mRecvThread.join();
|
|
||||||
|
|
||||||
SSL_shutdown(mSsl);
|
SSL_shutdown(mSsl);
|
||||||
SSL_free(mSsl);
|
SSL_free(mSsl);
|
||||||
SSL_CTX_free(mCtx);
|
SSL_CTX_free(mCtx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DtlsTransport::stop() {
|
||||||
|
Transport::stop();
|
||||||
|
|
||||||
|
mIncomingQueue.stop();
|
||||||
|
mRecvThread.join();
|
||||||
|
}
|
||||||
|
|
||||||
DtlsTransport::State DtlsTransport::state() const { return mState; }
|
DtlsTransport::State DtlsTransport::state() const { return mState; }
|
||||||
|
|
||||||
bool DtlsTransport::send(message_ptr message) {
|
bool DtlsTransport::send(message_ptr message) {
|
||||||
|
@ -54,6 +54,7 @@ public:
|
|||||||
|
|
||||||
State state() const;
|
State state() const;
|
||||||
|
|
||||||
|
void stop() override;
|
||||||
bool send(message_ptr message); // false if dropped
|
bool send(message_ptr message); // false if dropped
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -130,7 +130,9 @@ IceTransport::IceTransport(const Configuration &config, Description::Role role,
|
|||||||
RecvCallback, this);
|
RecvCallback, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
IceTransport::~IceTransport() {
|
IceTransport::~IceTransport() {}
|
||||||
|
|
||||||
|
void IceTransport::stop() {
|
||||||
g_main_loop_quit(mMainLoop.get());
|
g_main_loop_quit(mMainLoop.get());
|
||||||
mMainLoopThread.join();
|
mMainLoopThread.join();
|
||||||
}
|
}
|
||||||
|
@ -67,7 +67,8 @@ public:
|
|||||||
std::optional<string> getLocalAddress() const;
|
std::optional<string> getLocalAddress() const;
|
||||||
std::optional<string> getRemoteAddress() const;
|
std::optional<string> getRemoteAddress() const;
|
||||||
|
|
||||||
bool send(message_ptr message); // false if dropped
|
void stop() override;
|
||||||
|
bool send(message_ptr message) override; // false if dropped
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void incoming(message_ptr message);
|
void incoming(message_ptr message);
|
||||||
|
@ -37,6 +37,13 @@ PeerConnection::PeerConnection(const Configuration &config)
|
|||||||
: mConfig(config), mCertificate(make_certificate("libdatachannel")), mState(State::New) {}
|
: mConfig(config), mCertificate(make_certificate("libdatachannel")), mState(State::New) {}
|
||||||
|
|
||||||
PeerConnection::~PeerConnection() {
|
PeerConnection::~PeerConnection() {
|
||||||
|
if (mIceTransport)
|
||||||
|
mIceTransport->stop();
|
||||||
|
if (mDtlsTransport)
|
||||||
|
mDtlsTransport->stop();
|
||||||
|
if (mSctpTransport)
|
||||||
|
mSctpTransport->stop();
|
||||||
|
|
||||||
mSctpTransport.reset();
|
mSctpTransport.reset();
|
||||||
mDtlsTransport.reset();
|
mDtlsTransport.reset();
|
||||||
mIceTransport.reset();
|
mIceTransport.reset();
|
||||||
|
@ -143,8 +143,19 @@ SctpTransport::SctpTransport(std::shared_ptr<Transport> lower, uint16_t port,
|
|||||||
}
|
}
|
||||||
|
|
||||||
SctpTransport::~SctpTransport() {
|
SctpTransport::~SctpTransport() {
|
||||||
resetLower();
|
if (mSock) {
|
||||||
onRecv(nullptr); // unset recv callback
|
usrsctp_shutdown(mSock, SHUT_RDWR);
|
||||||
|
usrsctp_close(mSock);
|
||||||
|
}
|
||||||
|
|
||||||
|
usrsctp_deregister_address(this);
|
||||||
|
GlobalCleanup();
|
||||||
|
}
|
||||||
|
|
||||||
|
SctpTransport::State SctpTransport::state() const { return mState; }
|
||||||
|
|
||||||
|
void SctpTransport::stop() {
|
||||||
|
Transport::stop();
|
||||||
|
|
||||||
mSendQueue.stop();
|
mSendQueue.stop();
|
||||||
|
|
||||||
@ -154,14 +165,6 @@ SctpTransport::~SctpTransport() {
|
|||||||
mConnectDataSent = true;
|
mConnectDataSent = true;
|
||||||
mConnectCondition.notify_all();
|
mConnectCondition.notify_all();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mSock) {
|
|
||||||
usrsctp_shutdown(mSock, SHUT_RDWR);
|
|
||||||
usrsctp_close(mSock);
|
|
||||||
}
|
|
||||||
|
|
||||||
usrsctp_deregister_address(this);
|
|
||||||
GlobalCleanup();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SctpTransport::connect() {
|
void SctpTransport::connect() {
|
||||||
@ -186,8 +189,6 @@ void SctpTransport::connect() {
|
|||||||
throw std::runtime_error("Connection attempt failed, errno=" + std::to_string(errno));
|
throw std::runtime_error("Connection attempt failed, errno=" + std::to_string(errno));
|
||||||
}
|
}
|
||||||
|
|
||||||
SctpTransport::State SctpTransport::state() const { return mState; }
|
|
||||||
|
|
||||||
bool SctpTransport::send(message_ptr message) {
|
bool SctpTransport::send(message_ptr message) {
|
||||||
std::lock_guard<std::mutex> lock(mSendMutex);
|
std::lock_guard<std::mutex> lock(mSendMutex);
|
||||||
|
|
||||||
|
@ -50,7 +50,8 @@ public:
|
|||||||
|
|
||||||
State state() const;
|
State state() const;
|
||||||
|
|
||||||
bool send(message_ptr message); // false if buffered
|
void stop() override;
|
||||||
|
bool send(message_ptr message) override; // false if buffered
|
||||||
void reset(unsigned int stream);
|
void reset(unsigned int stream);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -36,13 +36,16 @@ public:
|
|||||||
if (auto lower = std::atomic_load(&mLower))
|
if (auto lower = std::atomic_load(&mLower))
|
||||||
lower->onRecv(std::bind(&Transport::incoming, this, _1));
|
lower->onRecv(std::bind(&Transport::incoming, this, _1));
|
||||||
}
|
}
|
||||||
virtual ~Transport() { resetLower(); }
|
virtual ~Transport() {}
|
||||||
|
|
||||||
|
virtual void stop() { resetLower(); }
|
||||||
virtual bool send(message_ptr message) = 0;
|
virtual bool send(message_ptr message) = 0;
|
||||||
|
|
||||||
void onRecv(message_callback callback) { mRecvCallback = std::move(callback); }
|
void onRecv(message_callback callback) { mRecvCallback = std::move(callback); }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void recv(message_ptr message) { mRecvCallback(message); }
|
void recv(message_ptr message) { mRecvCallback(message); }
|
||||||
|
|
||||||
void resetLower() {
|
void resetLower() {
|
||||||
if (auto lower = std::atomic_exchange(&mLower, std::shared_ptr<Transport>(nullptr)))
|
if (auto lower = std::atomic_exchange(&mLower, std::shared_ptr<Transport>(nullptr)))
|
||||||
lower->onRecv(nullptr);
|
lower->onRecv(nullptr);
|
||||||
|
Reference in New Issue
Block a user