From 6fac54340084065c8a4c63c49583c7bc03495608 Mon Sep 17 00:00:00 2001 From: deadlightreal Date: Fri, 4 Jul 2025 14:39:26 +0200 Subject: [PATCH 1/3] added debugger struct and debug flags --- src/add_debug_flags.c | 6 ++++++ src/initialize_swift_net.c | 4 ++++ src/internal/internal.h | 20 ++++++++++++++++++++ src/swift_net.h | 20 +++++++++++++++++++- 4 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 src/add_debug_flags.c diff --git a/src/add_debug_flags.c b/src/add_debug_flags.c new file mode 100644 index 0000000..a266424 --- /dev/null +++ b/src/add_debug_flags.c @@ -0,0 +1,6 @@ +#include "swift_net.h" +#include "internal/internal.h" + +void swiftnet_add_debug_flags(const uint32_t flags) { + debugger.flags |= flags; +} diff --git a/src/initialize_swift_net.c b/src/initialize_swift_net.c index 6675821..61d649b 100644 --- a/src/initialize_swift_net.c +++ b/src/initialize_swift_net.c @@ -7,6 +7,10 @@ #include "internal/internal.h" #include +SwiftNetDebug( + SwiftNetDebugger debugger = {.flags = 0}; +) + uint32_t maximum_transmission_unit = 0x00; void swiftnet_initialize() { diff --git a/src/internal/internal.h b/src/internal/internal.h index b592a0b..baffafd 100644 --- a/src/internal/internal.h +++ b/src/internal/internal.h @@ -3,7 +3,10 @@ #include #include #include +#include "../swift_net.h" #include +#include +#include #define REQUEST_LOST_PACKETS_RETURN_UPDATED_BIT_ARRAY 0x00 #define REQUEST_LOST_PACKETS_RETURN_COMPLETED_PACKET 0x01 @@ -107,6 +110,23 @@ extern void* swiftnet_client_process_packets(void* restrict const void_client); extern void* execute_packet_callback_client(void* void_client); extern void* execute_packet_callback_server(void* void_server); +SwiftNetDebug( + extern SwiftNetDebugger debugger; + + static inline bool check_debug_flag(uint32_t flag) { + return (debugger.flags & flag) != 0; + } + + static inline void send_debug_message(const char* message, ...) { + va_list args; + va_start(args, message); + + vprintf(message, args); + + va_end(args); + } +); + typedef enum { CONNECTION_TYPE_SERVER, CONNECTION_TYPE_CLIENT diff --git a/src/swift_net.h b/src/swift_net.h index f183aa6..8ff7dcf 100644 --- a/src/swift_net.h +++ b/src/swift_net.h @@ -35,8 +35,23 @@ #define SwiftNetErrorCheck(code) #endif +#ifndef SWIFT_NET_DISABLE_DEBUGGING + #define SwiftNetDebug(code) code +#else + #define SwiftNetDebug(code) code +#endif + extern uint32_t maximum_transmission_unit; +typedef enum { + DEBUG_PACKETS_SENDING = 1u << 0, + DEBUG_PACKETS_RECEIVING = 1u << 1 +} SwiftNetDebugFlags; + +typedef struct { + uint32_t flags; +} SwiftNetDebugger; + typedef struct { uint16_t destination_port; uint16_t source_port; @@ -191,6 +206,9 @@ extern SwiftNetPacketBuffer swiftnet_server_create_packet_buffer(const uint32_t extern SwiftNetPacketBuffer swiftnet_client_create_packet_buffer(const uint32_t buffer_size); extern void swiftnet_server_destroy_packet_buffer(SwiftNetPacketBuffer* restrict const packet); extern void swiftnet_client_destroy_packet_buffer(SwiftNetPacketBuffer* restrict const packet); - extern SwiftNetServer* swiftnet_create_server(const uint16_t port); extern SwiftNetClientConnection* swiftnet_create_client(const char* const restrict ip_address, const uint16_t port); + +SwiftNetDebug( + extern void swiftnet_add_debug_flags(const uint32_t flags); +) From 0351199cdc4ec618f052743331c3d6b46df2313d Mon Sep 17 00:00:00 2001 From: deadlightreal Date: Fri, 4 Jul 2025 17:36:13 +0200 Subject: [PATCH 2/3] added some basic debugging --- build/output/libswift_net.a | Bin 191464 -> 198512 bytes src/CMakeLists.txt | 1 + src/internal/internal.h | 16 ++++++++++++++-- src/process_packets.c | 12 ++++++++++++ src/send_packet.c | 12 ++++++++++++ .../test_basic_client_server_communication | Bin 111544 -> 112520 bytes ...test_client_sending_large_packet_to_server | Bin 111576 -> 112552 bytes ...test_server_sending_large_packet_to_client | Bin 111576 -> 112552 bytes .../test_basic_client_server_communication.c | 2 ++ ...st_client_sending_large_packet_to_server.c | 2 ++ ...st_server_sending_large_packet_to_client.c | 2 ++ 11 files changed, 45 insertions(+), 2 deletions(-) diff --git a/build/output/libswift_net.a b/build/output/libswift_net.a index 9eea84c06eef680711932c6f09a678a1c6986c72..7a1d3febb7c8a50db6081b8c1a0e9d1f0f4f1352 100644 GIT binary patch delta 35069 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 delta 29926 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 Oon7JW|7KjA_x}K2=~8(B diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 6e7a684..32a2201 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -16,6 +16,7 @@ set(SOURCE_FILES process_packets.c execute_packet_callback.c create_packet_buffer.c + add_debug_flags.c destroy_packet_buffer.c internal/get_mtu.c internal/get_default_interface.c diff --git a/src/internal/internal.h b/src/internal/internal.h index baffafd..cfa2359 100644 --- a/src/internal/internal.h +++ b/src/internal/internal.h @@ -1,5 +1,6 @@ #pragma once +#include <_string.h> #include #include #include @@ -113,7 +114,7 @@ extern void* execute_packet_callback_server(void* void_server); SwiftNetDebug( extern SwiftNetDebugger debugger; - static inline bool check_debug_flag(uint32_t flag) { + static inline bool check_debug_flag(SwiftNetDebugFlags flag) { return (debugger.flags & flag) != 0; } @@ -121,7 +122,18 @@ SwiftNetDebug( va_list args; va_start(args, message); - vprintf(message, args); + char* prefix = "[DEBUG] "; + + const uint32_t prefix_length = strlen(prefix); + const uint32_t message_length = strlen(message); + + char full_message[prefix_length + message_length + 1]; + + memcpy(full_message, prefix, prefix_length); + memcpy(full_message + prefix_length, message, message_length); + full_message[prefix_length + message_length] = '\0'; + + vprintf(full_message, args); va_end(args); } diff --git a/src/process_packets.c b/src/process_packets.c index 9fb6cfa..8cd62c0 100644 --- a/src/process_packets.c +++ b/src/process_packets.c @@ -1,5 +1,6 @@ #include "internal/internal.h" #include "swift_net.h" +#include #include #include #include @@ -269,9 +270,20 @@ static inline void swiftnet_process_packets( memset(&packet_buffer[sizeof(struct ip) + offsetof(SwiftNetPacketInfo, checksum)], 0x00, SIZEOF_FIELD(SwiftNetPacketInfo, checksum)); if(packet_corrupted(checksum_received, packet_info.chunk_size + sizeof(SwiftNetPacketInfo), &packet_buffer[sizeof(struct ip)]) == true) { + SwiftNetDebug( + if (check_debug_flag(DEBUG_PACKETS_RECEIVING)) { + send_debug_message("Received corrupted packet: {\"source_ip_address\": \"%s\", \"source_port\": %d, \"packet_id\": %d}\n", inet_ntoa(ip_header.ip_src), packet_info.port_info.source_port, packet_info.packet_id); + } + ) goto next_packet; } + SwiftNetDebug( + if (check_debug_flag(DEBUG_PACKETS_RECEIVING)) { + send_debug_message("Received packet: {\"source_ip_address\": \"%s\", \"source_port\": %d, \"packet_id\": %d, \"packet_type\": %d, \"packet_length\": %d}\n", inet_ntoa(ip_header.ip_src), packet_info.port_info.source_port, packet_info.packet_id, packet_info.packet_type, packet_info.packet_length); + } + ) + switch(packet_info.packet_type) { case PACKET_TYPE_REQUEST_INFORMATION: { diff --git a/src/send_packet.c b/src/send_packet.c index 407b1e5..6b6d012 100644 --- a/src/send_packet.c +++ b/src/send_packet.c @@ -164,6 +164,12 @@ static inline void swiftnet_send_packet( .maximum_transmission_unit = maximum_transmission_unit }; + SwiftNetDebug( + if (check_debug_flag(DEBUG_PACKETS_SENDING)) { + send_debug_message("Sending packet: {\"destination_ip_address\": \"%s\", \"destination_port\": %d, \"packet_length\": %d}\n", inet_ntoa(target_addr->sin_addr), port_info.destination_port, packet_length); + } + ) + memcpy(packet->packet_buffer_start, &packet_info, sizeof(SwiftNetPacketInfo)); if(packet_length > mtu) { @@ -186,6 +192,12 @@ static inline void swiftnet_send_packet( for(uint32_t i = 0; ; i++) { const uint32_t current_offset = i * (mtu - PACKET_HEADER_SIZE); + SwiftNetDebug( + if (check_debug_flag(DEBUG_PACKETS_SENDING)) { + send_debug_message("Sent chunk: {\"chunk_index\": %d}\n", i); + } + ) + memcpy(&buffer[offsetof(SwiftNetPacketInfo, chunk_index)], &i, SIZEOF_FIELD(SwiftNetPacketInfo, chunk_index)); memset(&buffer[offsetof(SwiftNetPacketInfo, checksum)], 0x00, SIZEOF_FIELD(SwiftNetPacketInfo, checksum)); diff --git a/tests/output/test_basic_client_server_communication b/tests/output/test_basic_client_server_communication index 80f639315aafc87f23c20dbd70fd896750df13a1..0987abf4e9a2b20b66d3020f339f26ca7dbb891c 100755 GIT binary patch delta 13002 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 Vi>3qN8QFDnJukiP^rrNX{|6f7ZA<_F delta 9421 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 O&{u!$gzs~<2k{?&j<*{C diff --git a/tests/output/test_client_sending_large_packet_to_server b/tests/output/test_client_sending_large_packet_to_server index 1192537c6b4045d02b9fb918345059a0d7cdbbd7..7393103470b8cd148d9efe723e271b980122e99b 100755 GIT binary patch delta 12873 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 T_SyJB*u4#}{AlSd>?i*OZf-}# delta 9451 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 diff --git a/tests/src/test_basic_client_server_communication.c b/tests/src/test_basic_client_server_communication.c index 8d0a595..956ed82 100644 --- a/tests/src/test_basic_client_server_communication.c +++ b/tests/src/test_basic_client_server_communication.c @@ -30,6 +30,8 @@ void server_message_handler(uint8_t* data, SwiftNetPacketServerMetadata* restric } int main() { + swiftnet_add_debug_flags(DEBUG_PACKETS_RECEIVING | DEBUG_PACKETS_SENDING); + swiftnet_initialize(); server = swiftnet_create_server(8080); diff --git a/tests/src/test_client_sending_large_packet_to_server.c b/tests/src/test_client_sending_large_packet_to_server.c index b3aaab4..cd2c5d8 100644 --- a/tests/src/test_client_sending_large_packet_to_server.c +++ b/tests/src/test_client_sending_large_packet_to_server.c @@ -31,6 +31,8 @@ void server_message_handler(uint8_t* data, SwiftNetPacketServerMetadata* restric } int main() { + swiftnet_add_debug_flags(DEBUG_PACKETS_RECEIVING | DEBUG_PACKETS_SENDING); + random_generated_data = malloc(DATA_TO_SEND); if (random_generated_data == NULL) { fprintf(stderr, "failed to allocate memory\n"); diff --git a/tests/src/test_server_sending_large_packet_to_client.c b/tests/src/test_server_sending_large_packet_to_client.c index 66a8dd8..fd5cd4e 100644 --- a/tests/src/test_server_sending_large_packet_to_client.c +++ b/tests/src/test_server_sending_large_packet_to_client.c @@ -43,6 +43,8 @@ void server_message_handler(uint8_t* data, SwiftNetPacketServerMetadata* restric } int main() { + swiftnet_add_debug_flags(DEBUG_PACKETS_RECEIVING | DEBUG_PACKETS_SENDING); + random_generated_data = malloc(DATA_TO_SEND); if (random_generated_data == NULL) { fprintf(stderr, "failed to allocate memory\n"); From d5e12ccc456ec961b571cab0e378c6a624b25777 Mon Sep 17 00:00:00 2001 From: deadlightreal Date: Fri, 4 Jul 2025 18:18:55 +0200 Subject: [PATCH 3/3] added initialization debugging --- build/output/libswift_net.a | Bin 198512 -> 204072 bytes src/initialize_client_socket.c | 35 ++++++++++++++++-- src/initialize_server_socket.c | 7 +++- src/internal/internal.h | 2 +- src/swift_net.h | 3 +- .../test_basic_client_server_communication | Bin 112520 -> 112920 bytes ...test_client_sending_large_packet_to_server | Bin 112552 -> 112952 bytes ...test_server_sending_large_packet_to_client | Bin 112552 -> 112952 bytes .../test_basic_client_server_communication.c | 2 +- ...st_client_sending_large_packet_to_server.c | 2 +- ...st_server_sending_large_packet_to_client.c | 2 +- 11 files changed, 44 insertions(+), 9 deletions(-) diff --git a/build/output/libswift_net.a b/build/output/libswift_net.a index 7a1d3febb7c8a50db6081b8c1a0e9d1f0f4f1352..8404fd52909aaf6abf359bfa120bacecbe467caf 100644 GIT binary patch delta 34170 zcmaKV349bq+J03}&rHuulIck%lL-MbBmshehC@Iw5(E|4fLtOfkN`nI!Gv�vQBF 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

QYR%BPcC1whfc@Y}6GiVGITEV7gU~RTyb$ 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 diff --git a/src/initialize_client_socket.c b/src/initialize_client_socket.c index a54b539..e262d2c 100644 --- a/src/initialize_client_socket.c +++ b/src/initialize_client_socket.c @@ -32,6 +32,12 @@ void* request_server_information(void* request_server_information_args_void) { return NULL; } + SwiftNetDebug( + if (check_debug_flag(DEBUG_INITIALIZATION)) { + send_debug_message("Requested server information: {\"server_ip_address\": \"%s\"}\n", inet_ntoa(request_server_information_args->server_addr.sin_addr)); + } + ) + sendto(request_server_information_args->sockfd, request_server_information_args->data, request_server_information_args->size, 0, (struct sockaddr *)&request_server_information_args->server_addr, request_server_information_args->server_addr_len); usleep(1000000); @@ -125,16 +131,33 @@ SwiftNetClientConnection* swiftnet_create_client(const char* const restrict ip_a while(1) { const int bytes_received = recvfrom(empty_connection->sockfd, server_information_buffer, sizeof(server_information_buffer), 0x00, NULL, NULL); if(bytes_received != PACKET_HEADER_SIZE + sizeof(SwiftNetServerInformation)) { + SwiftNetDebug( + if (check_debug_flag(DEBUG_INITIALIZATION)) { + send_debug_message("Invalid packet received from server. Expected server information: {\"bytes_received\": %d, \"expected_bytes\": %d}\n", bytes_received, PACKET_HEADER_SIZE + sizeof(SwiftNetServerInformation)); + } + ) continue; } - const SwiftNetPacketInfo* const restrict packetInfo = (SwiftNetPacketInfo *)&server_information_buffer[sizeof(struct ip)]; + const struct ip* const restrict ip_header = (struct ip*)&server_information_buffer; + + const SwiftNetPacketInfo* const restrict packet_info = (SwiftNetPacketInfo *)&server_information_buffer[sizeof(struct ip)]; - if(packetInfo->port_info.destination_port != empty_connection->port_info.source_port || packetInfo->port_info.source_port != empty_connection->port_info.destination_port) { + if(packet_info->port_info.destination_port != empty_connection->port_info.source_port || packet_info->port_info.source_port != empty_connection->port_info.destination_port) { + SwiftNetDebug( + if (check_debug_flag(DEBUG_INITIALIZATION)) { + send_debug_message("Port info does not match: {\"destination_port\": %d, \"source_port\": %d, \"source_ip_address\": \"%s\"}\n", packet_info->port_info.destination_port, packet_info->port_info.source_port, ip_header->ip_src.s_addr); + } + ) continue; } - if(packetInfo->packet_type != PACKET_TYPE_REQUEST_INFORMATION) { + if(packet_info->packet_type != PACKET_TYPE_REQUEST_INFORMATION) { + SwiftNetDebug( + if (check_debug_flag(DEBUG_INITIALIZATION)) { + send_debug_message("Invalid packet type: {\"packet_type\": %d}\n", packet_info->packet_type); + } + ) continue; } @@ -153,5 +176,11 @@ SwiftNetClientConnection* swiftnet_create_client(const char* const restrict ip_a pthread_create(&empty_connection->handle_packets_thread, NULL, swiftnet_client_handle_packets, empty_connection); + SwiftNetDebug( + if (check_debug_flag(DEBUG_INITIALIZATION)) { + send_debug_message("Successfully initialized client\n"); + } + ) + return empty_connection; } diff --git a/src/initialize_server_socket.c b/src/initialize_server_socket.c index 0d214e4..7ae7ace 100644 --- a/src/initialize_server_socket.c +++ b/src/initialize_server_socket.c @@ -47,7 +47,6 @@ SwiftNetServer* swiftnet_create_server(const uint16_t port) { const uint8_t opt = 1; setsockopt(empty_server->sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); - empty_server->packet_queue = (PacketQueue){ .first_node = NULL, @@ -69,5 +68,11 @@ SwiftNetServer* swiftnet_create_server(const uint16_t port) { // Create a new thread that will handle all packets received pthread_create(&empty_server->handle_packets_thread, NULL, swiftnet_server_handle_packets, empty_server); + SwiftNetDebug( + if (check_debug_flag(DEBUG_INITIALIZATION)) { + send_debug_message("Successfully initialized server\n"); + } + ) + return empty_server; } diff --git a/src/internal/internal.h b/src/internal/internal.h index cfa2359..73ae010 100644 --- a/src/internal/internal.h +++ b/src/internal/internal.h @@ -1,6 +1,6 @@ #pragma once -#include <_string.h> +#include #include #include #include diff --git a/src/swift_net.h b/src/swift_net.h index 8ff7dcf..8993b1c 100644 --- a/src/swift_net.h +++ b/src/swift_net.h @@ -45,7 +45,8 @@ extern uint32_t maximum_transmission_unit; typedef enum { DEBUG_PACKETS_SENDING = 1u << 0, - DEBUG_PACKETS_RECEIVING = 1u << 1 + DEBUG_PACKETS_RECEIVING = 1u << 1, + DEBUG_INITIALIZATION = 1u << 2 } SwiftNetDebugFlags; typedef struct { diff --git a/tests/output/test_basic_client_server_communication b/tests/output/test_basic_client_server_communication index 0987abf4e9a2b20b66d3020f339f26ca7dbb891c..84de15c8710ef1a7da48603c6690811d9b2301b0 100755 GIT binary patch delta 9900 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 delta 8829 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 Gm;4Jw3^z*v delta 8646 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 diff --git a/tests/src/test_basic_client_server_communication.c b/tests/src/test_basic_client_server_communication.c index 956ed82..d4cc0e0 100644 --- a/tests/src/test_basic_client_server_communication.c +++ b/tests/src/test_basic_client_server_communication.c @@ -30,7 +30,7 @@ void server_message_handler(uint8_t* data, SwiftNetPacketServerMetadata* restric } int main() { - swiftnet_add_debug_flags(DEBUG_PACKETS_RECEIVING | DEBUG_PACKETS_SENDING); + swiftnet_add_debug_flags(DEBUG_PACKETS_RECEIVING | DEBUG_PACKETS_SENDING | DEBUG_INITIALIZATION); swiftnet_initialize(); diff --git a/tests/src/test_client_sending_large_packet_to_server.c b/tests/src/test_client_sending_large_packet_to_server.c index cd2c5d8..520ebc7 100644 --- a/tests/src/test_client_sending_large_packet_to_server.c +++ b/tests/src/test_client_sending_large_packet_to_server.c @@ -31,7 +31,7 @@ void server_message_handler(uint8_t* data, SwiftNetPacketServerMetadata* restric } int main() { - swiftnet_add_debug_flags(DEBUG_PACKETS_RECEIVING | DEBUG_PACKETS_SENDING); + swiftnet_add_debug_flags(DEBUG_PACKETS_RECEIVING | DEBUG_PACKETS_SENDING | DEBUG_INITIALIZATION); random_generated_data = malloc(DATA_TO_SEND); if (random_generated_data == NULL) { diff --git a/tests/src/test_server_sending_large_packet_to_client.c b/tests/src/test_server_sending_large_packet_to_client.c index fd5cd4e..04bf566 100644 --- a/tests/src/test_server_sending_large_packet_to_client.c +++ b/tests/src/test_server_sending_large_packet_to_client.c @@ -43,7 +43,7 @@ void server_message_handler(uint8_t* data, SwiftNetPacketServerMetadata* restric } int main() { - swiftnet_add_debug_flags(DEBUG_PACKETS_RECEIVING | DEBUG_PACKETS_SENDING); + swiftnet_add_debug_flags(DEBUG_PACKETS_RECEIVING | DEBUG_PACKETS_SENDING | DEBUG_INITIALIZATION); random_generated_data = malloc(DATA_TO_SEND); if (random_generated_data == NULL) {