mirror of
https://github.com/mii443/libdatachannel.git
synced 2025-08-22 15:15:28 +00:00
Merge pull request #19 from paullouisageneau/fix-late-candidates
Fix late candidates triggering DTLS init twice
This commit is contained in:
@ -91,6 +91,7 @@ private:
|
||||
std::shared_ptr<DtlsTransport> initDtlsTransport();
|
||||
std::shared_ptr<SctpTransport> initSctpTransport();
|
||||
|
||||
void endLocalCandidates();
|
||||
bool checkFingerprint(const std::string &fingerprint) const;
|
||||
void forwardMessage(message_ptr message);
|
||||
void forwardBufferedAmount(uint16_t stream, size_t amount);
|
||||
@ -114,6 +115,7 @@ private:
|
||||
std::shared_ptr<IceTransport> mIceTransport;
|
||||
std::shared_ptr<DtlsTransport> mDtlsTransport;
|
||||
std::shared_ptr<SctpTransport> mSctpTransport;
|
||||
std::recursive_mutex mInitMutex;
|
||||
|
||||
std::unordered_map<unsigned int, std::weak_ptr<DataChannel>> mDataChannels;
|
||||
|
||||
|
@ -87,7 +87,6 @@ DtlsTransport::DtlsTransport(shared_ptr<IceTransport> lower, shared_ptr<Certific
|
||||
DtlsTransport::~DtlsTransport() {
|
||||
stop();
|
||||
|
||||
gnutls_bye(mSession, GNUTLS_SHUT_RDWR);
|
||||
gnutls_deinit(mSession);
|
||||
}
|
||||
|
||||
@ -98,6 +97,7 @@ void DtlsTransport::stop() {
|
||||
|
||||
if (mRecvThread.joinable()) {
|
||||
mIncomingQueue.stop();
|
||||
gnutls_bye(mSession, GNUTLS_SHUT_RDWR);
|
||||
mRecvThread.join();
|
||||
}
|
||||
}
|
||||
|
@ -210,6 +210,10 @@ void PeerConnection::onGatheringStateChange(std::function<void(GatheringState st
|
||||
}
|
||||
|
||||
shared_ptr<IceTransport> PeerConnection::initIceTransport(Description::Role role) {
|
||||
std::lock_guard lock(mInitMutex);
|
||||
if (auto transport = std::atomic_load(&mIceTransport))
|
||||
return transport;
|
||||
|
||||
auto transport = std::make_shared<IceTransport>(
|
||||
mConfig, role, std::bind(&PeerConnection::processLocalCandidate, this, _1),
|
||||
[this](IceTransport::State state) {
|
||||
@ -237,8 +241,7 @@ shared_ptr<IceTransport> PeerConnection::initIceTransport(Description::Role role
|
||||
changeGatheringState(GatheringState::InProgress);
|
||||
break;
|
||||
case IceTransport::GatheringState::Complete:
|
||||
if (mLocalDescription)
|
||||
mLocalDescription->endCandidates();
|
||||
endLocalCandidates();
|
||||
changeGatheringState(GatheringState::Complete);
|
||||
break;
|
||||
default:
|
||||
@ -251,6 +254,10 @@ shared_ptr<IceTransport> PeerConnection::initIceTransport(Description::Role role
|
||||
}
|
||||
|
||||
shared_ptr<DtlsTransport> PeerConnection::initDtlsTransport() {
|
||||
std::lock_guard lock(mInitMutex);
|
||||
if (auto transport = std::atomic_load(&mDtlsTransport))
|
||||
return transport;
|
||||
|
||||
auto lower = std::atomic_load(&mIceTransport);
|
||||
auto transport = std::make_shared<DtlsTransport>(
|
||||
lower, mCertificate, std::bind(&PeerConnection::checkFingerprint, this, _1),
|
||||
@ -275,6 +282,10 @@ shared_ptr<DtlsTransport> PeerConnection::initDtlsTransport() {
|
||||
}
|
||||
|
||||
shared_ptr<SctpTransport> PeerConnection::initSctpTransport() {
|
||||
std::lock_guard lock(mInitMutex);
|
||||
if (auto transport = std::atomic_load(&mSctpTransport))
|
||||
return transport;
|
||||
|
||||
uint16_t sctpPort = remoteDescription()->sctpPort().value_or(DEFAULT_SCTP_PORT);
|
||||
auto lower = std::atomic_load(&mDtlsTransport);
|
||||
auto transport = std::make_shared<SctpTransport>(
|
||||
@ -301,6 +312,12 @@ shared_ptr<SctpTransport> PeerConnection::initSctpTransport() {
|
||||
return transport;
|
||||
}
|
||||
|
||||
void PeerConnection::endLocalCandidates() {
|
||||
std::lock_guard lock(mLocalDescriptionMutex);
|
||||
if (mLocalDescription)
|
||||
mLocalDescription->endCandidates();
|
||||
}
|
||||
|
||||
bool PeerConnection::checkFingerprint(const std::string &fingerprint) const {
|
||||
std::lock_guard lock(mRemoteDescriptionMutex);
|
||||
if (auto expectedFingerprint =
|
||||
|
@ -145,7 +145,6 @@ SctpTransport::SctpTransport(std::shared_ptr<Transport> lower, uint16_t port,
|
||||
SctpTransport::~SctpTransport() {
|
||||
stop();
|
||||
|
||||
usrsctp_shutdown(mSock, SHUT_RDWR);
|
||||
usrsctp_close(mSock);
|
||||
usrsctp_deregister_address(this);
|
||||
|
||||
@ -158,12 +157,15 @@ void SctpTransport::stop() {
|
||||
Transport::stop();
|
||||
onRecv(nullptr);
|
||||
|
||||
mSendQueue.stop();
|
||||
if (!mShutdown.exchange(true)) {
|
||||
mSendQueue.stop();
|
||||
usrsctp_shutdown(mSock, SHUT_RDWR);
|
||||
|
||||
// Unblock incoming
|
||||
std::unique_lock<std::mutex> lock(mConnectMutex);
|
||||
mConnectDataSent = true;
|
||||
mConnectCondition.notify_all();
|
||||
// Unblock incoming
|
||||
std::unique_lock<std::mutex> lock(mConnectMutex);
|
||||
mConnectDataSent = true;
|
||||
mConnectCondition.notify_all();
|
||||
}
|
||||
}
|
||||
|
||||
void SctpTransport::connect() {
|
||||
|
@ -95,6 +95,8 @@ private:
|
||||
std::condition_variable mConnectCondition;
|
||||
bool mConnectDataSent = false;
|
||||
|
||||
std::atomic<bool> mShutdown = false;
|
||||
|
||||
state_callback mStateChangeCallback;
|
||||
std::atomic<State> mState;
|
||||
|
||||
|
Reference in New Issue
Block a user