diff options
author | Justin Seely <justin.seely@gmail.com> | 2016-06-24 07:29:10 -0700 |
---|---|---|
committer | Aliaksandr Valialkin <valyala@gmail.com> | 2016-06-24 17:29:10 +0300 |
commit | 3d3774799e6e558a26fb000e5dd90db6d3d64595 (patch) | |
tree | 9aed158396b2669b945e2c706c2d83c635bcb997 /reuseport | |
parent | Issue #121: Added a test to make sure equal and space chars may be used insid... (diff) | |
download | fasthttp-3d3774799e6e558a26fb000e5dd90db6d3d64595.tar.gz fasthttp-3d3774799e6e558a26fb000e5dd90db6d3d64595.tar.bz2 fasthttp-3d3774799e6e558a26fb000e5dd90db6d3d64595.zip |
Enable IPv6 for reuseport (#122)
Diffstat (limited to 'reuseport')
-rw-r--r-- | reuseport/reuseport.go | 31 | ||||
-rw-r--r-- | reuseport/reuseport_test.go | 17 |
2 files changed, 35 insertions, 13 deletions
diff --git a/reuseport/reuseport.go b/reuseport/reuseport.go index 792ba9c..15fd05a 100644 --- a/reuseport/reuseport.go +++ b/reuseport/reuseport.go @@ -17,10 +17,10 @@ import ( ) func getSockaddr(network, addr string) (sa syscall.Sockaddr, soType int, err error) { - // TODO: add support for tcp and tcp6 networks. + // TODO: add support for tcp networks. - if network != "tcp4" { - return nil, -1, errors.New("only tcp4 network is supported") + if network != "tcp4" && network != "tcp6" { + return nil, -1, errors.New("only tcp4 and tcp6 network is supported") } tcpAddr, err := net.ResolveTCPAddr(network, addr) @@ -28,10 +28,27 @@ func getSockaddr(network, addr string) (sa syscall.Sockaddr, soType int, err err return nil, -1, err } - var sa4 syscall.SockaddrInet4 - sa4.Port = tcpAddr.Port - copy(sa4.Addr[:], tcpAddr.IP.To4()) - return &sa4, syscall.AF_INET, nil + switch network { + case "tcp4": + var sa4 syscall.SockaddrInet4 + sa4.Port = tcpAddr.Port + copy(sa4.Addr[:], tcpAddr.IP.To4()) + return &sa4, syscall.AF_INET, nil + case "tcp6": + var sa6 syscall.SockaddrInet6 + sa6.Port = tcpAddr.Port + copy(sa6.Addr[:], tcpAddr.IP.To16()) + if tcpAddr.Zone != "" { + ifi, err := net.InterfaceByName(tcpAddr.Zone) + if err != nil { + return nil, -1, err + } + sa6.ZoneId = uint32(ifi.Index) + } + return &sa6, syscall.AF_INET6, nil + default: + return nil, -1, errors.New("Unknown network type " + network) + } } // ErrNoReusePort is returned if the OS doesn't support SO_REUSEPORT. diff --git a/reuseport/reuseport_test.go b/reuseport/reuseport_test.go index 3492902..d2381d6 100644 --- a/reuseport/reuseport_test.go +++ b/reuseport/reuseport_test.go @@ -8,16 +8,21 @@ import ( "time" ) -func TestNewListener(t *testing.T) { - addr := "localhost:10081" - serversCount := 20 - requestsCount := 1000 +func TestTCP4(t *testing.T) { + testNewListener(t, "tcp4", "localhost:10081", 20, 1000) +} + +func TestTCP6(t *testing.T) { + testNewListener(t, "tcp6", "ip6-localhost:10081", 20, 1000) +} + +func testNewListener(t *testing.T, network, addr string, serversCount, requestsCount int) { var lns []net.Listener doneCh := make(chan struct{}, serversCount) for i := 0; i < serversCount; i++ { - ln, err := Listen("tcp4", addr) + ln, err := Listen(network, addr) if err != nil { t.Fatalf("cannot create listener %d: %s", i, err) } @@ -29,7 +34,7 @@ func TestNewListener(t *testing.T) { } for i := 0; i < requestsCount; i++ { - c, err := net.Dial("tcp4", addr) + c, err := net.Dial(network, addr) if err != nil { t.Fatalf("%d. unexpected error when dialing: %s", i, err) } |