mirror of
https://github.com/neocturne/fastd.git
synced 2025-05-19 14:15:07 +02:00
Improve data alignment
Ensure that the actual packet data is always aligned to a multiple of 8.
This commit is contained in:
parent
3b67cdb32f
commit
430a8557d4
3 changed files with 16 additions and 19 deletions
30
src/fastd.c
30
src/fastd.c
|
@ -540,25 +540,14 @@ static void handle_tun(fastd_context *ctx) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static void handle_socket(fastd_context *ctx, int sockfd) {
|
static void handle_socket(fastd_context *ctx, int sockfd) {
|
||||||
size_t max_len = methods_max_packet_size(ctx);
|
size_t max_len = PACKET_TYPE_LEN + methods_max_packet_size(ctx);
|
||||||
fastd_buffer buffer = fastd_buffer_alloc(max_len, methods_min_decrypt_head_space(ctx), 0);
|
fastd_buffer buffer = fastd_buffer_alloc(max_len, ALIGN8(methods_min_decrypt_head_space(ctx)), 0);
|
||||||
uint8_t packet_type;
|
uint8_t *packet_type;
|
||||||
|
|
||||||
struct iovec iov[2] = {
|
|
||||||
{ .iov_base = &packet_type, .iov_len = 1 },
|
|
||||||
{ .iov_base = buffer.data, .iov_len = max_len }
|
|
||||||
};
|
|
||||||
fastd_peer_address recvaddr;
|
fastd_peer_address recvaddr;
|
||||||
|
socklen_t recvaddrlen = sizeof(recvaddr);
|
||||||
|
|
||||||
struct msghdr msg;
|
ssize_t len = recvfrom(sockfd, buffer.data, buffer.len, 0, (struct sockaddr*)&recvaddr, &recvaddrlen);
|
||||||
memset(&msg, 0, sizeof(msg));
|
|
||||||
|
|
||||||
msg.msg_name = &recvaddr;
|
|
||||||
msg.msg_namelen = sizeof(recvaddr);
|
|
||||||
msg.msg_iov = iov;
|
|
||||||
msg.msg_iovlen = 2;
|
|
||||||
|
|
||||||
ssize_t len = recvmsg(sockfd, &msg, 0);
|
|
||||||
if (len < 0) {
|
if (len < 0) {
|
||||||
if (errno != EINTR)
|
if (errno != EINTR)
|
||||||
pr_warn(ctx, "recvfrom: %s", strerror(errno));
|
pr_warn(ctx, "recvfrom: %s", strerror(errno));
|
||||||
|
@ -567,7 +556,10 @@ static void handle_socket(fastd_context *ctx, int sockfd) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
buffer.len = len - 1;
|
packet_type = buffer.data;
|
||||||
|
buffer.len = len;
|
||||||
|
|
||||||
|
fastd_buffer_push_head(&buffer, 1);
|
||||||
|
|
||||||
fastd_peer *peer;
|
fastd_peer *peer;
|
||||||
for (peer = ctx->peers; peer; peer = peer->next) {
|
for (peer = ctx->peers; peer; peer = peer->next) {
|
||||||
|
@ -576,7 +568,7 @@ static void handle_socket(fastd_context *ctx, int sockfd) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (peer) {
|
if (peer) {
|
||||||
switch (packet_type) {
|
switch (*packet_type) {
|
||||||
case PACKET_DATA:
|
case PACKET_DATA:
|
||||||
ctx->conf->protocol->handle_recv(ctx, peer, buffer);
|
ctx->conf->protocol->handle_recv(ctx, peer, buffer);
|
||||||
break;
|
break;
|
||||||
|
@ -592,7 +584,7 @@ static void handle_socket(fastd_context *ctx, int sockfd) {
|
||||||
else if(ctx->conf->n_floating || ctx->conf->n_dynamic ||
|
else if(ctx->conf->n_floating || ctx->conf->n_dynamic ||
|
||||||
(recvaddr.sa.sa_family == AF_INET && ctx->conf->n_dynamic_v4) ||
|
(recvaddr.sa.sa_family == AF_INET && ctx->conf->n_dynamic_v4) ||
|
||||||
(recvaddr.sa.sa_family == AF_INET6 && ctx->conf->n_dynamic_v6)) {
|
(recvaddr.sa.sa_family == AF_INET6 && ctx->conf->n_dynamic_v6)) {
|
||||||
switch (packet_type) {
|
switch (*packet_type) {
|
||||||
case PACKET_DATA:
|
case PACKET_DATA:
|
||||||
fastd_buffer_free(buffer);
|
fastd_buffer_free(buffer);
|
||||||
ctx->conf->protocol->handshake_init(ctx, &recvaddr, NULL);
|
ctx->conf->protocol->handshake_init(ctx, &recvaddr, NULL);
|
||||||
|
|
|
@ -349,6 +349,8 @@ static inline void fastd_string_stack_free(fastd_string_stack *str) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define ALIGN8(l) (((l+7)/8)*8)
|
||||||
|
|
||||||
static inline bool timespec_after(const struct timespec *tp1, const struct timespec *tp2) {
|
static inline bool timespec_after(const struct timespec *tp1, const struct timespec *tp2) {
|
||||||
return (tp1->tv_sec > tp2->tv_sec ||
|
return (tp1->tv_sec > tp2->tv_sec ||
|
||||||
(tp1->tv_sec == tp2->tv_sec && tp1->tv_nsec > tp2->tv_nsec));
|
(tp1->tv_sec == tp2->tv_sec && tp1->tv_nsec > tp2->tv_nsec));
|
||||||
|
|
|
@ -30,6 +30,9 @@
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
|
|
||||||
|
#define PACKET_TYPE_LEN 1
|
||||||
|
|
||||||
|
|
||||||
typedef enum _fastd_packet_type {
|
typedef enum _fastd_packet_type {
|
||||||
PACKET_UNKNOWN = 0,
|
PACKET_UNKNOWN = 0,
|
||||||
PACKET_HANDSHAKE,
|
PACKET_HANDSHAKE,
|
||||||
|
|
Loading…
Add table
Reference in a new issue