penguin/tinyproxy

An L4 proxy designed to act as a tiny transparent shim

commit db7aa486c9755f01ad2d745cefcf87bd9ad9d150

author斟酌 鵬兄 <tgckpg@gmail.com>
date2026-05-31T09:01:27Z
subjectUpdate docs
commit db7aa486c9755f01ad2d745cefcf87bd9ad9d150
Author: 斟酌 鵬兄 <tgckpg@gmail.com>
Date:   2026-05-31T09:01:27Z

    Update docs
---
 devtools/TSAN.sh          |  3 +++
 devtools/race_test.py     | 51 +++++++++++++++++++++++++++++++++++++++++++++++
 docs/tinyproxy.conf.5.scd |  3 +++
 3 files changed, 57 insertions(+)

diff --git a/devtools/TSAN.sh b/devtools/TSAN.sh
new file mode 100755
index 0000000..ab0ab02
--- /dev/null
+++ b/devtools/TSAN.sh
@@ -0,0 +1,3 @@
+#!/bin/bash
+
+CC=clang EXTRA_CFLAGS="-Og -g3 -DTINYPROXY_DEBUG -fsanitize=thread -fno-omit-frame-pointer"   LDFLAGS="-fsanitize=thread" LIBEVENT_SRC=libevent2/ make clean all
diff --git a/devtools/race_test.py b/devtools/race_test.py
new file mode 100755
index 0000000..4a509fe
--- /dev/null
+++ b/devtools/race_test.py
@@ -0,0 +1,51 @@
+#!/usr/bin/env python3
+import argparse
+import socket
+import threading
+import time
+
+
+def worker(sock: socket.socket, host: str, port: int, count: int, payload: bytes) -> None:
+    for _ in range(count):
+        sock.sendto(payload, (host, port))
+
+
+def main() -> None:
+    ap = argparse.ArgumentParser()
+    ap.add_argument("--host", default="127.0.0.1")
+    ap.add_argument("--port", type=int, default=24801)
+    ap.add_argument("--threads", type=int, default=32)
+    ap.add_argument("--count", type=int, default=100)
+    ap.add_argument("--payload", default="x")
+    args = ap.parse_args()
+
+    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+    sock.bind(("127.0.0.1", 0))
+
+    print(f"client={sock.getsockname()} target={(args.host, args.port)}")
+    print(f"sending {args.threads * args.count} packets")
+
+    payload = args.payload.encode()
+    threads = []
+
+    start = time.time()
+
+    for _ in range(args.threads):
+        t = threading.Thread(
+            target=worker,
+            args=(sock, args.host, args.port, args.count, payload),
+        )
+        t.start()
+        threads.append(t)
+
+    for t in threads:
+        t.join()
+
+    elapsed = time.time() - start
+    print(f"done in {elapsed:.3f}s")
+
+    sock.close()
+
+
+if __name__ == "__main__":
+    main()
\ No newline at end of file
diff --git a/docs/tinyproxy.conf.5.scd b/docs/tinyproxy.conf.5.scd
index 93e58f8..fc40c92 100644
--- a/docs/tinyproxy.conf.5.scd
+++ b/docs/tinyproxy.conf.5.scd
@@ -34,6 +34,9 @@ connect_timeout=SECONDS
 	Connection timeout for both listen and upstream.
 	Default: 5
 
+broadcast_reply
+	UDP only. Forward broadcast packets to the upstream and relay replies from the listening endpoint.
+
 # ENDPOINTS
 
 unix /tmp/backend.sock