Add SO_REUSEPORT support for EntryPoints
This commit is contained in:
parent
40de310927
commit
d02be003ab
19 changed files with 279 additions and 43 deletions
|
@ -1,7 +1,9 @@
|
|||
package udp
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"net"
|
||||
"sync"
|
||||
|
@ -33,18 +35,22 @@ type Listener struct {
|
|||
}
|
||||
|
||||
// Listen creates a new listener.
|
||||
func Listen(network string, laddr *net.UDPAddr, timeout time.Duration) (*Listener, error) {
|
||||
func Listen(listenConfig net.ListenConfig, network, address string, timeout time.Duration) (*Listener, error) {
|
||||
if timeout <= 0 {
|
||||
return nil, errors.New("timeout should be greater than zero")
|
||||
}
|
||||
|
||||
conn, err := net.ListenUDP(network, laddr)
|
||||
packetConn, err := listenConfig.ListenPacket(context.Background(), network, address)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
return nil, fmt.Errorf("listen packet: %w", err)
|
||||
}
|
||||
pConn, ok := packetConn.(*net.UDPConn)
|
||||
if !ok {
|
||||
return nil, errors.New("packet conn is not an UDPConn")
|
||||
}
|
||||
|
||||
l := &Listener{
|
||||
pConn: conn,
|
||||
pConn: pConn,
|
||||
acceptCh: make(chan *Conn),
|
||||
conns: make(map[string]*Conn),
|
||||
accepting: true,
|
||||
|
|
|
@ -14,10 +14,7 @@ import (
|
|||
)
|
||||
|
||||
func TestConsecutiveWrites(t *testing.T) {
|
||||
addr, err := net.ResolveUDPAddr("udp", ":0")
|
||||
require.NoError(t, err)
|
||||
|
||||
ln, err := Listen("udp", addr, 3*time.Second)
|
||||
ln, err := Listen(net.ListenConfig{}, "udp", ":0", 3*time.Second)
|
||||
require.NoError(t, err)
|
||||
defer func() {
|
||||
err := ln.Close()
|
||||
|
@ -75,11 +72,7 @@ func TestConsecutiveWrites(t *testing.T) {
|
|||
}
|
||||
|
||||
func TestListenNotBlocking(t *testing.T) {
|
||||
addr, err := net.ResolveUDPAddr("udp", ":0")
|
||||
|
||||
require.NoError(t, err)
|
||||
|
||||
ln, err := Listen("udp", addr, 3*time.Second)
|
||||
ln, err := Listen(net.ListenConfig{}, "udp", ":0", 3*time.Second)
|
||||
require.NoError(t, err)
|
||||
defer func() {
|
||||
err := ln.Close()
|
||||
|
@ -165,10 +158,7 @@ func TestListenNotBlocking(t *testing.T) {
|
|||
}
|
||||
|
||||
func TestListenWithZeroTimeout(t *testing.T) {
|
||||
addr, err := net.ResolveUDPAddr("udp", ":0")
|
||||
require.NoError(t, err)
|
||||
|
||||
_, err = Listen("udp", addr, 0)
|
||||
_, err := Listen(net.ListenConfig{}, "udp", ":0", 0)
|
||||
assert.Error(t, err)
|
||||
}
|
||||
|
||||
|
@ -183,10 +173,7 @@ func TestTimeoutWithoutRead(t *testing.T) {
|
|||
func testTimeout(t *testing.T, withRead bool) {
|
||||
t.Helper()
|
||||
|
||||
addr, err := net.ResolveUDPAddr("udp", ":0")
|
||||
require.NoError(t, err)
|
||||
|
||||
ln, err := Listen("udp", addr, 3*time.Second)
|
||||
ln, err := Listen(net.ListenConfig{}, "udp", ":0", 3*time.Second)
|
||||
require.NoError(t, err)
|
||||
defer func() {
|
||||
err := ln.Close()
|
||||
|
@ -227,10 +214,7 @@ func testTimeout(t *testing.T, withRead bool) {
|
|||
}
|
||||
|
||||
func TestShutdown(t *testing.T) {
|
||||
addr, err := net.ResolveUDPAddr("udp", ":0")
|
||||
require.NoError(t, err)
|
||||
|
||||
l, err := Listen("udp", addr, 3*time.Second)
|
||||
l, err := Listen(net.ListenConfig{}, "udp", ":0", 3*time.Second)
|
||||
require.NoError(t, err)
|
||||
|
||||
go func() {
|
||||
|
@ -331,10 +315,7 @@ func TestReadLoopMaxDataSize(t *testing.T) {
|
|||
|
||||
doneCh := make(chan struct{})
|
||||
|
||||
addr, err := net.ResolveUDPAddr("udp", ":0")
|
||||
require.NoError(t, err)
|
||||
|
||||
l, err := Listen("udp", addr, 3*time.Second)
|
||||
l, err := Listen(net.ListenConfig{}, "udp", ":0", 3*time.Second)
|
||||
require.NoError(t, err)
|
||||
|
||||
defer func() {
|
||||
|
|
|
@ -96,10 +96,7 @@ func TestProxy_ServeUDP_MaxDataSize(t *testing.T) {
|
|||
func newServer(t *testing.T, addr string, handler Handler) {
|
||||
t.Helper()
|
||||
|
||||
addrL, err := net.ResolveUDPAddr("udp", addr)
|
||||
require.NoError(t, err)
|
||||
|
||||
listener, err := Listen("udp", addrL, 3*time.Second)
|
||||
listener, err := Listen(net.ListenConfig{}, "udp", addr, 3*time.Second)
|
||||
require.NoError(t, err)
|
||||
|
||||
for {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue