From d938e518a0f90ecee9d7486a2f2276770a7f5c7d Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 18 Aug 2016 17:54:52 -0700 Subject: [PATCH 1/9] Start new hole punch when the socket is updated --- libraries/networking/src/LimitedNodeList.cpp | 6 ++++++ libraries/networking/src/LimitedNodeList.h | 1 + libraries/networking/src/NetworkPeer.cpp | 3 +++ libraries/networking/src/NetworkPeer.h | 3 +++ libraries/networking/src/NodeList.cpp | 1 + 5 files changed, 14 insertions(+) diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 6d9de2dbc1..2d90423a00 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -606,6 +606,12 @@ SharedNodePointer LimitedNodeList::addOrUpdateNode(const QUuid& uuid, NodeType_t }); } + // Signal when a socket changes, so we can start the hole punch over. + auto weakPtr = newNodePointer.toWeakRef(); // We don't want the lambda to hold a strong ref + connect(newNodePointer.data(), &NetworkPeer::socketUpdated, this, [=] { + emit nodeUpdated(weakPtr); + }); + return newNodePointer; } } diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index 49a3a155a2..85b4e718bf 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -250,6 +250,7 @@ signals: void uuidChanged(const QUuid& ownerUUID, const QUuid& oldUUID); void nodeAdded(SharedNodePointer); + void nodeUpdated(SharedNodePointer); void nodeKilled(SharedNodePointer); void nodeActivated(SharedNodePointer); diff --git a/libraries/networking/src/NetworkPeer.cpp b/libraries/networking/src/NetworkPeer.cpp index da2eced05c..2ebee1b71f 100644 --- a/libraries/networking/src/NetworkPeer.cpp +++ b/libraries/networking/src/NetworkPeer.cpp @@ -63,6 +63,7 @@ void NetworkPeer::setPublicSocket(const HifiSockAddr& publicSocket) { if (!wasOldSocketNull) { qCDebug(networking) << "Public socket change for node" << *this; + emit socketUpdated(); } } } @@ -82,6 +83,7 @@ void NetworkPeer::setLocalSocket(const HifiSockAddr& localSocket) { if (!wasOldSocketNull) { qCDebug(networking) << "Local socket change for node" << *this; + emit socketUpdated(); } } } @@ -101,6 +103,7 @@ void NetworkPeer::setSymmetricSocket(const HifiSockAddr& symmetricSocket) { if (!wasOldSocketNull) { qCDebug(networking) << "Symmetric socket change for node" << *this; + emit socketUpdated(); } } } diff --git a/libraries/networking/src/NetworkPeer.h b/libraries/networking/src/NetworkPeer.h index 8298a2dad4..7185ffef29 100644 --- a/libraries/networking/src/NetworkPeer.h +++ b/libraries/networking/src/NetworkPeer.h @@ -81,9 +81,12 @@ public: public slots: void startPingTimer(); void stopPingTimer(); + signals: void pingTimerTimeout(); void socketActivated(const HifiSockAddr& sockAddr); + void socketUpdated(); + protected: void setActiveSocket(HifiSockAddr* discoveredSocket); diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 3a07ea8b54..44c7e8e0cf 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -93,6 +93,7 @@ NodeList::NodeList(char newOwnerType, unsigned short socketListenPort, unsigned // anytime we get a new node we will want to attempt to punch to it connect(this, &LimitedNodeList::nodeAdded, this, &NodeList::startNodeHolePunch); + connect(this, &LimitedNodeList::nodeUpdated, this, &NodeList::startNodeHolePunch); // anytime we get a new node we may need to re-send our set of ignored node IDs to it connect(this, &LimitedNodeList::nodeActivated, this, &NodeList::maybeSendIgnoreSetToNode); From 713be9fd7334eded2916301c4b475a38fafa35cb Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Fri, 19 Aug 2016 13:07:46 -0700 Subject: [PATCH 2/9] Rename NLs nodeUpdated signal to nodeSocketUpdated --- libraries/networking/src/LimitedNodeList.cpp | 2 +- libraries/networking/src/LimitedNodeList.h | 2 +- libraries/networking/src/NodeList.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 2d90423a00..bd7b50c9f8 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -609,7 +609,7 @@ SharedNodePointer LimitedNodeList::addOrUpdateNode(const QUuid& uuid, NodeType_t // Signal when a socket changes, so we can start the hole punch over. auto weakPtr = newNodePointer.toWeakRef(); // We don't want the lambda to hold a strong ref connect(newNodePointer.data(), &NetworkPeer::socketUpdated, this, [=] { - emit nodeUpdated(weakPtr); + emit nodeSocketUpdated(weakPtr); }); return newNodePointer; diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index 85b4e718bf..89c8d41b49 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -250,7 +250,7 @@ signals: void uuidChanged(const QUuid& ownerUUID, const QUuid& oldUUID); void nodeAdded(SharedNodePointer); - void nodeUpdated(SharedNodePointer); + void nodeSocketUpdated(SharedNodePointer); void nodeKilled(SharedNodePointer); void nodeActivated(SharedNodePointer); diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 44c7e8e0cf..6269499e28 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -93,7 +93,7 @@ NodeList::NodeList(char newOwnerType, unsigned short socketListenPort, unsigned // anytime we get a new node we will want to attempt to punch to it connect(this, &LimitedNodeList::nodeAdded, this, &NodeList::startNodeHolePunch); - connect(this, &LimitedNodeList::nodeUpdated, this, &NodeList::startNodeHolePunch); + connect(this, &LimitedNodeList::nodeSocketUpdated, this, &NodeList::startNodeHolePunch); // anytime we get a new node we may need to re-send our set of ignored node IDs to it connect(this, &LimitedNodeList::nodeActivated, this, &NodeList::maybeSendIgnoreSetToNode); From a8de6f0a57fae09c3666eb1d734870f8d8e314c4 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 23 Aug 2016 10:29:49 -0700 Subject: [PATCH 3/9] Add settings to change local port --- .../dialogs/NetworkingPreferencesDialog.qml | 19 +++++++++++ interface/src/Menu.cpp | 23 +++++++------ interface/src/Menu.h | 1 + interface/src/ui/PreferencesDialog.cpp | 16 ++++++++++ libraries/networking/src/NodeList.cpp | 21 +++++++++++- libraries/networking/src/NodeList.h | 2 ++ libraries/networking/src/udt/Socket.cpp | 6 ++-- libraries/networking/src/udt/Socket.h | 3 +- libraries/shared/src/Preferences.h | 32 +++++++++++++++++++ 9 files changed, 110 insertions(+), 13 deletions(-) create mode 100644 interface/resources/qml/hifi/dialogs/NetworkingPreferencesDialog.qml diff --git a/interface/resources/qml/hifi/dialogs/NetworkingPreferencesDialog.qml b/interface/resources/qml/hifi/dialogs/NetworkingPreferencesDialog.qml new file mode 100644 index 0000000000..652d3347fc --- /dev/null +++ b/interface/resources/qml/hifi/dialogs/NetworkingPreferencesDialog.qml @@ -0,0 +1,19 @@ +import QtQuick 2.5 +import Qt.labs.settings 1.0 + +import "../../dialogs" + +PreferencesDialog { + id: root + objectName: "NetworkingPreferencesDialog" + title: "Networking Settings" + showCategories: ["Networking"] + property var settings: Settings { + category: root.objectName + property alias x: root.x + property alias y: root.y + property alias width: root.width + property alias height: root.height + } +} + diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 50dc748461..69ec085188 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -522,21 +522,26 @@ Menu::Menu() { // Developer > Network >>> MenuWrapper* networkMenu = developerMenu->addMenu("Network"); + action = addActionToQMenuAndActionHash(networkMenu, MenuOption::Networking); + connect(action, &QAction::triggered, [] { + DependencyManager::get()->toggle(QUrl("hifi/dialogs/NetworkingPreferencesDialog.qml"), + "NetworkingPreferencesDialog"); + }); addActionToQMenuAndActionHash(networkMenu, MenuOption::ReloadContent, 0, qApp, SLOT(reloadResourceCaches())); addCheckableActionToQMenuAndActionHash(networkMenu, - MenuOption::DisableActivityLogger, - 0, - false, - &UserActivityLogger::getInstance(), - SLOT(disable(bool))); + MenuOption::DisableActivityLogger, + 0, + false, + &UserActivityLogger::getInstance(), + SLOT(disable(bool))); addActionToQMenuAndActionHash(networkMenu, MenuOption::CachesSize, 0, - dialogsManager.data(), SLOT(cachesSizeDialog())); + dialogsManager.data(), SLOT(cachesSizeDialog())); addActionToQMenuAndActionHash(networkMenu, MenuOption::DiskCacheEditor, 0, - dialogsManager.data(), SLOT(toggleDiskCacheEditor())); + dialogsManager.data(), SLOT(toggleDiskCacheEditor())); addActionToQMenuAndActionHash(networkMenu, MenuOption::ShowDSConnectTable, 0, - dialogsManager.data(), SLOT(showDomainConnectionDialog())); + dialogsManager.data(), SLOT(showDomainConnectionDialog())); addActionToQMenuAndActionHash(networkMenu, MenuOption::BandwidthDetails, 0, - dialogsManager.data(), SLOT(bandwidthDetails())); + dialogsManager.data(), SLOT(bandwidthDetails())); #if (PR_BUILD || DEV_BUILD) addCheckableActionToQMenuAndActionHash(networkMenu, MenuOption::SendWrongProtocolVersion, 0, false, diff --git a/interface/src/Menu.h b/interface/src/Menu.h index ee00644746..b25603caeb 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -129,6 +129,7 @@ namespace MenuOption { const QString MuteEnvironment = "Mute Environment"; const QString MuteFaceTracking = "Mute Face Tracking"; const QString NamesAboveHeads = "Names Above Heads"; + const QString Networking = "Networking..."; const QString NoFaceTracking = "None"; const QString OctreeStats = "Entity Statistics"; const QString OnePointCalibration = "1 Point Calibration"; diff --git a/interface/src/ui/PreferencesDialog.cpp b/interface/src/ui/PreferencesDialog.cpp index 7fdafc9bda..aaecf8ae37 100644 --- a/interface/src/ui/PreferencesDialog.cpp +++ b/interface/src/ui/PreferencesDialog.cpp @@ -332,4 +332,20 @@ void setupPreferences() { preferences->addPreference(preference); } } + { + static const QString RENDER("Networking"); + + auto nodelist = DependencyManager::get(); + { + const int MIN_PORT_NUMBER { 0 }; + const int MAX_PORT_NUMBER { 65535 }; + auto getter = [nodelist] { return nodelist->getSocketLocalPort(); }; + auto setter = [nodelist](quint16 preset) { nodelist->setSocketLocalPort(preset); }; + auto preference = new SpinnerPreference(RENDER, "Listening Port", getter, setter); + preference->setMin(MIN_PORT_NUMBER); + preference->setMax(MAX_PORT_NUMBER); + preference->setStep(1); + preferences->addPreference(preference); + } + } } diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 6269499e28..dd6aa848ba 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -31,10 +31,18 @@ #include "udt/PacketHeaders.h" #include "SharedUtil.h" +#include + const int KEEPALIVE_PING_INTERVAL_MS = 1000; +static Setting::Handle NODELIST_LOCAL_PORT("NodeList.LocalPort", 0); + +quint16 pickPortHelper(quint16 port) { + return (port != 0) ? port : NODELIST_LOCAL_PORT.get(); +} + NodeList::NodeList(char newOwnerType, unsigned short socketListenPort, unsigned short dtlsListenPort) : - LimitedNodeList(socketListenPort, dtlsListenPort), + LimitedNodeList(pickPortHelper(socketListenPort), dtlsListenPort), _ownerType(newOwnerType), _nodeTypesOfInterest(), _domainHandler(this), @@ -238,6 +246,17 @@ void NodeList::reset() { } } +void NodeList::setSocketLocalPort(quint16 socketLocalPort) { + if (QThread::currentThread() != thread()) { + QMetaObject::invokeMethod(this, "setSocketLocalPort", Qt::QueuedConnection, + Q_ARG(quint16, socketLocalPort)); + return; + } + _nodeSocket.rebind(socketLocalPort); + reset(); + NODELIST_LOCAL_PORT.set(socketLocalPort); +} + void NodeList::addNodeTypeToInterestSet(NodeType_t nodeTypeToAdd) { _nodeTypesOfInterest << nodeTypeToAdd; } diff --git a/libraries/networking/src/NodeList.h b/libraries/networking/src/NodeList.h index f3cd5bed0d..936e67c018 100644 --- a/libraries/networking/src/NodeList.h +++ b/libraries/networking/src/NodeList.h @@ -92,6 +92,8 @@ public slots: void processICEPingPacket(QSharedPointer message); + void setSocketLocalPort(quint16 socketLocalPort); + #if (PR_BUILD || DEV_BUILD) void toggleSendNewerDSConnectVersion(bool shouldSendNewerVersion) { _shouldSendNewerVersion = shouldSendNewerVersion; } #endif diff --git a/libraries/networking/src/udt/Socket.cpp b/libraries/networking/src/udt/Socket.cpp index a39100f8d1..37ededa55c 100644 --- a/libraries/networking/src/udt/Socket.cpp +++ b/libraries/networking/src/udt/Socket.cpp @@ -63,10 +63,12 @@ void Socket::bind(const QHostAddress& address, quint16 port) { } void Socket::rebind() { - quint16 oldPort = _udpSocket.localPort(); + rebind(_udpSocket.localPort()); +} +void Socket::rebind(quint16 localPort) { _udpSocket.close(); - bind(QHostAddress::AnyIPv4, oldPort); + bind(QHostAddress::AnyIPv4, localPort); } void Socket::setSystemBufferSizes() { diff --git a/libraries/networking/src/udt/Socket.h b/libraries/networking/src/udt/Socket.h index 6b8ccf1fa8..bc4393d4bd 100644 --- a/libraries/networking/src/udt/Socket.h +++ b/libraries/networking/src/udt/Socket.h @@ -61,8 +61,9 @@ public: qint64 writeDatagram(const QByteArray& datagram, const HifiSockAddr& sockAddr); void bind(const QHostAddress& address, quint16 port = 0); + void rebind(quint16 port); void rebind(); - + void setPacketFilterOperator(PacketFilterOperator filterOperator) { _packetFilterOperator = filterOperator; } void setPacketHandler(PacketHandler handler) { _packetHandler = handler; } void setMessageHandler(MessageHandler handler) { _messageHandler = handler; } diff --git a/libraries/shared/src/Preferences.h b/libraries/shared/src/Preferences.h index abb3f5afbd..94a8f43c4e 100644 --- a/libraries/shared/src/Preferences.h +++ b/libraries/shared/src/Preferences.h @@ -189,6 +189,38 @@ protected: float _step { 0.1f }; }; + +class IntPreference : public TypedPreference { + Q_OBJECT + Q_PROPERTY(float value READ getValue WRITE setValue NOTIFY valueChanged) + Q_PROPERTY(float min READ getMin CONSTANT) + Q_PROPERTY(float max READ getMax CONSTANT) + Q_PROPERTY(float step READ getStep CONSTANT) + +public: + IntPreference(const QString& category, const QString& name, Getter getter, Setter setter) + : TypedPreference(category, name, getter, setter) { } + + float getMin() const { return _min; } + void setMin(float min) { _min = min; }; + + float getMax() const { return _max; } + void setMax(float max) { _max = max; }; + + float getStep() const { return _step; } + void setStep(float step) { _step = step; }; + +signals: + void valueChanged(); + +protected: + void emitValueChanged() override { emit valueChanged(); } + + int _min { std::numeric_limits::min() }; + int _max { std::numeric_limits::max() }; + int _step { 1 }; +}; + class StringPreference : public TypedPreference { Q_OBJECT Q_PROPERTY(QString value READ getValue WRITE setValue NOTIFY valueChanged) From fcf44911a35cabb8cf3934a0fd2ead8dd5a53313 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 23 Aug 2016 13:04:31 -0700 Subject: [PATCH 4/9] Fix Windows warning --- interface/src/ui/PreferencesDialog.cpp | 11 +++++------ libraries/networking/src/NodeList.cpp | 8 +++++--- libraries/shared/src/Preferences.h | 9 +++++++++ 3 files changed, 19 insertions(+), 9 deletions(-) diff --git a/interface/src/ui/PreferencesDialog.cpp b/interface/src/ui/PreferencesDialog.cpp index aaecf8ae37..0ba057a5e3 100644 --- a/interface/src/ui/PreferencesDialog.cpp +++ b/interface/src/ui/PreferencesDialog.cpp @@ -337,14 +337,13 @@ void setupPreferences() { auto nodelist = DependencyManager::get(); { - const int MIN_PORT_NUMBER { 0 }; - const int MAX_PORT_NUMBER { 65535 }; - auto getter = [nodelist] { return nodelist->getSocketLocalPort(); }; - auto setter = [nodelist](quint16 preset) { nodelist->setSocketLocalPort(preset); }; - auto preference = new SpinnerPreference(RENDER, "Listening Port", getter, setter); + static const int MIN_PORT_NUMBER { 0 }; + static const int MAX_PORT_NUMBER { 65535 }; + auto getter = [nodelist] { return static_cast(nodelist->getSocketLocalPort()); }; + auto setter = [nodelist](int preset) { nodelist->setSocketLocalPort(static_cast(preset)); }; + auto preference = new IntSpinnerPreference(RENDER, "Listening Port", getter, setter); preference->setMin(MIN_PORT_NUMBER); preference->setMax(MAX_PORT_NUMBER); - preference->setStep(1); preferences->addPreference(preference); } } diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index dd6aa848ba..2101395a23 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -252,9 +252,11 @@ void NodeList::setSocketLocalPort(quint16 socketLocalPort) { Q_ARG(quint16, socketLocalPort)); return; } - _nodeSocket.rebind(socketLocalPort); - reset(); - NODELIST_LOCAL_PORT.set(socketLocalPort); + if (_nodeSocket.localPort() != socketLocalPort) { + reset(); + _nodeSocket.rebind(socketLocalPort); + NODELIST_LOCAL_PORT.set(socketLocalPort); + } } void NodeList::addNodeTypeToInterestSet(NodeType_t nodeTypeToAdd) { diff --git a/libraries/shared/src/Preferences.h b/libraries/shared/src/Preferences.h index 94a8f43c4e..5a4b3f2096 100644 --- a/libraries/shared/src/Preferences.h +++ b/libraries/shared/src/Preferences.h @@ -254,6 +254,15 @@ public: Type getType() override { return Spinner; } }; +class IntSpinnerPreference : public IntPreference { + Q_OBJECT +public: + IntSpinnerPreference(const QString& category, const QString& name, Getter getter, Setter setter) + : IntPreference(category, name, getter, setter) { } + + Type getType() override { return Spinner; } +}; + class EditPreference : public StringPreference { Q_OBJECT Q_PROPERTY(QString placeholderText READ getPlaceholderText CONSTANT) From bba5e465333b14b969c811e0f33aaf9bd78a9fca Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 23 Aug 2016 14:13:17 -0700 Subject: [PATCH 5/9] Don't reset the NodeList --- libraries/networking/src/NodeList.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 2101395a23..171e9e279c 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -253,7 +253,6 @@ void NodeList::setSocketLocalPort(quint16 socketLocalPort) { return; } if (_nodeSocket.localPort() != socketLocalPort) { - reset(); _nodeSocket.rebind(socketLocalPort); NODELIST_LOCAL_PORT.set(socketLocalPort); } From 9f07511fd83d1feb1b54d5bdc0986e94bd7b4e0c Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 23 Aug 2016 14:28:25 -0700 Subject: [PATCH 6/9] Move setter to LimitedNodeList --- interface/src/Menu.cpp | 18 ++++++++-------- libraries/networking/src/LimitedNodeList.cpp | 20 ++++++++++++++++-- libraries/networking/src/LimitedNodeList.h | 2 ++ libraries/networking/src/NodeList.cpp | 22 +------------------- libraries/networking/src/NodeList.h | 2 -- 5 files changed, 30 insertions(+), 34 deletions(-) diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 69ec085188..d3caa4a092 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -529,19 +529,19 @@ Menu::Menu() { }); addActionToQMenuAndActionHash(networkMenu, MenuOption::ReloadContent, 0, qApp, SLOT(reloadResourceCaches())); addCheckableActionToQMenuAndActionHash(networkMenu, - MenuOption::DisableActivityLogger, - 0, - false, - &UserActivityLogger::getInstance(), - SLOT(disable(bool))); + MenuOption::DisableActivityLogger, + 0, + false, + &UserActivityLogger::getInstance(), + SLOT(disable(bool))); addActionToQMenuAndActionHash(networkMenu, MenuOption::CachesSize, 0, - dialogsManager.data(), SLOT(cachesSizeDialog())); + dialogsManager.data(), SLOT(cachesSizeDialog())); addActionToQMenuAndActionHash(networkMenu, MenuOption::DiskCacheEditor, 0, - dialogsManager.data(), SLOT(toggleDiskCacheEditor())); + dialogsManager.data(), SLOT(toggleDiskCacheEditor())); addActionToQMenuAndActionHash(networkMenu, MenuOption::ShowDSConnectTable, 0, - dialogsManager.data(), SLOT(showDomainConnectionDialog())); + dialogsManager.data(), SLOT(showDomainConnectionDialog())); addActionToQMenuAndActionHash(networkMenu, MenuOption::BandwidthDetails, 0, - dialogsManager.data(), SLOT(bandwidthDetails())); + dialogsManager.data(), SLOT(bandwidthDetails())); #if (PR_BUILD || DEV_BUILD) addCheckableActionToQMenuAndActionHash(networkMenu, MenuOption::SendWrongProtocolVersion, 0, false, diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index bd7b50c9f8..9cf7d87fb5 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include #include @@ -25,6 +26,7 @@ #include #include +#include #include #include @@ -34,6 +36,8 @@ #include "NetworkLogging.h" #include "udt/Packet.h" +static Setting::Handle LIMITED_NODELIST_LOCAL_PORT("LimitedNodeList.LocalPort", 0); + const std::set SOLO_NODE_TYPES = { NodeType::AvatarMixer, NodeType::AudioMixer @@ -62,8 +66,8 @@ LimitedNodeList::LimitedNodeList(unsigned short socketListenPort, unsigned short } qRegisterMetaType("ConnectionStep"); - - _nodeSocket.bind(QHostAddress::AnyIPv4, socketListenPort); + auto port = (socketListenPort != 0) ? socketListenPort : LIMITED_NODELIST_LOCAL_PORT.get(); + _nodeSocket.bind(QHostAddress::AnyIPv4, port); qCDebug(networking) << "NodeList socket is listening on" << _nodeSocket.localPort(); if (dtlsListenPort > 0) { @@ -157,6 +161,18 @@ void LimitedNodeList::setPermissions(const NodePermissions& newPermissions) { } } +void LimitedNodeList::setSocketLocalPort(quint16 socketLocalPort) { + if (QThread::currentThread() != thread()) { + QMetaObject::invokeMethod(this, "setSocketLocalPort", Qt::QueuedConnection, + Q_ARG(quint16, socketLocalPort)); + return; + } + if (_nodeSocket.localPort() != socketLocalPort) { + _nodeSocket.rebind(socketLocalPort); + LIMITED_NODELIST_LOCAL_PORT.set(socketLocalPort); + } +} + QUdpSocket& LimitedNodeList::getDTLSSocket() { if (!_dtlsSocket) { // DTLS socket getter called but no DTLS socket exists, create it now diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index 89c8d41b49..5cafd7e613 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -113,6 +113,8 @@ public: bool getThisNodeCanKick() const { return _permissions.can(NodePermissions::Permission::canKick); } quint16 getSocketLocalPort() const { return _nodeSocket.localPort(); } + void setSocketLocalPort(quint16 socketLocalPort); + QUdpSocket& getDTLSSocket(); PacketReceiver& getPacketReceiver() { return *_packetReceiver; } diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 171e9e279c..6269499e28 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -31,18 +31,10 @@ #include "udt/PacketHeaders.h" #include "SharedUtil.h" -#include - const int KEEPALIVE_PING_INTERVAL_MS = 1000; -static Setting::Handle NODELIST_LOCAL_PORT("NodeList.LocalPort", 0); - -quint16 pickPortHelper(quint16 port) { - return (port != 0) ? port : NODELIST_LOCAL_PORT.get(); -} - NodeList::NodeList(char newOwnerType, unsigned short socketListenPort, unsigned short dtlsListenPort) : - LimitedNodeList(pickPortHelper(socketListenPort), dtlsListenPort), + LimitedNodeList(socketListenPort, dtlsListenPort), _ownerType(newOwnerType), _nodeTypesOfInterest(), _domainHandler(this), @@ -246,18 +238,6 @@ void NodeList::reset() { } } -void NodeList::setSocketLocalPort(quint16 socketLocalPort) { - if (QThread::currentThread() != thread()) { - QMetaObject::invokeMethod(this, "setSocketLocalPort", Qt::QueuedConnection, - Q_ARG(quint16, socketLocalPort)); - return; - } - if (_nodeSocket.localPort() != socketLocalPort) { - _nodeSocket.rebind(socketLocalPort); - NODELIST_LOCAL_PORT.set(socketLocalPort); - } -} - void NodeList::addNodeTypeToInterestSet(NodeType_t nodeTypeToAdd) { _nodeTypesOfInterest << nodeTypeToAdd; } diff --git a/libraries/networking/src/NodeList.h b/libraries/networking/src/NodeList.h index 936e67c018..f3cd5bed0d 100644 --- a/libraries/networking/src/NodeList.h +++ b/libraries/networking/src/NodeList.h @@ -92,8 +92,6 @@ public slots: void processICEPingPacket(QSharedPointer message); - void setSocketLocalPort(quint16 socketLocalPort); - #if (PR_BUILD || DEV_BUILD) void toggleSendNewerDSConnectVersion(bool shouldSendNewerVersion) { _shouldSendNewerVersion = shouldSendNewerVersion; } #endif From 12eb65c0c4b06b2debcb442aeb1f1f3e1d06d514 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 6 Sep 2016 10:15:27 -0700 Subject: [PATCH 7/9] Make setSocketLocalPort invokable --- libraries/networking/src/LimitedNodeList.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index 5cafd7e613..11df4a8f04 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -113,7 +113,7 @@ public: bool getThisNodeCanKick() const { return _permissions.can(NodePermissions::Permission::canKick); } quint16 getSocketLocalPort() const { return _nodeSocket.localPort(); } - void setSocketLocalPort(quint16 socketLocalPort); + Q_INVOKABLE void setSocketLocalPort(quint16 socketLocalPort); QUdpSocket& getDTLSSocket(); From eb007b24cdb7b6db2f42fd92ecb4657b1bd8f48c Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 6 Sep 2016 11:55:19 -0700 Subject: [PATCH 8/9] Use invalid port to signal no value passed --- domain-server/src/DomainServer.cpp | 4 ++-- interface/src/Application.cpp | 6 ++---- libraries/networking/src/LimitedNodeList.cpp | 6 +++--- libraries/networking/src/LimitedNodeList.h | 8 +++++--- libraries/networking/src/NodeList.cpp | 2 +- libraries/networking/src/NodeList.h | 8 ++++---- tests/render-perf/src/main.cpp | 2 +- tests/render-texture-load/src/main.cpp | 2 +- 8 files changed, 19 insertions(+), 19 deletions(-) diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index b61fef8525..0c8296bb00 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -368,11 +368,11 @@ void DomainServer::setupNodeListAndAssignments() { const QString CUSTOM_LOCAL_PORT_OPTION = "metaverse.local_port"; QVariant localPortValue = _settingsManager.valueOrDefaultValueForKeyPath(CUSTOM_LOCAL_PORT_OPTION); - unsigned short domainServerPort = (unsigned short) localPortValue.toUInt(); + int domainServerPort = localPortValue.toInt(); QVariantMap& settingsMap = _settingsManager.getSettingsMap(); - unsigned short domainServerDTLSPort = 0; + int domainServerDTLSPort = INVALID_PORT; if (_isUsingDTLS) { domainServerDTLSPort = DEFAULT_DOMAIN_SERVER_DTLS_PORT; diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 45feed1088..92309fd7f9 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -401,12 +401,10 @@ static const QString STATE_GROUNDED = "Grounded"; static const QString STATE_NAV_FOCUSED = "NavigationFocused"; bool setupEssentials(int& argc, char** argv) { - unsigned int listenPort = 0; // bind to an ephemeral port by default const char** constArgv = const_cast(argv); const char* portStr = getCmdOption(argc, constArgv, "--listenPort"); - if (portStr) { - listenPort = atoi(portStr); - } + const int listenPort = portStr ? atoi(portStr) : INVALID_PORT; + // Set build version QCoreApplication::setApplicationVersion(BuildInfo::VERSION); diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 9cf7d87fb5..7fad66d608 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -43,7 +43,7 @@ const std::set SOLO_NODE_TYPES = { NodeType::AudioMixer }; -LimitedNodeList::LimitedNodeList(unsigned short socketListenPort, unsigned short dtlsListenPort) : +LimitedNodeList::LimitedNodeList(int socketListenPort, int dtlsListenPort) : _sessionUUID(), _nodeHash(), _nodeMutex(QReadWriteLock::Recursive), @@ -66,11 +66,11 @@ LimitedNodeList::LimitedNodeList(unsigned short socketListenPort, unsigned short } qRegisterMetaType("ConnectionStep"); - auto port = (socketListenPort != 0) ? socketListenPort : LIMITED_NODELIST_LOCAL_PORT.get(); + auto port = (socketListenPort != INVALID_PORT) ? socketListenPort : LIMITED_NODELIST_LOCAL_PORT.get(); _nodeSocket.bind(QHostAddress::AnyIPv4, port); qCDebug(networking) << "NodeList socket is listening on" << _nodeSocket.localPort(); - if (dtlsListenPort > 0) { + if (dtlsListenPort != INVALID_PORT) { // only create the DTLS socket during constructor if a custom port is passed _dtlsSocket = new QUdpSocket(this); diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index 11df4a8f04..cd343a5232 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -45,6 +45,8 @@ #include "udt/Socket.h" #include "UUIDHasher.h" +const int INVALID_PORT = -1; + const quint64 NODE_SILENCE_THRESHOLD_MSECS = 5 * 1000; extern const std::set SOLO_NODE_TYPES; @@ -270,9 +272,9 @@ protected slots: void errorTestingLocalSocket(); protected: - LimitedNodeList(unsigned short socketListenPort = 0, unsigned short dtlsListenPort = 0); - LimitedNodeList(LimitedNodeList const&); // Don't implement, needed to avoid copies of singleton - void operator=(LimitedNodeList const&); // Don't implement, needed to avoid copies of singleton + LimitedNodeList(int socketListenPort = INVALID_PORT, int dtlsListenPort = INVALID_PORT); + LimitedNodeList(LimitedNodeList const&) = delete; // Don't implement, needed to avoid copies of singleton + void operator=(LimitedNodeList const&) = delete; // Don't implement, needed to avoid copies of singleton qint64 sendPacket(std::unique_ptr packet, const Node& destinationNode, const HifiSockAddr& overridenSockAddr); diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 6269499e28..593a79b311 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -33,7 +33,7 @@ const int KEEPALIVE_PING_INTERVAL_MS = 1000; -NodeList::NodeList(char newOwnerType, unsigned short socketListenPort, unsigned short dtlsListenPort) : +NodeList::NodeList(char newOwnerType, int socketListenPort, int dtlsListenPort) : LimitedNodeList(socketListenPort, dtlsListenPort), _ownerType(newOwnerType), _nodeTypesOfInterest(), diff --git a/libraries/networking/src/NodeList.h b/libraries/networking/src/NodeList.h index f3cd5bed0d..f08c0dbe45 100644 --- a/libraries/networking/src/NodeList.h +++ b/libraries/networking/src/NodeList.h @@ -116,10 +116,10 @@ private slots: void maybeSendIgnoreSetToNode(SharedNodePointer node); private: - NodeList() : LimitedNodeList(0, 0) { assert(false); } // Not implemented, needed for DependencyManager templates compile - NodeList(char ownerType, unsigned short socketListenPort = 0, unsigned short dtlsListenPort = 0); - NodeList(NodeList const&); // Don't implement, needed to avoid copies of singleton - void operator=(NodeList const&); // Don't implement, needed to avoid copies of singleton + NodeList() : LimitedNodeList(INVALID_PORT, INVALID_PORT) { assert(false); } // Not implemented, needed for DependencyManager templates compile + NodeList(char ownerType, int socketListenPort = INVALID_PORT, int dtlsListenPort = INVALID_PORT); + NodeList(NodeList const&) = delete; // Don't implement, needed to avoid copies of singleton + void operator=(NodeList const&) = delete; // Don't implement, needed to avoid copies of singleton void processDomainServerAuthRequest(const QByteArray& packet); void requestAuthForDomainServer(); diff --git a/tests/render-perf/src/main.cpp b/tests/render-perf/src/main.cpp index c6cca74c69..7fa36136d2 100644 --- a/tests/render-perf/src/main.cpp +++ b/tests/render-perf/src/main.cpp @@ -503,7 +503,7 @@ public: DependencyManager::registerInheritance(); DependencyManager::registerInheritance(); DependencyManager::set(); - DependencyManager::set(NodeType::Agent, 0); + DependencyManager::set(NodeType::Agent); DependencyManager::set(); DependencyManager::set(); DependencyManager::set(); diff --git a/tests/render-texture-load/src/main.cpp b/tests/render-texture-load/src/main.cpp index fd6885c381..04bce72757 100644 --- a/tests/render-texture-load/src/main.cpp +++ b/tests/render-texture-load/src/main.cpp @@ -295,7 +295,7 @@ public: DependencyManager::registerInheritance(); //DependencyManager::registerInheritance(); DependencyManager::set(); - DependencyManager::set(NodeType::Agent, 0); + DependencyManager::set(NodeType::Agent); DependencyManager::set(); DependencyManager::set(); DependencyManager::set(); From 006780fe8e89103c15400bbe33153cbadfe47e5d Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 8 Sep 2016 14:29:43 -0700 Subject: [PATCH 9/9] Indentation --- libraries/shared/src/Preferences.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/shared/src/Preferences.h b/libraries/shared/src/Preferences.h index 5a4b3f2096..f1915a9d6a 100644 --- a/libraries/shared/src/Preferences.h +++ b/libraries/shared/src/Preferences.h @@ -199,7 +199,7 @@ class IntPreference : public TypedPreference { public: IntPreference(const QString& category, const QString& name, Getter getter, Setter setter) - : TypedPreference(category, name, getter, setter) { } + : TypedPreference(category, name, getter, setter) { } float getMin() const { return _min; } void setMin(float min) { _min = min; };