From 2ea8eded44775b50dc041fe7fe6863fd30dfcc2d Mon Sep 17 00:00:00 2001 From: Thorvald Natvig Date: Tue, 3 Nov 2009 13:05:14 +0100 Subject: [PATCH] Clientside QoS option --- src/mumble/NetworkConfig.cpp | 3 +++ src/mumble/NetworkConfig.ui | 13 +++++++++++++ src/mumble/ServerHandler.cpp | 31 +++++++++++++++++-------------- src/mumble/Settings.cpp | 3 +++ src/mumble/Settings.h | 4 +++- 5 files changed, 39 insertions(+), 15 deletions(-) diff --git a/src/mumble/NetworkConfig.cpp b/src/mumble/NetworkConfig.cpp index 27eca696d..1e473a91c 100644 --- a/src/mumble/NetworkConfig.cpp +++ b/src/mumble/NetworkConfig.cpp @@ -59,6 +59,7 @@ QIcon NetworkConfig::icon() const { void NetworkConfig::load(const Settings &r) { loadCheckBox(qcbTcpMode, s.bTCPCompat); + loadCheckBox(qcbQoS, s.bQoS); loadCheckBox(qcbAutoReconnect, s.bReconnect); loadCheckBox(qcbSuppressIdentity, s.bSuppressIdentity); loadComboBox(qcbType, s.ptProxyType); @@ -84,6 +85,7 @@ void NetworkConfig::load(const Settings &r) { void NetworkConfig::save() const { s.bTCPCompat = qcbTcpMode->isChecked(); + s.bQoS = qcbQoS->isChecked(); s.bReconnect = qcbAutoReconnect->isChecked(); s.bSuppressIdentity = qcbSuppressIdentity->isChecked(); @@ -152,6 +154,7 @@ void NetworkConfig::accept() const { bool NetworkConfig::expert(bool b) { qcbTcpMode->setVisible(b); + qcbQoS->setVisible(b); qgbProxy->setVisible(b); qcbUsage->setVisible(b); diff --git a/src/mumble/NetworkConfig.ui b/src/mumble/NetworkConfig.ui index c4249d9b1..2c40ea135 100644 --- a/src/mumble/NetworkConfig.ui +++ b/src/mumble/NetworkConfig.ui @@ -39,6 +39,19 @@ + + + + Enable QoS to prioritize packets + + + This will enable QoS, which will attempt to prioritize voice packets over other traffic. + + + Use Quality of Service + + + diff --git a/src/mumble/ServerHandler.cpp b/src/mumble/ServerHandler.cpp index 59ba312e9..5244da6aa 100644 --- a/src/mumble/ServerHandler.cpp +++ b/src/mumble/ServerHandler.cpp @@ -403,7 +403,8 @@ void ServerHandler::serverConnectionClosed(const QString &reason) { } void ServerHandler::serverConnectionConnected() { - cConnection->setToS(); + if (g.s.bQoS) + cConnection->setToS(); qscCert = cConnection->peerCertificateChain(); qscCipher = cConnection->sessionCipher(); @@ -457,24 +458,26 @@ void ServerHandler::serverConnectionConnected() { connect(qusUdp, SIGNAL(readyRead()), this, SLOT(udpReady())); + if (g.s.bQoS) { #if defined(Q_OS_UNIX) - int val = 0xe0; - if (setsockopt(qusUdp->socketDescriptor(), IPPROTO_IP, IP_TOS, &val, sizeof(val))) - qWarning("ServerHandler: Failed to set TOS for UDP Socket"); + int val = 0xe0; + if (setsockopt(qusUdp->socketDescriptor(), IPPROTO_IP, IP_TOS, &val, sizeof(val))) + qWarning("ServerHandler: Failed to set TOS for UDP Socket"); #elif defined(Q_OS_WIN) - if (hQoS != NULL) { - struct sockaddr_in addr; - memset(&addr, 0, sizeof(addr)); - addr.sin_family = AF_INET; - addr.sin_port = htons(usPort); - addr.sin_addr.s_addr = htonl(qhaRemote.toIPv4Address()); + if (hQoS != NULL) { + struct sockaddr_in addr; + memset(&addr, 0, sizeof(addr)); + addr.sin_family = AF_INET; + addr.sin_port = htons(usPort); + addr.sin_addr.s_addr = htonl(qhaRemote.toIPv4Address()); - dwFlowUDP = 0; - if (! QOSAddSocketToFlow(hQoS, qusUdp->socketDescriptor(), reinterpret_cast(&addr), QOSTrafficTypeVoice, QOS_NON_ADAPTIVE_FLOW, &dwFlowUDP)) - qWarning("ServerHandler: Failed to add UDP to QOS"); - } + dwFlowUDP = 0; + if (! QOSAddSocketToFlow(hQoS, qusUdp->socketDescriptor(), reinterpret_cast(&addr), QOSTrafficTypeVoice, QOS_NON_ADAPTIVE_FLOW, &dwFlowUDP)) + qWarning("ServerHandler: Failed to add UDP to QOS"); + } #endif + } } emit connected(); diff --git a/src/mumble/Settings.cpp b/src/mumble/Settings.cpp index fdcc1c7df..ffdf3259b 100644 --- a/src/mumble/Settings.cpp +++ b/src/mumble/Settings.cpp @@ -218,6 +218,7 @@ Settings::Settings() { // Network settings bTCPCompat = false; + bQoS = true; bReconnect = true; ptProxyType = NoProxy; usProxyPort = 0; @@ -367,6 +368,7 @@ void Settings::load() { // Network settings SAVELOAD(bTCPCompat, "net/tcponly"); + SAVELOAD(bQoS, "net/qos"); SAVELOAD(bReconnect, "net/reconnect"); SAVELOAD(bSuppressIdentity, "net/suppress"); LOADENUM(ptProxyType, "net/proxytype"); @@ -541,6 +543,7 @@ void Settings::save() { // Network settings SAVELOAD(bTCPCompat, "net/tcponly"); + SAVELOAD(bQoS, "net/qos"); SAVELOAD(bReconnect, "net/reconnect"); SAVELOAD(ptProxyType, "net/proxytype"); SAVELOAD(qsProxyHost, "net/proxyhost"); diff --git a/src/mumble/Settings.h b/src/mumble/Settings.h index 236296c99..5546067fd 100644 --- a/src/mumble/Settings.h +++ b/src/mumble/Settings.h @@ -182,7 +182,9 @@ struct Settings { // Network settings enum ProxyType { NoProxy, HttpProxy, Socks5Proxy }; - bool bTCPCompat, bReconnect; + bool bTCPCompat; + bool bReconnect; + bool bQoS; ProxyType ptProxyType; QString qsProxyHost, qsProxyUsername, qsProxyPassword; unsigned short usProxyPort;