From 330eff72cee5dbe34f6ffbdcee0808f16a805051 Mon Sep 17 00:00:00 2001 From: Stephen Birarda <commit@birarda.com> Date: Mon, 2 Dec 2013 17:18:07 -0800 Subject: [PATCH] repair usage of DS as STUN server --- assignment-client/src/AssignmentClient.cpp | 2 +- assignment-client/src/audio/AudioMixer.cpp | 2 +- assignment-client/src/audio/AudioMixer.h | 4 ++-- domain-server/src/DomainServer.cpp | 6 +++--- interface/src/PairingHandler.cpp | 2 +- libraries/shared/src/HifiSockAddr.cpp | 17 +++++++++-------- libraries/shared/src/HifiSockAddr.h | 2 +- libraries/shared/src/Node.cpp | 2 +- libraries/shared/src/NodeList.cpp | 7 +++++-- 9 files changed, 24 insertions(+), 20 deletions(-) diff --git a/assignment-client/src/AssignmentClient.cpp b/assignment-client/src/AssignmentClient.cpp index d882afdcae..6b2b27730d 100644 --- a/assignment-client/src/AssignmentClient.cpp +++ b/assignment-client/src/AssignmentClient.cpp @@ -95,7 +95,7 @@ void AssignmentClient::readPendingDatagrams() { // start the deployed assignment QThread *workerThread = new QThread(this); - connect(workerThread, SIGNAL(started()), _currentAssignment, SLOT(run())); + connect(workerThread, SIGNAL(started()), _currentAssignment, SLOT(setup())); connect(_currentAssignment, SIGNAL(finished()), this, SLOT(assignmentCompleted())); connect(_currentAssignment, SIGNAL(finished()), workerThread, SLOT(quit())); diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index 451904bb48..94bd787140 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -293,7 +293,7 @@ void AudioMixer::sendClientMixes() { } -void AudioMixer::run() { +void AudioMixer::setup() { // change the logging target name while this is running Logging::setTargetName(AUDIO_MIXER_LOGGING_TARGET_NAME); diff --git a/assignment-client/src/audio/AudioMixer.h b/assignment-client/src/audio/AudioMixer.h index d9764170bc..f2fbd04373 100644 --- a/assignment-client/src/audio/AudioMixer.h +++ b/assignment-client/src/audio/AudioMixer.h @@ -22,8 +22,8 @@ class AudioMixer : public Assignment { public: AudioMixer(const unsigned char* dataBuffer, int numBytes); public slots: - /// runs the audio mixer - void run(); + /// performs setup for the audio mixer + void setup(); void processDatagram(const QByteArray& dataByteArray, const HifiSockAddr& senderSockAddr); signals: diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index 175118ef7d..b10006e6cc 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -628,16 +628,16 @@ int DomainServer::run() { int numBytesPrivateSocket = HifiSockAddr::unpackSockAddr(packetData + packetIndex, nodePublicAddress); packetIndex += numBytesPrivateSocket; - if (nodePublicAddress.getAddress().isNull() == 0) { + if (nodePublicAddress.getAddress().isNull()) { // this node wants to use us its STUN server // so set the node public address to whatever we perceive the public address to be - nodePublicAddress.setAddress(senderAddress); - // if the sender is on our box then leave its public address to 0 so that // other users attempt to reach it on the same address they have for the domain-server if (senderAddress.isLoopback()) { nodePublicAddress.setAddress(QHostAddress()); + } else { + nodePublicAddress.setAddress(senderAddress); } } diff --git a/interface/src/PairingHandler.cpp b/interface/src/PairingHandler.cpp index 56d7642640..718a8c7dc8 100644 --- a/interface/src/PairingHandler.cpp +++ b/interface/src/PairingHandler.cpp @@ -37,7 +37,7 @@ void PairingHandler::sendPairRequest() { NodeList* nodeList = NodeList::getInstance(); // use the getLocalAddress helper to get this client's listening address - quint32 localAddress = getLocalAddress(); + quint32 localAddress = htonl(getHostOrderLocalAddress()); char pairPacket[24] = {}; sprintf(pairPacket, "Find %d.%d.%d.%d:%hu", diff --git a/libraries/shared/src/HifiSockAddr.cpp b/libraries/shared/src/HifiSockAddr.cpp index 66ae200026..0fdc8919ed 100644 --- a/libraries/shared/src/HifiSockAddr.cpp +++ b/libraries/shared/src/HifiSockAddr.cpp @@ -12,7 +12,7 @@ #include <QtNetwork/QNetworkInterface> HifiSockAddr::HifiSockAddr() : - _address(QHostAddress::Null), + _address(), _port(0) { @@ -55,15 +55,16 @@ void HifiSockAddr::swap(HifiSockAddr& otherSockAddr) { } int HifiSockAddr::packSockAddr(unsigned char* packetData, const HifiSockAddr& packSockAddr) { - unsigned int addressToPack = packSockAddr._address.toIPv4Address(); - memcpy(packetData, &addressToPack, sizeof(packSockAddr._address.toIPv4Address())); - memcpy(packetData, &packSockAddr._port, sizeof(packSockAddr._port)); + quint32 addressToPack = packSockAddr._address.isNull() ? 0 : packSockAddr._address.toIPv4Address(); + memcpy(packetData, &addressToPack, sizeof(addressToPack)); + memcpy(packetData + sizeof(addressToPack), &packSockAddr._port, sizeof(packSockAddr._port)); return sizeof(addressToPack) + sizeof(packSockAddr._port); } int HifiSockAddr::unpackSockAddr(const unsigned char* packetData, HifiSockAddr& unpackDestSockAddr) { - unpackDestSockAddr._address = QHostAddress(*((quint32*) packetData)); + quint32* address = (quint32*) packetData; + unpackDestSockAddr._address = *address == 0 ? QHostAddress() : QHostAddress(*address); unpackDestSockAddr._port = *((quint16*) (packetData + sizeof(quint32))); return sizeof(quint32) + sizeof(quint16); @@ -74,11 +75,11 @@ bool HifiSockAddr::operator==(const HifiSockAddr &rhsSockAddr) const { } QDebug operator<<(QDebug debug, const HifiSockAddr &hifiSockAddr) { - debug.nospace() << hifiSockAddr._address.toString() << ":" << hifiSockAddr._port; + debug.nospace() << hifiSockAddr._address.toString().toLocal8Bit().constData() << ":" << hifiSockAddr._port; return debug; } -quint32 getLocalAddress() { +quint32 getHostOrderLocalAddress() { static int localAddress = 0; @@ -95,7 +96,7 @@ quint32 getLocalAddress() { qDebug("Node's local address is %s\n", entry.ip().toString().toLocal8Bit().constData()); // set our localAddress and break out - localAddress = htonl(entry.ip().toIPv4Address()); + localAddress = entry.ip().toIPv4Address(); break; } } diff --git a/libraries/shared/src/HifiSockAddr.h b/libraries/shared/src/HifiSockAddr.h index 6428453849..f11492805f 100644 --- a/libraries/shared/src/HifiSockAddr.h +++ b/libraries/shared/src/HifiSockAddr.h @@ -43,7 +43,7 @@ private: quint16 _port; }; -quint32 getLocalAddress(); +quint32 getHostOrderLocalAddress(); Q_DECLARE_METATYPE(HifiSockAddr) diff --git a/libraries/shared/src/Node.cpp b/libraries/shared/src/Node.cpp index cc82677f9a..bcaf64f9c6 100644 --- a/libraries/shared/src/Node.cpp +++ b/libraries/shared/src/Node.cpp @@ -136,6 +136,6 @@ float Node::getAverageKilobitsPerSecond() { QDebug operator<<(QDebug debug, const Node &node) { debug.nospace() << node.getTypeName() << " (" << node.getType() << ")"; debug << " " << node.getUUID().toString().toLocal8Bit().constData() << " "; - debug.nospace() << node.getLocalSocket() << "/" << node.getPublicSocket(); + debug.nospace() << node.getPublicSocket() << "/" << node.getLocalSocket(); return debug.nospace(); } diff --git a/libraries/shared/src/NodeList.cpp b/libraries/shared/src/NodeList.cpp index b1dfa2ab38..16b55bd1db 100644 --- a/libraries/shared/src/NodeList.cpp +++ b/libraries/shared/src/NodeList.cpp @@ -76,6 +76,7 @@ NodeList::NodeList(char newOwnerType, unsigned short int newSocketListenPort) : _stunRequestsSinceSuccess(0) { _nodeSocket.bind(QHostAddress::AnyIPv4, newSocketListenPort); + qDebug() << "NodeList socket is listening on" << _nodeSocket.localPort() << "\n"; } NodeList::~NodeList() { @@ -361,7 +362,8 @@ void NodeList::sendSTUNRequest() { } // reset the public address and port - _publicSockAddr = HifiSockAddr(); + // use 0 so the DS knows to act as out STUN server + _publicSockAddr = HifiSockAddr(QHostAddress(), _nodeSocket.localPort()); } } @@ -539,7 +541,8 @@ void NodeList::sendDomainServerCheckIn() { // pack our local address to send to domain-server packetPosition += HifiSockAddr::packSockAddr(checkInPacket + (packetPosition - checkInPacket), - HifiSockAddr(_nodeSocket.localAddress(), _nodeSocket.localPort())); + HifiSockAddr(QHostAddress(getHostOrderLocalAddress()), + _nodeSocket.localPort())); // add the number of bytes for node types of interest *(packetPosition++) = numBytesNodesOfInterest;