-
Notifications
You must be signed in to change notification settings - Fork 125
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
base: main
Are you sure you want to change the base?
FreeBSD support #74
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -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); | ||
|
@@ -83,7 +84,7 @@ static inline void delay(long ms) | |
#define delay(ms) Sleep(ms) | ||
#endif | ||
|
||
#ifdef __linux__ | ||
#if defined(__linux__) || defined(__FreeBSD__) | ||
void wait_send(int sfd) | ||
{ | ||
for (int i = 0; params.wait_send && i < 500; i++) { | ||
|
@@ -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) | ||
{ | ||
|
@@ -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__) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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"); | ||
|
@@ -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; | ||
|
@@ -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) { | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -24,6 +24,10 @@ | |
#define close(fd) closesocket(fd) | ||
#endif | ||
|
||
#ifdef __FreeBSD__ | ||
#include <netinet/in.h> | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Можно поместить в #ifndef _win32 |
||
#endif | ||
|
||
#define VERSION "12" | ||
|
||
char oob_char[1] = "a"; | ||
|
@@ -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 | ||
|
@@ -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 | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -15,6 +15,10 @@ | |
#include <arpa/inet.h> | ||
#endif | ||
|
||
#ifdef __FreeBSD__ | ||
#include <strings.h> | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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]) | ||
|
||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -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 | ||
|
||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ни таймаут, ни фейки здесь работать не будут, поэтому поддержку объявлять не стоит. There was a problem hiding this comment. Choose a reason for hiding this commentThe 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 | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -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__) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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); | ||
|
@@ -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; | ||
} | ||
|
||
|
@@ -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); | ||
|
@@ -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; | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -7,6 +7,7 @@ | |
#include <ws2tcpip.h> | ||
#else | ||
#include <arpa/inet.h> | ||
#include <sys/socket.h> | ||
#endif | ||
|
||
#include "conev.h" | ||
|
There was a problem hiding this comment.
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, работать будет некорректно.