aboutsummaryrefslogtreecommitdiff
path: root/reuseport
diff options
context:
space:
mode:
authorGravatar Justin Seely <justin.seely@gmail.com> 2016-06-24 07:29:10 -0700
committerGravatar Aliaksandr Valialkin <valyala@gmail.com> 2016-06-24 17:29:10 +0300
commit3d3774799e6e558a26fb000e5dd90db6d3d64595 (patch)
tree9aed158396b2669b945e2c706c2d83c635bcb997 /reuseport
parentIssue #121: Added a test to make sure equal and space chars may be used insid... (diff)
downloadfasthttp-3d3774799e6e558a26fb000e5dd90db6d3d64595.tar.gz
fasthttp-3d3774799e6e558a26fb000e5dd90db6d3d64595.tar.bz2
fasthttp-3d3774799e6e558a26fb000e5dd90db6d3d64595.zip
Enable IPv6 for reuseport (#122)
Diffstat (limited to 'reuseport')
-rw-r--r--reuseport/reuseport.go31
-rw-r--r--reuseport/reuseport_test.go17
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)
}