Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

FreeBSD support #74

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
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
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
TARGET = ciadpi

CPPFLAGS = -D_XOPEN_SOURCE=500
CPPFLAGS = -D_XOPEN_SOURCE=600 -D__BSD_VISIBLE=1
CFLAGS += -I. -std=c99 -Wall -Wno-unused -O2
WIN_LDFLAGS = -lws2_32 -lmswsock

Expand Down
36 changes: 29 additions & 7 deletions desync.c
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,14 @@
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/tcp.h>

#ifdef __linux__

#include <sys/mman.h>
#include <sys/sendfile.h>
#ifdef __linux__
#include <sys/sendfile.h>
#endif
#include <fcntl.h>


#ifdef __linux__
#ifdef MFD_CLOEXEC
#include <sys/syscall.h>
#define memfd_create(name, flags) syscall(__NR_memfd_create, name, flags);
Expand Down Expand Up @@ -83,7 +84,7 @@ static inline void delay(long ms)
#define delay(ms) Sleep(ms)
#endif

#ifdef __linux__
#if defined(__linux__) || defined(__FreeBSD__)
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Структура tcp_info, определенная в desync.h, несовместима с FreeBSD, работать будет некорректно.

void wait_send(int sfd)
{
for (int i = 0; params.wait_send && i < 500; i++) {
Expand Down Expand Up @@ -119,7 +120,7 @@ void wait_send(int sfd)
#define wait_send_if_support(sfd) // :(
#endif

#ifdef __linux__
#if defined(__linux__) || defined(__FreeBSD__)
ssize_t send_fake(int sfd, char *buffer,
int cnt, long pos, int fa, struct desync_params *opt)
{
Expand Down Expand Up @@ -166,11 +167,18 @@ ssize_t send_fake(int sfd, char *buffer,
break;
}
if (opt->md5sig) {
#ifdef __linux__
struct tcp_md5sig md5 = {
.tcpm_keylen = 5
};
memcpy(&md5.tcpm_addr, &addr, addr_size);

#elif defined(__FreeBSD__)
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Следует вовсе убрать поддержку md5sig. Так работать корректно не будет.

// FIXME: Should be struct tcpmd5_support
// but netipsec/ipsec_support.h hides this under ifdef KERNEL
int md5 = 1;
#else
#error
#endif
if (setsockopt(sfd, IPPROTO_TCP,
TCP_MD5SIG, (char *)&md5, sizeof(md5)) < 0) {
uniperror("setsockopt TCP_MD5SIG");
Expand All @@ -184,7 +192,15 @@ ssize_t send_fake(int sfd, char *buffer,
break;
}

#ifdef __linux__
len = sendfile(sfd, ffd, 0, pos);
#else
int ret = sendfile(ffd, sfd, 0, pos, NULL, &len, 0);
if (ret < 0) {
uniperror("sendfile");
break;
}
#endif
if (len < 0) {
uniperror("sendfile");
break;
Expand All @@ -202,10 +218,16 @@ ssize_t send_fake(int sfd, char *buffer,
break;
}
if (opt->md5sig) {
#ifdef __linux__
struct tcp_md5sig md5 = {
.tcpm_keylen = 0
};
memcpy(&md5.tcpm_addr, &addr, addr_size);
#elif defined(__FreeBSD__)
int md5 = 0;
#else
#error
#endif

if (setsockopt(sfd, IPPROTO_TCP,
TCP_MD5SIG, (char *)&md5, sizeof(md5)) < 0) {
Expand Down
7 changes: 4 additions & 3 deletions extend.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,15 +33,16 @@ int set_timeout(int fd, unsigned int s)
uniperror("setsockopt TCP_USER_TIMEOUT");
return -1;
}
#else
#ifdef _WIN32
#elif defined(__FreeBSD__)
// https://wiki.freebsd.org/CatalinNicutar/TCPUTO
// sadly not yet available
#elif defined(_WIN32)
if (setsockopt(fd, IPPROTO_TCP,
TCP_MAXRT, (char *)&s, sizeof(s))) {
uniperror("setsockopt TCP_MAXRT");
return -1;
}
#endif
#endif
return 0;
}

Expand Down
8 changes: 6 additions & 2 deletions main.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,10 @@
#define close(fd) closesocket(fd)
#endif

#ifdef __FreeBSD__
#include <netinet/in.h>
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Можно поместить в #ifndef _win32

#endif

#define VERSION "12"

char oob_char[1] = "a";
Expand Down Expand Up @@ -94,7 +98,7 @@ const char help_text[] = {
#ifdef FAKE_SUPPORT
" -f, --fake <n[+s]> Split and send fake packet\n"
" -t, --ttl <num> TTL of fake packets, default 8\n"
#ifdef __linux__
#if defined(__linux__) || defined(__FreeBSD__)
" -k, --ip-opt[=f|:str] IP options of fake packets\n"
" -S, --md5sig Add MD5 Signature option for fake packets\n"
#endif
Expand Down Expand Up @@ -138,7 +142,7 @@ const struct option options[] = {
#ifdef FAKE_SUPPORT
{"fake", 1, 0, 'f'},
{"ttl", 1, 0, 't'},
#ifdef __linux__
#if defined(__linux__) || defined(__FreeBSD__)
{"ip-opt", 2, 0, 'k'},
{"md5sig", 0, 0, 'S'},
#endif
Expand Down
4 changes: 4 additions & 0 deletions packets.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,10 @@
#include <arpa/inet.h>
#endif

#ifdef __FreeBSD__
#include <strings.h>
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Здесь #ifdef можно вовсе убрать.

#endif

#define ANTOHS(data, i) \
(uint16_t)((data[i] << 8) + (uint8_t)data[i + 1])

Expand Down
8 changes: 8 additions & 0 deletions params.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,20 @@
#ifdef _WIN32
#include <ws2tcpip.h>
#else
#include <unistd.h>
#include <arpa/inet.h>
#endif

#ifdef __FreeBSD__
#include <netinet/in.h>
#endif

Copy link
Owner

@hufrea hufrea Aug 12, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ни таймаут, ни фейки здесь работать не будут, поэтому поддержку объявлять не стоит.
upd: я про стр.17

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Таймаут не работает (потому что не вмёржили в ядро), а фейки после починки sendfile вроде бы вполне себе работают.

#if defined(__linux__) || defined(_WIN32)
#define FAKE_SUPPORT 1
#define TIMEOUT_SUPPORT 1
#elif defined(__FreeBSD__)
#define FAKE_SUPPORT 1
// TIMEOUT_SUPPORT can't be used
#endif

#define OFFSET_SNI 1
Expand Down
11 changes: 5 additions & 6 deletions proxy.c
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ static inline char addr_equ(

static inline int nb_socket(int domain, int type)
{
#ifdef __linux__
#if defined(__linux__) || defined(__FreeBSD__)
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Пусть accept4 будет только на Linux (ниже все равно вызывается fcntl).

int fd = socket(domain, type | SOCK_NONBLOCK, 0);
#else
int fd = socket(domain, type, 0);
Expand All @@ -98,15 +98,13 @@ static inline int nb_socket(int domain, int type)
close(fd);
return -1;
}
#else
#ifndef __linux__
#elif !defined(__linux__)
if (fcntl(fd, F_SETFL, O_NONBLOCK) < 0) {
uniperror("fcntl");
close(fd);
return -1;
}
#endif
#endif
return fd;
}

Expand Down Expand Up @@ -517,7 +515,7 @@ static inline int on_accept(struct poolhd *pool, struct eval *val)

while (1) {
socklen_t len = sizeof(client);
#ifdef __linux__
#if defined(__linux__) || defined(__FreeBSD__)
int c = accept4(val->fd, &client.sa, &len, SOCK_NONBLOCK);
#else
int c = accept(val->fd, &client.sa, &len);
Expand Down Expand Up @@ -940,7 +938,8 @@ int listen_socket(struct sockaddr_ina *srv)
close(srvfd);
return -1;
}
if (bind(srvfd, &srv->sa, sizeof(*srv)) < 0) {
size_t size = srv->sa.sa_family == AF_INET6 ? sizeof(srv->in6) : sizeof(srv->in);
if (bind(srvfd, &srv->sa, size) < 0) {
uniperror("bind");
close(srvfd);
return -1;
Expand Down
1 change: 1 addition & 0 deletions proxy.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
#include <ws2tcpip.h>
#else
#include <arpa/inet.h>
#include <sys/socket.h>
#endif

#include "conev.h"
Expand Down