Add Transparent Proxy and PROXY v2 support and help page
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
/* Minimal unit test runner: ./test_runner [test_name ...] */
|
||||
|
||||
#include <netinet/in.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
@@ -112,6 +113,49 @@ static void test_token(void)
|
||||
CHECK(random_token(b, sizeof(b)) == 0 && strcmp(a, b));
|
||||
}
|
||||
|
||||
static void test_sockaddr(void)
|
||||
{
|
||||
struct sockaddr_storage ss;
|
||||
char out[64];
|
||||
CHECK(sockaddr_parse("1.2.3.4:5678", &ss) == 0 && ss.ss_family == AF_INET);
|
||||
sockaddr_str((struct sockaddr *)&ss, out, sizeof(out));
|
||||
CHECK(!strcmp(out, "1.2.3.4:5678"));
|
||||
CHECK(sockaddr_parse("[2001:db8::1]:443", &ss) == 0 && ss.ss_family == AF_INET6);
|
||||
sockaddr_str((struct sockaddr *)&ss, out, sizeof(out));
|
||||
CHECK(!strcmp(out, "[2001:db8::1]:443"));
|
||||
CHECK(sockaddr_parse("[::ffff:10.0.0.1]:80", &ss) == 0);
|
||||
sockaddr_unmap(&ss);
|
||||
sockaddr_str((struct sockaddr *)&ss, out, sizeof(out));
|
||||
CHECK(ss.ss_family == AF_INET && !strcmp(out, "10.0.0.1:80"));
|
||||
CHECK(sockaddr_parse("1.2.3.4", &ss) == -1);
|
||||
CHECK(sockaddr_parse("1.2.3.4:99999", &ss) == -1);
|
||||
CHECK(sockaddr_parse("host:80", &ss) == -1);
|
||||
CHECK(sockaddr_parse("[::1:80", &ss) == -1);
|
||||
}
|
||||
|
||||
static void test_proxy_v2(void)
|
||||
{
|
||||
static const unsigned char want4[] = {
|
||||
0x0d, 0x0a, 0x0d, 0x0a, 0x00, 0x0d, 0x0a, 0x51, 0x55, 0x49, 0x54, 0x0a,
|
||||
0x21, 0x11, 0x00, 0x0c,
|
||||
1, 2, 3, 4, 10, 0, 0, 5, 0x16, 0x2e, 0x01, 0xbb,
|
||||
};
|
||||
struct sockaddr_storage src, dst;
|
||||
unsigned char out[PROXY_V2_MAX];
|
||||
sockaddr_parse("1.2.3.4:5678", &src);
|
||||
sockaddr_parse("10.0.0.5:443", &dst);
|
||||
size_t n = proxy_v2_header(out, PROTO_TCP, (struct sockaddr *)&src, (struct sockaddr *)&dst);
|
||||
CHECK(n == sizeof(want4) && !memcmp(out, want4, n));
|
||||
|
||||
// Mixed families become IPv6 with a v4-mapped address; UDP sets DGRAM.
|
||||
sockaddr_parse("[2001:db8::1]:1000", &dst);
|
||||
n = proxy_v2_header(out, PROTO_UDP, (struct sockaddr *)&src, (struct sockaddr *)&dst);
|
||||
static const unsigned char mapped[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff, 1, 2, 3, 4 };
|
||||
CHECK(n == 52 && out[13] == 0x22 && out[15] == 36);
|
||||
CHECK(!memcmp(out + 16, mapped, 16) && out[32] == 0x20 && out[33] == 0x01);
|
||||
CHECK(out[48] == 0x16 && out[49] == 0x2e && out[50] == 0x03 && out[51] == 0xe8);
|
||||
}
|
||||
|
||||
/* Runner */
|
||||
|
||||
static const struct { const char *name; void (*fn)(void); } tests[] = {
|
||||
@@ -121,6 +165,8 @@ static const struct { const char *name; void (*fn)(void); } tests[] = {
|
||||
{ "services_parse", test_services_parse },
|
||||
{ "json", test_json },
|
||||
{ "token", test_token },
|
||||
{ "sockaddr", test_sockaddr },
|
||||
{ "proxy_v2", test_proxy_v2 },
|
||||
};
|
||||
|
||||
int main(int argc, char **argv)
|
||||
|
||||
Reference in New Issue
Block a user