penguin/tinyproxy

An L4 proxy designed to act as a tiny transparent shim

commit 3fd7d0e4532bff0bd50e0e7d2a1c895e6cf9604a

author斟酌 鵬兄 <tgckpg@gmail.com>
date2026-05-28T22:26:34Z
subjectRefactor a bit
commit 3fd7d0e4532bff0bd50e0e7d2a1c895e6cf9604a
Author: 斟酌 鵬兄 <tgckpg@gmail.com>
Date:   2026-05-28T22:26:34Z

    Refactor a bit
---
 src/datagram_client.c   | 62 ++++++++++++++++++++++++++++++++++++++++++++++++-
 src/datagram_client.h   |  6 +++++
 src/datagram_listener.c | 61 ------------------------------------------------
 src/datagram_route.c    |  6 -----
 4 files changed, 67 insertions(+), 68 deletions(-)

diff --git a/src/datagram_client.c b/src/datagram_client.c
index 011301b..0ad5092 100644
--- a/src/datagram_client.c
+++ b/src/datagram_client.c
@@ -8,6 +8,7 @@
 #include "env.h"
 #include "route.h"
 #include "datagram_client.h"
+#include "proxy_proto_v2.h"
 
 void free_datagram_client(struct datagram_client *c)
 {
@@ -197,6 +198,66 @@ static int connect_datagram_upstream(struct datagram_client *c, const struct end
 	}
 }
 
+int send_datagram_payload_to_upstream(
+	struct datagram_client *c,
+	const unsigned char *payload,
+	size_t payload_len
+) {
+	struct datagram_route_ctx *ctx = c->ctx;
+	const struct route *r = ctx->route;
+
+	if (!r->opts.proxy_v2) {
+		ssize_t sent = send(c->fd, (const char *)payload, payload_len, 0);
+		if (sent < 0) {
+			return -EVUTIL_SOCKET_ERROR();
+		}
+
+		return 0;
+	}
+
+	if (c->client_addr.ss_family != AF_INET ||
+		ctx->local_addr.ss_family != AF_INET) {
+		LOG_ERROR("PROXY v2 UDP currently only supports IPv4",
+			"client_family", _LOGV(c->client_addr.ss_family),
+			"local_family", _LOGV(ctx->local_addr.ss_family)
+		);
+		return -EAFNOSUPPORT;
+	}
+
+	unsigned char hdr[256];
+	size_t hdr_len = 0;
+
+	int rc = proxy_v2_build(
+		hdr,
+		sizeof(hdr),
+		(const struct sockaddr *)&c->client_addr,
+		c->client_addr_len,
+		(const struct sockaddr *)&ctx->local_addr,
+		ctx->local_addr_len,
+		SOCK_DGRAM,
+		&hdr_len
+	);
+	if (rc != 0) {
+		return rc;
+	}
+
+	if (hdr_len + payload_len > UDP_MAX_PACKET) {
+		return -EMSGSIZE;
+	}
+
+	unsigned char out[UDP_MAX_PACKET];
+
+	memcpy(out, hdr, hdr_len);
+	memcpy(out + hdr_len, payload, payload_len);
+
+	ssize_t sent = send(c->fd, (const char *)out, hdr_len + payload_len, 0);
+	if (sent < 0) {
+		return -EVUTIL_SOCKET_ERROR();
+	}
+
+	return 0;
+}
+
 static void upstream_read_cb(evutil_socket_t fd, short events, void *arg)
 {
 	(void)events;
@@ -302,4 +363,3 @@ struct datagram_client *create_datagram_client(
 
 	return c;
 }
-
diff --git a/src/datagram_client.h b/src/datagram_client.h
index 7a6b1f4..2320ec3 100644
--- a/src/datagram_client.h
+++ b/src/datagram_client.h
@@ -34,4 +34,10 @@ struct datagram_client *find_datagram_client(
 	socklen_t addr_len
 );
 
+int send_datagram_payload_to_upstream(
+	struct datagram_client *c,
+	const unsigned char *payload,
+	size_t payload_len
+);
+
 #endif
diff --git a/src/datagram_listener.c b/src/datagram_listener.c
index c8c0d8b..4fe0260 100644
--- a/src/datagram_listener.c
+++ b/src/datagram_listener.c
@@ -7,67 +7,6 @@
 #include "datagram_listener.h"
 #include "datagram_client.h"
 #include "datagram_builtin.h"
-#include "proxy_proto_v2.h"
-
-static int send_datagram_payload_to_upstream(
-	struct datagram_client *c,
-	const unsigned char *payload,
-	size_t payload_len
-) {
-	struct datagram_route_ctx *ctx = c->ctx;
-	const struct route *r = ctx->route;
-
-	if (!r->opts.proxy_v2) {
-		ssize_t sent = send(c->fd, (const char *)payload, payload_len, 0);
-		if (sent < 0) {
-			return -EVUTIL_SOCKET_ERROR();
-		}
-
-		return 0;
-	}
-
-	if (c->client_addr.ss_family != AF_INET ||
-		ctx->local_addr.ss_family != AF_INET) {
-		LOG_ERROR("PROXY v2 UDP currently only supports IPv4",
-			"client_family", _LOGV(c->client_addr.ss_family),
-			"local_family", _LOGV(ctx->local_addr.ss_family)
-		);
-		return -EAFNOSUPPORT;
-	}
-
-	unsigned char hdr[256];
-	size_t hdr_len = 0;
-
-	int rc = proxy_v2_build(
-		hdr,
-		sizeof(hdr),
-		(const struct sockaddr *)&c->client_addr,
-		c->client_addr_len,
-		(const struct sockaddr *)&ctx->local_addr,
-		ctx->local_addr_len,
-		SOCK_DGRAM,
-		&hdr_len
-	);
-	if (rc != 0) {
-		return rc;
-	}
-
-	if (hdr_len + payload_len > UDP_MAX_PACKET) {
-		return -EMSGSIZE;
-	}
-
-	unsigned char out[UDP_MAX_PACKET];
-
-	memcpy(out, hdr, hdr_len);
-	memcpy(out + hdr_len, payload, payload_len);
-
-	ssize_t sent = send(c->fd, (const char *)out, hdr_len + payload_len, 0);
-	if (sent < 0) {
-		return -EVUTIL_SOCKET_ERROR();
-	}
-
-	return 0;
-}
 
 static void listen_read_cb(evutil_socket_t fd, short events, void *arg)
 {
diff --git a/src/datagram_route.c b/src/datagram_route.c
index 26204fb..7ba2311 100644
--- a/src/datagram_route.c
+++ b/src/datagram_route.c
@@ -1,16 +1,10 @@
 #include <event2/event.h>
-#include <event2/util.h>
 
 #include <errno.h>
-#include <stdint.h>
-#include <stdlib.h>
 #include <string.h>
-#include <time.h>
 
 #include "klog.h"
 #include "env.h"
-#include "file_conf.h"
-#include "proxy_proto_v2.h"
 #include "worker.h"
 #include "route.h"
 #include "datagram_route.h"