From 28de70aa05569709bf00996300a31a48dbed56e0 Mon Sep 17 00:00:00 2001 From: Paul Hollinsky Date: Tue, 25 Sep 2018 17:50:58 -0400 Subject: [PATCH] Refactor ICSChecksum and packetWrap into the Packetizer --- communication/communication.cpp | 20 +------------------- communication/include/communication.h | 5 ++--- communication/include/packetizer.h | 8 +++++++- communication/multichannelcommunication.cpp | 2 +- communication/packetizer.cpp | 18 ++++++++++++++++++ platform/windows/pcap.cpp | 5 +++-- 6 files changed, 32 insertions(+), 26 deletions(-) diff --git a/communication/communication.cpp b/communication/communication.cpp index 3846419..3acfbd6 100644 --- a/communication/communication.cpp +++ b/communication/communication.cpp @@ -14,24 +14,6 @@ using namespace icsneo; int Communication::messageCallbackIDCounter = 1; -uint8_t Communication::ICSChecksum(const std::vector& data) { - uint32_t checksum = 0; - for(auto i = 0; i < data.size(); i++) - checksum += data[i]; - checksum = ~checksum; - checksum++; - return (uint8_t)checksum; -} - -std::vector& Communication::packetWrap(std::vector& data, bool addChecksum) { - if(addChecksum) - data.push_back(ICSChecksum(data)); - data.insert(data.begin(), 0xAA); - if(align16bit && data.size() % 2 == 1) - data.push_back('A'); - return data; -} - bool Communication::open() { if(isOpen) return true; @@ -62,7 +44,7 @@ bool Communication::close() { } bool Communication::sendPacket(std::vector& bytes) { - return impl->write(Communication::packetWrap(bytes)); + return impl->write(packetizer->packetWrap(bytes)); } bool Communication::sendCommand(Command cmd, std::vector arguments) { diff --git a/communication/include/communication.h b/communication/include/communication.h index 431e77e..53c69f2 100644 --- a/communication/include/communication.h +++ b/communication/include/communication.h @@ -5,6 +5,8 @@ #include "communication/include/command.h" #include "communication/include/network.h" #include "communication/include/packet.h" +#include "communication/include/packetizer.h" +#include "communication/include/messagedecoder.h" #include #include #include @@ -16,8 +18,6 @@ namespace icsneo { class Communication { public: - static uint8_t ICSChecksum(const std::vector& data); - Communication(std::shared_ptr com, std::shared_ptr p, std::shared_ptr md) : impl(com), packetizer(p), decoder(md) {} virtual ~Communication() { close(); } @@ -26,7 +26,6 @@ public: virtual void spawnThreads(); virtual void joinThreads(); bool rawWrite(const std::vector& bytes) { return impl->write(bytes); } - std::vector& packetWrap(std::vector& data, bool addChecksum = true); bool sendPacket(std::vector& bytes); virtual bool sendCommand(Command cmd, bool boolean) { return sendCommand(cmd, std::vector({ (uint8_t)boolean })); } diff --git a/communication/include/packetizer.h b/communication/include/packetizer.h index ae4cc10..1c773e6 100644 --- a/communication/include/packetizer.h +++ b/communication/include/packetizer.h @@ -1,7 +1,7 @@ #ifndef __PACKETIZER_H_ #define __PACKETIZER_H_ -#include "communication/include/communication.h" +#include "communication/include/packet.h" #include #include #include @@ -10,8 +10,14 @@ namespace icsneo { class Packetizer { public: + static uint8_t ICSChecksum(const std::vector& data); + std::vector& packetWrap(std::vector& data); + bool input(const std::vector& bytes); std::vector> output(); + + bool disableChecksum = false; // Even for short packets + bool align16bit = true; // Not needed for Gigalog, Galaxy, etc and newer private: enum class ReadState { diff --git a/communication/multichannelcommunication.cpp b/communication/multichannelcommunication.cpp index 2e8a3c6..537167a 100644 --- a/communication/multichannelcommunication.cpp +++ b/communication/multichannelcommunication.cpp @@ -22,7 +22,7 @@ bool MultiChannelCommunication::sendCommand(Command cmd, std::vector ar for(auto& b : arguments) bytes.push_back(b); bytes.insert(bytes.begin(), 0xB | ((uint8_t)bytes.size() << 4)); - bytes = Communication::packetWrap(bytes); + bytes = packetizer->packetWrap(bytes); bytes.insert(bytes.begin(), {(uint8_t)CommandType::HostPC_to_Vnet1, (uint8_t)bytes.size(), (uint8_t)(bytes.size() >> 8)}); return rawWrite(bytes); } diff --git a/communication/packetizer.cpp b/communication/packetizer.cpp index 3b3d84d..e763f84 100644 --- a/communication/packetizer.cpp +++ b/communication/packetizer.cpp @@ -3,6 +3,24 @@ using namespace icsneo; +uint8_t Packetizer::ICSChecksum(const std::vector& data) { + uint32_t checksum = 0; + for(auto i = 0; i < data.size(); i++) + checksum += data[i]; + checksum = ~checksum; + checksum++; + return (uint8_t)checksum; +} + +std::vector& Packetizer::packetWrap(std::vector& data) { + if(!disableChecksum) + data.push_back(ICSChecksum(data)); + data.insert(data.begin(), 0xAA); + if(align16bit && data.size() % 2 == 1) + data.push_back('A'); + return data; +} + bool Packetizer::input(const std::vector& inputBytes) { bool haveEnoughData = true; bytes.insert(bytes.end(), inputBytes.begin(), inputBytes.end()); diff --git a/platform/windows/pcap.cpp b/platform/windows/pcap.cpp index bc96ab5..3dd2e3b 100644 --- a/platform/windows/pcap.cpp +++ b/platform/windows/pcap.cpp @@ -1,6 +1,7 @@ #include "platform/windows/include/pcap.h" #include "communication/include/network.h" #include "communication/include/communication.h" +#include "communication/include/packetizer.h" #include #include #pragma comment(lib, "IPHLPAPI.lib") @@ -108,9 +109,9 @@ std::vector PCAP::FindByProduct(int product) { requestPacket.payload.reserve(4); requestPacket.payload = { ((1 << 4) | (uint8_t)Network::NetID::Main51), // Packet size of 1 on NETID_MAIN51 - (uint8_t)Communication::Command::RequestSerialNumber + (uint8_t)Command::RequestSerialNumber }; - requestPacket.payload.push_back(Communication::ICSChecksum(requestPacket.payload)); + requestPacket.payload.push_back(Packetizer::ICSChecksum(requestPacket.payload)); requestPacket.payload.insert(requestPacket.payload.begin(), 0xAA); auto bs = requestPacket.getBytestream();