From 88763c208f8fa1fe8d1e5b623b8126dc1b802646 Mon Sep 17 00:00:00 2001 From: Oliver Wieland Date: Sun, 7 Dec 2025 11:25:34 +0100 Subject: [PATCH 1/4] doc: Remove obsolete files --- doc/developer documentation.pdf | Bin 299693 -> 0 bytes doc/sockets/SOCKET_CASTING_GUIDE.md | 359 ------------- doc/sockets/socket_casting_alternatives.cpp | 526 -------------------- 3 files changed, 885 deletions(-) delete mode 100644 doc/developer documentation.pdf delete mode 100644 doc/sockets/SOCKET_CASTING_GUIDE.md delete mode 100644 doc/sockets/socket_casting_alternatives.cpp diff --git a/doc/developer documentation.pdf b/doc/developer documentation.pdf deleted file mode 100644 index c19c461aaf65a3fc23df78f407e98c77abc5dffb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 299693 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

H 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, sizeof(addr)); - -std::vector data; -send(sockfd, reinterpret_cast(data.data()), data.size(), 0); -``` - -**Probleme mit reinterpret_cast:** -- Unsicheres Type-Punning (kann Strict Aliasing Rules verletzen) -- Keine Compile-Zeit-Prüfung -- Fehleranfällig -- Schwer zu lesen - -## Lösungen - -### 1. SocketAddress Wrapper (✅ Empfohlen für C++11+) - -**Problem:** `sockaddr*` Cast bei bind/connect/accept - -**Lösung:** Union-basierter Wrapper - -```cpp -class SocketAddress { -public: - static SocketAddress createIPv4(const char* ip, uint16_t port) { - SocketAddress addr; - auto& ipv4 = addr.storage_.ipv4; - ipv4.sin_family = AF_INET; - ipv4.sin_port = htons(port); - inet_pton(AF_INET, ip, &ipv4.sin_addr); - addr.length_ = sizeof(sockaddr_in); - return addr; - } - - // ✅ Sichere Konvertierung - sockaddr* get() { return &storage_.base; } - const sockaddr* get() const { return &storage_.base; } - socklen_t length() const { return length_; } - -private: - union Storage { - sockaddr base; - sockaddr_in ipv4; - sockaddr_in6 ipv6; - sockaddr_storage storage; - } storage_; - - socklen_t length_ = 0; -}; - -// Verwendung -auto addr = SocketAddress::createIPv4("127.0.0.1", 13400); -bind(sockfd, addr.get(), addr.length()); // ✅ Kein reinterpret_cast! -``` - -**Warum funktioniert das?** -- Union für Type-Punning ist vom C++-Standard erlaubt (seit C++11) -- Zugriff auf inaktive Union-Member ist definiertes Verhalten -- Common initial sequence Regel garantiert Kompatibilität - -**Vorteile:** -- ✅ Vollständig typsicher -- ✅ Keine reinterpret_casts -- ✅ C++11 kompatibel -- ✅ Unterstützt IPv4 und IPv6 -- ✅ Keine Performance-Overhead - -### 2. std::span für send/recv (✅ Empfohlen für C++20) - -**Problem:** Cast von `uint8_t*` zu `char*` bei send/recv - -**Lösung:** std::span + std::as_bytes() - -```cpp -template -ssize_t send(std::span data, int flags = 0) { - static_assert(std::is_trivially_copyable_v, - "Type must be trivially copyable"); - - // ✅ std::as_bytes eliminiert Casts - auto bytes = std::as_bytes(data); - return ::send(fd_, bytes.data(), bytes.size(), flags); -} - -// Verwendung -std::vector data = {0x01, 0x02, 0x03}; -socket.send(std::span{data}); // ✅ Kein Cast! - -std::array buffer; -socket.recv(std::span{buffer}); // ✅ Typsicher! -``` - -**Vorteile:** -- ✅ Generisch für alle Typen -- ✅ Compile-Zeit Type-Checks -- ✅ std::as_bytes() ist vom Standard definiert -- ✅ Keine Performance-Overhead (Zero-Cost Abstraction) - -### 3. Socket Wrapper-Klasse (✅ Beste Gesamtlösung) - -Kombiniere beide Ansätze in einer Wrapper-Klasse: - -```cpp -class Socket { -public: - // RAII: Automatisches close() - ~Socket() { close(); } - - // Move-only - Socket(Socket&& other) noexcept; - Socket& operator=(Socket&& other) noexcept; - - // Factory - static Socket createTCP(); - static Socket createUDP(); - - // ✅ Typsichere Methoden - bool bind(const SocketAddress& addr); - bool connect(const SocketAddress& addr); - bool listen(int backlog = 5); - Socket accept(SocketAddress* addr = nullptr); - - // ✅ Generisches send/recv - template - ssize_t send(std::span data, int flags = 0); - - template - ssize_t recv(std::span buffer, int flags = 0); - - // Convenience für vector - ssize_t send(const std::vector& data, int flags = 0); - ssize_t recv(std::vector& buffer, int flags = 0); - -private: - int fd_; -}; - -// Verwendung -auto server = Socket::createTCP(); -auto addr = SocketAddress::createIPv4("0.0.0.0", 13400); - -server.bind(addr); -server.listen(); - -auto client = server.accept(); - -std::vector data = {0x01, 0x02}; -client.send(data); // ✅ Kein reinterpret_cast! -``` - -**Vorteile:** -- ✅ Komplett typsicher -- ✅ RAII (kein Vergessen von close()) -- ✅ Move-only Semantik (keine versehentlichen Kopien) -- ✅ Saubere, moderne API -- ✅ Zero-Cost Abstraction - -### 4. std::byte für Rohdaten (C++17) - -**Problem:** uint8_t ist eigentlich ein Integer-Typ - -**Lösung:** std::byte für semantisch korrekte Bytes - -```cpp -ssize_t send(const std::byte* data, size_t size, int flags = 0) { - return ::send(fd_, data, size, flags); -} - -// Verwendung -std::vector data = { - std::byte{0x01}, - std::byte{0x02} -}; -socket.send(data); -``` - -**Vorteile:** -- ✅ Semantisch korrekter (Byte ≠ Integer) -- ✅ Verhindert arithmetische Operationen -- ✅ Explizite Konvertierung nötig - -**Nachteile:** -- ⚠️ Verbosity (jedes Byte braucht std::byte{}) -- ⚠️ Konvertierung von/zu uint8_t nötig - -### 5. Der erlaubte Cast: uint8_t* → char* - -**Wichtig:** Dieser spezifische Cast ist vom Standard erlaubt! - -```cpp -std::vector data; - -// ✅ Dieser Cast ist OK (vom Standard garantiert) -send(sockfd, reinterpret_cast(data.data()), data.size(), 0); -``` - -**Warum ist das erlaubt?** -- `char`, `signed char`, `unsigned char` haben spezielle Aliasing-Regeln -- Sie dürfen für Zugriff auf jede Byte-Sequenz verwendet werden -- uint8_t ist typedef für unsigned char - -**Aber:** Auch wenn erlaubt, ist ein Wrapper trotzdem besser! - -## Vergleichstabelle - -| Ansatz | C++ Version | Typsicherheit | Performance | Empfehlung | -|--------|-------------|---------------|-------------|------------| -| `reinterpret_cast` | Alle | ❌ Niedrig | ✅ Gut | ❌ Vermeiden | -| Union Wrapper | C++11+ | ✅ Hoch | ✅ Gut | ✅ Für sockaddr | -| std::span | C++20 | ✅ Sehr hoch | ✅ Gut | ✅ Für send/recv | -| std::byte | C++17 | ✅ Hoch | ✅ Gut | ⚠️ Verbose | -| uint8_t→char cast | Alle | ⚠️ Mittel | ✅ Gut | ⚠️ Als Fallback OK | -| Socket Wrapper | C++11+ | ✅ Sehr hoch | ✅ Gut | ✅✅ Beste Lösung | - -## Empfohlene Implementierung für dein Projekt - -Für libdoip würde ich empfehlen: - -### Phase 1: SocketAddress Wrapper (sofort) - -```cpp -// In socket_utils.h -namespace doip { - -class SocketAddress { - // ... wie oben -}; - -} // namespace doip -``` - -### Phase 2: Socket Wrapper (mittelfristig) - -```cpp -namespace doip { - -class Socket { - // ... RAII + typsichere Methoden -}; - -} // namespace doip -``` - -### Phase 3: Integration mit DoIPMessage (langfristig) - -```cpp -// DoIPMessage hat bereits getData() -auto msg = doip::message::makeDiagnosticMessage(...); - -// ✅ Perfekte Integration -socket.send(msg.getData()); - -// Oder mit ByteArrayRef -auto [data, size] = msg.getData(); -socket.send(data, size); -``` - -## Quick Reference - -### Alte Methode vs. Neue Methode - -**Bind:** -```cpp -// ❌ Alt -sockaddr_in addr; -bind(sockfd, reinterpret_cast(&addr), sizeof(addr)); - -// ✅ Neu -auto addr = SocketAddress::createIPv4("127.0.0.1", 13400); -socket.bind(addr); -``` - -**Send:** -```cpp -// ❌ Alt -std::vector data; -send(sockfd, reinterpret_cast(data.data()), data.size(), 0); - -// ✅ Neu (C++20) -socket.send(std::span{data}); - -// ✅ Neu (C++11) -socket.send(data); // Wrapper übernimmt den Cast -``` - -**Accept:** -```cpp -// ❌ Alt -sockaddr_in client_addr; -socklen_t len = sizeof(client_addr); -int client_fd = accept(sockfd, reinterpret_cast(&client_addr), &len); - -// ✅ Neu -SocketAddress client_addr; -auto client_socket = server.accept(&client_addr); -``` - -## Performance - -**Keine Overhead!** - -Alle vorgeschlagenen Lösungen sind Zero-Cost Abstractions: -- Compiler optimiert Wrapper weg -- std::span ist nur Pointer + Size -- Union hat keine Runtime-Kosten -- Inline-Funktionen werden eingefügt - -**Benchmark-Ergebnis (typisch):** -``` -reinterpret_cast: 100 ns -Union wrapper: 100 ns (identisch!) -std::span: 100 ns (identisch!) -Socket wrapper: 100 ns (identisch!) -``` - -## Compiler-Unterstützung - -| Feature | GCC | Clang | MSVC | -|---------|-----|-------|------| -| Union Type-Punning | ✅ 4.8+ | ✅ 3.4+ | ✅ 2015+ | -| std::byte | ✅ 7+ | ✅ 5+ | ✅ 2017+ | -| std::span | ✅ 10+ | ✅ 7+ | ✅ 2019+ | - -## Fazit - -**Für libdoip:** - -1. **Sofort:** SocketAddress Wrapper implementieren -2. **Mittelfristig:** Socket Wrapper-Klasse -3. **Optional:** std::span für C++20 (wenn gewünscht) - -**Code wird:** -- ✅ Typsicherer -- ✅ Lesbarer -- ✅ Wartbarer -- ✅ Moderner -- ✅ Genauso performant - -**Minimale Migration:** -```cpp -// Alte Calls können sogar kompatibel bleiben: -class Socket { - // Neue API - ssize_t send(const std::vector& data); - - // Legacy-Kompatibilität - ssize_t send(const void* data, size_t size) { - return ::send(fd_, data, size, 0); - } -}; -``` diff --git a/doc/sockets/socket_casting_alternatives.cpp b/doc/sockets/socket_casting_alternatives.cpp deleted file mode 100644 index c281b39..0000000 --- a/doc/sockets/socket_casting_alternatives.cpp +++ /dev/null @@ -1,526 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include - -// ============================================================================ -// Problem: Typische Socket-API Verwendung mit reinterpret_cast -// ============================================================================ - -namespace unsafe_example { - -void typical_socket_code() { - int sockfd = socket(AF_INET, SOCK_STREAM, 0); - - sockaddr_in server_addr{}; - server_addr.sin_family = AF_INET; - server_addr.sin_port = htons(13400); - inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr); - - // ❌ Problematisch: reinterpret_cast - bind(sockfd, reinterpret_cast(&server_addr), sizeof(server_addr)); - - // ❌ Bei send/recv auch problematisch - std::vector data = {0x01, 0x02, 0x03}; - send(sockfd, reinterpret_cast(data.data()), data.size(), 0); -} - -} // namespace unsafe_example - -// ============================================================================ -// Lösung 1: std::bit_cast (C++20) für Type-Punning -// ============================================================================ - -namespace solution1_bitcast { - -#if __cplusplus >= 202002L -#include - -// std::bit_cast ist der sicherste Weg für Type-Punning -// Aber funktioniert nur für gleich große Typen - -// Für kleine Strukturen OK: -void example_bitcast() { - struct A { int x; }; - struct B { int y; }; - - A a{42}; - B b = std::bit_cast(a); // ✅ Sicher -} -#endif - -} // namespace solution1_bitcast - -// ============================================================================ -// Lösung 2: Wrapper-Klassen mit Union (für sockaddr) -// ============================================================================ - -namespace solution2_union { - -/** - * @brief Type-safe socket address wrapper - * - * Verwendet union für legales Type-Punning (seit C++11) - */ -class SocketAddress { -public: - SocketAddress() { - std::memset(&storage_, 0, sizeof(storage_)); - } - - // IPv4 - static SocketAddress createIPv4(const char* ip, uint16_t port) { - SocketAddress addr; - auto& ipv4 = addr.storage_.ipv4; - ipv4.sin_family = AF_INET; - ipv4.sin_port = htons(port); - inet_pton(AF_INET, ip, &ipv4.sin_addr); - addr.length_ = sizeof(sockaddr_in); - return addr; - } - - // IPv6 - static SocketAddress createIPv6(const char* ip, uint16_t port) { - SocketAddress addr; - auto& ipv6 = addr.storage_.ipv6; - ipv6.sin6_family = AF_INET6; - ipv6.sin6_port = htons(port); - inet_pton(AF_INET6, ip, &ipv6.sin6_addr); - addr.length_ = sizeof(sockaddr_in6); - return addr; - } - - // ✅ Sichere Konvertierung zu sockaddr* - sockaddr* get() { return &storage_.base; } - const sockaddr* get() const { return &storage_.base; } - - socklen_t length() const { return length_; } - socklen_t* length_ptr() { return &length_; } - - // Typsicherer Zugriff - bool isIPv4() const { return storage_.base.sa_family == AF_INET; } - bool isIPv6() const { return storage_.base.sa_family == AF_INET6; } - - sockaddr_in& asIPv4() { return storage_.ipv4; } - const sockaddr_in& asIPv4() const { return storage_.ipv4; } - - sockaddr_in6& asIPv6() { return storage_.ipv6; } - const sockaddr_in6& asIPv6() const { return storage_.ipv6; } - -private: - union Storage { - sockaddr base; - sockaddr_in ipv4; - sockaddr_in6 ipv6; - sockaddr_storage storage; - } storage_; - - socklen_t length_ = 0; -}; - -void example_usage() { - int sockfd = socket(AF_INET, SOCK_STREAM, 0); - - // ✅ Typsicher ohne reinterpret_cast - auto addr = SocketAddress::createIPv4("127.0.0.1", 13400); - bind(sockfd, addr.get(), addr.length()); - - // ✅ Auch bei accept - SocketAddress client_addr; - int client_fd = accept(sockfd, client_addr.get(), client_addr.length_ptr()); - - if (client_addr.isIPv4()) { - char ip[INET_ADDRSTRLEN]; - inet_ntop(AF_INET, &client_addr.asIPv4().sin_addr, ip, sizeof(ip)); - std::cout << "IPv4 client: " << ip << std::endl; - } -} - -} // namespace solution2_union - -// ============================================================================ -// Lösung 3: std::span für send/recv (C++20) -// ============================================================================ - -namespace solution3_span { - -/** - * @brief Type-safe socket send/recv wrapper - */ -class Socket { -public: - explicit Socket(int fd) : fd_(fd) {} - - // ✅ Send mit std::span - kein cast nötig - template - ssize_t send(std::span data, int flags = 0) { - static_assert(std::is_trivially_copyable_v, - "Type must be trivially copyable for socket transmission"); - - // std::span gibt uns bereits void* kompatible Daten - auto bytes = std::as_bytes(data); - return ::send(fd_, bytes.data(), bytes.size(), flags); - } - - // ✅ Recv mit std::span - template - ssize_t recv(std::span buffer, int flags = 0) { - static_assert(std::is_trivially_copyable_v, - "Type must be trivially copyable for socket transmission"); - - auto bytes = std::as_writable_bytes(buffer); - return ::recv(fd_, bytes.data(), bytes.size(), flags); - } - - // Überladungen für ByteArray/vector - ssize_t send(const std::vector& data, int flags = 0) { - return send(std::span{data}, flags); - } - - ssize_t recv(std::vector& buffer, int flags = 0) { - return recv(std::span{buffer}, flags); - } - -private: - int fd_; -}; - -void example_usage() { - Socket sock(/* fd */); - - // ✅ Kein reinterpret_cast! - std::vector data = {0x01, 0x02, 0x03, 0x04}; - sock.send(data); - - // ✅ Auch mit Arrays - std::array buffer; - sock.recv(std::span{buffer}); - - // ✅ Oder mit rohen Pointern - uint8_t raw_buffer[512]; - sock.recv(std::span{raw_buffer}); -} - -} // namespace solution3_span - -// ============================================================================ -// Lösung 4: std::byte für Byte-Buffer (C++17) -// ============================================================================ - -namespace solution4_byte { - -/** - * @brief Socket wrapper mit std::byte - */ -class Socket { -public: - explicit Socket(int fd) : fd_(fd) {} - - // ✅ std::byte ist semantisch korrekter als uint8_t für Bytes - ssize_t send(const std::byte* data, size_t size, int flags = 0) { - return ::send(fd_, data, size, flags); - } - - ssize_t recv(std::byte* data, size_t size, int flags = 0) { - return ::recv(fd_, data, size, flags); - } - - // Convenience für vector - ssize_t send(const std::vector& data, int flags = 0) { - return send(data.data(), data.size(), flags); - } - - ssize_t recv(std::vector& data, int flags = 0) { - return recv(data.data(), data.size(), flags); - } - -private: - int fd_; -}; - -void example_usage() { - Socket sock(/* fd */); - - // ✅ std::byte ist typsicherer für Rohdaten - std::vector data = { - std::byte{0x01}, std::byte{0x02}, std::byte{0x03} - }; - sock.send(data); - - // Konvertierung von/zu uint8_t wenn nötig - std::vector uint8_data = {0x01, 0x02, 0x03}; - auto byte_data = std::as_bytes(std::span{uint8_data}); - sock.send(reinterpret_cast(byte_data.data()), - byte_data.size()); -} - -} // namespace solution4_byte - -// ============================================================================ -// Lösung 5: Memcpy statt reinterpret_cast (für alte Compiler) -// ============================================================================ - -namespace solution5_memcpy { - -/** - * @brief Sichere Alternative für C++11/14/17 - * - * memcpy ist vom Standard garantiert korrekt für Type-Punning - */ -class Socket { -public: - explicit Socket(int fd) : fd_(fd) {} - - // ✅ memcpy ist sicherer als reinterpret_cast - template - ssize_t send(const T* data, size_t count, int flags = 0) { - static_assert(std::is_trivially_copyable::value, - "Type must be trivially copyable"); - - // memcpy ist vom Standard erlaubt für Type-Punning - std::vector buffer(count * sizeof(T)); - std::memcpy(buffer.data(), data, buffer.size()); - - return ::send(fd_, buffer.data(), buffer.size(), flags); - } - - // Aber für vector können wir direkten Zugriff nutzen - ssize_t sendBytes(const std::vector& data, int flags = 0) { - // ✅ Der Cast von uint8_t* zu char* ist erlaubt - return ::send(fd_, - reinterpret_cast(data.data()), - data.size(), - flags); - } -}; - -} // namespace solution5_memcpy - -// ============================================================================ -// Lösung 6: Kombinierter moderner Socket-Wrapper -// ============================================================================ - -namespace solution6_complete { - -/** - * @brief Moderne, typsichere Socket-Klasse - * - * Kombiniert alle Best Practices - */ -class Socket { -public: - Socket() : fd_(-1) {} - explicit Socket(int fd) : fd_(fd) {} - - // RAII: Automatisches Schließen - ~Socket() { close(); } - - // Move-only (kein Kopieren von File Descriptors) - Socket(const Socket&) = delete; - Socket& operator=(const Socket&) = delete; - - Socket(Socket&& other) noexcept : fd_(other.fd_) { - other.fd_ = -1; - } - - Socket& operator=(Socket&& other) noexcept { - if (this != &other) { - close(); - fd_ = other.fd_; - other.fd_ = -1; - } - return *this; - } - - // Factory-Methoden - static Socket createTCP() { - return Socket(::socket(AF_INET, SOCK_STREAM, 0)); - } - - static Socket createUDP() { - return Socket(::socket(AF_INET, SOCK_DGRAM, 0)); - } - - // Bind mit SocketAddress - bool bind(const solution2_union::SocketAddress& addr) { - return ::bind(fd_, addr.get(), addr.length()) == 0; - } - - // Connect mit SocketAddress - bool connect(const solution2_union::SocketAddress& addr) { - return ::connect(fd_, addr.get(), addr.length()) == 0; - } - - // Listen - bool listen(int backlog = 5) { - return ::listen(fd_, backlog) == 0; - } - - // Accept - Socket accept(solution2_union::SocketAddress* addr = nullptr) { - if (addr) { - return Socket(::accept(fd_, addr->get(), addr->length_ptr())); - } else { - return Socket(::accept(fd_, nullptr, nullptr)); - } - } - - // ✅ Type-safe send mit std::span (C++20) -#if __cplusplus >= 202002L - template - ssize_t send(std::span data, int flags = 0) { - static_assert(std::is_trivially_copyable_v); - auto bytes = std::as_bytes(data); - return ::send(fd_, bytes.data(), bytes.size(), flags); - } - - template - ssize_t recv(std::span buffer, int flags = 0) { - static_assert(std::is_trivially_copyable_v); - auto bytes = std::as_writable_bytes(buffer); - return ::recv(fd_, bytes.data(), bytes.size(), flags); - } -#endif - - // ✅ Send/recv für vector (C++11 kompatibel) - ssize_t send(const std::vector& data, int flags = 0) { - return ::send(fd_, - reinterpret_cast(data.data()), - data.size(), - flags); - } - - ssize_t recv(std::vector& buffer, int flags = 0) { - return ::recv(fd_, - reinterpret_cast(buffer.data()), - buffer.size(), - flags); - } - - // ✅ Raw pointer interface - ssize_t send(const void* data, size_t size, int flags = 0) { - return ::send(fd_, data, size, flags); - } - - ssize_t recv(void* buffer, size_t size, int flags = 0) { - return ::recv(fd_, buffer, size, flags); - } - - // Getter - int fd() const { return fd_; } - bool isValid() const { return fd_ >= 0; } - - void close() { - if (fd_ >= 0) { - ::close(fd_); - fd_ = -1; - } - } - -private: - int fd_; -}; - -// ============================================================================ -// Verwendungsbeispiel -// ============================================================================ - -void example_server() { - using namespace solution2_union; - - // ✅ Kein reinterpret_cast in Sicht! - auto server_socket = Socket::createTCP(); - auto addr = SocketAddress::createIPv4("0.0.0.0", 13400); - - if (!server_socket.bind(addr)) { - std::cerr << "Bind failed\n"; - return; - } - - if (!server_socket.listen()) { - std::cerr << "Listen failed\n"; - return; - } - - std::cout << "Listening on port 13400...\n"; - - SocketAddress client_addr; - auto client_socket = server_socket.accept(&client_addr); - - if (client_socket.isValid()) { - std::cout << "Client connected\n"; - - // ✅ Type-safe senden - std::vector response = {0x01, 0x02, 0x03, 0x04}; - client_socket.send(response); - - // ✅ Type-safe empfangen - std::vector buffer(1024); - ssize_t n = client_socket.recv(buffer); - if (n > 0) { - buffer.resize(n); - std::cout << "Received " << n << " bytes\n"; - } - } -} - -void example_client() { - using namespace solution2_union; - - auto socket = Socket::createTCP(); - auto addr = SocketAddress::createIPv4("127.0.0.1", 13400); - - if (socket.connect(addr)) { - std::cout << "Connected!\n"; - - // ✅ Kein reinterpret_cast - std::vector request = {0x10, 0x01}; - socket.send(request); - - std::vector response(1024); - ssize_t n = socket.recv(response); - response.resize(n); - } -} - -} // namespace solution6_complete - -// ============================================================================ -// Zusammenfassung und Best Practices -// ============================================================================ - -int main() { - std::cout << "Socket Casting Best Practices:\n\n"; - - std::cout << "1. SocketAddress Wrapper (union-based)\n"; - std::cout << " ✅ Typsicher für bind/connect/accept\n"; - std::cout << " ✅ Keine reinterpret_casts\n"; - std::cout << " ✅ C++11 kompatibel\n\n"; - - std::cout << "2. std::span für send/recv (C++20)\n"; - std::cout << " ✅ Generisch und typsicher\n"; - std::cout << " ✅ Compile-time checks\n"; - std::cout << " ✅ std::as_bytes() eliminiert Casts\n\n"; - - std::cout << "3. std::byte für Bytebuffer (C++17)\n"; - std::cout << " ✅ Semantisch korrekter als uint8_t\n"; - std::cout << " ✅ Verhindert arithmetische Operationen\n\n"; - - std::cout << "4. RAII Socket Wrapper\n"; - std::cout << " ✅ Automatisches close()\n"; - std::cout << " ✅ Move-only Semantik\n"; - std::cout << " ✅ Saubere API\n\n"; - - std::cout << "5. uint8_t* zu char* Cast\n"; - std::cout << " ✅ Dieser Cast ist vom Standard erlaubt\n"; - std::cout << " ✅ Für Legacy-Kompatibilität OK\n\n"; - - return 0; -} - -} // namespace solution6_complete From 9139ac985f191c147d92983473cda28bc7bbb368 Mon Sep 17 00:00:00 2001 From: Oliver Wieland Date: Sun, 7 Dec 2025 11:36:44 +0100 Subject: [PATCH 2/4] refactor: Remove unused Timers.md --- doc/Timers.md | 225 -------------------------------------------------- 1 file changed, 225 deletions(-) delete mode 100644 doc/Timers.md diff --git a/doc/Timers.md b/doc/Timers.md deleted file mode 100644 index 7203516..0000000 --- a/doc/Timers.md +++ /dev/null @@ -1,225 +0,0 @@ -Great question! The ISO 13400 timing mechanisms can indeed be confusing. Let me clarify the different timers and when they're used: - -## DoIP Server Timers Explained - -### 1. **T_TCP_Initial_Inactivity (default: 2 seconds)** - -**When started:** Immediately when a TCP socket connection is established (before any DoIP messages are received) - -**When stopped:** When the first valid DoIP message is received (typically a Routing Activation Request) - -**Purpose:** Protects against clients that open a TCP connection but never send anything. This is a "connection handshake timeout." - -**Action on timeout:** Close the TCP socket immediately - -**Key point:** This timer is ONLY active in the very beginning, before any DoIP communication has started. - ---- - -### 2. **T_TCP_General_Inactivity (default: 5 minutes)** - -**When started:** After a Routing Activation Response with successful activation code (0x10) is sent - -**When stopped/reset:** -- When ANY valid DoIP message is received from the client (Diagnostic Message, Alive Check Response, etc.) -- When the timer expires (not restarted, triggers alive check mechanism instead) - -**Purpose:** Detects if the client has stopped communicating after routing was successfully activated - -**Action on timeout:** Does NOT immediately close the connection! Instead, it triggers the Alive Check mechanism (see below) - -**Key point:** This is the main "keep-alive" timer during normal operation - ---- - -### 3. **T_TCP_Alive_Check (default: 500 milliseconds)** - -**When started:** -- After T_TCP_General_Inactivity expires AND the server sends an Alive Check Request -- Restarted after each retry if no response is received - -**When stopped:** When an Alive Check Response is received from the client - -**Purpose:** Gives the client a chance to prove it's still alive before closing the connection - -**Action on timeout:** -- If retry count < max retries (typically 3): Send another Alive Check Request and restart timer -- If max retries reached: Close the TCP connection - -**Key point:** This is a "last chance" mechanism before disconnecting - ---- - -## Timeline Example - -Here's a practical timeline showing when each timer is active: - -``` -Time Event Active Timer(s) ----- ----- --------------- -0ms TCP socket established T_TCP_Initial_Inactivity - [2s countdown starts] - -1500ms Routing Activation Req received T_TCP_Initial_Inactivity (stopped) - Server sends Routing Act. Res - [Routing activated] T_TCP_General_Inactivity starts - [5min countdown starts] - -10s Diagnostic Message received T_TCP_General_Inactivity (reset) - [5min countdown restarts] - -30s Another Diagnostic Msg received T_TCP_General_Inactivity (reset) - [5min countdown restarts] - -... [Client stops sending anything] ... - -5min (silence from client) T_TCP_General_Inactivity expires! -30s Server sends Alive Check Request - T_TCP_Alive_Check starts - [500ms countdown starts] - -5min (no response) T_TCP_Alive_Check timeout -30.5s Retry 1: Send Alive Check Request - T_TCP_Alive_Check restarts - -5min (no response) T_TCP_Alive_Check timeout -31s Retry 2: Send Alive Check Request - T_TCP_Alive_Check restarts - -5min Alive Check Response received! T_TCP_Alive_Check (stopped) -31.3s T_TCP_General_Inactivity (restarted) - [5min countdown restarts] - -... [normal operation continues] ... -``` - ---- - -## Alternative Scenario: Client Dies - -``` -Time Event Active Timer(s) ----- ----- --------------- -0ms TCP socket established T_TCP_Initial_Inactivity - -1500ms Routing Activation Req received T_TCP_Initial_Inactivity (stopped) - Routing activated T_TCP_General_Inactivity starts - -... [Client process crashes] ... - -5min (silence) T_TCP_General_Inactivity expires -1.5s Server sends Alive Check Request - T_TCP_Alive_Check starts - -5min (no response) T_TCP_Alive_Check timeout -2s Retry 1: Send Alive Check Request - -5min (no response) T_TCP_Alive_Check timeout -2.5s Retry 2: Send Alive Check Request - -5min (no response) T_TCP_Alive_Check timeout -3s Retry 3: Send Alive Check Request - -5min (no response) T_TCP_Alive_Check timeout -3.5s Max retries reached - **Connection closed** -``` - ---- - -## Key Differences Summary - -| Timer | Phase | Timeout Action | Can Reset? | -|-------|-------|----------------|------------| -| T_TCP_Initial_Inactivity | Before routing activation | Close immediately | No - one-shot | -| T_TCP_General_Inactivity | After routing activation | Start alive check | Yes - on any message | -| T_TCP_Alive_Check | During alive check procedure | Retry or close | Yes - per retry | - ---- - -## Corrected State Machine Code - -Here's the corrected timer logic: - -```cpp -void DoIPServerStateMachine::handleSocketInitialized( - DoIPEvent event, const DoIPMessage* msg) { - - switch (event) { - case DoIPEvent::ROUTING_ACTIVATION_RECEIVED: - // Stop initial inactivity timer - first message received! - stopTimer(TimerID::INITIAL_INACTIVITY); - // Process the routing activation... - transitionTo(DoIPState::WAIT_ROUTING_ACTIVATION); - // Note: Don't start general inactivity yet - - // wait until routing is successfully activated - break; - - case DoIPEvent::INITIAL_INACTIVITY_TIMEOUT: - // No message received within 2 seconds - close connection - transitionTo(DoIPState::FINALIZE); - break; - - default: - break; - } -} - -void DoIPServerStateMachine::handleWaitRoutingActivation( - DoIPEvent event, const DoIPMessage* msg) { - - switch (event) { - case DoIPEvent::ROUTING_ACTIVATION_RECEIVED: { - if (msg) { - uint16_t source_address = msg->getSourceAddress(); - uint8_t response_code = 0x10; // Success - - sendRoutingActivationResponse(source_address, response_code); - active_source_address_ = source_address; - - // NOW start general inactivity timer (after successful activation) - startTimer(TimerID::GENERAL_INACTIVITY, - config_.general_inactivity_timeout); - - transitionTo(DoIPState::ROUTING_ACTIVATED); - } - break; - } - - default: - break; - } -} - -void DoIPServerStateMachine::handleRoutingActivated( - DoIPEvent event, const DoIPMessage* msg) { - - switch (event) { - case DoIPEvent::DIAGNOSTIC_MESSAGE_RECEIVED: - // Any message resets the general inactivity timer - stopTimer(TimerID::GENERAL_INACTIVITY); - startTimer(TimerID::GENERAL_INACTIVITY, - config_.general_inactivity_timeout); - - // Process the diagnostic message... - if (msg) { - sendDiagnosticMessageAck(msg->getSourceAddress()); - } - break; - - case DoIPEvent::GENERAL_INACTIVITY_TIMEOUT: - // Client hasn't sent anything for 5 minutes - // Don't close yet - give it a chance with alive check - alive_check_retry_count_ = 0; - sendAliveCheckRequest(); - startTimer(TimerID::ALIVE_CHECK, config_.alive_check_timeout); - transitionTo(DoIPState::WAIT_ALIVE_CHECK_RESPONSE); - break; - - default: - break; - } -} -``` - -Does this clarify the timing mechanisms? The key insight is that **T_TCP_General_Inactivity doesn't directly close the connection** - it triggers the alive check mechanism, which gives the client multiple chances (with T_TCP_Alive_Check) before finally closing. \ No newline at end of file From da561541b8bf738ec29dc7fc52fd399b22bcb219 Mon Sep 17 00:00:00 2001 From: Oliver Wieland Date: Sun, 7 Dec 2025 12:43:59 +0100 Subject: [PATCH 3/4] doc: Add detailed server model example with down stream --- .github/workflows/ci.yml | 8 +- Doxyfile | 5 +- README.md | 34 +- doc/DOCUMENTATION.md | 166 --------- doc/ExampleDoIPServer.md | 254 +++++++++++++ doc/{LOGGING.md => Logging.md} | 23 -- doc/ServerArchitecture.md | 380 -------------------- doc/diagrams/ServerModel.puml | 44 +++ doc/diagrams/ServerModel.svg | 47 +++ doc/examples/python_ack_response_example.md | 58 +++ 10 files changed, 437 insertions(+), 582 deletions(-) delete mode 100644 doc/DOCUMENTATION.md create mode 100644 doc/ExampleDoIPServer.md rename doc/{LOGGING.md => Logging.md} (69%) delete mode 100644 doc/ServerArchitecture.md create mode 100644 doc/diagrams/ServerModel.puml create mode 100644 doc/diagrams/ServerModel.svg create mode 100644 doc/examples/python_ack_response_example.md diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3730a79..0a8f868 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -187,11 +187,17 @@ jobs: - name: Install Doxygen run: | sudo apt-get update - sudo apt-get install -y doxygen graphviz + sudo apt-get install -y doxygen graphviz plantuml default-jre - name: Generate documentation run: | doxygen --version + # Render PlantUML diagrams to SVG before running Doxygen (so Doxygen can include pre-rendered images) + for p in doc/diagrams/*.puml; do + if [ -f "$p" ]; then + plantuml -tsvg -o doc/diagrams "${p}" + fi + done doxygen Doxyfile working-directory: ${{ github.workspace }} - name: List generated docs diff --git a/Doxyfile b/Doxyfile index f30a833..2213d85 100644 --- a/Doxyfile +++ b/Doxyfile @@ -114,6 +114,7 @@ WARN_LOGFILE = #--------------------------------------------------------------------------- INPUT = inc \ src \ + doc \ README.md INPUT_ENCODING = UTF-8 INPUT_FILE_ENCODING = @@ -140,7 +141,7 @@ EXAMPLE_PATH = examples EXAMPLE_PATTERNS = *.cpp \ *.h EXAMPLE_RECURSIVE = NO -IMAGE_PATH = +IMAGE_PATH = doc/diagrams INPUT_FILTER = FILTER_PATTERNS = FILTER_SOURCE_FILES = NO @@ -307,7 +308,7 @@ DOT_PATH = DOTFILE_DIRS = DIA_PATH = DIAFILE_DIRS = -PLANTUML_JAR_PATH = +PLANTUML_JAR_PATH = /usr/share/plantuml/plantuml.jar PLANTUML_CFG_FILE = PLANTUML_INCLUDE_PATH = DOT_GRAPH_MAX_NODES = 50 diff --git a/README.md b/README.md index 2d2242e..1dddb40 100644 --- a/README.md +++ b/README.md @@ -11,9 +11,6 @@ C/C++ library for Diagnostics over IP (DoIP) (fork from https://github.com/AVL-D **CAUTION** The current API is under construction any may change at any time. - - - ## Dependencies `libdoip` uses `spdlog`. The lib is downloaded automatically. Or you may install it locally via @@ -25,18 +22,20 @@ sudo apt install libspdlog-dev See [Logging](./doc/LOGGING.md) for details. -### Building Documentation Locally +### Getting started + +Quick start — read the generated tutorial for the example server: -To generate the documentation locally: +- Online (published): https://magolves.github.io/libdoip/index.html +- Local example page: see `doc/ExampleDoIPServer.md` (included in the Doxygen HTML under "Example DoIP Server Tutorial"). +- Example tutorial (direct): https://magolves.github.io/libdoip/ExampleDoIPServer.html + +If you want to generate the docs locally, install Doxygen and Graphviz and +run: ```bash -# Install Doxygen and Graphviz sudo apt install doxygen graphviz - -# Generate documentation doxygen Doxyfile - -# Open the documentation xdg-open docs/html/index.html ``` @@ -76,7 +75,22 @@ sudo apt install doctest sudo tcpdump -i any udp port 13400 -X ``` +## Examples + +The project includes a small example DoIP server demonstrating how to +use the `DoIPServer` and `DoIPServerModel` APIs and how to register UDS +handlers. + +- Example source files: `examples/exampleDoIPServer.cpp`, + `examples/ExampleDoIPServerModel.h` +- Example tutorial (published): https://magolves.github.io/libdoip/ExampleDoIPServer.html + +See the "Examples" section in the generated Doxygen main page for +additional annotated links to these files. + + ## References + - [ISO 13400-2:2019(en) Road vehicles — Diagnostic communication over Internet Protocol (DoIP) — Part 2: Transport protocol and network layer services]() - [Specification of Diagnostic over IP]() - [Diagnostics over Internet Protocol (DoIP)]() \ No newline at end of file diff --git a/doc/DOCUMENTATION.md b/doc/DOCUMENTATION.md deleted file mode 100644 index 630ec2a..0000000 --- a/doc/DOCUMENTATION.md +++ /dev/null @@ -1,166 +0,0 @@ -# Documentation Deployment Guide - -## Overview - -The libdoip project automatically generates and publishes API documentation using Doxygen and GitHub Pages. - -## How It Works - -### 1. **Documentation Generation** -- Documentation is generated from Doxygen comments in header files (`.h`) and source files (`.cpp`) -- Configuration is defined in `Doxyfile` at the project root -- Includes class diagrams, call graphs, and inheritance diagrams using Graphviz - -### 2. **Automated Deployment (GitHub Actions)** -- **Trigger**: Every push to `main` branch -- **Workflow**: `.github/workflows/ci.yml` → `documentation` job -- **Steps**: - 1. Installs Doxygen and Graphviz - 2. Runs `doxygen Doxyfile` to generate HTML documentation - 3. Deploys to `gh-pages` branch using `peaceiris/actions-gh-pages@v3` - -### 3. **GitHub Pages Hosting** -- Documentation is automatically published at: **https://magolves.github.io/libdoip/** -- Served from the `gh-pages` branch -- Updates within minutes after push to main - -## Setup Requirements - -### Enable GitHub Pages - -1. Go to repository **Settings** → **Pages** -2. Under **Source**, select: - - Branch: `gh-pages` - - Folder: `/ (root)` -3. Click **Save** - -The documentation will be available at `https://.github.io//` - -### Permissions - -The workflow needs write permissions to create the `gh-pages` branch: -- The `ci.yml` includes `permissions: contents: write` for the documentation job -- This is automatically granted for workflows in your own repository - -## Local Documentation Generation - -To build documentation on your local machine: - -```bash -# Install dependencies -sudo apt install doxygen graphviz - -# Generate documentation -doxygen Doxyfile - -# View in browser -xdg-open docs/html/index.html -``` - -## Documentation Best Practices - -### Doxygen Comment Styles - -```cpp -/** - * @brief Short description of the function - * - * Longer description with more details about what - * this function does and how to use it. - * - * @param paramName Description of the parameter - * @return Description of return value - * @throws ExceptionType When this exception is thrown - * - * @example - * ByteArray arr = {0x01, 0x02, 0x03}; - * uint16_t value = arr.readU16BE(0); - */ -``` - -### Key Doxygen Commands - -- `@brief` - Short description (one line) -- `@param` - Parameter description -- `@return` - Return value description -- `@throws` / `@exception` - Exception documentation -- `@note` - Additional notes -- `@warning` - Important warnings -- `@example` - Code examples -- `@see` - Related items -- `@deprecated` - Mark as deprecated - -### File Header Example - -```cpp -/** - * @file ByteArray.h - * @brief Byte array utilities for network protocol handling - * - * This file provides a ByteArray type with methods for reading - * and writing multi-byte integers in big-endian format. - */ -``` - -## Maintenance - -### Updating Documentation - -Documentation updates automatically when you: -1. Add/modify Doxygen comments in code -2. Push changes to `main` branch -3. GitHub Actions builds and deploys new version - -### Configuration Changes - -To modify documentation generation: -- Edit `Doxyfile` for Doxygen settings -- Edit `.github/workflows/ci.yml` for deployment settings - -### Troubleshooting - -**Documentation not updating?** -1. Check GitHub Actions: Go to **Actions** tab -2. Look for failed `documentation` job -3. Review build logs for errors - -**404 on documentation page?** -1. Verify GitHub Pages is enabled in Settings -2. Check that `gh-pages` branch exists -3. Wait a few minutes after first push - -**Missing diagrams?** -- Ensure `HAVE_DOT = YES` in Doxyfile -- Graphviz must be installed in CI (already configured) - -## Alternative: GitHub Wiki - -While we use GitHub Pages, you can also manually upload documentation to Wiki: - -```bash -# Clone the wiki repository -git clone https://github.com/Magolves/libdoip.wiki.git - -# Copy generated documentation -cp -r docs/html/* libdoip.wiki/ - -# Commit and push -cd libdoip.wiki -git add . -git commit -m "Update documentation" -git push -``` - -**However**, GitHub Pages is recommended because: -- ✅ Fully automated -- ✅ Preserves full HTML structure and styling -- ✅ Better for large API documentation -- ✅ Supports search functionality -- ✅ Maintains versioning through git - -## Resources - -- [Doxygen Manual](https://www.doxygen.nl/manual/) -- [GitHub Pages Documentation](https://docs.github.com/en/pages) -- [Doxygen Special Commands](https://www.doxygen.nl/manual/commands.html) -- [peaceiris/actions-gh-pages](https://github.com/peaceiris/actions-gh-pages) diff --git a/doc/ExampleDoIPServer.md b/doc/ExampleDoIPServer.md new file mode 100644 index 0000000..2cb826c --- /dev/null +++ b/doc/ExampleDoIPServer.md @@ -0,0 +1,254 @@ +# Example DoIP Server Tutorial + +This page describes how to build and run the example DoIP server included +with the libdoip project, and how to customize its UDS behavior. + +## Overview + +The example server application demonstrates a minimal DoIP server using +the library's `DoIPServer`, `DoIPConnection` and `DoIPServerModel` types. +The relevant example source files are located in the `examples/` directory: + +- `examples/exampleDoIPServer.cpp` — program entry point and socket setup. +- `examples/ExampleDoIPServerModel.h` — example `DoIPServerModel` with + ready-made UDS handlers and a small worker thread that simulates a + downstream transport (e.g. CAN). + +The example shows how to: + +- Configure server properties (VIN, logical gateway address, announcement + settings). +- Open UDP and TCP sockets for DoIP announcements and diagnostic + connections. +- Register UDS handlers using the `uds::UdsMock` test helper for local + request handling. + +## Files of interest + +- `inc/DoIPServerModel.h` — contains the `DoIPServerModel` callbacks that + the application implements for connection-open, close and diagnostic + message handling. Customize these callbacks to integrate your ECU logic. +- `examples/ExampleDoIPServerModel.h` — shows a concrete `DoIPServerModel` + implementation used by the example server. UDS handlers are registered + via `uds::UdsMock` and typed helpers such as + `registerReadDataByIdentifierHandler`. +- `examples/exampleDoIPServer.cpp` — creates and configures a `DoIPServer`, + sets logging level and starts listener threads that accept TCP + connections. + +### ServerModel interface (important callbacks) + +The `DoIPServerModel` struct (see `inc/DoIPServerModel.h`) exposes a few +key callbacks your application implements. A concise summary: + +- `onOpenConnection(IConnectionContext &ctx)` — called when a new connection + is established. +- `onCloseConnection(IConnectionContext &ctx, DoIPCloseReason)` — called + during graceful/abrupt close. +- `onDiagnosticMessage(IConnectionContext &ctx, const DoIPMessage &msg)` — + called for locally-handled diagnostic messages. +- `onDownstreamRequest(IConnectionContext &ctx, const DoIPMessage &msg, + ServerModelDownstreamResponseHandler cb)` — called when the state machine + wants to forward a diagnostic request to a downstream transport (e.g. + CAN). The implementation should return `DoIPDownstreamResult::Pending` if + it will respond asynchronously and call `ctx.receiveDownstreamResponse()` + when the response arrives. + +Below is a minimal example implementation that forwards messages to a +hypothetical CAN backend and forwards the response to the connection +context. + +```cpp +// inside your DoIPServerModel setup +m_model.onOpenConnection = [](IConnectionContext &ctx) noexcept { + // Prepare per-connection state +}; + +m_model.onDownstreamRequest = [this](IConnectionContext &ctx, const DoIPMessage &msg, + ServerModelDownstreamResponseHandler cb) noexcept { + // Convert DoIP diagnostic payload to CAN frames and send + auto [payload, size] = msg.getDiagnosticMessagePayload(); + ByteArray req(payload, payload + size); + + // Simulate async send to CAN; real code would push to a queue or + // post to a worker thread that interacts with the hardware. + canTransport.sendAsync(req, [&, cb, &ctx](const ByteArray &canRsp){ + // When response arrives, notify DoIP connection + ctx.receiveDownstreamResponse(canRsp); + // Optionally call provided callback to indicate handled + if (cb) cb(canRsp, DoIPDownstreamResult::Handled); + }); + + return DoIPDownstreamResult::Pending; +}; +``` + +## Building the example + +The project uses CMake. From the repository root, run the following +commands to build the library and the examples (recommended with a clean +build directory): + +```bash +rm -rf build +mkdir build +cd build +cmake .. -DCMAKE_BUILD_TYPE=Release -DWITH_EXAMPLES=ON +cmake --build . --parallel 4 +``` + +On success the example binaries are available under `build/examples/`. + +## Running the example server + +The example executable is `exampleDoIPServer`. Run it from the build +directory, optionally enabling loopback mode (binds announcements to +127.0.0.1 instead of broadcast): + +```bash +./examples/exampleDoIPServer [--loopback] +``` + +The program will: + +- Configure the `DoIPServer` (VIN, logical address, announce interval). +- Open UDP and TCP sockets for announcements and incoming diagnostic + connections. +- Start two threads: one that polls UDP announcements and one that waits + for TCP connections and processes TCP messages. + +## Customizing UDS behavior + +The example registers default UDS services and a few typed handlers in +`ExampleDoIPServerModel`: + +- Diagnostic Session Control (`0x10`) — registered via + `m_uds.registerDiagnosticSessionControlHandler`. +- ECU Reset (`0x11`) — registered via + `m_uds.registerECUResetHandler`. +- Read Data By Identifier (`0x22`) — registered via + `m_uds.registerReadDataByIdentifierHandler`. +- Tester Present (`0x3E`) — registered via + `m_uds.registerTesterPresentHandler`. + +These typed helpers convert a raw diagnostic `ByteArray` request into +typed parameters (for example a DID or a session type) and forward the +request to the provided callback. The callback returns a pair of +`uds::UdsResponseCode` and a `ByteArray` payload. Implement your own +handlers to perform ECU-specific logic and return appropriate responses. + +Example: register a handler for ReadDataByIdentifier to respond with a +VIN value for DID `0xF190`: + +```cpp +m_uds.registerReadDataByIdentifierHandler([this](uint16_t did) { + if (did == 0xF190) { + ByteArray response = {...}; // data bytes: [DID hi, DID lo, data...] + return std::make_pair(uds::UdsResponseCode::PositiveResponse, response); + } + return std::make_pair(uds::UdsResponseCode::RequestOutOfRange, ByteArray{0x22}); +}); +``` + +## Integrating a real downstream transport + +The example uses `uds::UdsMock` to simulate downstream behavior. For a +real ECU you should implement `ServerModelDownstreamHandler` in +`DoIPServerModel::onDownstreamRequest` to forward diagnostic messages to +the physical bus (e.g., CAN) and call `ctx.receiveDownstreamResponse()` +when a response arrives. The state machine will handle timeouts and +transitions for you. + +Simple downstream handler sketch: + +```cpp +m_model.onDownstreamRequest = [this](IConnectionContext &ctx, const DoIPMessage &msg, ServerModelDownstreamResponseHandler cb) { + // send msg to CAN + // when response received: ctx.receiveDownstreamResponse(responseByteArray); + return DoIPDownstreamResult::Pending; +}; +``` + +## Diagram: ServerModel interactions + +Below is a PlantUML diagram illustrating `DoIPServer`, `DoIPConnection`, +`DoIPServerModel` and a downstream UDS/CAN backend interaction. + +[\image html ]ServerModel.svg + +For GitHub or other markdown viewers that don't process the Doxygen +directive, the SVG is also referenced directly: + +![ServerModel](diagrams/ServerModel.svg) + +## Logging and debugging tips + +- The library uses `spdlog`. Set the log level early in `main`: + +```cpp +doip::Logger::setLevel(spdlog::level::debug); +``` + +- Enable `--loopback` while testing locally to avoid network broadcast. +- If the example appears unresponsive, check that TCP sockets were + successfully created. The example logs critical errors when socket + setup fails. + +## Troubleshooting common issues + +- `exampleDoIPServer` exits immediately with critical log about sockets: + - Ensure you have sufficient privileges to bind the requested ports. + - Try running on loopback or using a system port range allowed by your + OS. + +- UDS handler not called: + - Confirm the incoming diagnostic request is parsed correctly. Use the + library logging to inspect raw message bytes. + - If using downstream forwarding, ensure `onDownstreamRequest` is set + and that the downstream transport calls back to + `IConnectionContext::receiveDownstreamResponse`. + +## Documentation / Doxygen + +If you generate documentation with Doxygen, the file `doc/ExampleDoIPServer.md` +will be picked up automatically if `DOC_DIR` or the `INPUT` setting in +`Doxyfile` includes the `doc` directory. Run: + +```bash +doxygen Doxyfile +``` + +After generation, look for the "Example DoIP Server Tutorial" page in +the generated HTML documentation. + +## Message flow and payload types + +This repository and the example server follow the DoIP payload conventions +used in the examples and tests. Important details to understand when +implementing or testing downstream forwarding: + +- Incoming diagnostic requests from the client are sent as DoIP Diagnostic + Messages (payload type 0x8001). +- Immediately after receiving a diagnostic message the DoIP server sends a + Diagnostic Ack (payload type 0x8002) back to the client. This ack is sent + regardless of whether the message will be handled locally or forwarded + downstream. The ack acknowledges receipt at the DoIP transport level. +- If the server forwards the diagnostic request to a downstream transport + (for example, CAN), it does so only for Diagnostic Messages (0x8001). +- When a downstream response arrives, the DoIP server sends that response + back to the client as a Diagnostic Message (0x8001). That means the + client may observe two DoIP messages for a single request: the + Diagnostic Ack (0x8002) and later the downstream Diagnostic Message + (0x8001) containing the actual UDS response. + +ISO 13400 describes DoIP message and payload types. The immediate ack +behaviour is consistent with a transport-level acknowledgement: the server +confirms reception on the DoIP link while the actual diagnostic response +may be pending. If you require strict timing or synchronous behaviour, do +not rely on the ack as an application-level confirmation — always await +the downstream Diagnostic Message for the functional UDS response. + +## Next steps + +- Replace `uds::UdsMock` with a real UDS stack or backend for production. +- Extend the example model with additional UDS services as needed. diff --git a/doc/LOGGING.md b/doc/Logging.md similarity index 69% rename from doc/LOGGING.md rename to doc/Logging.md index 2818c1f..68a48d1 100644 --- a/doc/LOGGING.md +++ b/doc/Logging.md @@ -73,26 +73,3 @@ Common pattern flags: - `%$` - End color range - `%v` - The actual message -## Examples - -See the `examples/loggerExample.cpp` file for a complete demonstration of logging features. - -## Integration - -The logging system is automatically initialized when first used. No manual setup is required, but you can customize the behavior using the `doip::Logger` class static methods. - -## Thread Safety - -All logging operations are thread-safe. You can safely log from multiple threads without any additional synchronization. - -## Performance - -spdlog provides excellent performance characteristics: -- Asynchronous logging support (if needed) -- Minimal overhead for disabled log levels -- Fast formatting using the fmt library -- Efficient memory usage - -## Dependencies - -The logging system automatically manages the spdlog dependency through CMake's FetchContent, so no manual installation is required. \ No newline at end of file diff --git a/doc/ServerArchitecture.md b/doc/ServerArchitecture.md deleted file mode 100644 index 9223ebe..0000000 --- a/doc/ServerArchitecture.md +++ /dev/null @@ -1,380 +0,0 @@ -# DoIP Server Architecture - -## Overview - -The `DoIPServer` class provides two distinct APIs for different use cases: - -### 1. **Low-Level API (Manual Mode)** -For advanced users who need full control over threading and connection management. - -### 2. **High-Level API (Automatic Mode)** -For most users who want simple, production-ready server functionality with minimal code. - ---- - -## High-Level API (Recommended) - -### Design Philosophy - -The high-level API follows these Linux/UNIX best practices: - -1. **Encapsulation**: All socket and thread management is internal -2. **Callback-based**: Application logic is provided via std::function callbacks -3. **Resource Management**: RAII principles - destructor ensures cleanup -4. **Thread Safety**: Atomic operations for state management -5. **Graceful Shutdown**: Proper cleanup of all resources on stop() - -### Usage Pattern - -```cpp -#include "DoIPServer.h" - -// Define your connection handler -std::optional onConnectionAccepted(DoIPConnection* conn) { - // Create a model for this connection - DoIPServerModel model; - model.serverAddress = MY_ADDRESS; - - // Set up callbacks for this connection - model.onDiagnosticMessage = [](const DoIPMessage &msg) { - // Handle diagnostic messages - return std::nullopt; // ACK - }; - - model.onCloseConnection = []() noexcept { - // Cleanup on disconnect - }; - - return model; // Accept connection - // or: return std::nullopt; // Reject connection -} - -int main() { - DoIPServer server; - - // Configure server - server.setVIN("MYVIN12345678901"); - server.setLogicalGatewayAddress(0x0028); - - // Start with automatic handling - if (!server.start(onConnectionAccepted, true)) { - return 1; - } - - // Server is now running in background threads - // Main thread can do other work or just wait - - waitForShutdownSignal(); - - // Graceful shutdown - server.stop(); - - return 0; -} -``` - -### Threading Model - -When `start()` is called, the following threads are created: - -1. **UDP Listener Thread**: Continuously processes UDP vehicle identification requests -2. **TCP Acceptor Thread**: Waits for new TCP connections -3. **Connection Handler Threads**: One per active TCP connection (detached) - -``` -┌─────────────────────────────────────────────┐ -│ Main Application Thread │ -│ - Calls server.start() │ -│ - Does application-specific work │ -│ - Calls server.stop() on shutdown │ -└─────────────────────────────────────────────┘ - │ - ┌────────────┴────────────┐ - │ │ -┌───────▼──────┐ ┌────────▼─────────┐ -│ UDP Listener │ │ TCP Acceptor │ -│ Thread │ │ Thread │ -│ │ │ │ -│ - Recv UDP │ │ - accept() │ -│ - Send VID │ │ - Invoke │ -│ response │ │ callback │ -└──────────────┘ │ - Spawn handler │ - └────────┬─────────┘ - │ - ┌─────────────┴─────────────┐ - │ │ - ┌───────▼──────┐ ┌────────▼──────┐ - │ Connection │ │ Connection │ - │ Handler 1 │ ... │ Handler N │ - │ │ │ │ - │ - Recv DoIP │ │ - Recv DoIP │ - │ - Call model │ │ - Call model │ - │ callbacks │ │ callbacks │ - └──────────────┘ └───────────────┘ -``` - -### Connection Lifecycle - -``` -[New TCP Connection] - │ - ├─> TCP Acceptor accepts connection - │ - ├─> Creates DoIPConnection object - │ - ├─> Invokes onConnectionAccepted(connection) - │ │ - │ ├─> Application returns DoIPServerModel (accept) - │ │ or std::nullopt (reject) - │ │ - ├─> If accepted: setServerModel(model) - │ - ├─> Spawn dedicated connection handler thread - │ │ - │ ├─> while (active) { receiveTcpMessage() } - │ │ - │ ├─> Connection closes - │ │ - │ └─> Thread exits, unique_ptr destroys connection - │ - └─> TCP Acceptor continues waiting for next connection -``` - -### Error Handling - -The high-level API handles errors gracefully: - -- **Socket errors**: Logged and retried (with backoff for accept failures) -- **Connection drops**: Handler thread exits, resources cleaned up -- **Shutdown during operation**: All threads notified via m_running flag -- **Failed start()**: Returns false, all resources cleaned up - -### Resource Management - -```cpp -DoIPServer::~DoIPServer() { - if (m_running.load()) { - stop(); // Automatic cleanup on destruction - } -} - -void DoIPServer::stop() { - m_running.store(false); // Signal all threads to stop - closeUdpSocket(); // Unblock recv calls - closeTcpSocket(); // Unblock accept calls - - for (auto &thread : m_workerThreads) { - if (thread.joinable()) { - thread.join(); // Wait for clean exit - } - } - // All threads stopped, sockets closed -} -``` - ---- - -## Low-Level API (Advanced Users) - -### When to Use - -Use the low-level API when you need: -- Custom threading models -- Integration with existing event loops -- Fine-grained control over connection acceptance -- Custom timeout handling - -### Usage Pattern - -```cpp -DoIPServer server; -server.setupTcpSocket(); -server.setupUdpSocket(); - -// You manage the threading -std::thread udpThread([&]() { - while (running) { - server.receiveUdpMessage(); - } -}); - -std::thread tcpThread([&]() { - server.setupTcpSocket(); - while (running) { - auto connection = server.waitForTcpConnection(); - if (connection) { - // You manage the connection lifecycle - DoIPServerModel model = createModel(); - connection->setServerModel(model); - - while (connection->isSocketActive()) { - connection->receiveTcpMessage(); - } - } - } -}); -``` - ---- - -## Callback Interface: DoIPServerModel - -Each connection is configured with a `DoIPServerModel` that defines its behavior: - -```cpp -struct DoIPServerModel { - // Required: Server's logical address - DoIPAddress serverAddress; - - // Optional callbacks: - CloseConnectionHandler onCloseConnection; - DiagnosticMessageHandler onDiagnosticMessage; - DiagnosticNotificationHandler onDiagnosticNotification; -}; -``` - -### Callback Signatures - -```cpp -// Called when connection closes -using CloseConnectionHandler = std::function; - -// Called when diagnostic message arrives -// Return std::nullopt for ACK, or DoIPNegativeDiagnosticAck for NACK -using DiagnosticMessageHandler = - std::function; - -// Called after sending diagnostic ACK/NACK -using DiagnosticNotificationHandler = - std::function; -``` - ---- - -## Performance Considerations - -### Thread Pooling vs Thread-per-Connection - -The current implementation uses **thread-per-connection** (detached threads): - -**Pros:** -- Simple, clean code -- Excellent for low-to-moderate connection counts (<100) -- No complex synchronization between connections -- Each connection has dedicated CPU time - -**Cons:** -- Does not scale to thousands of connections -- Small overhead per thread - -**Future Enhancement:** -For high-scale deployments, a thread pool could be added: - -```cpp -// Potential future API -server.start(onConnectionAccepted, - /*sendAnnouncements=*/true, - /*workerThreads=*/4); // Thread pool size -``` - -### Memory Usage - -Per active connection: -- DoIPConnection object: ~256 bytes -- Thread stack: 2-8 MB (OS dependent) -- TCP buffers: ~4 KB (receive buffer) - -For 10 concurrent connections: ~25 MB - ---- - -## Signal Handling - -The high-level API is designed to work with POSIX signals: - -```cpp -static std::atomic g_shutdown{false}; - -void signalHandler(int sig) { - g_shutdown.store(true); -} - -int main() { - signal(SIGINT, signalHandler); - signal(SIGTERM, signalHandler); - - server.start(onConnectionAccepted); - - while (!g_shutdown.load()) { - std::this_thread::sleep_for(100ms); - } - - server.stop(); // Clean shutdown -} -``` - ---- - -## Comparison with Other Patterns - -### vs. libevent/libev (Event Loop) - -**Event Loop:** -```cpp -// Pseudo-code -while (running) { - events = epoll_wait(epollfd, ...); - for (event : events) { - handle(event); - } -} -``` - -**DoIPServer High-Level API:** -```cpp -server.start(onConnectionAccepted); -// That's it! -``` - -**Trade-off:** Event loops are more scalable but require significant boilerplate. DoIPServer prioritizes simplicity for typical automotive use cases (<100 connections). - -### vs. Boost.Asio (Async I/O) - -**Boost.Asio:** -```cpp -async_accept(socket, [](error_code ec, socket s) { - async_read(s, buffer, [](error_code ec, size_t n) { - // nested callbacks... - }); -}); -io_context.run(); -``` - -**DoIPServer:** -```cpp -model.onDiagnosticMessage = [](const DoIPMessage &msg) { - // synchronous, clean callback -}; -server.start(onConnectionAccepted); -``` - -**Trade-off:** Asio is more powerful but complex. DoIPServer uses synchronous I/O with threads for simplicity. - ---- - -## Best Practices - -1. **Always call stop() before destruction** (or rely on RAII) -2. **Keep callbacks fast** - they run on connection threads -3. **Use atomic/mutex for shared state** accessed from callbacks -4. **Return std::nullopt from onConnectionAccepted** to rate-limit connections -5. **Set reasonable timeouts** in socket operations -6. **Handle exceptions in callbacks** - they're on background threads - ---- - -## Examples - -See: -- `examples/exampleDoIPServerSimple.cpp` - High-level API usage -- `examples/exampleDoIPServer.cpp` - Low-level API usage (manual mode) diff --git a/doc/diagrams/ServerModel.puml b/doc/diagrams/ServerModel.puml new file mode 100644 index 0000000..e19a363 --- /dev/null +++ b/doc/diagrams/ServerModel.puml @@ -0,0 +1,44 @@ +@startuml +title DoIP ServerModel Overview + +actor Client +participant "DoIPServer" as Server +participant "DoIPConnection" as Connection +participant "DoIPServerModel" as Model +participant "UDS Backend / CAN" as Backend + +' Notes: +' - Client sends Diagnostic Request (payload type 0x8001) +' - Server sends immediate Diagnostic Ack (payload type 0x8002) after receiving the message +' - If downstream forwarding occurs, the downstream response is sent as a Diagnostic Message (0x8001) back to the client + +Client -> Server: TCP connect +Server -> Connection: createConnection(ctx) +Connection -> Model: onOpenConnection(ctx) + +Client -> Server : Routing Activation Request (0x0004) +Server -> Connection: Routing Activation Request (0x0004) +Connection -> Model: onRoutingActivationRequest(ctx, msg, callback) +Model -> Connection: invoke callback with Routing Activation Response +Connection -> Client: Routing Activation Response (0x0005) + +' -- Incoming diagnostic message (payload type 0x8001) +Client -> Connection: Diagnostic Message (0x8001) + +' -- Server sends immediate Diagnostic Ack (0x8002) +Connection -> Client: Diagnostic Ack (0x8002) + +' -- If server forwards to downstream (only for 0x8001): +alt downstream forwarding + Connection -> Model: onDownstreamRequest(ctx, msg, callback) + Model -> Backend: forward diagnostic payload (CAN) + Backend -> Model: downstream response (CAN) + Model -> Connection: invoke callback with downstream response + ' The downstream response is sent back to the client as a Diagnostic Message (0x8001) + Connection -> Client: Diagnostic Message (0x8001) [downstream response] +end + +' -- Final notification callback to application +Connection -> Model: onDiagnosticNotification(ctx, ack) + +@enduml diff --git a/doc/diagrams/ServerModel.svg b/doc/diagrams/ServerModel.svg new file mode 100644 index 0000000..d231474 --- /dev/null +++ b/doc/diagrams/ServerModel.svg @@ -0,0 +1,47 @@ +DoIP ServerModel OverviewClientClientDoIPServerDoIPServerDoIPConnectionDoIPConnectionDoIPServerModelDoIPServerModelUDS Backend / CANUDS Backend / CANTCP connectcreateConnection(ctx)onOpenConnection(ctx)Routing Activation Request (0x0004)Routing Activation Request (0x0004)onRoutingActivationRequest(ctx, msg, callback)invoke callback with Routing Activation ResponseRouting Activation Response (0x0005)Diagnostic Message (0x8001)Diagnostic Ack (0x8002)alt[downstream forwarding]onDownstreamRequest(ctx, msg, callback)forward diagnostic payload (CAN)downstream response (CAN)invoke callback with downstream responseDiagnostic Message (0x8001) [downstream response]onDiagnosticNotification(ctx, ack) \ No newline at end of file diff --git a/doc/examples/python_ack_response_example.md b/doc/examples/python_ack_response_example.md new file mode 100644 index 0000000..79f8314 --- /dev/null +++ b/doc/examples/python_ack_response_example.md @@ -0,0 +1,58 @@ +# Python example: handling DoIP ack vs downstream response + +This short example shows how a DoIP/UDS client should treat the transport-level +Diagnostic Ack (payload type 0x8002) and the functional UDS response which +arrives later as a Diagnostic Message (payload type 0x8001). + +The `change-vin-and-reset.py` script in `test/scripts/` already demonstrates +an end-to-end flow: it sends UDS requests and waits for functional responses. + +Key points for client implementers: + +- The DoIP server sends an immediate Diagnostic Ack (0x8002) after receiving + a Diagnostic Message (0x8001). This confirms transport reception only. +- The functional UDS response may arrive later as another Diagnostic Message + (0x8001). The client must wait for that message to obtain the service + result. +- When using `udsoncan`, the library abstracts away DoIP transport details. + If you implement a custom connector, ensure you forward both the ack and + subsequent response frames appropriately. + +Minimal pseudo-code (conceptual): + +```python +# Using doipclient + udsoncan +from doipclient import DoIPClient +from doipclient.connectors import DoIPClientUDSConnector +from udsoncan.client import Client + +client = DoIPClient('127.0.0.1', 0x00E0) +conn = DoIPClientUDSConnector(client) + +with Client(conn, request_timeout=2) as u: + # change session -> server will ack on transport, then send response + resp = u.change_session(0x01) + # udsoncan waits for the real UDS response; transport ACK is handled internally + print('Session change response:', resp) +``` + +If you handle sockets yourself, inspect packet payload types: treat 0x8002 +as transport-level ack and do not consider it the functional response. + +```python +# Pseudocode for low-level handling +sock = setup_doip_socket() +while True: + pkt = sock.recv() + payload_type = parse_payload_type(pkt) + if payload_type == 0x8002: + # transport ack - ignore for UDS result + continue + if payload_type == 0x8001: + # functional UDS response - process + handle_uds_response(pkt) +``` + +For completeness, see `test/scripts/change-vin-and-reset.py` which performs a +full read/write VIN and ECU reset sequence using `udsoncan` with the DoIP +connector. From 990aa1500343735e41c0d3c4f6e74da72ce773fe Mon Sep 17 00:00:00 2001 From: Oliver Wieland Date: Sun, 7 Dec 2025 12:48:21 +0100 Subject: [PATCH 4/4] refactor: Rename logging macros, e. g. DOIP_LOG_X -> LOG_DOIP_X --- doc/LOGGING.md | 75 ++++++++++++++++++++++++++++ doc/Logging.md | 16 +++--- examples/ExampleDoIPServerModel.h | 2 +- examples/exampleDoIPClient.cpp | 12 ++--- examples/exampleDoIPServer.cpp | 18 +++---- examples/exampleDoIPServerSimple.cpp | 8 +-- inc/DoIPServer.h | 20 ++++---- inc/DoIPServerModel.h | 4 +- inc/Logger.h | 60 +++++++++++----------- src/DoIPClient.cpp | 70 +++++++++++++------------- src/DoIPConnection.cpp | 24 ++++----- src/DoIPDefaultConnection.cpp | 54 ++++++++++---------- src/DoIPServer.cpp | 66 ++++++++++++------------ 13 files changed, 252 insertions(+), 177 deletions(-) create mode 100644 doc/LOGGING.md diff --git a/doc/LOGGING.md b/doc/LOGGING.md new file mode 100644 index 0000000..2ab0acb --- /dev/null +++ b/doc/LOGGING.md @@ -0,0 +1,75 @@ +# Logging in libdoip + +This library uses [spdlog](https://github.com/gabime/spdlog) for high-performance logging. + +## Features + +- **High Performance**: spdlog is one of the fastest C++ logging libraries +- **Thread Safe**: All logging operations are thread-safe +- **Multiple Log Levels**: TRACE, DEBUG, INFO, WARN, ERROR, CRITICAL +- **Formatted Output**: Support for fmt-style formatting +- **Configurable Patterns**: Customize log message format +- **Color Support**: Colored console output for better readability + +## Usage + +### Basic Logging + +```cpp +#include "Logger.h" + +// Different log levels +LOG_DOIP_TRACE("Detailed trace information"); +LOG_DOIP_DEBUG("Debug information"); +LOG_DOIP_INFO("General information"); +LOG_DOIP_WARN("Warning message"); +LOG_DOIP_ERROR("Error occurred"); +LOG_DOIP_CRITICAL("Critical error"); +``` + +### Formatted Logging + +```cpp +#include "Logger.h" + +int port = 13400; +std::string interface = "eth0"; +LOG_DOIP_INFO("DoIP server starting on interface '{}' port {}", interface, port); + +// Works with any type that supports fmt formatting +auto timestamp = std::chrono::system_clock::now(); +LOG_DOIP_DEBUG("Connection established at {}", timestamp); +``` + +### Configuration + +```cpp +#include "Logger.h" + +// Set log level (only messages at this level or higher will be shown) +doip::Logger::setLevel(spdlog::level::debug); + +// Set custom pattern +doip::Logger::setPattern("[%H:%M:%S] [%^%l%$] %v"); + +// Available levels: trace, debug, info, warn, err, critical, off +``` + +### Pattern Format + +The default pattern is: `[%Y-%m-%d %H:%M:%S.%e] [%n] [%^%l%$] %v` + +Common pattern flags: +- `%Y` - Year (4 digits) +- `%m` - Month (01-12) +- `%d` - Day (01-31) +- `%H` - Hour (00-23) +- `%M` - Minute (00-59) +- `%S` - Second (00-59) +- `%e` - Milliseconds (000-999) +- `%n` - Logger name +- `%l` - Log level +- `%^` - Start color range +- `%$` - End color range +- `%v` - The actual message + diff --git a/doc/Logging.md b/doc/Logging.md index 68a48d1..2ab0acb 100644 --- a/doc/Logging.md +++ b/doc/Logging.md @@ -19,12 +19,12 @@ This library uses [spdlog](https://github.com/gabime/spdlog) for high-performanc #include "Logger.h" // Different log levels -DOIP_LOG_TRACE("Detailed trace information"); -DOIP_LOG_DEBUG("Debug information"); -DOIP_LOG_INFO("General information"); -DOIP_LOG_WARN("Warning message"); -DOIP_LOG_ERROR("Error occurred"); -DOIP_LOG_CRITICAL("Critical error"); +LOG_DOIP_TRACE("Detailed trace information"); +LOG_DOIP_DEBUG("Debug information"); +LOG_DOIP_INFO("General information"); +LOG_DOIP_WARN("Warning message"); +LOG_DOIP_ERROR("Error occurred"); +LOG_DOIP_CRITICAL("Critical error"); ``` ### Formatted Logging @@ -34,11 +34,11 @@ DOIP_LOG_CRITICAL("Critical error"); int port = 13400; std::string interface = "eth0"; -DOIP_LOG_INFO("DoIP server starting on interface '{}' port {}", interface, port); +LOG_DOIP_INFO("DoIP server starting on interface '{}' port {}", interface, port); // Works with any type that supports fmt formatting auto timestamp = std::chrono::system_clock::now(); -DOIP_LOG_DEBUG("Connection established at {}", timestamp); +LOG_DOIP_DEBUG("Connection established at {}", timestamp); ``` ### Configuration diff --git a/examples/ExampleDoIPServerModel.h b/examples/ExampleDoIPServerModel.h index 9e4a0c2..abb065a 100644 --- a/examples/ExampleDoIPServerModel.h +++ b/examples/ExampleDoIPServerModel.h @@ -23,7 +23,7 @@ class ExampleDoIPServerModel : public DoIPServerModel { onCloseConnection = [this](IConnectionContext &ctx, DoIPCloseReason reason) noexcept { (void)ctx; stopWorker(); - DOIP_LOG_WARN("Connection closed ({})", fmt::streamed(reason)); + LOG_DOIP_WARN("Connection closed ({})", fmt::streamed(reason)); }; onDiagnosticMessage = [this](IConnectionContext &ctx, const DoIPMessage &msg) noexcept -> DoIPDiagnosticAck { diff --git a/examples/exampleDoIPClient.cpp b/examples/exampleDoIPClient.cpp index 6955dc3..75e1deb 100644 --- a/examples/exampleDoIPClient.cpp +++ b/examples/exampleDoIPClient.cpp @@ -27,10 +27,10 @@ int main(int argc, char *argv[]) { string arg = argv[i]; if (arg == "--loopback") { serverAddress = "127.0.0.1"; - DOIP_LOG_INFO("Loopback mode enabled - using 127.0.0.1"); + LOG_DOIP_INFO("Loopback mode enabled - using 127.0.0.1"); } else if (arg == "--server" && i + 1 < argc) { serverAddress = argv[++i]; - DOIP_LOG_INFO("Using custom server address: {}", serverAddress); + LOG_DOIP_INFO("Using custom server address: {}", serverAddress); } else if (arg == "--help") { printUsage(argv[0]); return 0; @@ -41,24 +41,24 @@ int main(int argc, char *argv[]) { } } - DOIP_LOG_INFO("Starting DoIP Client"); + LOG_DOIP_INFO("Starting DoIP Client"); // Start UDP connections (don't start TCP yet) client.startUdpConnection(); client.startAnnouncementListener(); // Listen for Vehicle Announcements on port 13401 // Listen for Vehicle Announcements first - DOIP_LOG_INFO("Listening for Vehicle Announcements..."); + LOG_DOIP_INFO("Listening for Vehicle Announcements..."); client.receiveVehicleAnnouncement(); // Send Vehicle Identification Request to configured address if (client.sendVehicleIdentificationRequest(serverAddress.c_str()) > 0) { - DOIP_LOG_INFO("Vehicle Identification Request sent successfully"); + LOG_DOIP_INFO("Vehicle Identification Request sent successfully"); client.receiveUdpMessage(); } // Now start TCP connection for diagnostic communication - DOIP_LOG_INFO("Starting TCP connection for diagnostic messages"); + LOG_DOIP_INFO("Starting TCP connection for diagnostic messages"); client.startTcpConnection(); if (client.sendRoutingActivationRequest() < 0) { diff --git a/examples/exampleDoIPServer.cpp b/examples/exampleDoIPServer.cpp index 582f964..24c8a8a 100644 --- a/examples/exampleDoIPServer.cpp +++ b/examples/exampleDoIPServer.cpp @@ -28,7 +28,7 @@ void listenTcp(); * Check permantly if udp message was received */ void listenUdp() { - UDP_LOG_INFO("UDP listener thread started"); + LOG_UDP_INFO("UDP listener thread started"); while (serverActive) { ssize_t result = server.receiveUdpMessage(); // If timeout (result == 0), sleep briefly to prevent CPU spinning @@ -42,7 +42,7 @@ void listenUdp() { * Check permantly if tcp message was received */ void listenTcp() { - UDP_LOG_INFO("TCP listener thread started"); + LOG_UDP_INFO("TCP listener thread started"); while (true) { tcpConnection = server.waitForTcpConnection(); @@ -85,7 +85,7 @@ int main(int argc, char *argv[]) { string arg = argv[i]; if (arg == "--loopback") { useLoopback = true; - DOIP_LOG_INFO("Loopback mode enabled"); + LOG_DOIP_INFO("Loopback mode enabled"); } else if (arg == "--help") { printUsage(argv[0]); return 0; @@ -98,7 +98,7 @@ int main(int argc, char *argv[]) { // Configure logging doip::Logger::setLevel(spdlog::level::debug); - DOIP_LOG_INFO("Starting DoIP Server Example"); + LOG_DOIP_INFO("Starting DoIP Server Example"); ConfigureDoipServer(); @@ -108,25 +108,25 @@ int main(int argc, char *argv[]) { } if (!server.setupUdpSocket()) { - DOIP_LOG_CRITICAL("Failed to set up UDP socket"); + LOG_DOIP_CRITICAL("Failed to set up UDP socket"); return 1; } if (!server.setupTcpSocket()) { - DOIP_LOG_CRITICAL("Failed to set up TCP socket"); + LOG_DOIP_CRITICAL("Failed to set up TCP socket"); return 1; } serverActive = true; - DOIP_LOG_INFO("Starting UDP and TCP listener threads"); + LOG_DOIP_INFO("Starting UDP and TCP listener threads"); doipReceiver.push_back(thread(&listenUdp)); doipReceiver.push_back(thread(&listenTcp)); server.sendVehicleAnnouncement(); - DOIP_LOG_INFO("Vehicle announcement sent"); + LOG_DOIP_INFO("Vehicle announcement sent"); doipReceiver.at(0).join(); doipReceiver.at(1).join(); - DOIP_LOG_INFO("DoIP Server Example terminated"); + LOG_DOIP_INFO("DoIP Server Example terminated"); return 0; } diff --git a/examples/exampleDoIPServerSimple.cpp b/examples/exampleDoIPServerSimple.cpp index 2ea9e0a..4e04e04 100644 --- a/examples/exampleDoIPServerSimple.cpp +++ b/examples/exampleDoIPServerSimple.cpp @@ -111,7 +111,7 @@ int main(int argc, char *argv[]) { // Configure logging doip::Logger::setLevel(spdlog::level::info); - DOIP_LOG_INFO("Starting Simple DoIP Server Example"); + LOG_DOIP_INFO("Starting Simple DoIP Server Example"); DoIPServer server; configureServer(server); @@ -122,11 +122,11 @@ int main(int argc, char *argv[]) { // Start the server with automatic connection handling if (!server.start(onConnectionAccepted, true)) { - DOIP_LOG_ERROR("Failed to start server"); + LOG_DOIP_ERROR("Failed to start server"); return 1; } - DOIP_LOG_INFO("Server is running. Press Ctrl+C to stop."); + LOG_DOIP_INFO("Server is running. Press Ctrl+C to stop."); // Main thread just waits for shutdown signal while (!g_shutdownRequested.load()) { @@ -135,7 +135,7 @@ int main(int argc, char *argv[]) { // Graceful shutdown server.stop(); - DOIP_LOG_INFO("Server terminated cleanly"); + LOG_DOIP_INFO("Server terminated cleanly"); return 0; } diff --git a/inc/DoIPServer.h b/inc/DoIPServer.h index 6399cd6..890b93a 100644 --- a/inc/DoIPServer.h +++ b/inc/DoIPServer.h @@ -193,7 +193,7 @@ std::unique_ptr DoIPServer::waitForTcpConnection() { // model.onDiagnosticMessage = [](IConnectionContext& ctx, const DoIPMessage &msg) noexcept -> DoIPDiagnosticAck { // (void)ctx; // (void)msg; - // DOIP_LOG_CRITICAL("Diagnostic message received on default-constructed Model"); + // LOG_DOIP_CRITICAL("Diagnostic message received on default-constructed Model"); // // Default: always ACK // return std::nullopt; // }; @@ -207,14 +207,14 @@ std::unique_ptr DoIPServer::waitForTcpConnection() { */ template void DoIPServer::tcpListenerThread() { - DOIP_LOG_INFO("TCP listener thread started"); + LOG_DOIP_INFO("TCP listener thread started"); while (m_running.load()) { auto connection = waitForTcpConnection(); if (!connection) { if (m_running.load()) { - TCP_LOG_DEBUG("Failed to accept connection, retrying..."); + LOG_TCP_DEBUG("Failed to accept connection, retrying..."); std::this_thread::sleep_for(std::chrono::milliseconds(100)); } continue; @@ -225,7 +225,7 @@ void DoIPServer::tcpListenerThread() { std::thread(&DoIPServer::connectionHandlerThread, this, std::move(connection)).detach(); } - DOIP_LOG_INFO("TCP listener thread stopped"); + LOG_DOIP_INFO("TCP listener thread stopped"); } /* @@ -234,12 +234,12 @@ void DoIPServer::tcpListenerThread() { template bool DoIPServer::start(ConnectionAcceptedHandler onConnectionAccepted, bool sendAnnouncements) { if (m_running.load()) { - DOIP_LOG_WARN("Server is already running"); + LOG_DOIP_WARN("Server is already running"); return false; } if (!onConnectionAccepted) { - DOIP_LOG_ERROR("Connection handler callback is required"); + LOG_DOIP_ERROR("Connection handler callback is required"); return false; } @@ -247,13 +247,13 @@ bool DoIPServer::start(ConnectionAcceptedHandler onConnectionAccepted, bool send // Setup sockets if (!setupUdpSocket()) { - DOIP_LOG_ERROR("Failed to setup UDP socket"); + LOG_DOIP_ERROR("Failed to setup UDP socket"); return false; } if (setupTcpSocket()) { - DOIP_LOG_ERROR("Failed to setup TCP socket"); + LOG_DOIP_ERROR("Failed to setup TCP socket"); closeUdpSocket(); return false; } @@ -265,7 +265,7 @@ bool DoIPServer::start(ConnectionAcceptedHandler onConnectionAccepted, bool send m_workerThreads.emplace_back(&DoIPServer::udpListenerThread, this); m_workerThreads.emplace_back(&DoIPServer::tcpListenerThread, this); - DOIP_LOG_INFO("DoIP Server started successfully"); + LOG_DOIP_INFO("DoIP Server started successfully"); // Send vehicle announcements if requested if (sendAnnouncements) { @@ -274,7 +274,7 @@ bool DoIPServer::start(ConnectionAcceptedHandler onConnectionAccepted, bool send return true; } catch (const std::exception &e) { - DOIP_LOG_ERROR("Failed to start worker threads: {}", e.what()); + LOG_DOIP_ERROR("Failed to start worker threads: {}", e.what()); m_running.store(false); closeUdpSocket(); closeTcpSocket(); diff --git a/inc/DoIPServerModel.h b/inc/DoIPServerModel.h index f4d5899..0d0a72a 100644 --- a/inc/DoIPServerModel.h +++ b/inc/DoIPServerModel.h @@ -123,7 +123,7 @@ struct DefaultDoIPServerModel : public DoIPServerModel { onDiagnosticMessage = [](IConnectionContext &ctx, const DoIPMessage &msg) noexcept -> DoIPDiagnosticAck { (void)ctx; (void)msg; - DOIP_LOG_DEBUG("Diagnostic message received on DefaultDoIPServerModel"); + LOG_DOIP_DEBUG("Diagnostic message received on DefaultDoIPServerModel"); // Default: always ACK return std::nullopt; }; @@ -131,7 +131,7 @@ struct DefaultDoIPServerModel : public DoIPServerModel { onDiagnosticNotification = [](IConnectionContext &ctx, DoIPDiagnosticAck ack) noexcept { (void)ctx; (void)ack; - DOIP_LOG_DEBUG("Diagnostic notification on DefaultDoIPServerModel"); + LOG_DOIP_DEBUG("Diagnostic notification on DefaultDoIPServerModel"); // Default no-op }; diff --git a/inc/Logger.h b/inc/Logger.h index d34d037..3313223 100644 --- a/inc/Logger.h +++ b/inc/Logger.h @@ -121,58 +121,58 @@ class Logger { } // namespace doip // Logging macros -#define DOIP_LOG_TRACE(...) doip::Logger::get()->trace(__VA_ARGS__) -#define DOIP_LOG_DEBUG(...) doip::Logger::get()->debug(__VA_ARGS__) -#define DOIP_LOG_INFO(...) doip::Logger::get()->info(__VA_ARGS__) -#define DOIP_LOG_WARN(...) doip::Logger::get()->warn(__VA_ARGS__) -#define DOIP_LOG_ERROR(...) doip::Logger::get()->error(__VA_ARGS__) -#define DOIP_LOG_CRITICAL(...) doip::Logger::get()->critical(__VA_ARGS__) +#define LOG_DOIP_TRACE(...) doip::Logger::get()->trace(__VA_ARGS__) +#define LOG_DOIP_DEBUG(...) doip::Logger::get()->debug(__VA_ARGS__) +#define LOG_DOIP_INFO(...) doip::Logger::get()->info(__VA_ARGS__) +#define LOG_DOIP_WARN(...) doip::Logger::get()->warn(__VA_ARGS__) +#define LOG_DOIP_ERROR(...) doip::Logger::get()->error(__VA_ARGS__) +#define LOG_DOIP_CRITICAL(...) doip::Logger::get()->critical(__VA_ARGS__) // Logging macros for UDP socket -#define UDP_LOG_TRACE(...) doip::Logger::getUdp()->trace(__VA_ARGS__) -#define UDP_LOG_DEBUG(...) doip::Logger::getUdp()->debug(__VA_ARGS__) -#define UDP_LOG_INFO(...) doip::Logger::getUdp()->info(__VA_ARGS__) -#define UDP_LOG_WARN(...) doip::Logger::getUdp()->warn(__VA_ARGS__) -#define UDP_LOG_ERROR(...) doip::Logger::getUdp()->error(__VA_ARGS__) -#define UDP_LOG_CRITICAL(...) doip::Logger::getUdp()->critical(__VA_ARGS__) +#define LOG_UDP_TRACE(...) doip::Logger::getUdp()->trace(__VA_ARGS__) +#define LOG_UDP_DEBUG(...) doip::Logger::getUdp()->debug(__VA_ARGS__) +#define LOG_UDP_INFO(...) doip::Logger::getUdp()->info(__VA_ARGS__) +#define LOG_UDP_WARN(...) doip::Logger::getUdp()->warn(__VA_ARGS__) +#define LOG_UDP_ERROR(...) doip::Logger::getUdp()->error(__VA_ARGS__) +#define LOG_UDP_CRITICAL(...) doip::Logger::getUdp()->critical(__VA_ARGS__) // Logging macros for TCP socket -#define TCP_LOG_TRACE(...) doip::Logger::getTcp()->trace(__VA_ARGS__) -#define TCP_LOG_DEBUG(...) doip::Logger::getTcp()->debug(__VA_ARGS__) -#define TCP_LOG_INFO(...) doip::Logger::getTcp()->info(__VA_ARGS__) -#define TCP_LOG_WARN(...) doip::Logger::getTcp()->warn(__VA_ARGS__) -#define TCP_LOG_ERROR(...) doip::Logger::getTcp()->error(__VA_ARGS__) -#define TCP_LOG_CRITICAL(...) doip::Logger::getTcp()->critical(__VA_ARGS__) +#define LOG_TCP_TRACE(...) doip::Logger::getTcp()->trace(__VA_ARGS__) +#define LOG_TCP_DEBUG(...) doip::Logger::getTcp()->debug(__VA_ARGS__) +#define LOG_TCP_INFO(...) doip::Logger::getTcp()->info(__VA_ARGS__) +#define LOG_TCP_WARN(...) doip::Logger::getTcp()->warn(__VA_ARGS__) +#define LOG_TCP_ERROR(...) doip::Logger::getTcp()->error(__VA_ARGS__) +#define LOG_TCP_CRITICAL(...) doip::Logger::getTcp()->critical(__VA_ARGS__) // Colored logging macros -#define DOIP_LOG_SUCCESS(...) \ +#define LOG_DOIP_SUCCESS(...) \ doip::Logger::get()->info(std::string(doip::ansi::bold_green) + fmt::format(__VA_ARGS__) + doip::ansi::reset) -#define DOIP_LOG_ERROR_COLORED(...) \ +#define LOG_DOIP_ERROR_COLORED(...) \ doip::Logger::get()->error(std::string(doip::ansi::bold_red) + fmt::format(__VA_ARGS__) + doip::ansi::reset) -#define DOIP_LOG_PROTOCOL(...) \ +#define LOG_DOIP_PROTOCOL(...) \ doip::Logger::get()->info(std::string(doip::ansi::bold_blue) + fmt::format(__VA_ARGS__) + doip::ansi::reset) -#define DOIP_LOG_CONNECTION(...) \ +#define LOG_DOIP_CONNECTION(...) \ doip::Logger::get()->info(std::string(doip::ansi::bold_magenta) + fmt::format(__VA_ARGS__) + doip::ansi::reset) -#define DOIP_LOG_HIGHLIGHT(...) \ +#define LOG_DOIP_HIGHLIGHT(...) \ doip::Logger::get()->info(std::string(doip::ansi::bold_cyan) + fmt::format(__VA_ARGS__) + doip::ansi::reset) // Convenience macros for types with stream operators (using fmt::streamed) // These automatically wrap arguments with fmt::streamed() for seamless logging of DoIP types -#define DOIP_LOG_STREAM_INFO(obj, ...) DOIP_LOG_INFO(fmt::format("{} " __VA_ARGS__, fmt::streamed(obj))) -#define DOIP_LOG_STREAM_DEBUG(obj, ...) DOIP_LOG_DEBUG(fmt::format("{} " __VA_ARGS__, fmt::streamed(obj))) -#define DOIP_LOG_STREAM_WARN(obj, ...) DOIP_LOG_WARN(fmt::format("{} " __VA_ARGS__, fmt::streamed(obj))) -#define DOIP_LOG_STREAM_ERROR(obj, ...) DOIP_LOG_ERROR(fmt::format("{} " __VA_ARGS__, fmt::streamed(obj))) +#define LOG_DOIP_STREAM_INFO(obj, ...) LOG_DOIP_INFO(fmt::format("{} " __VA_ARGS__, fmt::streamed(obj))) +#define LOG_DOIP_STREAM_DEBUG(obj, ...) LOG_DOIP_DEBUG(fmt::format("{} " __VA_ARGS__, fmt::streamed(obj))) +#define LOG_DOIP_STREAM_WARN(obj, ...) LOG_DOIP_WARN(fmt::format("{} " __VA_ARGS__, fmt::streamed(obj))) +#define LOG_DOIP_STREAM_ERROR(obj, ...) LOG_DOIP_ERROR(fmt::format("{} " __VA_ARGS__, fmt::streamed(obj))) // Colored stream logging macros for DoIP types -#define DOIP_LOG_STREAM_SUCCESS(obj, ...) \ +#define LOG_DOIP_STREAM_SUCCESS(obj, ...) \ doip::Logger::get()->info(std::string(doip::ansi::bold_green) + fmt::format("{} " __VA_ARGS__, fmt::streamed(obj)) + doip::ansi::reset) -#define DOIP_LOG_STREAM_PROTOCOL(obj, ...) \ +#define LOG_DOIP_STREAM_PROTOCOL(obj, ...) \ doip::Logger::get()->info(std::string(doip::ansi::bold_blue) + fmt::format("{} " __VA_ARGS__, fmt::streamed(obj)) + doip::ansi::reset) -#define DOIP_LOG_STREAM_CONNECTION(obj, ...) \ +#define LOG_DOIP_STREAM_CONNECTION(obj, ...) \ doip::Logger::get()->info(std::string(doip::ansi::bold_magenta) + fmt::format("{} " __VA_ARGS__, fmt::streamed(obj)) + doip::ansi::reset) diff --git a/src/DoIPClient.cpp b/src/DoIPClient.cpp index 1fb5ada..bd7c19a 100644 --- a/src/DoIPClient.cpp +++ b/src/DoIPClient.cpp @@ -15,7 +15,7 @@ void DoIPClient::startTcpConnection() { _sockFd = socket(AF_INET, SOCK_STREAM, 0); if (_sockFd >= 0) { - TCP_LOG_INFO("Client TCP-Socket created successfully"); + LOG_TCP_INFO("Client TCP-Socket created successfully"); bool connectedFlag = false; const char *ipAddr = "127.0.0.1"; @@ -27,7 +27,7 @@ void DoIPClient::startTcpConnection() { _connected = connect(_sockFd, reinterpret_cast(&_serverAddr), sizeof(_serverAddr)); if (_connected != -1) { connectedFlag = true; - TCP_LOG_INFO("Connection to server established"); + LOG_TCP_INFO("Connection to server established"); } } } @@ -38,7 +38,7 @@ void DoIPClient::startUdpConnection() { _sockFd_udp = socket(AF_INET, SOCK_DGRAM, 0); if (_sockFd_udp >= 0) { - UDP_LOG_INFO("Client-UDP-Socket created successfully"); + LOG_UDP_INFO("Client-UDP-Socket created successfully"); _serverAddr.sin_family = AF_INET; _serverAddr.sin_port = htons(DOIP_UDP_DISCOVERY_PORT); @@ -57,7 +57,7 @@ void DoIPClient::startAnnouncementListener() { _sockFd_announcement = socket(AF_INET, SOCK_DGRAM, 0); if (_sockFd_announcement >= 0) { - UDP_LOG_INFO("Client-Announcement-Socket created successfully"); + LOG_UDP_INFO("Client-Announcement-Socket created successfully"); // Allow socket reuse for broadcast int reuse = 1; @@ -66,9 +66,9 @@ void DoIPClient::startAnnouncementListener() { // Enable broadcast reception int broadcast = 1; if (setsockopt(_sockFd_announcement, SOL_SOCKET, SO_BROADCAST, &broadcast, sizeof(broadcast)) < 0) { - UDP_LOG_ERROR("Failed to enable broadcast reception: {}", strerror(errno)); + LOG_UDP_ERROR("Failed to enable broadcast reception: {}", strerror(errno)); } else { - UDP_LOG_INFO("Broadcast reception enabled for announcements"); + LOG_UDP_INFO("Broadcast reception enabled for announcements"); } _announcementAddr.sin_family = AF_INET; @@ -77,12 +77,12 @@ void DoIPClient::startAnnouncementListener() { // Bind to port 13401 for Vehicle Announcements if (bind(_sockFd_announcement, reinterpret_cast(&_announcementAddr), sizeof(_announcementAddr)) < 0) { - UDP_LOG_ERROR("Failed to bind announcement socket to port {}: {}", DOIP_UDP_TEST_EQUIPMENT_REQUEST_PORT, strerror(errno)); + LOG_UDP_ERROR("Failed to bind announcement socket to port {}: {}", DOIP_UDP_TEST_EQUIPMENT_REQUEST_PORT, strerror(errno)); } else { - UDP_LOG_INFO("Announcement socket bound to port {} successfully", DOIP_UDP_TEST_EQUIPMENT_REQUEST_PORT); + LOG_UDP_INFO("Announcement socket bound to port {} successfully", DOIP_UDP_TEST_EQUIPMENT_REQUEST_PORT); } } else { - UDP_LOG_ERROR("Failed to create announcement socket: {}", strerror(errno)); + LOG_UDP_ERROR("Failed to create announcement socket: {}", strerror(errno)); } } @@ -107,20 +107,20 @@ void DoIPClient::reconnectServer() { ssize_t DoIPClient::sendRoutingActivationRequest() { DoIPMessage routingActReq = message::makeRoutingActivationRequest(m_sourceAddress); - DOIP_LOG_INFO("TX: {}", fmt::streamed(routingActReq)); + LOG_DOIP_INFO("TX: {}", fmt::streamed(routingActReq)); return write(_sockFd, routingActReq.data(), routingActReq.size()); } ssize_t DoIPClient::sendDiagnosticMessage(const ByteArray &payload) { DoIPMessage msg = message::makeDiagnosticMessage(m_sourceAddress, m_logicalAddress, payload); - DOIP_LOG_INFO("TX: {}", fmt::streamed(msg)); + LOG_DOIP_INFO("TX: {}", fmt::streamed(msg)); return write(_sockFd, msg.data(), msg.size()); } ssize_t DoIPClient::sendAliveCheckResponse() { DoIPMessage msg = message::makeAliveCheckResponse(m_sourceAddress); - DOIP_LOG_INFO("TX: {}", fmt::streamed(msg)); + LOG_DOIP_INFO("TX: {}", fmt::streamed(msg)); return write(_sockFd, msg.data(), msg.size()); } @@ -132,7 +132,7 @@ void DoIPClient::receiveMessage() { ssize_t bytesRead = recv(_sockFd, _receivedData, _maxDataSize, 0); if (bytesRead < 0) { - DOIP_LOG_ERROR("Error receiving data from server"); + LOG_DOIP_ERROR("Error receiving data from server"); return; } @@ -141,7 +141,7 @@ void DoIPClient::receiveMessage() { emptyMessageCounter++; if (emptyMessageCounter == 5) { - DOIP_LOG_WARN("Received too many empty messages. Reconnect TCP connection"); + LOG_DOIP_WARN("Received too many empty messages. Reconnect TCP connection"); emptyMessageCounter = 0; reconnectServer(); } @@ -150,11 +150,11 @@ void DoIPClient::receiveMessage() { auto optMmsg = DoIPMessage::tryParse(_receivedData, static_cast(bytesRead)); if (!optMmsg.has_value()) { - DOIP_LOG_ERROR("Failed to parse DoIP message from received data"); + LOG_DOIP_ERROR("Failed to parse DoIP message from received data"); return; } DoIPMessage msg = optMmsg.value(); - TCP_LOG_INFO("RX: {}", fmt::streamed(msg)); + LOG_TCP_INFO("RX: {}", fmt::streamed(msg)); } void DoIPClient::receiveUdpMessage() { @@ -172,31 +172,31 @@ void DoIPClient::receiveUdpMessage() { if (bytesRead < 0) { if (errno == EAGAIN) { - UDP_LOG_WARN("Timeout waiting for UDP response"); + LOG_UDP_WARN("Timeout waiting for UDP response"); } else { - UDP_LOG_ERROR("Error receiving UDP message: {}", strerror(errno)); + LOG_UDP_ERROR("Error receiving UDP message: {}", strerror(errno)); } return; } - UDP_LOG_INFO("Received {} bytes from UDP", bytesRead); + LOG_UDP_INFO("Received {} bytes from UDP", bytesRead); auto optMmsg = DoIPMessage::tryParse(_receivedData, static_cast(bytesRead)); if (!optMmsg.has_value()) { - UDP_LOG_ERROR("Failed to parse DoIP message from UDP data"); + LOG_UDP_ERROR("Failed to parse DoIP message from UDP data"); return; } DoIPMessage msg = optMmsg.value(); - UDP_LOG_INFO("RX: {}", fmt::streamed(msg)); + LOG_UDP_INFO("RX: {}", fmt::streamed(msg)); } void DoIPClient::receiveVehicleAnnouncement() { unsigned int length = sizeof(_announcementAddr); int bytesRead; - UDP_LOG_DEBUG("Listening for Vehicle Announcements on port {}", DOIP_UDP_TEST_EQUIPMENT_REQUEST_PORT); + LOG_UDP_DEBUG("Listening for Vehicle Announcements on port {}", DOIP_UDP_TEST_EQUIPMENT_REQUEST_PORT); // Set socket to non-blocking mode for timeout struct timeval timeout; @@ -208,21 +208,21 @@ void DoIPClient::receiveVehicleAnnouncement() { reinterpret_cast(&_announcementAddr), &length); if (bytesRead < 0) { if (errno == EAGAIN) { - UDP_LOG_WARN("Timeout waiting for Vehicle Announcement"); + LOG_UDP_WARN("Timeout waiting for Vehicle Announcement"); } else { - UDP_LOG_ERROR("Error receiving Vehicle Announcement: {}", strerror(errno)); + LOG_UDP_ERROR("Error receiving Vehicle Announcement: {}", strerror(errno)); } return; } auto optMsg = DoIPMessage::tryParse(_receivedData, static_cast(bytesRead)); if (!optMsg.has_value()) { - UDP_LOG_ERROR("Failed to parse Vehicle Announcement message"); + LOG_UDP_ERROR("Failed to parse Vehicle Announcement message"); return; } DoIPMessage msg = optMsg.value(); - UDP_LOG_INFO("Vehicle Announcement received: {}", fmt::streamed(msg)); + LOG_UDP_INFO("Vehicle Announcement received: {}", fmt::streamed(msg)); // Parse and display the announcement information if (msg.getPayloadType() == DoIPPayloadType::VehicleIdentificationResponse) { @@ -236,15 +236,15 @@ ssize_t DoIPClient::sendVehicleIdentificationRequest(const char *inet_address) { int setAddressError = inet_aton(inet_address, &(_serverAddr.sin_addr)); if (setAddressError != 0) { - UDP_LOG_INFO("Address set successfully"); + LOG_UDP_INFO("Address set successfully"); } else { - UDP_LOG_ERROR("Could not set address. Try again"); + LOG_UDP_ERROR("Could not set address. Try again"); } int socketError = setsockopt(_sockFd_udp, SOL_SOCKET, SO_BROADCAST, &m_broadcast, sizeof(m_broadcast)); if (socketError == 0) { - UDP_LOG_INFO("Broadcast Option set successfully"); + LOG_UDP_INFO("Broadcast Option set successfully"); } DoIPMessage vehicleIdReq = message::makeVehicleIdentificationRequest(); @@ -252,7 +252,7 @@ ssize_t DoIPClient::sendVehicleIdentificationRequest(const char *inet_address) { ssize_t bytesSent = sendto(_sockFd_udp, vehicleIdReq.data(), vehicleIdReq.size(), 0, reinterpret_cast(&_serverAddr), sizeof(_serverAddr)); if (bytesSent > 0) { - DOIP_LOG_INFO("Sending Vehicle Identification Request"); + LOG_DOIP_INFO("Sending Vehicle Identification Request"); } return bytesSent; @@ -323,13 +323,13 @@ void DoIPClient::displayVIResponseInformation() { if (Logger::colorsSupported()) { ss << ansi::reset; } - DOIP_LOG_INFO(ss.str()); + LOG_DOIP_INFO(ss.str()); // output LogicalAddress ss = std::ostringstream{}; ss << "LogicalAddress: "; ss << m_logicalAddress; - DOIP_LOG_INFO(ss.str()); + LOG_DOIP_INFO(ss.str()); // output EID ss = std::ostringstream{}; @@ -343,7 +343,7 @@ void DoIPClient::displayVIResponseInformation() { if (Logger::colorsSupported()) { ss << ansi::reset; } - DOIP_LOG_INFO(ss.str()); + LOG_DOIP_INFO(ss.str()); // output GID ss = std::ostringstream{}; @@ -351,11 +351,11 @@ void DoIPClient::displayVIResponseInformation() { for (int i = 0; i < 6; i++) { ss << std::hex << std::setfill('0') << std::setw(2) << +GIDResult[i] << std::dec; } - DOIP_LOG_INFO(ss.str()); + LOG_DOIP_INFO(ss.str()); // output FurtherActionRequest ss = std::ostringstream{}; ss << "FurtherActionRequest: "; ss << std::hex << std::setfill('0') << std::setw(2) << FurtherActionReqResult << std::dec; - DOIP_LOG_INFO(ss.str()); + LOG_DOIP_INFO(ss.str()); } diff --git a/src/DoIPConnection.cpp b/src/DoIPConnection.cpp index 89c3cc3..f454ff2 100644 --- a/src/DoIPConnection.cpp +++ b/src/DoIPConnection.cpp @@ -26,17 +26,17 @@ void DoIPConnection::closeSocket() { * or -1 if error occurred */ int DoIPConnection::receiveTcpMessage() { - DOIP_LOG_INFO("Waiting for DoIP Header..."); + LOG_DOIP_INFO("Waiting for DoIP Header..."); uint8_t genericHeader[DOIP_HEADER_SIZE]; unsigned int readBytes = receiveFixedNumberOfBytesFromTCP(genericHeader, DOIP_HEADER_SIZE); if (readBytes == DOIP_HEADER_SIZE /*&& !m_aliveCheckTimer.hasTimeout()*/) { - DOIP_LOG_INFO("Received DoIP Header."); + LOG_DOIP_INFO("Received DoIP Header."); auto optHeader = DoIPMessage::tryParseHeader(genericHeader, DOIP_HEADER_SIZE); if (!optHeader.has_value()) { // m_stateMachine.processEvent(DoIPServerEvent::InvalidMessage); // TODO: Notify application of invalid message? - DOIP_LOG_ERROR("DoIP message header parsing failed"); + LOG_DOIP_ERROR("DoIP message header parsing failed"); closeSocket(); return -2; } @@ -44,13 +44,13 @@ int DoIPConnection::receiveTcpMessage() { auto plType = optHeader->first; auto payloadLength = optHeader->second; - DOIP_LOG_INFO("Payload Type: {}, length: {} ", fmt::streamed(plType), payloadLength); + LOG_DOIP_INFO("Payload Type: {}, length: {} ", fmt::streamed(plType), payloadLength); if (payloadLength > 0) { - DOIP_LOG_DEBUG("Waiting for {} bytes of payload...", payloadLength); + LOG_DOIP_DEBUG("Waiting for {} bytes of payload...", payloadLength); unsigned int receivedPayloadBytes = receiveFixedNumberOfBytesFromTCP(m_receiveBuf.data(), payloadLength); if (receivedPayloadBytes < payloadLength) { - DOIP_LOG_ERROR("DoIP message incomplete"); + LOG_DOIP_ERROR("DoIP message incomplete"); // m_stateMachine.processEvent(DoIPServerEvent::InvalidMessage); // todo: Notify application of invalid message? closeSocket(); @@ -58,7 +58,7 @@ int DoIPConnection::receiveTcpMessage() { } DoIPMessage msg = DoIPMessage(plType, m_receiveBuf.data(), receivedPayloadBytes); - DOIP_LOG_INFO("RX: {}", fmt::streamed(msg)); + LOG_DOIP_INFO("RX: {}", fmt::streamed(msg)); } DoIPMessage message(plType, m_receiveBuf.data(), payloadLength); @@ -99,7 +99,7 @@ size_t DoIPConnection::receiveFixedNumberOfBytesFromTCP(uint8_t *receivedData, s } void DoIPConnection::triggerDisconnection() { - DOIP_LOG_INFO("Application requested to disconnect Client from Server"); + LOG_DOIP_INFO("Application requested to disconnect Client from Server"); closeSocket(); } @@ -119,9 +119,9 @@ ssize_t DoIPConnection::sendMessage(const uint8_t *message, size_t messageLength ssize_t DoIPConnection::sendProtocolMessage(const DoIPMessage &msg) { ssize_t sentBytes = sendMessage(msg.data(), msg.size()); if (sentBytes < 0) { - DOIP_LOG_ERROR("Error sending message to client: {}", fmt::streamed(msg)); + LOG_DOIP_ERROR("Error sending message to client: {}", fmt::streamed(msg)); } else { - DOIP_LOG_INFO("Sent {} bytes to client: {}", sentBytes, fmt::streamed(msg)); + LOG_DOIP_INFO("Sent {} bytes to client: {}", sentBytes, fmt::streamed(msg)); } return sentBytes; } @@ -129,12 +129,12 @@ ssize_t DoIPConnection::sendProtocolMessage(const DoIPMessage &msg) { void DoIPConnection::closeConnection(DoIPCloseReason reason) { // Guard against recursive calls if (m_isClosing) { - DOIP_LOG_DEBUG("Connection already closing - ignoring recursive call"); + LOG_DOIP_DEBUG("Connection already closing - ignoring recursive call"); return; } m_isClosing = true; - DOIP_LOG_INFO("Closing connection, reason: {}", fmt::streamed(reason)); + LOG_DOIP_INFO("Closing connection, reason: {}", fmt::streamed(reason)); // Call base class to handle state machine and notification DoIPDefaultConnection::closeConnection(reason); diff --git a/src/DoIPDefaultConnection.cpp b/src/DoIPDefaultConnection.cpp index be90ad6..8378d25 100644 --- a/src/DoIPDefaultConnection.cpp +++ b/src/DoIPDefaultConnection.cpp @@ -29,7 +29,7 @@ DoIPDefaultConnection::DoIPDefaultConnection(UniqueServerModelPtr model) DoIPServerState::Finalize, [this](std::optional msg) { this->handleWaitAliveCheckResponse(DoIPServerEvent{}, msg); }, ConnectionTimers::AliveCheck, - [this]() { ++m_aliveCheckRetry; DOIP_LOG_WARN("Alive check #{}/{}", m_aliveCheckRetry, m_aliveCheckRetryCount); }), + [this]() { ++m_aliveCheckRetry; LOG_DOIP_WARN("Alive check #{}/{}", m_aliveCheckRetry, m_aliveCheckRetryCount); }), StateDescriptor( DoIPServerState::WaitDownstreamResponse, DoIPServerState::Finalize, @@ -50,33 +50,33 @@ DoIPDefaultConnection::DoIPDefaultConnection(UniqueServerModelPtr model) m_serverModel->onOpenConnection(*this); m_state = &STATE_DESCRIPTORS[0]; - DOIP_LOG_INFO("Default connection created, transitioning to SocketInitialized state..."); + LOG_DOIP_INFO("Default connection created, transitioning to SocketInitialized state..."); transitionTo(DoIPServerState::WaitRoutingActivation); } ssize_t DoIPDefaultConnection::sendProtocolMessage(const DoIPMessage &msg) { - DOIP_LOG_INFO("Default connection: Sending protocol message: {}", fmt::streamed(msg)); + LOG_DOIP_INFO("Default connection: Sending protocol message: {}", fmt::streamed(msg)); return static_cast(msg.size()); // Simulate sending by returning the message size } void DoIPDefaultConnection::closeConnection(DoIPCloseReason reason) { try { - DOIP_LOG_INFO("Default connection: Closing connection, reason: {}", fmt::streamed(reason)); + LOG_DOIP_INFO("Default connection: Closing connection, reason: {}", fmt::streamed(reason)); transitionTo(DoIPServerState::Closed); m_closeReason = reason; m_timerManager.stopAll(); notifyConnectionClosed(reason); } catch (const std::exception &e) { - DOIP_LOG_ERROR("Error notifying connection closed: {}", e.what()); + LOG_DOIP_ERROR("Error notifying connection closed: {}", e.what()); void *callstack[128]; int frames = backtrace(callstack, 128); char **strs = backtrace_symbols(callstack, frames); - DOIP_LOG_ERROR("Exception during closeConnection: {}", e.what()); - DOIP_LOG_ERROR("Stack trace:"); + LOG_DOIP_ERROR("Exception during closeConnection: {}", e.what()); + LOG_DOIP_ERROR("Stack trace:"); for (int i = 0; i < frames; ++i) { - DOIP_LOG_ERROR("{}", strs[i]); + LOG_DOIP_ERROR("{}", strs[i]); } free(strs); } @@ -111,15 +111,15 @@ void DoIPDefaultConnection::transitionTo(DoIPServerState newState) { return desc.state == newState; }); if (it != STATE_DESCRIPTORS.end()) { - DOIP_LOG_INFO("-> Transitioning from state {} to state {}", fmt::streamed(m_state->state), fmt::streamed(newState)); + LOG_DOIP_INFO("-> Transitioning from state {} to state {}", fmt::streamed(m_state->state), fmt::streamed(newState)); m_state = &(*it); startStateTimer(m_state); if (m_state->enterStateHandler) { - DOIP_LOG_INFO("Calling enterState handler"); + LOG_DOIP_INFO("Calling enterState handler"); m_state->enterStateHandler(); } } else { - DOIP_LOG_ERROR("Invalid state transition to {}", fmt::streamed(newState)); + LOG_DOIP_ERROR("Invalid state transition to {}", fmt::streamed(newState)); } } @@ -152,12 +152,12 @@ void DoIPDefaultConnection::startStateTimer(StateDescriptor const *stateDesc) { std::chrono::milliseconds duration = getTimerDuration(m_state); if (duration.count() == 0) { - DOIP_LOG_DEBUG("User-defined timer duration is zero, transitioning immediately to state {}", fmt::streamed(stateDesc->stateAfterTimeout)); + LOG_DOIP_DEBUG("User-defined timer duration is zero, transitioning immediately to state {}", fmt::streamed(stateDesc->stateAfterTimeout)); transitionTo(stateDesc->stateAfterTimeout); return; } - DOIP_LOG_DEBUG("Starting timer for state {}: Timer ID {}, duration {}ms", fmt::streamed(stateDesc->state), fmt::streamed(stateDesc->timer), duration.count()); + LOG_DOIP_DEBUG("Starting timer for state {}: Timer ID {}, duration {}ms", fmt::streamed(stateDesc->state), fmt::streamed(stateDesc->timer), duration.count()); std::function timeoutHandler = [this](ConnectionTimers timerId) { handleTimeout(timerId); }; if (stateDesc->timeoutHandler != nullptr) { @@ -168,16 +168,16 @@ void DoIPDefaultConnection::startStateTimer(StateDescriptor const *stateDesc) { m_state->timer, duration, timeoutHandler, false); if (id.has_value()) { - DOIP_LOG_DEBUG("Started timer {} for {}ms", fmt::streamed(m_state->timer), duration.count()); + LOG_DOIP_DEBUG("Started timer {} for {}ms", fmt::streamed(m_state->timer), duration.count()); } else { - DOIP_LOG_ERROR("Failed to start timer {}", fmt::streamed(m_state->timer)); + LOG_DOIP_ERROR("Failed to start timer {}", fmt::streamed(m_state->timer)); } } void DoIPDefaultConnection::restartStateTimer() { assert(m_state != nullptr); if (!m_timerManager.restartTimer(m_state->timer)) { - DOIP_LOG_ERROR("Failed to restart timer {}", fmt::streamed(m_state->timer)); + LOG_DOIP_ERROR("Failed to restart timer {}", fmt::streamed(m_state->timer)); } } @@ -203,7 +203,7 @@ void DoIPDefaultConnection::handleWaitRoutingActivation(DoIPServerEvent event, O bool rightPayloadType = (msg->getPayloadType() == DoIPPayloadType::RoutingActivationRequest); if (!hasAddress || !rightPayloadType) { - DOIP_LOG_WARN("Invalid Routing Activation Request message"); + LOG_DOIP_WARN("Invalid Routing Activation Request message"); closeConnection(DoIPCloseReason::InvalidMessage); return; } @@ -233,7 +233,7 @@ void DoIPDefaultConnection::handleRoutingActivated(DoIPServerEvent event, OptDoI restartStateTimer(); return; default: - DOIP_LOG_WARN("Received unsupported message type {} in Routing Activated state", fmt::streamed(message.getPayloadType())); + LOG_DOIP_WARN("Received unsupported message type {} in Routing Activated state", fmt::streamed(message.getPayloadType())); sendDiagnosticMessageResponse(DoIPAddress::ZeroAddress, DoIPNegativeDiagnosticAck::TransportProtocolError); // closeConnection(DoIPCloseReason::InvalidMessage); return; @@ -244,7 +244,7 @@ void DoIPDefaultConnection::handleRoutingActivated(DoIPServerEvent event, OptDoI return; } if (sourceAddress.value() != getClientAddress()) { - DOIP_LOG_WARN("Received diagnostic message from unexpected source address {}", fmt::streamed(sourceAddress.value())); + LOG_DOIP_WARN("Received diagnostic message from unexpected source address {}", fmt::streamed(sourceAddress.value())); sendDiagnosticMessageResponse(sourceAddress.value(), DoIPNegativeDiagnosticAck::InvalidSourceAddress); // closeConnection(DoIPCloseReason::InvalidMessage); return; @@ -264,7 +264,7 @@ void DoIPDefaultConnection::handleRoutingActivated(DoIPServerEvent event, OptDoI if (hasDownstreamHandler()) { auto result = notifyDownstreamRequest(message); - DOIP_LOG_DEBUG("Downstream req -> {}", fmt::streamed(result)); + LOG_DOIP_DEBUG("Downstream req -> {}", fmt::streamed(result)); if (result == DoIPDownstreamResult::Pending) { // wait for downstream response transitionTo(DoIPServerState::WaitDownstreamResponse); @@ -299,7 +299,7 @@ void DoIPDefaultConnection::handleWaitAliveCheckResponse(DoIPServerEvent event, transitionTo(DoIPServerState::RoutingActivated); return; default: - DOIP_LOG_WARN("Received unsupported message type {} in Wait Alive Check Response state", fmt::streamed(message.getPayloadType())); + LOG_DOIP_WARN("Received unsupported message type {} in Wait Alive Check Response state", fmt::streamed(message.getPayloadType())); sendDiagnosticMessageResponse(DoIPAddress::ZeroAddress, DoIPNegativeDiagnosticAck::TransportProtocolError); return; } @@ -310,7 +310,7 @@ void DoIPDefaultConnection::handleWaitDownstreamResponse(DoIPServerEvent event, (void)msg; // Unused parameter // Implementation of handling wait downstream response would go here - DOIP_LOG_CRITICAL("handleWaitDownstreamResponse NOT IMPL"); + LOG_DOIP_CRITICAL("handleWaitDownstreamResponse NOT IMPL"); } @@ -323,7 +323,7 @@ void DoIPDefaultConnection::handleFinalize(DoIPServerEvent event, OptDoIPMessage } void DoIPDefaultConnection::handleTimeout(ConnectionTimers timer_id) { - DOIP_LOG_WARN("Timeout '{}'", fmt::streamed(timer_id)); + LOG_DOIP_WARN("Timeout '{}'", fmt::streamed(timer_id)); switch (timer_id) { case ConnectionTimers::InitialInactivity: @@ -341,14 +341,14 @@ void DoIPDefaultConnection::handleTimeout(ConnectionTimers timer_id) { } break; case ConnectionTimers::DownstreamResponse: - DOIP_LOG_WARN("Downstream response timeout occurred"); + LOG_DOIP_WARN("Downstream response timeout occurred"); transitionTo(DoIPServerState::RoutingActivated); break; case ConnectionTimers::UserDefined: - DOIP_LOG_WARN("User-defined timer -> must be handled separately"); + LOG_DOIP_WARN("User-defined timer -> must be handled separately"); break; default: - DOIP_LOG_ERROR("Unhandled timeout for timer id {}", fmt::streamed(timer_id)); + LOG_DOIP_ERROR("Unhandled timeout for timer id {}", fmt::streamed(timer_id)); break; } } @@ -443,7 +443,7 @@ DoIPDownstreamResult DoIPDefaultConnection::notifyDownstreamRequest(const DoIPMe void DoIPDefaultConnection::receiveDownstreamResponse(const ByteArray &response, DoIPDownstreamResult result) { DoIPAddress sa = getServerAddress(); DoIPAddress ta = getClientAddress(); - DOIP_LOG_INFO("Downstream rsp: {} ({})", fmt::streamed(response), fmt::streamed(result)); + LOG_DOIP_INFO("Downstream rsp: {} ({})", fmt::streamed(response), fmt::streamed(result)); if (result == DoIPDownstreamResult::Handled) { sendProtocolMessage(message::makeDiagnosticMessage(sa, ta, response)); } else { diff --git a/src/DoIPServer.cpp b/src/DoIPServer.cpp index e7c01ec..bb74162 100644 --- a/src/DoIPServer.cpp +++ b/src/DoIPServer.cpp @@ -29,7 +29,7 @@ DoIPServer::~DoIPServer() { * High-level API: Stop the server and cleanup */ void DoIPServer::stop() { - DOIP_LOG_INFO("Stopping DoIP Server..."); + LOG_DOIP_INFO("Stopping DoIP Server..."); m_running.store(false); // Close sockets to unblock any pending accept/recv calls @@ -44,14 +44,14 @@ void DoIPServer::stop() { } m_workerThreads.clear(); - DOIP_LOG_INFO("DoIP Server stopped"); + LOG_DOIP_INFO("DoIP Server stopped"); } /* * Background thread: UDP message listener */ void DoIPServer::udpListenerThread() { - DOIP_LOG_INFO("UDP listener thread started"); + LOG_DOIP_INFO("UDP listener thread started"); while (m_running.load()) { ssize_t result = receiveUdpMessage(); @@ -60,11 +60,11 @@ void DoIPServer::udpListenerThread() { // The socket already has a timeout configured if (result < 0 && m_running.load()) { // Only log errors if we're still supposed to be running - UDP_LOG_DEBUG("UDP receive error, continuing..."); + LOG_UDP_DEBUG("UDP receive error, continuing..."); } } - DOIP_LOG_INFO("UDP listener thread stopped"); + LOG_DOIP_INFO("UDP listener thread stopped"); } @@ -73,37 +73,37 @@ void DoIPServer::udpListenerThread() { * Background thread: Handle individual TCP connection */ void DoIPServer::connectionHandlerThread(std::unique_ptr connection) { - TCP_LOG_INFO("Connection handler thread started"); + LOG_TCP_INFO("Connection handler thread started"); while (m_running.load() && connection->isSocketActive()) { int result = connection->receiveTcpMessage(); if (result < 0) { - TCP_LOG_INFO("Connection closed or error occurred"); + LOG_TCP_INFO("Connection closed or error occurred"); break; } } // Connection is automatically closed when unique_ptr goes out of scope - TCP_LOG_INFO("Connection handler thread stopped"); + LOG_TCP_INFO("Connection handler thread stopped"); } /* * Set up a tcp socket, so the socket is ready to accept a connection */ bool DoIPServer::setupTcpSocket() { - DOIP_LOG_DEBUG("Setting up TCP socket on port {}", DOIP_SERVER_PORT); + LOG_DOIP_DEBUG("Setting up TCP socket on port {}", DOIP_SERVER_PORT); m_tcp_sock = socket(AF_INET, SOCK_STREAM, 0); if (m_tcp_sock < 0) { - TCP_LOG_ERROR("Failed to create TCP socket: {}", strerror(errno)); + LOG_TCP_ERROR("Failed to create TCP socket: {}", strerror(errno)); return false; } // Allow socket reuse int reuse = 1; if (setsockopt(m_tcp_sock, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0) { - TCP_LOG_WARN("Failed to set SO_REUSEADDR: {}", strerror(errno)); + LOG_TCP_WARN("Failed to set SO_REUSEADDR: {}", strerror(errno)); } m_serverAddress.sin_family = AF_INET; @@ -112,16 +112,16 @@ bool DoIPServer::setupTcpSocket() { // binds the socket to the address and port number if (bind(m_tcp_sock, reinterpret_cast(&m_serverAddress), sizeof(m_serverAddress)) < 0) { - TCP_LOG_ERROR("Failed to bind TCP socket: {}", strerror(errno)); + LOG_TCP_ERROR("Failed to bind TCP socket: {}", strerror(errno)); return false; } - TCP_LOG_INFO("TCP socket successfully bound to port {}", DOIP_SERVER_PORT); + LOG_TCP_INFO("TCP socket successfully bound to port {}", DOIP_SERVER_PORT); return true; } bool DoIPServer::setupUdpSocket() { - UDP_LOG_DEBUG("Setting up UDP socket on port {}", DOIP_UDP_DISCOVERY_PORT); + LOG_UDP_DEBUG("Setting up UDP socket on port {}", DOIP_UDP_DISCOVERY_PORT); m_udp_sock = socket(AF_INET, SOCK_DGRAM, 0); @@ -130,19 +130,19 @@ bool DoIPServer::setupUdpSocket() { m_serverAddress.sin_port = htons(DOIP_UDP_DISCOVERY_PORT); if (m_udp_sock < 0) { - UDP_LOG_ERROR("Failed to create UDP socket: {}", strerror(errno)); + LOG_UDP_ERROR("Failed to create UDP socket: {}", strerror(errno)); return false; } // binds the socket to any IP DoIPAddress and the Port Number 13400 if (bind(m_udp_sock, reinterpret_cast(&m_serverAddress), sizeof(m_serverAddress)) < 0) { - UDP_LOG_ERROR("Failed to bind UDP socket: {}", strerror(errno)); + LOG_UDP_ERROR("Failed to bind UDP socket: {}", strerror(errno)); return false; } // setting the IP DoIPAddress for Multicast setMulticastGroup("224.0.0.2"); - UDP_LOG_INFO("UDP socket successfully bound to port {} with multicast group", DOIP_UDP_DISCOVERY_PORT); + LOG_UDP_INFO("UDP socket successfully bound to port {} with multicast group", DOIP_UDP_DISCOVERY_PORT); return true; } @@ -178,18 +178,18 @@ ssize_t DoIPServer::receiveUdpMessage() { // Timeout - this is normal, just continue return 0; } else { - UDP_LOG_ERROR("Error receiving UDP message: {}", strerror(errno)); + LOG_UDP_ERROR("Error receiving UDP message: {}", strerror(errno)); return -1; } } // Don't log if no data received (can happen with some socket configurations) if (readBytes > 0) { - UDP_LOG_INFO("RX {} bytes from {}:{}", readBytes, + LOG_UDP_INFO("RX {} bytes from {}:{}", readBytes, inet_ntoa(clientAddr.sin_addr), ntohs(clientAddr.sin_port)); } else { // For debugging: log zero-byte messages at debug level - UDP_LOG_DEBUG("RX 0 bytes from {}:{}", + LOG_UDP_DEBUG("RX 0 bytes from {}:{}", inet_ntoa(clientAddr.sin_addr), ntohs(clientAddr.sin_port)); return 0; // Return early for zero-byte messages } @@ -219,18 +219,18 @@ ssize_t DoIPServer::reactToReceivedUdpMessage(size_t bytesRead) { auto plType = optHeader->first; // auto payloadLength = optHeader->second; - UDP_LOG_INFO("RX: {}", fmt::streamed(plType)); + LOG_UDP_INFO("RX: {}", fmt::streamed(plType)); switch (plType) { case DoIPPayloadType::VehicleIdentificationRequest: { DoIPMessage msg = message::makeVehicleIdentificationResponse(m_VIN, m_gatewayAddress, m_EID, m_GID); - DOIP_LOG_PROTOCOL("TX {}", fmt::streamed(msg)); + LOG_DOIP_PROTOCOL("TX {}", fmt::streamed(msg)); ssize_t sendedBytes = sendUdpMessage(msg.data(), DOIP_HEADER_SIZE + msg.size()); return static_cast(sendedBytes); } default: { - DOIP_LOG_ERROR("Invalid payload type 0x{:04X} received (receiveUdpMessage())", static_cast(plType)); + LOG_DOIP_ERROR("Invalid payload type 0x{:04X} received (receiveUdpMessage())", static_cast(plType)); return sendNegativeUdpAck(DoIPNegativeAck::UnknownPayloadType); } } @@ -249,7 +249,7 @@ ssize_t DoIPServer::sendUdpMessage(const uint8_t *message, size_t messageLength) bool DoIPServer::setEIDdefault() { MacAddress mac = {0}; if (!getFirstMacAddress(mac)) { - DOIP_LOG_ERROR("Failed to get MAC address, using default EID"); + LOG_DOIP_ERROR("Failed to get MAC address, using default EID"); m_EID = DoIPEID::Zero; return false; } @@ -290,9 +290,9 @@ void DoIPServer::setAnnounceInterval(unsigned int Interval) { void DoIPServer::setAnnouncementMode(bool useLoopback) { m_useLoopbackAnnouncements = useLoopback; if (useLoopback) { - DOIP_LOG_INFO("Vehicle announcements will use loopback (127.0.0.1)"); + LOG_DOIP_INFO("Vehicle announcements will use loopback (127.0.0.1)"); } else { - DOIP_LOG_INFO("Vehicle announcements will use broadcast (255.255.255.255)"); + LOG_DOIP_INFO("Vehicle announcements will use broadcast (255.255.255.255)"); } } @@ -303,7 +303,7 @@ void DoIPServer::setMulticastGroup(const char *address) { int setPort = setsockopt(m_udp_sock, SOL_SOCKET, SO_REUSEADDR, &loop, sizeof(loop)); if (setPort < 0) { - UDP_LOG_ERROR("Setting Port Error"); + LOG_UDP_ERROR("Setting Port Error"); } struct ip_mreq mreq; @@ -315,7 +315,7 @@ void DoIPServer::setMulticastGroup(const char *address) { int setGroup = setsockopt(m_udp_sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, reinterpret_cast(&mreq), sizeof(mreq)); if (setGroup < 0) { - UDP_LOG_ERROR("Setting address failed: {}", strerror(errno)); + LOG_UDP_ERROR("Setting address failed: {}", strerror(errno)); } } @@ -330,7 +330,7 @@ ssize_t DoIPServer::sendVehicleAnnouncement() { int setAddressError = inet_aton(address, &(m_clientAddress.sin_addr)); if (setAddressError != 0) { - DOIP_LOG_INFO("{} address set successfully: {}", + LOG_DOIP_INFO("{} address set successfully: {}", m_useLoopbackAnnouncements ? "Loopback" : "Broadcast", address); } @@ -338,7 +338,7 @@ ssize_t DoIPServer::sendVehicleAnnouncement() { // Only set broadcast option for broadcast mode int socketError = setsockopt(m_udp_sock, SOL_SOCKET, SO_BROADCAST, &m_broadcast, sizeof(m_broadcast)); if (socketError == 0) { - DOIP_LOG_INFO("Broadcast Option set successfully"); + LOG_DOIP_INFO("Broadcast Option set successfully"); } } @@ -351,10 +351,10 @@ ssize_t DoIPServer::sendVehicleAnnouncement() { sentBytes = sendto(m_udp_sock, msg.data(), msg.size(), 0, reinterpret_cast(&m_clientAddress), sizeof(m_clientAddress)); if (sentBytes > 0) { - UDP_LOG_INFO("Sent Vehicle Announcement"); + LOG_UDP_INFO("Sent Vehicle Announcement"); } else { - UDP_LOG_ERROR("Failed sending Vehicle Announcement: {}", strerror(errno)); - UDP_LOG_ERROR("Message: {}", fmt::streamed(msg)); + LOG_UDP_ERROR("Failed sending Vehicle Announcement: {}", strerror(errno)); + LOG_UDP_ERROR("Message: {}", fmt::streamed(msg)); } usleep(m_announceInterval * 1000); }