From 5ad4619b7f0dc622baef24ea9499dea35f28141f Mon Sep 17 00:00:00 2001 From: contradict Date: Wed, 7 May 2025 11:17:44 -0700 Subject: [PATCH 1/2] Add the option to set the port used by the originiator for implicit communication --- src/ConnectionManager.cpp | 4 ++-- src/MessageRouter.cpp | 11 ++++++++--- src/MessageRouter.h | 7 ++++++- src/eip/CommonPacketItemFactory.cpp | 8 +++++++- src/eip/CommonPacketItemFactory.h | 1 + 5 files changed, 24 insertions(+), 7 deletions(-) diff --git a/src/ConnectionManager.cpp b/src/ConnectionManager.cpp index a4c76a2..8f9d54e 100644 --- a/src/ConnectionManager.cpp +++ b/src/ConnectionManager.cpp @@ -145,13 +145,13 @@ namespace eipScanner { } } else { - ioConnection->_socket = std::make_unique(si->getRemoteEndPoint().getHost(), EIP_DEFAULT_IMPLICIT_PORT); + ioConnection->_socket = std::make_unique(si->getRemoteEndPoint().getHost(), _messageRouter->implicitPort()); } Logger(LogLevel::INFO) << "Open UDP socket to send data to " << ioConnection->_socket->getRemoteEndPoint().toString(); - findOrCreateSocket(sockets::EndPoint(si->getRemoteEndPoint().getHost(), EIP_DEFAULT_IMPLICIT_PORT)); + findOrCreateSocket(sockets::EndPoint(si->getRemoteEndPoint().getHost(), _messageRouter->implicitPort())); auto result = _connectionMap .insert(std::make_pair(response.getT2ONetworkConnectionId(), ioConnection)); diff --git a/src/MessageRouter.cpp b/src/MessageRouter.cpp index 16f2232..30469bc 100644 --- a/src/MessageRouter.cpp +++ b/src/MessageRouter.cpp @@ -22,8 +22,8 @@ namespace eipScanner { using eip::EncapsPacket; using eip::EncapsPacketFactory; - MessageRouter::MessageRouter(bool use_8_bit_path_segments) - : _use_8_bit_path_segments(use_8_bit_path_segments) + MessageRouter::MessageRouter(bool use_8_bit_path_segments, cip::CipUint implicit_port) + : _use_8_bit_path_segments(use_8_bit_path_segments), _implicit_port(implicit_port) {}; MessageRouter::~MessageRouter() = default; @@ -47,7 +47,7 @@ namespace eipScanner { CommonPacketItemFactory commonPacketItemFactory; CommonPacket commonPacket; - commonPacket << commonPacketItemFactory.createNullAddressItem(); + commonPacket << commonPacketItemFactory.createT2OSockaddrInfo(_implicit_port, 0); commonPacket << commonPacketItemFactory.createUnconnectedDataItem(request.pack()); for(auto& item : additionalPacketItems) { @@ -84,4 +84,9 @@ namespace eipScanner { MessageRouter::sendRequest(SessionInfoIf::SPtr si, CipUsint service, const EPath &path) const { return this->sendRequest(si, service, path, {}, {}); } + + cip::CipUint + MessageRouter::implicitPort() const { + return _implicit_port; + } } diff --git a/src/MessageRouter.h b/src/MessageRouter.h index c4a0bda..c0a8e59 100644 --- a/src/MessageRouter.h +++ b/src/MessageRouter.h @@ -27,7 +27,9 @@ namespace eipScanner { /** * @brief Default constructor */ - MessageRouter(bool use_8_bit_path_segments=false); + MessageRouter(bool use_8_bit_path_segments=false, cip::CipUint implicit_port=EIP_DEFAULT_IMPLICIT_PORT); + MessageRouter(cip::CipUint implicit_port) : MessageRouter(false, implicit_port){ }; + MessageRouter(bool use_8_bit_path_segments) : MessageRouter(use_8_bit_path_segments, EIP_DEFAULT_IMPLICIT_PORT) {}; /** * @brief Default destructor @@ -74,8 +76,11 @@ namespace eipScanner { virtual cip::MessageRouterResponse sendRequest(SessionInfoIf::SPtr si, cip::CipUsint service, const cip::EPath& path) const; + cip::CipUint implicitPort() const; + private: bool _use_8_bit_path_segments; + cip::CipUint _implicit_port; }; } diff --git a/src/eip/CommonPacketItemFactory.cpp b/src/eip/CommonPacketItemFactory.cpp index 40f0d8a..1d4bef9 100644 --- a/src/eip/CommonPacketItemFactory.cpp +++ b/src/eip/CommonPacketItemFactory.cpp @@ -27,5 +27,11 @@ namespace eip { buffer << connectionId << seqNumber; return CommonPacketItem(CommonPacketItemIds::SEQUENCED_ADDRESS_ITEM, buffer.data()); } + CommonPacketItem + CommonPacketItemFactory::createT2OSockaddrInfo(cip::CipUint port, cip::CipUdint address) const { + Buffer buffer; + buffer << htons(cip::CipInt(2)) << htons(port) << htonl(address) << cip::CipUdint(0) << cip::CipUdint(0); + return CommonPacketItem(CommonPacketItemIds::T2O_SOCKADDR_INFO, buffer.data()); + } +} } -} \ No newline at end of file diff --git a/src/eip/CommonPacketItemFactory.h b/src/eip/CommonPacketItemFactory.h index 98a5b63..b5c5b8b 100644 --- a/src/eip/CommonPacketItemFactory.h +++ b/src/eip/CommonPacketItemFactory.h @@ -17,6 +17,7 @@ namespace eip { CommonPacketItem createUnconnectedDataItem(const std::vector &data) const; CommonPacketItem createSequenceAddressItem(cip::CipUdint connectionId, cip::CipUdint seqNumber) const; CommonPacketItem createConnectedDataItem(const std::vector &data) const; + CommonPacketItem createT2OSockaddrInfo(cip::CipUint port, cip::CipUdint address) const; }; } } From d65ce4c574ac903f7d407cd11b0694c3ca896a25 Mon Sep 17 00:00:00 2001 From: contradict Date: Fri, 30 May 2025 14:16:16 -0700 Subject: [PATCH 2/2] Try again. --- src/ConnectionManager.cpp | 12 +++++++----- src/ConnectionManager.h | 2 +- src/MessageRouter.cpp | 10 +++------- src/MessageRouter.h | 7 +------ 4 files changed, 12 insertions(+), 19 deletions(-) diff --git a/src/ConnectionManager.cpp b/src/ConnectionManager.cpp index 8f9d54e..0b94067 100644 --- a/src/ConnectionManager.cpp +++ b/src/ConnectionManager.cpp @@ -7,6 +7,7 @@ #include #include "ConnectionManager.h" +#include "eip/CommonPacketItemFactory.h" #include "eip/CommonPacket.h" #include "cip/connectionManager/ForwardOpenRequest.h" #include "cip/connectionManager/ForwardCloseRequest.h" @@ -50,7 +51,7 @@ namespace eipScanner { ConnectionManager::~ConnectionManager() = default; IOConnection::WPtr - ConnectionManager::forwardOpen(const SessionInfoIf::SPtr& si, ConnectionParameters connectionParameters, bool isLarge) { + ConnectionManager::forwardOpen(const SessionInfoIf::SPtr& si, ConnectionParameters connectionParameters, bool isLarge, cip::CipUint implicit_port) { static int serialNumberCount = 0; connectionParameters.connectionSerialNumber = ++serialNumberCount; @@ -87,17 +88,18 @@ namespace eipScanner { connectionParameters.t2oNetworkConnectionParams += 4; } + eip::CommonPacketItemFactory commonPacketItemFactory; MessageRouterResponse messageRouterResponse; if (isLarge) { LargeForwardOpenRequest request(connectionParameters); messageRouterResponse = _messageRouter->sendRequest(si, static_cast(ConnectionManagerServiceCodes::LARGE_FORWARD_OPEN), - EPath(6, 1), request.pack(), {}); + EPath(6, 1), request.pack(), {commonPacketItemFactory.createT2OSockaddrInfo(implicit_port, 0)}); } else { ForwardOpenRequest request(connectionParameters); messageRouterResponse = _messageRouter->sendRequest(si, static_cast(ConnectionManagerServiceCodes::FORWARD_OPEN), - EPath(6, 1), request.pack(), {}); + EPath(6, 1), request.pack(), {commonPacketItemFactory.createT2OSockaddrInfo(implicit_port, 0)}); } IOConnection::SPtr ioConnection; @@ -145,13 +147,13 @@ namespace eipScanner { } } else { - ioConnection->_socket = std::make_unique(si->getRemoteEndPoint().getHost(), _messageRouter->implicitPort()); + ioConnection->_socket = std::make_unique(si->getRemoteEndPoint().getHost(), implicit_port); } Logger(LogLevel::INFO) << "Open UDP socket to send data to " << ioConnection->_socket->getRemoteEndPoint().toString(); - findOrCreateSocket(sockets::EndPoint(si->getRemoteEndPoint().getHost(), _messageRouter->implicitPort())); + findOrCreateSocket(sockets::EndPoint(si->getRemoteEndPoint().getHost(), implicit_port)); auto result = _connectionMap .insert(std::make_pair(response.getT2ONetworkConnectionId(), ioConnection)); diff --git a/src/ConnectionManager.h b/src/ConnectionManager.h index a317067..9cac5a0 100644 --- a/src/ConnectionManager.h +++ b/src/ConnectionManager.h @@ -44,7 +44,7 @@ namespace eipScanner { * @param isLarge use large forward open if true * @return weak pointer to the created connection or nullptr if got an error */ - IOConnection::WPtr forwardOpen(const SessionInfoIf::SPtr& si, cip::connectionManager::ConnectionParameters connectionParameters, bool isLarge = false); + IOConnection::WPtr forwardOpen(const SessionInfoIf::SPtr& si, cip::connectionManager::ConnectionParameters connectionParameters, bool isLarge = false, cip::CipUint implicit_port=EIP_DEFAULT_IMPLICIT_PORT); /** * @brief Opens an EIP IO connection with the EIP adapter diff --git a/src/MessageRouter.cpp b/src/MessageRouter.cpp index 30469bc..ccdace8 100644 --- a/src/MessageRouter.cpp +++ b/src/MessageRouter.cpp @@ -22,8 +22,8 @@ namespace eipScanner { using eip::EncapsPacket; using eip::EncapsPacketFactory; - MessageRouter::MessageRouter(bool use_8_bit_path_segments, cip::CipUint implicit_port) - : _use_8_bit_path_segments(use_8_bit_path_segments), _implicit_port(implicit_port) + MessageRouter::MessageRouter(bool use_8_bit_path_segments) + : _use_8_bit_path_segments(use_8_bit_path_segments) {}; MessageRouter::~MessageRouter() = default; @@ -47,7 +47,7 @@ namespace eipScanner { CommonPacketItemFactory commonPacketItemFactory; CommonPacket commonPacket; - commonPacket << commonPacketItemFactory.createT2OSockaddrInfo(_implicit_port, 0); + commonPacket << commonPacketItemFactory.createNullAddressItem(); commonPacket << commonPacketItemFactory.createUnconnectedDataItem(request.pack()); for(auto& item : additionalPacketItems) { @@ -85,8 +85,4 @@ namespace eipScanner { return this->sendRequest(si, service, path, {}, {}); } - cip::CipUint - MessageRouter::implicitPort() const { - return _implicit_port; - } } diff --git a/src/MessageRouter.h b/src/MessageRouter.h index c0a8e59..c4a0bda 100644 --- a/src/MessageRouter.h +++ b/src/MessageRouter.h @@ -27,9 +27,7 @@ namespace eipScanner { /** * @brief Default constructor */ - MessageRouter(bool use_8_bit_path_segments=false, cip::CipUint implicit_port=EIP_DEFAULT_IMPLICIT_PORT); - MessageRouter(cip::CipUint implicit_port) : MessageRouter(false, implicit_port){ }; - MessageRouter(bool use_8_bit_path_segments) : MessageRouter(use_8_bit_path_segments, EIP_DEFAULT_IMPLICIT_PORT) {}; + MessageRouter(bool use_8_bit_path_segments=false); /** * @brief Default destructor @@ -76,11 +74,8 @@ namespace eipScanner { virtual cip::MessageRouterResponse sendRequest(SessionInfoIf::SPtr si, cip::CipUsint service, const cip::EPath& path) const; - cip::CipUint implicitPort() const; - private: bool _use_8_bit_path_segments; - cip::CipUint _implicit_port; }; }