Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions src/execute_packet_callback.c
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ static struct PacketCallbackQueueNode* const wait_for_next_packet_callback(struc
return node_to_process;
}

void execute_packet_callback(struct PacketCallbackQueue* const queue, void (* const _Atomic * const packet_handler) (void* const), const enum ConnectionType connection_type, struct SwiftNetMemoryAllocator* const pending_message_memory_allocator, _Atomic bool* closing, void* const connection, struct SwiftNetVector* const pending_messages) {
void execute_packet_callback(struct PacketCallbackQueue* const queue, void (* const _Atomic * const packet_handler) (void* const, void* const), const enum ConnectionType connection_type, struct SwiftNetMemoryAllocator* const pending_message_memory_allocator, _Atomic bool* closing, void* const connection, struct SwiftNetVector* const pending_messages, _Atomic(void*)* user_data) {
while (1) {
if (atomic_load_explicit(closing, memory_order_acquire) == true) {
break;
Expand Down Expand Up @@ -67,7 +67,7 @@ void execute_packet_callback(struct PacketCallbackQueue* const queue, void (* co
vector_unlock(pending_messages);
}

void (*const packet_handler_loaded)(void*) = atomic_load(packet_handler);
void (*const packet_handler_loaded)(void* const, void* const) = atomic_load(packet_handler);
if (unlikely(packet_handler_loaded == NULL)) {
if (connection_type == CONNECTION_TYPE_CLIENT) {
swiftnet_client_destroy_packet_data(node->packet_data, connection);
Expand All @@ -80,7 +80,7 @@ void execute_packet_callback(struct PacketCallbackQueue* const queue, void (* co
continue;
}

(*packet_handler_loaded)(node->packet_data);
(*packet_handler_loaded)(node->packet_data, atomic_load_explicit(user_data, memory_order_acquire));

allocator_free(&packet_callback_queue_node_memory_allocator, (void*)node);
}
Expand All @@ -89,15 +89,15 @@ void execute_packet_callback(struct PacketCallbackQueue* const queue, void (* co
void* execute_packet_callback_client(void* const void_client) {
struct SwiftNetClientConnection* const client = void_client;

execute_packet_callback(&client->packet_callback_queue, (void*)&client->packet_handler, CONNECTION_TYPE_CLIENT, &client->pending_messages_memory_allocator, &client->closing, void_client, &client->pending_messages);
execute_packet_callback(&client->packet_callback_queue, (void*)&client->packet_handler, CONNECTION_TYPE_CLIENT, &client->pending_messages_memory_allocator, &client->closing, void_client, &client->pending_messages, &client->packet_handler_user_arg);

return NULL;
}

void* execute_packet_callback_server(void* const void_server) {
struct SwiftNetServer* const server = void_server;

execute_packet_callback(&server->packet_callback_queue, (void*)&server->packet_handler, CONNECTION_TYPE_SERVER, &server->pending_messages_memory_allocator, &server->closing, void_server, &server->pending_messages);
execute_packet_callback(&server->packet_callback_queue, (void*)&server->packet_handler, CONNECTION_TYPE_SERVER, &server->pending_messages_memory_allocator, &server->closing, void_server, &server->pending_messages, &server->packet_handler_user_arg);

return NULL;
}
11 changes: 7 additions & 4 deletions src/generic_functions.c
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#include "internal/internal.h"
#include "swift_net.h"
#include <stdatomic.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
Expand All @@ -15,16 +16,18 @@ static inline void swiftnet_validate_new_handler(const void* const new_handler,
#endif
}

void swiftnet_client_set_message_handler(struct SwiftNetClientConnection* const client, void (* const new_handler)(struct SwiftNetClientPacketData* const)) {
void swiftnet_client_set_message_handler(struct SwiftNetClientConnection* const client, void (* const new_handler)(struct SwiftNetClientPacketData* const, void* const), void* const user_arg) {
swiftnet_validate_new_handler(new_handler, __func__);

atomic_store(&client->packet_handler, new_handler);
atomic_store_explicit(&client->packet_handler, new_handler, memory_order_release);
atomic_store_explicit(&client->packet_handler_user_arg, user_arg, memory_order_release);
}

void swiftnet_server_set_message_handler(struct SwiftNetServer* const server, void (* const new_handler)(struct SwiftNetServerPacketData* const)) {
void swiftnet_server_set_message_handler(struct SwiftNetServer* const server, void (* const new_handler)(struct SwiftNetServerPacketData* const, void* const), void* const user_arg) {
swiftnet_validate_new_handler(new_handler, __func__);

atomic_store(&server->packet_handler, new_handler);
atomic_store_explicit(&server->packet_handler, new_handler, memory_order_release);
atomic_store_explicit(&server->packet_handler_user_arg, user_arg, memory_order_release);
}

// Read packet data into buffers
Expand Down
2 changes: 2 additions & 0 deletions src/initialize_client_socket.c
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,8 @@ struct SwiftNetClientConnection* swiftnet_create_client(const char* const ip_add

new_connection->server_addr.s_addr = inet_addr(ip_address);

atomic_store_explicit(&new_connection->packet_handler_user_arg, NULL, memory_order_release);

// Request the server information, and proccess it
const struct SwiftNetPacketInfo request_server_information_packet_info = construct_packet_info(
0x00,
Expand Down
5 changes: 3 additions & 2 deletions src/initialize_server_socket.c
Original file line number Diff line number Diff line change
Expand Up @@ -54,9 +54,10 @@ struct SwiftNetServer* swiftnet_create_server(const uint16_t port, const bool lo
atomic_store(&new_server->packet_queue.owner, PACKET_QUEUE_OWNER_NONE);

memset(&new_server->packet_callback_queue, 0x00, sizeof(struct PacketCallbackQueue));
atomic_store(&new_server->packet_callback_queue.owner, PACKET_CALLBACK_QUEUE_OWNER_NONE);
atomic_store_explicit(&new_server->packet_callback_queue.owner, PACKET_CALLBACK_QUEUE_OWNER_NONE, memory_order_release);

atomic_store(&new_server->packet_handler, NULL);
atomic_store_explicit(&new_server->packet_handler, NULL, memory_order_release);
atomic_store_explicit(&new_server->packet_handler_user_arg, NULL, memory_order_release);

new_server->pending_messages_memory_allocator = allocator_create(sizeof(struct SwiftNetPendingMessage), 100);
new_server->pending_messages = vector_create(100);
Expand Down
12 changes: 8 additions & 4 deletions src/swift_net.h
Original file line number Diff line number Diff line change
Expand Up @@ -217,7 +217,8 @@ struct SwiftNetClientConnection {
struct SwiftNetPortInfo port_info;
struct in_addr server_addr;
socklen_t server_addr_len;
_Atomic(void (*)(struct SwiftNetClientPacketData* const)) packet_handler;
_Atomic(void (*)(struct SwiftNetClientPacketData* const, void* const user)) packet_handler;
_Atomic(void*) packet_handler_user_arg;
_Atomic bool closing;
_Atomic bool initialized;
uint16_t addr_type;
Expand All @@ -240,7 +241,8 @@ struct SwiftNetServer {
pcap_t* pcap;
struct ether_header eth_header;
uint16_t server_port;
_Atomic(void (*)(struct SwiftNetServerPacketData* const)) packet_handler;
_Atomic(void (*)(struct SwiftNetServerPacketData* const, void* const user)) packet_handler;
_Atomic(void*) packet_handler_user_arg;
_Atomic bool closing;
uint16_t addr_type;
bool loopback;
Expand All @@ -265,7 +267,8 @@ struct SwiftNetServer {
*/
extern void swiftnet_server_set_message_handler(
struct SwiftNetServer* const server,
void (* const new_handler)(struct SwiftNetServerPacketData* const)
void (* const new_handler)(struct SwiftNetServerPacketData* const, void* const),
void* const user_arg
);

/**
Expand All @@ -275,7 +278,8 @@ extern void swiftnet_server_set_message_handler(
*/
extern void swiftnet_client_set_message_handler(
struct SwiftNetClientConnection* const client,
void (* const new_handler)(struct SwiftNetClientPacketData* const)
void (* const new_handler)(struct SwiftNetClientPacketData* const, void* const),
void* const user_arg
);

/**
Expand Down
8 changes: 4 additions & 4 deletions tests/src/making_request.c
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ static void reset_test_state() {
atomic_store_explicit(&g_test_result, INT_MAX, memory_order_release);
}

static void on_client_packet(struct SwiftNetClientPacketData* packet) {
static void on_client_packet(struct SwiftNetClientPacketData* packet, void* const user) {
struct SwiftNetClientConnection* const client_conn = atomic_load_explicit(&g_client_conn, memory_order_acquire);

if (packet->metadata.data_length != atomic_load_explicit(&g_request_data_len, memory_order_acquire)) {
Expand Down Expand Up @@ -99,7 +99,7 @@ static void on_client_packet(struct SwiftNetClientPacketData* packet) {
atomic_store_explicit(&g_sent_response, true, memory_order_release);
}

static void on_server_packet(struct SwiftNetServerPacketData* packet) {
static void on_server_packet(struct SwiftNetServerPacketData* packet, void* const user) {
struct SwiftNetServer* const server = atomic_load_explicit(&g_server, memory_order_acquire);

if (packet->metadata.expecting_response) {
Expand Down Expand Up @@ -241,15 +241,15 @@ int test_making_request(const union Args* args_ptr) {
return -1;
}

swiftnet_server_set_message_handler(server, on_server_packet);
swiftnet_server_set_message_handler(server, on_server_packet, NULL);

struct SwiftNetClientConnection* const client_conn = swiftnet_create_client(args.ip_address, 8080, 1000);
if (client_conn == NULL) {
PRINT_ERROR("Failed to create client connection");
return -1;
}

swiftnet_client_set_message_handler(client_conn, on_client_packet);
swiftnet_client_set_message_handler(client_conn, on_client_packet, NULL);

atomic_store_explicit(&g_client_conn, client_conn, memory_order_release);
atomic_store_explicit(&g_server, server, memory_order_release);
Expand Down
8 changes: 4 additions & 4 deletions tests/src/sending_packet.c
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ static void reset_test_state() {
atomic_store_explicit(&g_test_result, INT_MAX, memory_order_release);
}

static void on_client_packet(struct SwiftNetClientPacketData* packet) {
static void on_client_packet(struct SwiftNetClientPacketData* packet, void* const user) {
struct SwiftNetClientConnection* const client_conn = atomic_load_explicit(&g_client_conn, memory_order_acquire);

while (!atomic_load_explicit(&g_client_send_done, memory_order_acquire)) usleep(1000);
Expand Down Expand Up @@ -84,7 +84,7 @@ static void on_client_packet(struct SwiftNetClientPacketData* packet) {
swiftnet_client_destroy_packet_data(packet, client_conn);
}

static void on_server_packet(struct SwiftNetServerPacketData* packet) {
static void on_server_packet(struct SwiftNetServerPacketData* packet, void* const user) {
struct SwiftNetServer* const server = atomic_load_explicit(&g_server, memory_order_acquire);

while (!atomic_load_explicit(&g_server_send_done, memory_order_acquire)) usleep(1000);
Expand Down Expand Up @@ -143,15 +143,15 @@ int test_sending_packet(const union Args* args_ptr) {
return -1;
}

swiftnet_server_set_message_handler(server, on_server_packet);
swiftnet_server_set_message_handler(server, on_server_packet, NULL);

struct SwiftNetClientConnection* const client_conn = swiftnet_create_client(args.ip_address, 8080, 1000);
if (client_conn == NULL) {
PRINT_ERROR("Failed to create client connection");
return -1;
}

swiftnet_client_set_message_handler(client_conn, on_client_packet);
swiftnet_client_set_message_handler(client_conn, on_client_packet, NULL);

atomic_store_explicit(&g_client_conn, client_conn, memory_order_release);
atomic_store_explicit(&g_server, server, memory_order_release);
Expand Down