Skip to content

Commit 0456b32

Browse files
authored
Issue 117 (#119)
* added some bpf related internal functions, and made initialize client probably work. * something works, but something doesn't * Code is shit, but works :) * Performance optimization * Fixed cmake * maybe works * fixed lo interface name * updated actions * Update README.md Updated project title in README.md for clarity. * Rename linux_run_tests.yml to run_all_tests.yml * Fix casing in runs-on for consistency * Add matrix strategy for OS and architecture * many updates, but still everything doesn't work * works, but still not on linux. * should work on ubuntu. Needs testing * some changes. should work on linux * works on linux :) * small mistake * opa another mistake
1 parent 6a65389 commit 0456b32

29 files changed

+762
-443
lines changed

build/cmake/deadlightreal-swiftnetConfigVersion.cmake

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
# PACKAGE_VERSION_COMPATIBLE if the current version is >= requested version.
88
# The variable CVF_VERSION must be set before calling configure_file().
99

10-
set(PACKAGE_VERSION "1.0.0")
10+
set(PACKAGE_VERSION "0.1.0")
1111

1212
if (PACKAGE_FIND_VERSION_RANGE)
1313
# Package version must be in the requested version range

src/CMakeLists.txt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
cmake_minimum_required(VERSION 3.10)
2-
project(SwiftNet C CXX)
2+
project(swiftnet C CXX)
33

44
include(GNUInstallDirs)
55

@@ -23,9 +23,12 @@ set(SOURCE_FILES
2323
make_response.c
2424
make_request.c
2525
internal/get_mtu.c
26-
internal/get_default_interface.c
26+
internal/get_default_interface_and_mac.c
2727
internal/datatype_allocator.c
2828
internal/datatype_vector.c
29+
internal/pcap_open.c
30+
internal/pcap_send.c
31+
internal/check_existing_listener.c
2932
)
3033

3134
if(SANITIZER STREQUAL "address")

src/cleanup.c

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,39 @@
11
#include "internal/internal.h"
22
#include "swift_net.h"
3+
#include <stdint.h>
34

45
void swiftnet_cleanup() {
56
allocator_destroy(&packet_queue_node_memory_allocator);
67
allocator_destroy(&packet_callback_queue_node_memory_allocator);
78
allocator_destroy(&server_packet_data_memory_allocator);
89
allocator_destroy(&client_packet_data_memory_allocator);
910
allocator_destroy(&packet_buffer_memory_allocator);
10-
allocator_destroy(&server_memory_allocator);
1111

1212
#ifdef SWIFT_NET_REQUESTS
1313
allocator_destroy(&requests_sent_memory_allocator);
1414

1515
vector_destroy(&requests_sent);
1616
#endif
17+
18+
vector_lock(&listeners);
19+
20+
for (uint16_t i = 0; i < listeners.size; i++) {
21+
Listener* const current_listener = vector_get(&listeners, i);
22+
23+
pcap_breakloop(current_listener->pcap);
24+
25+
pthread_join(current_listener->listener_thread, NULL);
26+
27+
pcap_close(current_listener->pcap);
28+
29+
vector_destroy(&current_listener->client_connections);
30+
vector_destroy(&current_listener->servers);
31+
}
32+
33+
vector_destroy(&listeners);
34+
35+
allocator_destroy(&server_memory_allocator);
36+
allocator_destroy(&client_connection_memory_allocator);
37+
38+
allocator_destroy(&listener_memory_allocator);
1739
}

src/cleanup_connection.c

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,10 @@ void swiftnet_client_cleanup(SwiftNetClientConnection* const client) {
1414

1515
atomic_store_explicit(&client->closing, true, memory_order_release);
1616

17-
shutdown(client->sockfd, SHUT_RD);
17+
pthread_join(client->process_packets_thread, NULL);
18+
pthread_join(client->execute_callback_thread, NULL);
1819

19-
close(client->sockfd);
20-
21-
pthread_detach(client->handle_packets_thread);
22-
pthread_detach(client->process_packets_thread);
23-
pthread_detach(client->execute_callback_thread);
20+
pcap_close(client->pcap);
2421

2522
allocator_free(&client_connection_memory_allocator, client);
2623
}
@@ -36,11 +33,10 @@ void swiftnet_server_cleanup(SwiftNetServer* const server) {
3633

3734
atomic_store_explicit(&server->closing, true, memory_order_release);
3835

39-
close(server->sockfd);
36+
pthread_join(server->process_packets_thread, NULL);
37+
pthread_join(server->execute_callback_thread, NULL);
4038

41-
pthread_detach(server->handle_packets_thread);
42-
pthread_detach(server->process_packets_thread);
43-
pthread_detach(server->execute_callback_thread);
39+
pcap_close(server->pcap);
4440

4541
allocator_free(&server_memory_allocator, server);
4642
}

src/create_packet_buffer.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44
#include <stdlib.h>
55

66
static inline SwiftNetPacketBuffer create_packet_buffer(const uint32_t buffer_size) {
7-
uint8_t* const mem = malloc(buffer_size + PACKET_HEADER_SIZE);
7+
uint8_t* const mem = malloc(buffer_size + PACKET_HEADER_SIZE + sizeof(struct ether_header));
88

9-
uint8_t* const data_pointer = mem + PACKET_HEADER_SIZE;
9+
uint8_t* const data_pointer = mem + PACKET_HEADER_SIZE + sizeof(struct ether_header);
1010

1111
return (SwiftNetPacketBuffer){
1212
.packet_buffer_start = mem,

src/execute_packet_callback.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ void execute_packet_callback(PacketCallbackQueue* const queue, void (* const _At
5858

5959
for (uint32_t i = 0; i < pending_messages->size; i++) {
6060
const SwiftNetPendingMessage* const pending_message = vector_get(pending_messages, i);
61-
if ((connection_type == CONNECTION_TYPE_CLIENT && pending_message->packet_id == node->pending_message->packet_id) || (connection_type == CONNECTION_TYPE_SERVER && pending_message->sender_address == ((SwiftNetServerPacketData*)node->packet_data)->metadata.sender.sender_address.sin_addr.s_addr && pending_message->packet_id == node->pending_message->packet_id)) {
61+
if (pending_message == node->pending_message) {
6262
vector_remove(pending_messages, i);
6363
}
6464
}

src/handle_packets.c

Lines changed: 119 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#include "swift_net.h"
22
#include <arpa/inet.h>
33
#include <stdatomic.h>
4+
#include <stdint.h>
45
#include <stdio.h>
56
#include <unistd.h>
67
#include <string.h>
@@ -36,59 +37,143 @@ static inline void insert_queue_node(PacketQueueNode* const new_node, volatile P
3637
return;
3738
}
3839

39-
static inline void swiftnet_handle_packets(const int sockfd, const uint16_t source_port, pthread_t* const process_packets_thread, void* connection, const ConnectionType connection_type, PacketQueue* const packet_queue, const _Atomic bool* closing) {
40-
while(1) {
41-
if (atomic_load_explicit(closing, memory_order_acquire) == true) {
42-
break;
43-
}
40+
static inline void swiftnet_handle_packets(const uint16_t source_port, pthread_t* const process_packets_thread, void* connection, const ConnectionType connection_type, PacketQueue* const packet_queue, const _Atomic bool* closing, const bool loopback, const uint16_t addr_type, const struct pcap_pkthdr* hdr, const uint8_t* packet) {
41+
PacketQueueNode *node = allocator_allocate(&packet_queue_node_memory_allocator);
42+
if (unlikely(node == NULL)) {
43+
return;
44+
}
4445

45-
PacketQueueNode* const node = allocator_allocate(&packet_queue_node_memory_allocator);
46-
if(unlikely(node == NULL)) {
47-
continue;
48-
}
46+
uint8_t *packet_buffer = allocator_allocate(&packet_buffer_memory_allocator);
47+
if (unlikely(packet_buffer == NULL)) {
48+
allocator_free(&packet_queue_node_memory_allocator, node);
49+
return;
50+
}
4951

50-
node->server_address_length = sizeof(node->sender_address);
52+
uint32_t len = hdr->caplen;
53+
memcpy(packet_buffer, packet, len);
5154

52-
uint8_t* const packet_buffer = allocator_allocate(&packet_buffer_memory_allocator);
53-
if(unlikely(packet_buffer == NULL)) {
54-
allocator_free(&packet_queue_node_memory_allocator, node);
55-
continue;
56-
}
55+
if (len == 0) {
56+
allocator_free(&packet_queue_node_memory_allocator, node);
57+
allocator_free(&packet_buffer_memory_allocator, packet_buffer);
58+
return;
59+
}
5760

58-
const int received_sucessfully = recvfrom(sockfd, packet_buffer, maximum_transmission_unit, 0, (struct sockaddr *)&node->sender_address, &node->server_address_length);
59-
60-
if(received_sucessfully < 0) {
61+
if (addr_type == DLT_EN10MB) {
62+
struct ether_header *eth = (struct ether_header *)packet_buffer;
63+
64+
if (ntohs(eth->ether_type) == ETHERTYPE_IP) {
65+
struct ip *ip_header = (struct ip *)(packet_buffer + sizeof(struct ether_header));
66+
67+
node->sender_address = ip_header->ip_src;
68+
} else {
6169
allocator_free(&packet_queue_node_memory_allocator, node);
6270
allocator_free(&packet_buffer_memory_allocator, packet_buffer);
63-
continue;
71+
return;
6472
}
73+
}
74+
75+
node->data_read = len;
76+
node->data = packet_buffer;
77+
node->next = NULL;
78+
79+
node->server_address_length = sizeof(node->sender_address);
80+
81+
atomic_thread_fence(memory_order_release);
82+
83+
insert_queue_node(node, packet_queue, connection_type);
84+
}
85+
86+
static void handle_client_init(SwiftNetClientConnection* user, const struct pcap_pkthdr* hdr, const uint8_t* buffer) {
87+
SwiftNetClientConnection* const client_connection = (SwiftNetClientConnection*)user;
6588

66-
struct in_addr sender_addr;
67-
memcpy(&sender_addr, &packet_buffer[offsetof(struct ip, ip_src)], sizeof(struct in_addr));
89+
if (atomic_load_explicit(&client_connection->closing, memory_order_acquire) == true) {
90+
return;
91+
}
6892

69-
node->data_read = received_sucessfully;
70-
node->data = packet_buffer;
71-
node->sender_address.sin_addr = sender_addr;
72-
node->next = NULL;
93+
const uint32_t bytes_received = hdr->caplen;
7394

74-
atomic_thread_fence(memory_order_release);
95+
if(bytes_received != PACKET_HEADER_SIZE + sizeof(SwiftNetServerInformation) + client_connection->prepend_size) {
96+
#ifdef SWIFT_NET_DEBUG
97+
if (check_debug_flag(DEBUG_INITIALIZATION)) {
98+
send_debug_message("Invalid packet received from server. Expected server information: {\"bytes_received\": %u, \"expected_bytes\": %u}\n", bytes_received, PACKET_HEADER_SIZE + sizeof(SwiftNetServerInformation));
99+
}
100+
#endif
75101

76-
insert_queue_node(node, packet_queue, connection_type);
102+
return;
77103
}
104+
105+
struct ip* ip_header = (struct ip*)(buffer + client_connection->prepend_size);
106+
SwiftNetPacketInfo* packet_info = (SwiftNetPacketInfo*)(buffer + client_connection->prepend_size + sizeof(struct ip));
107+
SwiftNetServerInformation* server_information = (SwiftNetServerInformation*)(buffer + client_connection->prepend_size + sizeof(struct ip) + sizeof(SwiftNetPacketInfo));
108+
109+
if(packet_info->port_info.destination_port != client_connection->port_info.source_port || packet_info->port_info.source_port != client_connection->port_info.destination_port) {
110+
#ifdef SWIFT_NET_DEBUG
111+
if (check_debug_flag(DEBUG_INITIALIZATION)) {
112+
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, inet_ntoa(ip_header->ip_src));
113+
}
114+
#endif
115+
116+
return;
117+
}
118+
119+
if(packet_info->packet_type != PACKET_TYPE_REQUEST_INFORMATION) {
120+
#ifdef SWIFT_NET_DEBUG
121+
if (check_debug_flag(DEBUG_INITIALIZATION)) {
122+
send_debug_message("Invalid packet type: {\"packet_type\": %d}\n", packet_info->packet_type);
123+
}
124+
#endif
125+
return;
126+
}
127+
128+
client_connection->maximum_transmission_unit = server_information->maximum_transmission_unit;
129+
130+
atomic_store_explicit(&client_connection->initialized, true, memory_order_release);
78131
}
79132

80-
void* swiftnet_client_handle_packets(void* const client_void) {
81-
SwiftNetClientConnection* const client = (SwiftNetClientConnection*)client_void;
133+
static void pcap_packet_handle(uint8_t* user, const struct pcap_pkthdr* hdr, const uint8_t* packet) {
134+
Listener* const listener = (Listener*)user;
82135

83-
swiftnet_handle_packets(client->sockfd, client->port_info.source_port, &client->process_packets_thread, client, CONNECTION_TYPE_CLIENT, &client->packet_queue, &client->closing);
136+
SwiftNetPortInfo* const port_info = (SwiftNetPortInfo*)(packet + PACKET_PREPEND_SIZE(listener->addr_type) + sizeof(struct ip) + offsetof(SwiftNetPacketInfo, port_info));
84137

85-
return NULL;
138+
vector_lock(&listener->servers);
139+
140+
for (uint16_t i = 0; i < listener->servers.size; i++) {
141+
SwiftNetServer* const server = vector_get(&listener->servers, i);
142+
if (server->server_port == port_info->destination_port) {
143+
vector_unlock(&listener->servers);
144+
145+
swiftnet_handle_packets(server->server_port, &server->process_packets_thread, server, CONNECTION_TYPE_SERVER, &server->packet_queue, &server->closing, server->loopback, server->addr_type, hdr, packet);
146+
147+
return;
148+
}
149+
}
150+
151+
vector_unlock(&listener->servers);
152+
153+
vector_lock(&listener->client_connections);
154+
155+
for (uint16_t i = 0; i < listener->client_connections.size; i++) {
156+
SwiftNetClientConnection* const client_connection = vector_get(&listener->client_connections, i);
157+
if (client_connection->port_info.source_port == port_info->destination_port) {
158+
vector_unlock(&listener->client_connections);
159+
160+
if (client_connection->initialized == false) {
161+
handle_client_init(client_connection, hdr, packet);
162+
} else {
163+
swiftnet_handle_packets(client_connection->port_info.source_port, &client_connection->process_packets_thread, client_connection, CONNECTION_TYPE_CLIENT, &client_connection->packet_queue, &client_connection->closing, client_connection->loopback, client_connection->addr_type, hdr, packet);
164+
}
165+
166+
return;
167+
}
168+
}
169+
170+
vector_unlock(&listener->client_connections);
86171
}
87172

88-
void* swiftnet_server_handle_packets(void* const server_void) {
89-
SwiftNetServer* const server = (SwiftNetServer*)server_void;
173+
void* interface_start_listening(void* listener_void) {
174+
Listener* listener = listener_void;
90175

91-
swiftnet_handle_packets(server->sockfd, server->server_port, &server->process_packets_thread, server, CONNECTION_TYPE_SERVER, &server->packet_queue, &server->closing);
176+
pcap_loop(listener->pcap, 0, pcap_packet_handle, listener_void);
92177

93178
return NULL;
94179
}

0 commit comments

Comments
 (0)