aboutsummaryrefslogtreecommitdiff
path: root/src/base
diff options
context:
space:
mode:
authorNiels Ole Salscheider <niels_ole@salscheider-online.de>2020-03-10 13:19:31 +0100
committerLNJ <lnj@kaidan.im>2020-03-16 22:22:59 +0100
commitbb47e1b9cd2926bed3e63f528e063e462c28975a (patch)
tree1b86c3f9774bc86a55509da35a479c88ca7c49ab /src/base
parent133c94dcf874162860351e34aa1a92a1d942ad2c (diff)
downloadqxmpp-bb47e1b9cd2926bed3e63f528e063e462c28975a.tar.gz
Allow to set multiple STUN servers
This way we can for example add a server for IPv4 and one IPv6.
Diffstat (limited to 'src/base')
-rw-r--r--src/base/QXmppStun.cpp55
-rw-r--r--src/base/QXmppStun.h1
2 files changed, 39 insertions, 17 deletions
diff --git a/src/base/QXmppStun.cpp b/src/base/QXmppStun.cpp
index 623ee75d..0f8dfac8 100644
--- a/src/base/QXmppStun.cpp
+++ b/src/base/QXmppStun.cpp
@@ -1703,19 +1703,25 @@ public:
QString localPassword;
QString remoteUser;
QString remotePassword;
- QHostAddress stunHost;
- quint16 stunPort;
+ QList<QPair<QHostAddress, quint16>> stunServers;
QByteArray tieBreaker;
};
QXmppIcePrivate::QXmppIcePrivate()
- : iceControlling(false), stunPort(0)
+ : iceControlling(false)
{
localUser = QXmppUtils::generateStanzaHash(4);
localPassword = QXmppUtils::generateStanzaHash(22);
tieBreaker = QXmppUtils::generateRandomBytes(8);
}
+struct QXmppIceTransportDetails
+{
+ QXmppIceTransport *transport;
+ QHostAddress stunHost;
+ quint16 stunPort;
+};
+
class QXmppIceComponentPrivate
{
public:
@@ -1746,7 +1752,7 @@ public:
QTimer *timer;
// STUN server
- QMap<QXmppStunTransaction *, QXmppIceTransport *> stunTransactions;
+ QMap<QXmppStunTransaction *, QXmppIceTransportDetails> stunTransactions;
// TURN server
QXmppTurnAllocation *turnAllocation;
@@ -1850,19 +1856,19 @@ void QXmppIceComponentPrivate::setSockets(QList<QUdpSocket *> sockets)
}
// start STUN checks
- if (!config->stunHost.isNull() && config->stunPort) {
- stunTransactions.clear();
-
+ stunTransactions.clear();
+ for (auto &stunServer : config->stunServers) {
QXmppStunMessage request;
request.setType(QXmppStunMessage::Binding | QXmppStunMessage::Request);
for (auto *transport : transports) {
const QXmppJingleCandidate local = transport->localCandidate(component);
- if (!isCompatibleAddress(local.host(), config->stunHost))
+ if (!isCompatibleAddress(local.host(), stunServer.first)) {
continue;
+ }
request.setId(QXmppUtils::generateRandomBytes(STUN_ID_SIZE));
auto *transaction = new QXmppStunTransaction(request, q);
- stunTransactions.insert(transaction, transport);
+ stunTransactions.insert(transaction, {transport, stunServer.first, stunServer.second});
}
}
@@ -2027,7 +2033,7 @@ void QXmppIceComponent::handleDatagram(const QByteArray &buffer, const QHostAddr
QXmppStunTransaction *stunTransaction = nullptr;
for (auto *t : d->stunTransactions.keys()) {
if (t->request().id() == messageId &&
- d->stunTransactions.value(t) == transport) {
+ d->stunTransactions.value(t).transport == transport) {
stunTransaction = t;
break;
}
@@ -2208,7 +2214,7 @@ void QXmppIceComponent::transactionFinished()
}
// STUN checks
- QXmppIceTransport *transport = d->stunTransactions.value(transaction);
+ QXmppIceTransport *transport = d->stunTransactions.value(transaction).transport;
if (transport) {
const QXmppStunMessage response = transaction->response();
if (response.messageClass() == QXmppStunMessage::Response) {
@@ -2411,11 +2417,12 @@ void QXmppIceComponent::writeStun(const QXmppStunMessage &message)
}
// STUN checks
- QXmppIceTransport *transport = d->stunTransactions.value(transaction);
+ QXmppIceTransportDetails transportDetails = d->stunTransactions.value(transaction);
+ QXmppIceTransport *transport = transportDetails.transport;
if (transport) {
- transport->writeDatagram(message.encode(), d->config->stunHost, d->config->stunPort);
+ transport->writeDatagram(message.encode(), transportDetails.stunHost, transportDetails.stunPort);
#ifdef QXMPP_DEBUG_STUN
- logSent(QString("STUN packet to %1 port %2\n%3").arg(d->config->stunHost.toString(), QString::number(d->config->stunPort), message.toString()));
+ logSent(QString("STUN packet to %1 port %2\n%3").arg(transportDetails.stunHost.toString(), QString::number(transportDetails.stunPort), message.toString()));
#endif
return;
}
@@ -2628,7 +2635,21 @@ void QXmppIceConnection::setRemotePassword(const QString &password)
d->remotePassword = password;
}
-/// Sets the STUN server to use to determine server-reflexive addresses
+/// Sets multiple STUN servers to use to determine server-reflexive addresses
+/// and ports.
+///
+/// \note This may only be called prior to calling bind().
+///
+/// \param servers List of the STUN servers.
+///
+/// \since QXmpp 1.3
+
+void QXmppIceConnection::setStunServers(const QList<QPair<QHostAddress, quint16>> &servers)
+{
+ d->stunServers = servers;
+}
+
+/// Sets a single STUN server to use to determine server-reflexive addresses
/// and ports.
///
/// \note This may only be called prior to calling bind().
@@ -2638,8 +2659,8 @@ void QXmppIceConnection::setRemotePassword(const QString &password)
void QXmppIceConnection::setStunServer(const QHostAddress &host, quint16 port)
{
- d->stunHost = host;
- d->stunPort = port;
+ d->stunServers.clear();
+ d->stunServers.push_back(QPair<QHostAddress, quint16>(host, port));
}
/// Sets the TURN server to use to relay packets in double-NAT configurations.
diff --git a/src/base/QXmppStun.h b/src/base/QXmppStun.h
index f46916c8..fe835daa 100644
--- a/src/base/QXmppStun.h
+++ b/src/base/QXmppStun.h
@@ -267,6 +267,7 @@ public:
void setRemoteUser(const QString &user);
void setRemotePassword(const QString &password);
+ void setStunServers(const QList<QPair<QHostAddress, quint16>> &servers);
void setStunServer(const QHostAddress &host, quint16 port = 3478);
void setTurnServer(const QHostAddress &host, quint16 port = 3478);
void setTurnUser(const QString &user);