From daef16c145208e4fb79beea2dec93e5f1995cc41 Mon Sep 17 00:00:00 2001 From: Antonio Matraia <63372602+iu5jae@users.noreply.github.com> Date: Fri, 30 Jun 2023 22:09:20 +0200 Subject: [PATCH 1/5] Update YSFGateway.cpp fixed the "segmentation fault" error in case a non-existent room is requested --- YSFGateway/YSFGateway.cpp | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/YSFGateway/YSFGateway.cpp b/YSFGateway/YSFGateway.cpp index bc6e948..2c8cffe 100644 --- a/YSFGateway/YSFGateway.cpp +++ b/YSFGateway/YSFGateway.cpp @@ -273,7 +273,8 @@ int CYSFGateway::run() for (;;) { unsigned char buffer[200U]; memset(buffer, 0U, 200U); - + bool wx_tmp; + while (rptNetwork.read(buffer) > 0U) { CYSFFICH fich; bool valid = fich.decode(buffer + 35U); @@ -282,14 +283,22 @@ int CYSFGateway::run() unsigned char dt = fich.getDT(); CYSFReflector* reflector = m_wiresX->getReflector(); - if (m_ysfNetwork != NULL && m_linkType == LINK_YSF && wiresXCommandPassthrough && reflector->m_wiresX) { + if (reflector != NULL) + wx_tmp = reflector->m_wiresX; + else + wx_tmp = 0; + if (m_ysfNetwork != NULL && m_linkType == LINK_YSF && wiresXCommandPassthrough && wx_tmp) { processDTMF(buffer, dt); processWiresX(buffer, fich, true, wiresXCommandPassthrough); } else { processDTMF(buffer, dt); processWiresX(buffer, fich, false, wiresXCommandPassthrough); reflector = m_wiresX->getReflector(); //reflector may have changed - if (m_ysfNetwork != NULL && m_linkType == LINK_YSF && reflector->m_wiresX) + if (reflector != NULL) + wx_tmp = reflector->m_wiresX; + else + wx_tmp = 0; + if (m_ysfNetwork != NULL && m_linkType == LINK_YSF && wx_tmp) m_exclude = (dt == YSF_DT_DATA_FR_MODE); } From 2e303e55e6442b3f9a2fd25e15934e7c9c84d5ad Mon Sep 17 00:00:00 2001 From: Antonio Matraia <63372602+iu5jae@users.noreply.github.com> Date: Sat, 8 Jul 2023 20:57:03 +0200 Subject: [PATCH 2/5] updated YSFGateway Remote control management compatible with pistar uk. If the requested room does not exist, the gw remains on the previously set one --- YSFGateway/WiresX.cpp | 6 +++++- YSFGateway/YSFGateway.cpp | 14 ++++++++------ 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/YSFGateway/WiresX.cpp b/YSFGateway/WiresX.cpp index 179f0aa..909d584 100644 --- a/YSFGateway/WiresX.cpp +++ b/YSFGateway/WiresX.cpp @@ -373,7 +373,11 @@ WX_STATUS CWiresX::processConnect(const unsigned char* source, const unsigned ch std::string id = std::string((char*)data, 5U); - m_reflector = m_reflectors.findById(id); + CYSFReflector* reflector_tmp; + reflector_tmp = m_reflectors.findById(id); + if (reflector_tmp != NULL) + m_reflector = reflector_tmp; + if (m_reflector == NULL) return WXS_NONE; diff --git a/YSFGateway/YSFGateway.cpp b/YSFGateway/YSFGateway.cpp index 2c8cffe..638d3f1 100644 --- a/YSFGateway/YSFGateway.cpp +++ b/YSFGateway/YSFGateway.cpp @@ -892,10 +892,11 @@ void CYSFGateway::processRemoteCommands() int res = m_remoteSocket->read(buffer, 200U, addr, addrLen); if (res > 0) { buffer[res] = '\0'; - if ((::memcmp(buffer + 0U, "LinkYSF", 7U) == 0) && (strlen((char*)buffer + 0U) > 8)) { - std::string id = std::string((char*)(buffer + 8U)); + if ((::memcmp(buffer + 0U, "LinkYSF", 7U) == 0) && (strlen((char*)buffer + 0U) > 8) && (m_ysfNetwork != NULL)) { + std::string id = std::string((char*)(buffer + 7U)); // Left trim - id.erase(id.begin(), std::find_if(id.begin(), id.end(), std::not1(std::ptr_fun(std::isspace)))); + // id.erase(id.begin(), std::find_if(id.begin(), id.end(), std::not1(std::ptr_fun(std::isspace)))); + id.erase(std::remove_if(id.begin(), id.end(), [](char c) { return !std::isalnum(c); }), id.end()); CYSFReflector* reflector = m_reflectors->findById(id); if (reflector == NULL) reflector = m_reflectors->findByName(id); @@ -923,10 +924,11 @@ void CYSFGateway::processRemoteCommands() LogWarning("Invalid YSF reflector id/name - \"%s\"", id.c_str()); return; } - } else if ((::memcmp(buffer + 0U, "LinkFCS", 7U) == 0) && (strlen((char*)buffer + 0U) > 8)) { - std::string raw = std::string((char*)(buffer + 8U)); + } else if ((::memcmp(buffer + 0U, "LinkFCS", 7U) == 0) && (strlen((char*)buffer + 0U) > 8) && (m_fcsNetwork != NULL)) { + std::string raw = std::string((char*)(buffer + 7U)); // Left trim - raw.erase(raw.begin(), std::find_if(raw.begin(), raw.end(), std::not1(std::ptr_fun(std::isspace)))); + // raw.erase(raw.begin(), std::find_if(raw.begin(), raw.end(), std::not1(std::ptr_fun(std::isspace)))); + raw.erase(std::remove_if(raw.begin(), raw.end(), [](char c) { return !std::isalnum(c); }), raw.end()); std::string id = "FCS00"; std::string idShort = "FCS"; if (raw.length() == 3U) { From 351e6c2d59c9751f06464230b9701a025384167b Mon Sep 17 00:00:00 2001 From: Antonio Matraia <63372602+iu5jae@users.noreply.github.com> Date: Fri, 21 Jul 2023 00:41:19 +0200 Subject: [PATCH 3/5] added YSFDirect Added management of the YSFBMGateway gateway using the id 00006 --- YSFGateway/Conf.cpp | 16 ++++++++++++++++ YSFGateway/Conf.h | 4 ++++ YSFGateway/WiresX.cpp | 5 +++++ YSFGateway/WiresX.h | 1 + YSFGateway/YSFGateway.cpp | 9 +++++++-- YSFGateway/YSFGateway.ini | 2 ++ YSFGateway/YSFReflectors.cpp | 33 +++++++++++++++++++++++++++++++++ YSFGateway/YSFReflectors.h | 3 +++ 8 files changed, 71 insertions(+), 2 deletions(-) diff --git a/YSFGateway/Conf.cpp b/YSFGateway/Conf.cpp index c9e39a9..a0e445b 100644 --- a/YSFGateway/Conf.cpp +++ b/YSFGateway/Conf.cpp @@ -88,6 +88,8 @@ m_ysfNetworkYSF2NXDNAddress("127.0.0.1"), m_ysfNetworkYSF2NXDNPort(0U), m_ysfNetworkYSF2P25Address("127.0.0.1"), m_ysfNetworkYSF2P25Port(0U), +m_ysfNetworkYSFDirectAddress("127.0.0.1"), +m_ysfNetworkYSFDirectPort(0U), m_fcsNetworkEnabled(false), m_fcsNetworkFile(), m_fcsNetworkPort(0U), @@ -274,6 +276,10 @@ bool CConf::read() m_ysfNetworkYSF2P25Address = value; else if (::strcmp(key, "YSF2P25Port") == 0) m_ysfNetworkYSF2P25Port = (unsigned short)::atoi(value); + else if (::strcmp(key, "YSFDirectAddress") == 0) + m_ysfNetworkYSFDirectAddress = value; + else if (::strcmp(key, "YSFDirectPort") == 0) + m_ysfNetworkYSFDirectPort = (unsigned short)::atoi(value); } else if (section == SECTION_FCS_NETWORK) { if (::strcmp(key, "Enable") == 0) m_fcsNetworkEnabled = ::atoi(value) == 1; @@ -536,6 +542,16 @@ unsigned short CConf::getYSFNetworkYSF2P25Port() const return m_ysfNetworkYSF2P25Port; } +std::string CConf::getYSFNetworkYSFDirectAddress() const +{ + return m_ysfNetworkYSFDirectAddress; +} + +unsigned short CConf::getYSFNetworkYSFDirectPort() const +{ + return m_ysfNetworkYSFDirectPort; +} + bool CConf::getFCSNetworkEnabled() const { diff --git a/YSFGateway/Conf.h b/YSFGateway/Conf.h index 430613d..aecdbbd 100644 --- a/YSFGateway/Conf.h +++ b/YSFGateway/Conf.h @@ -87,6 +87,8 @@ public: unsigned short getYSFNetworkYSF2NXDNPort() const; std::string getYSFNetworkYSF2P25Address() const; unsigned short getYSFNetworkYSF2P25Port() const; + std::string getYSFNetworkYSFDirectAddress() const; + unsigned short getYSFNetworkYSFDirectPort() const; // The FCS Network section bool getFCSNetworkEnabled() const; @@ -156,6 +158,8 @@ private: unsigned short m_ysfNetworkYSF2NXDNPort; std::string m_ysfNetworkYSF2P25Address; unsigned short m_ysfNetworkYSF2P25Port; + std::string m_ysfNetworkYSFDirectAddress; + unsigned short m_ysfNetworkYSFDirectPort; bool m_fcsNetworkEnabled; std::string m_fcsNetworkFile; diff --git a/YSFGateway/WiresX.cpp b/YSFGateway/WiresX.cpp index 909d584..1be96fe 100644 --- a/YSFGateway/WiresX.cpp +++ b/YSFGateway/WiresX.cpp @@ -173,6 +173,11 @@ void CWiresX::setYSF2P25(const std::string& address, unsigned short port) m_reflectors.setYSF2P25(address, port); } +void CWiresX::setYSFDirect(const std::string& address, unsigned short port) +{ + m_reflectors.setYSFDirect(address, port); +} + void CWiresX::addFCSRoom(const std::string& id, const std::string& name) { m_reflectors.addFCSRoom(id, name); diff --git a/YSFGateway/WiresX.h b/YSFGateway/WiresX.h index 7901c2b..df7cd40 100644 --- a/YSFGateway/WiresX.h +++ b/YSFGateway/WiresX.h @@ -55,6 +55,7 @@ public: void setYSF2DMR(const std::string& address, unsigned short port); void setYSF2NXDN(const std::string& address, unsigned short port); void setYSF2P25(const std::string& address, unsigned short port); + void setYSFDirect(const std::string& address, unsigned short port); void addFCSRoom(const std::string& id, const std::string& name); bool start(); diff --git a/YSFGateway/YSFGateway.cpp b/YSFGateway/YSFGateway.cpp index 638d3f1..f75164e 100644 --- a/YSFGateway/YSFGateway.cpp +++ b/YSFGateway/YSFGateway.cpp @@ -539,6 +539,11 @@ void CYSFGateway::createWiresX(CYSFNetwork* rptNetwork) if (port > 0U) m_wiresX->setYSF2P25(address, port); + address = m_conf.getYSFNetworkYSFDirectAddress(); + port = m_conf.getYSFNetworkYSFDirectPort(); + if (port > 0U) + m_wiresX->setYSFDirect(address, port); + std::string filename = m_conf.getFCSNetworkFile(); if (m_fcsNetworkEnabled) readFCSRoomsFile(filename); @@ -952,7 +957,7 @@ void CYSFGateway::processRemoteCommands() m_current.clear(); m_inactivityTimer.stop(); m_lostTimer.stop(); - m_linkType = LINK_NONE; + m_linkType = LINK_FCS; LogMessage("Connect by remote command to %s", id.c_str()); @@ -961,7 +966,7 @@ void CYSFGateway::processRemoteCommands() m_current = id; m_inactivityTimer.start(); m_lostTimer.start(); - m_linkType = LINK_FCS; + m_linkType = LINK_NONE; } else { LogMessage("Unknown reflector - %s", id.c_str()); } diff --git a/YSFGateway/YSFGateway.ini b/YSFGateway/YSFGateway.ini index bdfef4c..96b8993 100644 --- a/YSFGateway/YSFGateway.ini +++ b/YSFGateway/YSFGateway.ini @@ -60,6 +60,8 @@ YSF2NXDNAddress=127.0.0.1 YSF2NXDNPort=42014 YSF2P25Address=127.0.0.1 YSF2P25Port=42015 +YSFDirectAddress=127.0.0.1 +YSFDirectPort=42016 [FCS Network] Enable=1 diff --git a/YSFGateway/YSFReflectors.cpp b/YSFGateway/YSFReflectors.cpp index 129b20c..9ac73bc 100644 --- a/YSFGateway/YSFReflectors.cpp +++ b/YSFGateway/YSFReflectors.cpp @@ -36,6 +36,8 @@ m_YSF2NXDNAddress(), m_YSF2NXDNPort(0U), m_YSF2P25Address(), m_YSF2P25Port(0U), +m_YSFDirectAddress(), +m_YSFDirectPort(0U), m_fcsRooms(), m_newReflectors(), m_currReflectors(), @@ -100,6 +102,12 @@ void CYSFReflectors::setYSF2P25(const std::string& address, unsigned short port) m_YSF2P25Port = port; } +void CYSFReflectors::setYSFDirect(const std::string& address, unsigned short port) +{ + m_YSFDirectAddress = address; + m_YSFDirectPort = port; +} + void CYSFReflectors::addFCSRoom(const std::string& id, const std::string& name) { m_fcsRooms.push_back(std::make_pair(id, name)); @@ -252,6 +260,31 @@ bool CYSFReflectors::load() } } + // Add the YSFDirect entry + if (m_YSFDirectPort > 0U) { + sockaddr_storage addr; + unsigned int addrLen; + if (CUDPSocket::lookup(m_YSFDirectAddress, m_YSFDirectPort, addr, addrLen) == 0) { + CYSFReflector* refl = new CYSFReflector; + refl->m_id = "00006"; + refl->m_name = "YSFDirect "; + refl->m_desc = "Link YSFDirect"; + refl->m_addr = addr; + refl->m_addrLen = addrLen; + refl->m_count = "000"; + refl->m_type = YT_YSF; + refl->m_wiresX = true; + + m_newReflectors.push_back(refl); + + LogInfo("Loaded YSFDirect"); + } else { + LogWarning("Unable to resolve the address of YSFDirect"); + } + } + + + unsigned int id = 9U; for (std::vector>::const_iterator it1 = m_fcsRooms.cbegin(); it1 != m_fcsRooms.cend(); ++it1) { bool used; diff --git a/YSFGateway/YSFReflectors.h b/YSFGateway/YSFReflectors.h index 00c8184..eea7e63 100644 --- a/YSFGateway/YSFReflectors.h +++ b/YSFGateway/YSFReflectors.h @@ -63,6 +63,7 @@ public: void setYSF2DMR(const std::string& address, unsigned short port); void setYSF2NXDN(const std::string& address, unsigned short port); void setYSF2P25(const std::string& address, unsigned short port); + void setYSFDirect(const std::string& address, unsigned short port); void addFCSRoom(const std::string& id, const std::string& name); bool load(); @@ -88,6 +89,8 @@ private: unsigned short m_YSF2NXDNPort; std::string m_YSF2P25Address; unsigned short m_YSF2P25Port; + std::string m_YSFDirectAddress; + unsigned short m_YSFDirectPort; std::vector> m_fcsRooms; std::vector m_newReflectors; std::vector m_currReflectors; From 2530199d54c0325ef3ad7e01537788b6a0c7fe1f Mon Sep 17 00:00:00 2001 From: Antonio Matraia <63372602+iu5jae@users.noreply.github.com> Date: Sun, 23 Jul 2023 20:50:05 +0200 Subject: [PATCH 4/5] Possibility of inserting startup reflector as ID --- YSFGateway/YSFGateway.cpp | 2 ++ YSFGateway/YSFReflectors.cpp | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/YSFGateway/YSFGateway.cpp b/YSFGateway/YSFGateway.cpp index f75164e..25b93d1 100644 --- a/YSFGateway/YSFGateway.cpp +++ b/YSFGateway/YSFGateway.cpp @@ -840,6 +840,8 @@ void CYSFGateway::startupLinking() m_linkType = LINK_NONE; CYSFReflector* reflector = m_reflectors->findByName(m_startup); + if (reflector == NULL) + reflector = m_reflectors->findById(m_startup); if (reflector != NULL) { LogMessage("Automatic (re-)connection to %5.5s - \"%s\"", reflector->m_id.c_str(), reflector->m_name.c_str()); diff --git a/YSFGateway/YSFReflectors.cpp b/YSFGateway/YSFReflectors.cpp index 9ac73bc..cdf0401 100644 --- a/YSFGateway/YSFReflectors.cpp +++ b/YSFGateway/YSFReflectors.cpp @@ -267,7 +267,7 @@ bool CYSFReflectors::load() if (CUDPSocket::lookup(m_YSFDirectAddress, m_YSFDirectPort, addr, addrLen) == 0) { CYSFReflector* refl = new CYSFReflector; refl->m_id = "00006"; - refl->m_name = "YSFDirect "; + refl->m_name = "YSFDIRECT "; refl->m_desc = "Link YSFDirect"; refl->m_addr = addr; refl->m_addrLen = addrLen; From 95d83fd9cee0891eb0398d8eb89ade461eba7226 Mon Sep 17 00:00:00 2001 From: Antonio Matraia <63372602+iu5jae@users.noreply.github.com> Date: Wed, 26 Jul 2023 22:02:47 +0200 Subject: [PATCH 5/5] Requested changes Changed indentation from space to tab, used false instead of 0 for boolean variables. --- YSFGateway/Conf.cpp | 2 +- YSFGateway/WiresX.cpp | 8 ++++---- YSFGateway/YSFGateway.cpp | 22 +++++++++++----------- YSFGateway/YSFReflectors.cpp | 6 +++--- 4 files changed, 19 insertions(+), 19 deletions(-) diff --git a/YSFGateway/Conf.cpp b/YSFGateway/Conf.cpp index a0e445b..55ac4db 100644 --- a/YSFGateway/Conf.cpp +++ b/YSFGateway/Conf.cpp @@ -276,7 +276,7 @@ bool CConf::read() m_ysfNetworkYSF2P25Address = value; else if (::strcmp(key, "YSF2P25Port") == 0) m_ysfNetworkYSF2P25Port = (unsigned short)::atoi(value); - else if (::strcmp(key, "YSFDirectAddress") == 0) + else if (::strcmp(key, "YSFDirectAddress") == 0) m_ysfNetworkYSFDirectAddress = value; else if (::strcmp(key, "YSFDirectPort") == 0) m_ysfNetworkYSFDirectPort = (unsigned short)::atoi(value); diff --git a/YSFGateway/WiresX.cpp b/YSFGateway/WiresX.cpp index 1be96fe..f2d9304 100644 --- a/YSFGateway/WiresX.cpp +++ b/YSFGateway/WiresX.cpp @@ -378,11 +378,11 @@ WX_STATUS CWiresX::processConnect(const unsigned char* source, const unsigned ch std::string id = std::string((char*)data, 5U); - CYSFReflector* reflector_tmp; + CYSFReflector* reflector_tmp; reflector_tmp = m_reflectors.findById(id); - if (reflector_tmp != NULL) - m_reflector = reflector_tmp; - + if (reflector_tmp != NULL) + m_reflector = reflector_tmp; + if (m_reflector == NULL) return WXS_NONE; diff --git a/YSFGateway/YSFGateway.cpp b/YSFGateway/YSFGateway.cpp index 25b93d1..f051dda 100644 --- a/YSFGateway/YSFGateway.cpp +++ b/YSFGateway/YSFGateway.cpp @@ -283,10 +283,10 @@ int CYSFGateway::run() unsigned char dt = fich.getDT(); CYSFReflector* reflector = m_wiresX->getReflector(); - if (reflector != NULL) - wx_tmp = reflector->m_wiresX; - else - wx_tmp = 0; + if (reflector != NULL) + wx_tmp = reflector->m_wiresX; + else + wx_tmp = false; if (m_ysfNetwork != NULL && m_linkType == LINK_YSF && wiresXCommandPassthrough && wx_tmp) { processDTMF(buffer, dt); processWiresX(buffer, fich, true, wiresXCommandPassthrough); @@ -294,10 +294,10 @@ int CYSFGateway::run() processDTMF(buffer, dt); processWiresX(buffer, fich, false, wiresXCommandPassthrough); reflector = m_wiresX->getReflector(); //reflector may have changed - if (reflector != NULL) - wx_tmp = reflector->m_wiresX; - else - wx_tmp = 0; + if (reflector != NULL) + wx_tmp = reflector->m_wiresX; + else + wx_tmp = false; if (m_ysfNetwork != NULL && m_linkType == LINK_YSF && wx_tmp) m_exclude = (dt == YSF_DT_DATA_FR_MODE); } @@ -840,7 +840,7 @@ void CYSFGateway::startupLinking() m_linkType = LINK_NONE; CYSFReflector* reflector = m_reflectors->findByName(m_startup); - if (reflector == NULL) + if (reflector == NULL) reflector = m_reflectors->findById(m_startup); if (reflector != NULL) { LogMessage("Automatic (re-)connection to %5.5s - \"%s\"", reflector->m_id.c_str(), reflector->m_name.c_str()); @@ -903,7 +903,7 @@ void CYSFGateway::processRemoteCommands() std::string id = std::string((char*)(buffer + 7U)); // Left trim // id.erase(id.begin(), std::find_if(id.begin(), id.end(), std::not1(std::ptr_fun(std::isspace)))); - id.erase(std::remove_if(id.begin(), id.end(), [](char c) { return !std::isalnum(c); }), id.end()); + id.erase(std::remove_if(id.begin(), id.end(), [](char c) { return !std::isalnum(c); }), id.end()); CYSFReflector* reflector = m_reflectors->findById(id); if (reflector == NULL) reflector = m_reflectors->findByName(id); @@ -935,7 +935,7 @@ void CYSFGateway::processRemoteCommands() std::string raw = std::string((char*)(buffer + 7U)); // Left trim // raw.erase(raw.begin(), std::find_if(raw.begin(), raw.end(), std::not1(std::ptr_fun(std::isspace)))); - raw.erase(std::remove_if(raw.begin(), raw.end(), [](char c) { return !std::isalnum(c); }), raw.end()); + raw.erase(std::remove_if(raw.begin(), raw.end(), [](char c) { return !std::isalnum(c); }), raw.end()); std::string id = "FCS00"; std::string idShort = "FCS"; if (raw.length() == 3U) { diff --git a/YSFGateway/YSFReflectors.cpp b/YSFGateway/YSFReflectors.cpp index cdf0401..ed0c0c0 100644 --- a/YSFGateway/YSFReflectors.cpp +++ b/YSFGateway/YSFReflectors.cpp @@ -260,7 +260,7 @@ bool CYSFReflectors::load() } } - // Add the YSFDirect entry + // Add the YSFDirect entry if (m_YSFDirectPort > 0U) { sockaddr_storage addr; unsigned int addrLen; @@ -283,8 +283,8 @@ bool CYSFReflectors::load() } } - - + + unsigned int id = 9U; for (std::vector>::const_iterator it1 = m_fcsRooms.cbegin(); it1 != m_fcsRooms.cend(); ++it1) { bool used;