Skip to content
Snippets Groups Projects
Commit efe342a3 authored by Sébastien Blin's avatar Sébastien Blin
Browse files

file transfer: use different ice for each transfer

Multiplexing should be redone after the ConnectionManager patch

Change-Id: I61588c9fb0d0dc86093a09405b2a6078341106ca
parent 0b686317
No related branches found
No related tags found
No related merge requests found
......@@ -51,7 +51,7 @@ static constexpr std::chrono::seconds NET_CONNECTION_TIMEOUT{10};
static constexpr std::chrono::seconds SOCK_TIMEOUT{3};
static constexpr std::chrono::seconds ICE_READY_TIMEOUT{10};
static constexpr std::chrono::seconds ICE_INIT_TIMEOUT{10};
static constexpr std::chrono::seconds ICE_NOGOTIATION_TIMEOUT{10};
static constexpr std::chrono::seconds ICE_NEGOTIATION_TIMEOUT{10};
using Clock = std::chrono::system_clock;
using ValueIdDist = std::uniform_int_distribution<dht::Value::Id>;
......@@ -293,8 +293,6 @@ private:
std::future<void> loopFut_; // keep it last member
std::shared_ptr<IceTransport> ice_;
std::vector<std::thread> answer_threads_;
};
......@@ -439,7 +437,7 @@ private:
break;
}
ice->waitForNegotiation(ICE_NOGOTIATION_TIMEOUT);
ice->waitForNegotiation(ICE_NEGOTIATION_TIMEOUT);
if (ice->isRunning()) {
peer_ep = std::make_shared<IceSocketEndpoint>(ice, true);
JAMI_DBG("[Account:%s] ICE negotiation succeed. Starting file transfer",
......@@ -475,6 +473,11 @@ private:
}
}
if (!peer_ep) {
cancel();
return;
}
// Negotiate a TLS session
JAMI_DBG() << parent_.account << "[CNX] start TLS session";
auto tls_ep = std::make_unique<TlsSocketEndpoint>(
......@@ -731,6 +734,7 @@ DhtPeerConnector::Impl::answerToRequest(PeerConnectionMsg&& request,
bool ready {false};
};
auto iceReady = std::make_shared<IceReady>();
std::shared_ptr<IceTransport> ice;
for (auto& ip: request.addresses) {
try {
if (IpAddr(ip).isIpv4()) {
......@@ -761,32 +765,33 @@ DhtPeerConnector::Impl::answerToRequest(PeerConnectionMsg&& request,
ir.ready = true;
ir.cv.notify_one();
};
ice_ = iceTransportFactory.createTransport(account.getAccountID().c_str(), 1, true, ice_config);
ice = iceTransportFactory.createTransport(account.getAccountID().c_str(), 1, true, ice_config);
if (ice_->waitForInitialization(ICE_INIT_TIMEOUT) <= 0) {
if (ice->waitForInitialization(ICE_INIT_TIMEOUT) <= 0) {
JAMI_ERR("Cannot initialize ICE session.");
continue;
}
account.registerDhtAddress(*ice_);
account.registerDhtAddress(*ice);
auto sdp = parse_SDP(ip, *ice_);
auto sdp = parse_SDP(ip, *ice);
// NOTE: hasPubIp is used for compability (because ICE is waiting for a certain state in old versions)
// This can be removed when old versions will be unsupported (version before this patch)
hasPubIp = hasPublicIp(sdp);
if (not ice_->start({sdp.rem_ufrag, sdp.rem_pwd}, sdp.rem_candidates)) {
if (not ice->start({sdp.rem_ufrag, sdp.rem_pwd}, sdp.rem_candidates)) {
JAMI_WARN("[Account:%s] start ICE failed - fallback to TURN",
account.getAccountID().c_str());
continue;
}
if (!hasPubIp) {
ice_->waitForNegotiation(ICE_NOGOTIATION_TIMEOUT);
if (ice_->isRunning()) {
ice->waitForNegotiation(ICE_NEGOTIATION_TIMEOUT);
if (ice->isRunning()) {
sendIce = true;
JAMI_DBG("[Account:%s] ICE negotiation succeed. Answering with local SDP", account.getAccountID().c_str());
} else {
JAMI_WARN("[Account:%s] ICE negotation failed", account.getAccountID().c_str());
ice->cancelOperations();
}
} else
sendIce = true; // Ice started with success, we can use it.
......@@ -801,11 +806,11 @@ DhtPeerConnector::Impl::answerToRequest(PeerConnectionMsg&& request,
if (sendIce) {
// NOTE: This is a shortest version of a real SDP message to save some bits
auto iceAttributes = ice_->getLocalAttributes();
auto iceAttributes = ice->getLocalAttributes();
std::stringstream icemsg;
icemsg << iceAttributes.ufrag << "\n";
icemsg << iceAttributes.pwd << "\n";
for (const auto &addr : ice_->getLocalCandidates(0)) {
for (const auto &addr : ice->getLocalCandidates(0)) {
icemsg << addr << "\n";
}
addresses = {icemsg.str()};
......@@ -837,8 +842,8 @@ DhtPeerConnector::Impl::answerToRequest(PeerConnectionMsg&& request,
if (sendIce) {
if (hasPubIp) {
ice_->waitForNegotiation(ICE_NOGOTIATION_TIMEOUT);
if (ice_->isRunning()) {
ice->waitForNegotiation(ICE_NEGOTIATION_TIMEOUT);
if (ice->isRunning()) {
JAMI_DBG("[Account:%s] ICE negotiation succeed. Answering with local SDP", account.getAccountID().c_str());
} else {
JAMI_WARN("[Account:%s] ICE negotation failed - Fallbacking to TURN", account.getAccountID().c_str());
......@@ -847,7 +852,7 @@ DhtPeerConnector::Impl::answerToRequest(PeerConnectionMsg&& request,
}
if (not iceReady->ready) {
if (!hasPubIp) ice_->setSlaveSession();
if (!hasPubIp) ice->setSlaveSession();
std::unique_lock<std::mutex> lk {iceReady->mtx};
if (not iceReady->cv.wait_for(lk, ICE_READY_TIMEOUT, [&]{ return iceReady->ready; })) {
// This will fallback on TURN if ICE is not ready
......@@ -856,10 +861,10 @@ DhtPeerConnector::Impl::answerToRequest(PeerConnectionMsg&& request,
}
std::unique_ptr<AbstractSocketEndpoint> peer_ep =
std::make_unique<IceSocketEndpoint>(ice_, false);
std::make_unique<IceSocketEndpoint>(ice, false);
JAMI_DBG() << account << "[CNX] start TLS session";
auto ph = peer_h;
if (hasPubIp) ice_->setSlaveSession();
if (hasPubIp) ice->setSlaveSession();
auto tls_ep = std::make_unique<TlsSocketEndpoint>(
*peer_ep, account.identity(), account.dhParams(),
[&, this](const dht::crypto::Certificate &cert) {
......@@ -880,9 +885,9 @@ DhtPeerConnector::Impl::answerToRequest(PeerConnectionMsg&& request,
std::move(tls_ep));
connection->attachOutputStream(std::make_shared<FtpServer>(
account.getAccountID(), peer_h.toString()));
servers_.emplace(std::make_pair(peer_h, ice_->getRemoteAddress(0)),
servers_.emplace(std::make_pair(peer_h, ice->getRemoteAddress(0)),
std::move(connection));
p2pEndpoints_.emplace(std::make_pair(peer_h, ice_->getRemoteAddress(0)),
p2pEndpoints_.emplace(std::make_pair(peer_h, ice->getRemoteAddress(0)),
std::move(peer_ep));
}
// Now wait for a TURN connection from peer (see onTurnPeerConnection) if fallbacking
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment