commit 3fd7d0e4532bff0bd50e0e7d2a1c895e6cf9604a
| author | 斟酌 鵬兄 <tgckpg@gmail.com> |
| date | 2026-05-28T22:26:34Z |
| subject | Refactor 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"