FreeBSD support

This commit is contained in:
Er2 2024-08-11 12:55:12 +03:00
parent 99e2d9b648
commit 5529d0ae25
8 changed files with 58 additions and 19 deletions

View File

@ -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

View File

@ -13,12 +13,13 @@
#include <arpa/inet.h>
#include <netinet/tcp.h>
#ifdef __linux__
#include <sys/mman.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__)
// 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) {

View File

@ -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;
}

8
main.c
View File

@ -24,6 +24,10 @@
#define close(fd) closesocket(fd)
#endif
#ifdef __FreeBSD__
#include <netinet/in.h>
#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

View File

@ -15,6 +15,10 @@
#include <arpa/inet.h>
#endif
#ifdef __FreeBSD__
#include <strings.h>
#endif
#define ANTOHS(data, i) \
(uint16_t)((data[i] << 8) + (uint8_t)data[i + 1])

View File

@ -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
#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

11
proxy.c
View File

@ -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__)
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;

View File

@ -7,6 +7,7 @@
#include <ws2tcpip.h>
#else
#include <arpa/inet.h>
#include <sys/socket.h>
#endif
#include "conev.h"