From 84576aed1f609671c2cd10403f81200e8e988ccd Mon Sep 17 00:00:00 2001 From: Sean DuBois Date: Sat, 5 Oct 2019 13:17:40 -0700 Subject: [PATCH] Support TURN over TCP Relates to pion/turn#1 --- candidate_relay_test.go | 1 + gather.go | 45 ++++++++++++++++++++++++++++++++++------- go.mod | 2 +- go.sum | 7 ++----- 4 files changed, 42 insertions(+), 13 deletions(-) diff --git a/candidate_relay_test.go b/candidate_relay_test.go index c27e54e..c3977e9 100644 --- a/candidate_relay_test.go +++ b/candidate_relay_test.go @@ -45,6 +45,7 @@ func TestRelayOnlyConnection(t *testing.T) { Username: "username", Password: "password", Port: serverPort, + Proto: ProtoTypeUDP, }, }, CandidateTypes: []CandidateType{CandidateTypeRelay}, diff --git a/gather.go b/gather.go index 828738d..558e10b 100644 --- a/gather.go +++ b/gather.go @@ -378,13 +378,45 @@ func (a *Agent) gatherCandidatesRelay(urls []*URL) error { return ErrPasswordEmpty } - locConn, err := a.net.ListenPacket(network, "0.0.0.0:0") - if err != nil { - return err + TURNServerAddr := fmt.Sprintf("%s:%d", url.Host, url.Port) + var ( + locConn net.PacketConn + err error + RelAddr string + RelPort int + ) + + if url.Proto == ProtoTypeUDP { + locConn, err = a.net.ListenPacket(network, "0.0.0.0:0") + if err != nil { + return err + } + + RelAddr = locConn.LocalAddr().(*net.UDPAddr).IP.String() + RelPort = locConn.LocalAddr().(*net.UDPAddr).Port + } else { + var ( + tcpAddr *net.TCPAddr + tcpConn *net.TCPConn + ) + + tcpAddr, err = net.ResolveTCPAddr(NetworkTypeTCP4.String(), TURNServerAddr) + if err != nil { + return err + } + + tcpConn, err = net.DialTCP(NetworkTypeTCP4.String(), nil, tcpAddr) + if err != nil { + return err + } + + RelAddr = tcpConn.LocalAddr().(*net.TCPAddr).IP.String() + RelPort = tcpConn.LocalAddr().(*net.TCPAddr).Port + locConn = turn.NewSTUNConn(tcpConn) } client, err := turn.NewClient(&turn.ClientConfig{ - TURNServerAddr: fmt.Sprintf("%s:%d", url.Host, url.Port), + TURNServerAddr: TURNServerAddr, Conn: locConn, Username: url.Username, Password: url.Password, @@ -405,7 +437,6 @@ func (a *Agent) gatherCandidatesRelay(urls []*URL) error { return err } - laddr := locConn.LocalAddr().(*net.UDPAddr) raddr := relayConn.LocalAddr().(*net.UDPAddr) relayConfig := CandidateRelayConfig{ @@ -413,8 +444,8 @@ func (a *Agent) gatherCandidatesRelay(urls []*URL) error { Component: ComponentRTP, Address: raddr.IP.String(), Port: raddr.Port, - RelAddr: laddr.IP.String(), - RelPort: laddr.Port, + RelAddr: RelAddr, + RelPort: RelPort, OnClose: func() error { client.Close() return locConn.Close() diff --git a/go.mod b/go.mod index ab6c3b4..bef7201 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/pion/mdns v0.0.3 github.com/pion/stun v0.3.3 github.com/pion/transport v0.8.9 - github.com/pion/turn v1.3.7 + github.com/pion/turn v1.4.0 github.com/stretchr/testify v1.4.0 golang.org/x/net v0.0.0-20190930134127-c5a3c61f89f3 golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24 // indirect diff --git a/go.sum b/go.sum index 93135d4..d1f480b 100644 --- a/go.sum +++ b/go.sum @@ -13,15 +13,12 @@ github.com/pion/logging v0.2.2 h1:M9+AIj/+pxNsDfAT64+MAVgJO0rsyLnoJKCqf//DoeY= github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms= github.com/pion/mdns v0.0.3 h1:DxdOYd0pgwLKiDlIIxfU0qdG5iWh1Xn6CsS9vc6cMAY= github.com/pion/mdns v0.0.3/go.mod h1:VrN3wefVgtfL8QgpEblPUC46ag1reLIfpqekCnKunLE= -github.com/pion/stun v0.3.2 h1:Vsy6C+bTbJKEC2TH4vHYOnRKmozNPi5FpeKv9/bX16k= -github.com/pion/stun v0.3.2/go.mod h1:xrCld6XM+6GWDZdvjPlLMsTU21rNxnO6UO8XsAvHr/M= github.com/pion/stun v0.3.3 h1:brYuPl9bN9w/VM7OdNzRSLoqsnwlyNvD9MVeJrHjDQw= github.com/pion/stun v0.3.3/go.mod h1:xrCld6XM+6GWDZdvjPlLMsTU21rNxnO6UO8XsAvHr/M= -github.com/pion/transport v0.8.8/go.mod h1:lpeSM6KJFejVtZf8k0fgeN7zE73APQpTF83WvA1FVP8= github.com/pion/transport v0.8.9 h1:3PUZULb0WZd/QNfXKKMwcUHzLR+XfNem6lF2M9UrxSU= github.com/pion/transport v0.8.9/go.mod h1:lpeSM6KJFejVtZf8k0fgeN7zE73APQpTF83WvA1FVP8= -github.com/pion/turn v1.3.7 h1:/nyM2XrlZILD7KKfnh0oYEBTRG5JlbH21ibjluRoCeo= -github.com/pion/turn v1.3.7/go.mod h1:js0LBFqMcKAlaWAXoYqNjefGI7kfJCrkCBfHGuTToXE= +github.com/pion/turn v1.4.0 h1:7NUMRehQz4fIo53Qv9ui1kJ0Kr1CA82I81RHKHCeM80= +github.com/pion/turn v1.4.0/go.mod h1:aDSi6hWX/hd1+gKia9cExZOR0MU95O7zX9p3Gw/P2aU= github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=