From 857d5eb005989a68178804fff17f7270b886c331 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Mon, 11 Nov 2019 01:18:08 +0100 Subject: [PATCH] [FSD] Overload prevention * only allow aircraft to be added based on new positions, NOT on received ICAO data anymore * hardcoded max.range Discussion: https://discordapp.com/channels/539048679160676382/539925070550794240/643163521999306832 --- src/blackcore/airspacemonitor.cpp | 22 ++++++++++-- src/blackcore/fsd/fsdclient.cpp | 32 ++++++------------ src/blackcore/fsd/fsdclient.h | 4 +-- src/blackcore/fsd/serializer.cpp | 56 +++++++++++++++---------------- 4 files changed, 59 insertions(+), 55 deletions(-) diff --git a/src/blackcore/airspacemonitor.cpp b/src/blackcore/airspacemonitor.cpp index 08c770240..1054c5a44 100644 --- a/src/blackcore/airspacemonitor.cpp +++ b/src/blackcore/airspacemonitor.cpp @@ -822,6 +822,8 @@ namespace BlackCore if (!this->isConnectedAndNotShuttingDown()) { return; } if (CBuildConfig::isLocalDeveloperDebugBuild()) { BLACK_VERIFY_X(callsign.isValid(), Q_FUNC_INFO, "invalid callsign"); } if (!callsign.isValid()) { return; } + if (!this->isAircraftInRange(callsign)) { return; } // FSD overload issue, do not do anything if unknown + const ReverseLookupLogging reverseLookupEnabled = this->isReverseLookupMessagesEnabled(); CStatusMessageList reverseLookupMessages; CStatusMessageList *pReverseLookupMessages = reverseLookupEnabled.testFlag(RevLogEnabled) ? &reverseLookupMessages : nullptr; @@ -1104,15 +1106,20 @@ namespace BlackCore } else { + /* FSD overload issue, do NOT to add new aircraft other than from positions const CAircraftModel model = this->reverseLookupModelWithFlightplanData(callsign, aircraftIcao, airlineIcao, livery, modelString, modelType, log); const CSimulatedAircraft initAircraft(model); this->addNewAircraftInRange(initAircraft); + */ } return aircraft; } void CAirspaceMonitor::onAircraftUpdateReceived(const CAircraftSituation &situation, const CTransponder &transponder) { + static constexpr int MaxDistanceNM = 125; + static constexpr int MaxDistanceNMHysteresis = qRound(1.1 * MaxDistanceNM); + Q_ASSERT_X(CThreadUtils::isCurrentThreadObjectThread(this), Q_FUNC_INFO, "Called in different thread"); if (!this->isConnectedAndNotShuttingDown()) { return; } @@ -1120,6 +1127,16 @@ namespace BlackCore Q_ASSERT_X(!callsign.isEmpty(), Q_FUNC_INFO, "Empty callsign"); if (this->isCopilotAircraft(callsign)) { return; } + const bool existsInRange = this->isAircraftInRange(callsign); + + // hardcoded range (FSD overload issue) + const int distanceNM = this->getOwnAircraft().calculateGreatCircleDistance(situation).valueInteger(CLengthUnit::NM()); + if (existsInRange && distanceNM > MaxDistanceNMHysteresis) + { + this->removeClient(callsign); + return; + } + if (distanceNM > MaxDistanceNM) { return; } // update client info this->autoAdjustCientGndCapability(situation); @@ -1127,11 +1144,10 @@ namespace BlackCore // store situation history this->storeAircraftSituation(situation); // updates situation - const bool existsInRange = this->isAircraftInRange(callsign); - const bool hasFsInnPacket = m_tempFsInnPackets.contains(callsign); - if (!existsInRange) { + const bool hasFsInnPacket = m_tempFsInnPackets.contains(callsign); + CSimulatedAircraft aircraft; aircraft.setCallsign(callsign); aircraft.setSituation(situation); diff --git a/src/blackcore/fsd/fsdclient.cpp b/src/blackcore/fsd/fsdclient.cpp index 8b362d862..036f5b05c 100644 --- a/src/blackcore/fsd/fsdclient.cpp +++ b/src/blackcore/fsd/fsdclient.cpp @@ -643,14 +643,14 @@ namespace BlackCore { AuthResponse pduAuthResponse(m_ownCallsign.asString(), "SERVER", response); sendMessage(pduAuthResponse); - this->increaseStatisticsValue(QStringLiteral("sendAuthResponse")); + increaseStatisticsValue(QStringLiteral("sendAuthResponse")); } void CFSDClient::sendPong(const QString &receiver, const QString ×tamp) { const Pong pong(m_ownCallsign.asString(), receiver, timestamp); sendMessage(pong); - this->increaseStatisticsValue(QStringLiteral("sendPong")); + increaseStatisticsValue(QStringLiteral("sendPong")); } void CFSDClient::sendClientResponse(ClientQueryType queryType, const QString &receiver) @@ -664,22 +664,14 @@ namespace BlackCore else if (queryType == ClientQueryType::Capabilities) { responseData.clear(); - if (m_capabilities & Capabilities::AtcInfo) - responseData.push_back(toQString(Capabilities::AtcInfo) % "=1"); - if (m_capabilities & Capabilities::SecondaryPos) - responseData.push_back(toQString(Capabilities::SecondaryPos) % "=1"); - if (m_capabilities & Capabilities::AircraftInfo) - responseData.push_back(toQString(Capabilities::AircraftInfo) % "=1"); - if (m_capabilities & Capabilities::OngoingCoord) - responseData.push_back(toQString(Capabilities::OngoingCoord) % "=1"); - if (m_capabilities & Capabilities::InterminPos) - responseData.push_back(toQString(Capabilities::InterminPos) % "=1"); - if (m_capabilities & Capabilities::FastPos) - responseData.push_back(toQString(Capabilities::FastPos) % "=1"); - if (m_capabilities & Capabilities::Stealth) - responseData.push_back(toQString(Capabilities::Stealth) % "=1"); - if (m_capabilities & Capabilities::AircraftConfig) - responseData.push_back(toQString(Capabilities::AircraftConfig) % "=1"); + if (m_capabilities & Capabilities::AtcInfo) responseData.push_back(toQString(Capabilities::AtcInfo) % "=1"); + if (m_capabilities & Capabilities::SecondaryPos) responseData.push_back(toQString(Capabilities::SecondaryPos) % "=1"); + if (m_capabilities & Capabilities::AircraftInfo) responseData.push_back(toQString(Capabilities::AircraftInfo) % "=1"); + if (m_capabilities & Capabilities::OngoingCoord) responseData.push_back(toQString(Capabilities::OngoingCoord) % "=1"); + if (m_capabilities & Capabilities::InterminPos) responseData.push_back(toQString(Capabilities::InterminPos) % "=1"); + if (m_capabilities & Capabilities::FastPos) responseData.push_back(toQString(Capabilities::FastPos) % "=1"); + if (m_capabilities & Capabilities::Stealth) responseData.push_back(toQString(Capabilities::Stealth) % "=1"); + if (m_capabilities & Capabilities::AircraftConfig) responseData.push_back(toQString(Capabilities::AircraftConfig) % "=1"); const ClientResponse clientResponse(m_ownCallsign.asString(), receiver, ClientQueryType::Capabilities, responseData); sendMessage(clientResponse); } @@ -713,12 +705,10 @@ namespace BlackCore else if (queryType == ClientQueryType::ATIS) { this->handleIllegalFsdState(QStringLiteral("Dont send '%1' as pilot client!").arg(toQString(ClientQueryType::ATIS))); - return; } else if (queryType == ClientQueryType::PublicIP) { this->handleIllegalFsdState(QStringLiteral("Dont send '%1' as pilot client!").arg(toQString(ClientQueryType::PublicIP))); - return; } else if (queryType == ClientQueryType::INF) { @@ -743,12 +733,10 @@ namespace BlackCore else if (queryType == ClientQueryType::FP) { this->handleIllegalFsdState(QStringLiteral("Dont send '%1' as pilot client!").arg(toQString(ClientQueryType::FP))); - return; } else if (queryType == ClientQueryType::AircraftConfig) { this->handleIllegalFsdState(QStringLiteral("Dont send '%1' as pilot client!").arg(toQString(ClientQueryType::AircraftConfig))); - return; } this->increaseStatisticsValue(QStringLiteral("sendClientResponse"), toQString(queryType)); } diff --git a/src/blackcore/fsd/fsdclient.h b/src/blackcore/fsd/fsdclient.h index b1a045d04..0426dae0e 100644 --- a/src/blackcore/fsd/fsdclient.h +++ b/src/blackcore/fsd/fsdclient.h @@ -246,8 +246,8 @@ namespace BlackCore if (!message.isValid()) return; const QString payload = message.toTokens().join(':'); - const QString line = message.pdu() + payload; - const QString buffer = line + "\r\n"; + const QString line = message.pdu() + payload; + const QString buffer = line + "\r\n"; const QByteArray bufferEncoded = m_fsdTextCodec->fromUnicode(buffer); emitRawFsdMessage(buffer.trimmed(), true); if (m_printToConsole) { qDebug() << "FSD Sent=>" << bufferEncoded; } diff --git a/src/blackcore/fsd/serializer.cpp b/src/blackcore/fsd/serializer.cpp index aea16360d..d85c8dda6 100644 --- a/src/blackcore/fsd/serializer.cpp +++ b/src/blackcore/fsd/serializer.cpp @@ -43,14 +43,14 @@ namespace BlackCore AtcRating fromQString(const QString &str) { if (str == "1") return AtcRating::Observer; - else if (str == "2") return AtcRating::Student; - else if (str == "3") return AtcRating::Student2; - else if (str == "4") return AtcRating::Student3; - else if (str == "5") return AtcRating::Controller1; - else if (str == "6") return AtcRating::Controller2; - else if (str == "7") return AtcRating::Controller3; - else if (str == "8") return AtcRating::Instructor1; - else if (str == "9") return AtcRating::Instructor2; + else if (str == "2") return AtcRating::Student; + else if (str == "3") return AtcRating::Student2; + else if (str == "4") return AtcRating::Student3; + else if (str == "5") return AtcRating::Controller1; + else if (str == "6") return AtcRating::Controller2; + else if (str == "7") return AtcRating::Controller3; + else if (str == "8") return AtcRating::Instructor1; + else if (str == "9") return AtcRating::Instructor2; else if (str == "10") return AtcRating::Instructor3; else if (str == "11") return AtcRating::Supervisor; else if (str == "12") return AtcRating::Administrator; @@ -176,17 +176,17 @@ namespace BlackCore { switch (value) { - case ClientQueryType::IsValidATC: return "ATC"; - case ClientQueryType::Capabilities: return "CAPS"; - case ClientQueryType::Com1Freq: return "C?"; - case ClientQueryType::RealName: return "RN"; - case ClientQueryType::Server: return "SV"; - case ClientQueryType::ATIS: return "ATIS"; - case ClientQueryType::PublicIP: return "IP"; - case ClientQueryType::INF: return "INF"; - case ClientQueryType::FP: return "FP"; + case ClientQueryType::IsValidATC: return "ATC"; + case ClientQueryType::Capabilities: return "CAPS"; + case ClientQueryType::Com1Freq: return "C?"; + case ClientQueryType::RealName: return "RN"; + case ClientQueryType::Server: return "SV"; + case ClientQueryType::ATIS: return "ATIS"; + case ClientQueryType::PublicIP: return "IP"; + case ClientQueryType::INF: return "INF"; + case ClientQueryType::FP: return "FP"; case ClientQueryType::AircraftConfig: return "ACC"; - case ClientQueryType::Unknown: qFatal("Don't serialize ClientQueryType::Unknown!"); + case ClientQueryType::Unknown: return "Unknown query type"; } Q_UNREACHABLE(); return {}; @@ -204,7 +204,7 @@ namespace BlackCore else if (str == "IP") return ClientQueryType::PublicIP; else if (str == "INF") return ClientQueryType::INF; else if (str == "FP") return ClientQueryType::FP; - else if (str == "ACC") return ClientQueryType::AircraftConfig; + else if (str == "ACC") return ClientQueryType::AircraftConfig; else { // networkLog(vatSeverityDebug, "ClientQueryType fromString(str)", "Unknown client query type"); @@ -229,11 +229,11 @@ namespace BlackCore template<> FlightType fromQString(const QString &str) { - if (str == QLatin1String("I")) return FlightType::IFR; - else if (str == QLatin1String("V")) return FlightType::VFR; - else if (str == QLatin1String("S")) return FlightType::SVFR; - else if (str == QLatin1String("D")) return FlightType::DVFR; - else return FlightType::IFR; + if (str == QLatin1String("I")) return FlightType::IFR; + else if (str == QLatin1String("V")) return FlightType::VFR; + else if (str == QLatin1String("S")) return FlightType::SVFR; + else if (str == QLatin1String("D")) return FlightType::DVFR; + else return FlightType::IFR; } template<> @@ -262,10 +262,10 @@ namespace BlackCore template<> CTransponder::TransponderMode fromQString(const QString &str) { - if (str == "S") return CTransponder::StateStandby; - else if (str == "N") return CTransponder::ModeC; - else if (str == "Y") return CTransponder::StateIdent; - else return CTransponder::StateStandby; + if (str == "S") return CTransponder::StateStandby; + else if (str == "N") return CTransponder::ModeC; + else if (str == "Y") return CTransponder::StateIdent; + else return CTransponder::StateStandby; } template<>