fix: increase UDP read buffer length to max datagram size

Co-authored-by: Tom Moulard <tom.moulard@traefik.io>
This commit is contained in:
Kevin Pollet 2021-11-09 15:12:07 +01:00 committed by GitHub
parent 9df053e3f5
commit db4a92d877
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 137 additions and 18 deletions

View file

@ -1,7 +1,9 @@
package udp
import (
"crypto/rand"
"net"
"runtime"
"testing"
"time"
@ -9,13 +11,14 @@ import (
"github.com/stretchr/testify/require"
)
func TestUDPProxy(t *testing.T) {
func TestProxy_ServeUDP(t *testing.T) {
backendAddr := ":8081"
go newServer(t, ":8081", HandlerFunc(func(conn *Conn) {
go newServer(t, backendAddr, HandlerFunc(func(conn *Conn) {
for {
b := make([]byte, 1024*1024)
n, err := conn.Read(b)
require.NoError(t, err)
_, err = conn.Write(b[:n])
require.NoError(t, err)
}
@ -28,6 +31,7 @@ func TestUDPProxy(t *testing.T) {
go newServer(t, proxyAddr, proxy)
time.Sleep(time.Second)
udpConn, err := net.Dial("udp", proxyAddr)
require.NoError(t, err)
@ -37,9 +41,58 @@ func TestUDPProxy(t *testing.T) {
b := make([]byte, 1024*1024)
n, err := udpConn.Read(b)
require.NoError(t, err)
assert.Equal(t, "DATAWRITE", string(b[:n]))
}
func TestProxy_ServeUDP_MaxDataSize(t *testing.T) {
if runtime.GOOS == "darwin" {
// sudo sysctl -w net.inet.udp.maxdgram=65507
t.Skip("Skip test on darwin as the maximum dgram size is set to 9216 bytes by default")
}
// Theoretical maximum size of data in a UDP datagram.
// 65535 8 (UDP header) 20 (IP header).
dataSize := 65507
backendAddr := ":8083"
go newServer(t, backendAddr, HandlerFunc(func(conn *Conn) {
buffer := make([]byte, dataSize)
n, err := conn.Read(buffer)
require.NoError(t, err)
_, err = conn.Write(buffer[:n])
require.NoError(t, err)
}))
proxy, err := NewProxy(backendAddr)
require.NoError(t, err)
proxyAddr := ":8082"
go newServer(t, proxyAddr, proxy)
time.Sleep(time.Second)
udpConn, err := net.Dial("udp", proxyAddr)
require.NoError(t, err)
want := make([]byte, dataSize)
_, err = rand.Read(want)
require.NoError(t, err)
_, err = udpConn.Write(want)
require.NoError(t, err)
got := make([]byte, dataSize)
_, err = udpConn.Read(got)
require.NoError(t, err)
assert.Equal(t, want, got)
}
func newServer(t *testing.T, addr string, handler Handler) {
t.Helper()
@ -52,6 +105,7 @@ func newServer(t *testing.T, addr string, handler Handler) {
for {
conn, err := listener.Accept()
require.NoError(t, err)
go handler.ServeUDP(conn)
}
}