diff --git a/CMakeLists.txt b/CMakeLists.txt index e9bccff..fa27f66 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 3.2) -project(libicsneo-socketcan-daemon VERSION 2.0.3) +project(libicsneo-socketcan-daemon VERSION 2.1.0) -set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_STANDARD 17) include(GNUInstallDirs) diff --git a/src/main.cpp b/src/main.cpp index d3a00f8..f7036d0 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -20,6 +20,8 @@ #include #include +#include +#include #include #include @@ -86,8 +88,15 @@ public: const std::string& getName() const { return name; } uint8_t* getRxBox() { return rxBox; } const uint8_t* getRxBox() const { return rxBox; } - void addReceivedMessageToQueue(const std::shared_ptr& msg) { - auto neomessage = icsneo::CreateNeoMessage(msg); + void addReceivedMessageToQueue(const std::shared_ptr& msg) { + const auto neomessageGeneric = icsneo::CreateNeoMessage(msg); + if (neomessageGeneric.messageType != neomessagetype_t(icsneo::Message::Type::Frame)) { + LOG(LOG_DEBUG, "could not create a neomessage_can_t\n"); + return; + } + + const auto& neomessage = *reinterpret_cast(&neomessageGeneric); + size_t bytesNeeded = sizeof(neomessage) + neomessage.length; std::lock_guard lg(rxBoxLock); if(ssize_t((rxBoxCurrentPosition - rxBox) + bytesNeeded) > RX_BOX_SIZE) { @@ -480,10 +489,16 @@ int main(int argc, char** argv) { // Send! uint8_t* currentPosition = GET_TX_BOX(info.tx_box_index); while(info.count--) { - neomessage_t* msg = reinterpret_cast(currentPosition); - currentPosition += sizeof(neomessage_t); + neomessage_frame_t* msg = reinterpret_cast(currentPosition); + currentPosition += sizeof(neomessage_frame_t); msg->data = currentPosition; currentPosition += msg->length; + + if(msg->type != neonettype_t(icsneo::Network::Type::CAN)) { + LOG(LOG_ERR, "Message dropped, kernel sent a non-CAN message\n"); + continue; + } + bool sent = false; std::lock_guard lg(openDevicesMutex); for(auto& dev : openDevices) { @@ -491,8 +506,9 @@ int main(int argc, char** argv) { if(netifPair.second->getKernelHandle() != msg->netid) continue; msg->netid = static_cast(netifPair.first); - auto tx = icsneo::CreateMessageFromNeoMessage(msg); - if(!dev.device->transmit(tx)) + auto txMsg = icsneo::CreateMessageFromNeoMessage(reinterpret_cast(msg)); + auto tx = std::dynamic_pointer_cast(txMsg); + if(!tx || !dev.device->transmit(tx)) break; sent = true; break; diff --git a/third-party/libicsneo b/third-party/libicsneo index b09f856..0ff1230 160000 --- a/third-party/libicsneo +++ b/third-party/libicsneo @@ -1 +1 @@ -Subproject commit b09f85693fef5e5513f099648cdf165ade5d20f2 +Subproject commit 0ff12300f34be54ec7d3380a4ab6693a7d7c3fb1