From 3fd03ff40777ccb7627e2c8bcc8c0e80c4b7cd81 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Thu, 1 Sep 2022 20:07:06 +0200 Subject: [PATCH] Use new pion/transport Net interface This change adapts pion/ice to use a new interface for most network related operations. The interface was formerly a simple struct vnet.Net which was originally intended to facilicate testing. By replacing it with an interface we have greater flexibility and allow users to hook into the networking stack by providing their own implementation of the interface. --- agent.go | 50 ++++++++++++++++-------------- agent_config.go | 6 ++-- agent_test.go | 26 +++++++++------- agent_udpmux_test.go | 2 +- candidate_relay_test.go | 2 +- candidate_server_reflexive_test.go | 2 +- connectivity_vnet_test.go | 33 ++++++++++++++------ gather.go | 37 +++++++++++++++++----- gather_test.go | 2 +- gather_vnet_test.go | 29 +++++++++-------- go.mod | 4 +-- go.sum | 16 +++++----- mdns.go | 9 +++--- mdns_test.go | 2 +- tcp_mux_multi_test.go | 2 +- tcp_mux_test.go | 2 +- tcp_packet_conn.go | 2 +- transport_test.go | 2 +- transport_vnet_test.go | 4 +-- udp_mux.go | 14 +++++++-- udp_mux_multi.go | 33 +++++++++++++++++--- udp_mux_multi_test.go | 2 +- udp_mux_test.go | 2 +- udp_mux_universal.go | 3 ++ udp_muxed_conn.go | 2 +- util.go | 12 +++---- 26 files changed, 190 insertions(+), 110 deletions(-) diff --git a/agent.go b/agent.go index dcca6c5f..aafa0da6 100644 --- a/agent.go +++ b/agent.go @@ -4,6 +4,7 @@ package ice import ( "context" + "fmt" "net" "strings" "sync" @@ -13,8 +14,10 @@ import ( "github.com/pion/logging" "github.com/pion/mdns" "github.com/pion/stun" - "github.com/pion/transport/packetio" - "github.com/pion/transport/vnet" + "github.com/pion/transport/v2" + "github.com/pion/transport/v2/packetio" + "github.com/pion/transport/v2/stdnet" + "github.com/pion/transport/v2/vnet" "golang.org/x/net/proxy" ) @@ -123,7 +126,7 @@ type Agent struct { loggerFactory logging.LoggerFactory log logging.LeveledLogger - net *vnet.Net + net transport.Net tcpMux TCPMux udpMux UDPMux udpMuxSrflx UniversalUDPMux @@ -262,21 +265,6 @@ func NewAgent(config *AgentConfig) (*Agent, error) { //nolint:gocognit } log := loggerFactory.NewLogger("ice") - var mDNSConn *mdns.Conn - mDNSConn, mDNSMode, err = createMulticastDNS(mDNSMode, mDNSName, log) - // Opportunistic mDNS: If we can't open the connection, that's ok: we - // can continue without it. - if err != nil { - log.Warnf("Failed to initialize mDNS %s: %v", mDNSName, err) - } - closeMDNSConn := func() { - if mDNSConn != nil { - if mdnsCloseErr := mDNSConn.Close(); mdnsCloseErr != nil { - log.Warnf("Failed to close mDNS: %v", mdnsCloseErr) - } - } - } - startedCtx, startedFn := context.WithCancel(context.Background()) a := &Agent{ @@ -307,7 +295,6 @@ func NewAgent(config *AgentConfig) (*Agent, error) { //nolint:gocognit mDNSMode: mDNSMode, mDNSName: mDNSName, - mDNSConn: mDNSConn, gatherCandidateCancel: func() {}, @@ -330,11 +317,28 @@ func NewAgent(config *AgentConfig) (*Agent, error) { //nolint:gocognit a.udpMuxSrflx = config.UDPMuxSrflx if a.net == nil { - a.net = vnet.NewNet(nil) - } else if a.net.IsVirtual() { - a.log.Warn("vnet is enabled") + a.net, err = stdnet.NewNet() + if err != nil { + return nil, fmt.Errorf("failed to create network: %w", err) + } + } else if _, isVirtual := a.net.(*vnet.Net); isVirtual { + a.log.Warn("virtual network is enabled") if a.mDNSMode != MulticastDNSModeDisabled { - a.log.Warn("vnet does not support mDNS yet") + a.log.Warn("virtual network does not support mDNS yet") + } + } + + a.mDNSConn, mDNSMode, err = createMulticastDNS(a.net, mDNSMode, mDNSName, log) + // Opportunistic mDNS: If we can't open the connection, that's ok: we + // can continue without it. + if err != nil { + log.Warnf("Failed to initialize mDNS %s: %v", mDNSName, err) + } + closeMDNSConn := func() { + if a.mDNSConn != nil { + if mdnsCloseErr := a.mDNSConn.Close(); mdnsCloseErr != nil { + log.Warnf("Failed to close mDNS: %v", mdnsCloseErr) + } } } diff --git a/agent_config.go b/agent_config.go index 54a61ba3..c823887f 100644 --- a/agent_config.go +++ b/agent_config.go @@ -5,7 +5,7 @@ import ( "time" "github.com/pion/logging" - "github.com/pion/transport/vnet" + "github.com/pion/transport/v2" "golang.org/x/net/proxy" ) @@ -130,8 +130,8 @@ type AgentConfig struct { RelayAcceptanceMinWait *time.Duration // Net is the our abstracted network interface for internal development purpose only - // (see github.com/pion/transport/vnet) - Net *vnet.Net + // (see https://github.com/pion/transport) + Net transport.Net // InterfaceFilter is a function that you can use in order to whitelist or blacklist // the interfaces which are used to gather ICE candidates. diff --git a/agent_test.go b/agent_test.go index befb02f7..8d6ac834 100644 --- a/agent_test.go +++ b/agent_test.go @@ -15,8 +15,8 @@ import ( "github.com/pion/logging" "github.com/pion/stun" - "github.com/pion/transport/test" - "github.com/pion/transport/vnet" + "github.com/pion/transport/v2/test" + "github.com/pion/transport/v2/vnet" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -376,14 +376,16 @@ func TestConnectivityOnStartup(t *testing.T) { }) assert.NoError(t, err) - net0 := vnet.NewNet(&vnet.NetConfig{ + net0, err := vnet.NewNet(&vnet.NetConfig{ StaticIPs: []string{"192.168.0.1"}, }) + assert.NoError(t, err) assert.NoError(t, wan.AddNet(net0)) - net1 := vnet.NewNet(&vnet.NetConfig{ + net1, err := vnet.NewNet(&vnet.NetConfig{ StaticIPs: []string{"192.168.0.2"}, }) + assert.NoError(t, err) assert.NoError(t, wan.AddNet(net1)) assert.NoError(t, wan.Start()) @@ -393,10 +395,9 @@ func TestConnectivityOnStartup(t *testing.T) { KeepaliveInterval := time.Hour cfg0 := &AgentConfig{ - NetworkTypes: supportedNetworkTypes(), - MulticastDNSMode: MulticastDNSModeDisabled, - Net: net0, - + NetworkTypes: supportedNetworkTypes(), + MulticastDNSMode: MulticastDNSModeDisabled, + Net: net0, KeepaliveInterval: &KeepaliveInterval, CheckInterval: &KeepaliveInterval, } @@ -1734,9 +1735,10 @@ func TestGetSelectedCandidatePair(t *testing.T) { }) assert.NoError(t, err) - net := vnet.NewNet(&vnet.NetConfig{ + net, err := vnet.NewNet(&vnet.NetConfig{ StaticIPs: []string{"192.168.0.1"}, }) + assert.NoError(t, err) assert.NoError(t, wan.AddNet(net)) assert.NoError(t, wan.Start()) @@ -1792,14 +1794,16 @@ func TestAcceptAggressiveNomination(t *testing.T) { }) assert.NoError(t, err) - net0 := vnet.NewNet(&vnet.NetConfig{ + net0, err := vnet.NewNet(&vnet.NetConfig{ StaticIPs: []string{"192.168.0.1"}, }) + assert.NoError(t, err) assert.NoError(t, wan.AddNet(net0)) - net1 := vnet.NewNet(&vnet.NetConfig{ + net1, err := vnet.NewNet(&vnet.NetConfig{ StaticIPs: []string{"192.168.0.2", "192.168.0.3", "192.168.0.4"}, }) + assert.NoError(t, err) assert.NoError(t, wan.AddNet(net1)) assert.NoError(t, wan.Start()) diff --git a/agent_udpmux_test.go b/agent_udpmux_test.go index a1841cae..089cfe27 100644 --- a/agent_udpmux_test.go +++ b/agent_udpmux_test.go @@ -9,7 +9,7 @@ import ( "time" "github.com/pion/logging" - "github.com/pion/transport/test" + "github.com/pion/transport/v2/test" "github.com/stretchr/testify/require" ) diff --git a/candidate_relay_test.go b/candidate_relay_test.go index d45b32b8..e07f246d 100644 --- a/candidate_relay_test.go +++ b/candidate_relay_test.go @@ -9,7 +9,7 @@ import ( "testing" "time" - "github.com/pion/transport/test" + "github.com/pion/transport/v2/test" "github.com/pion/turn/v2" "github.com/stretchr/testify/assert" ) diff --git a/candidate_server_reflexive_test.go b/candidate_server_reflexive_test.go index 41306fa4..3742bea3 100644 --- a/candidate_server_reflexive_test.go +++ b/candidate_server_reflexive_test.go @@ -9,7 +9,7 @@ import ( "testing" "time" - "github.com/pion/transport/test" + "github.com/pion/transport/v2/test" "github.com/pion/turn/v2" "github.com/stretchr/testify/assert" ) diff --git a/connectivity_vnet_test.go b/connectivity_vnet_test.go index 82272d3a..0e6b2068 100644 --- a/connectivity_vnet_test.go +++ b/connectivity_vnet_test.go @@ -13,8 +13,8 @@ import ( "github.com/pion/logging" "github.com/pion/stun" - "github.com/pion/transport/test" - "github.com/pion/transport/vnet" + "github.com/pion/transport/v2/test" + "github.com/pion/transport/v2/vnet" "github.com/pion/turn/v2" "github.com/stretchr/testify/assert" ) @@ -54,9 +54,12 @@ func buildVNet(natType0, natType1 *vnet.NATType) (*virtualNet, error) { return nil, err } - wanNet := vnet.NewNet(&vnet.NetConfig{ + wanNet, err := vnet.NewNet(&vnet.NetConfig{ StaticIP: vnetSTUNServerIP, // will be assigned to eth0 }) + if err != nil { + return nil, err + } err = wan.AddNet(wanNet) if err != nil { @@ -83,9 +86,13 @@ func buildVNet(natType0, natType1 *vnet.NATType) (*virtualNet, error) { return nil, err } - net0 := vnet.NewNet(&vnet.NetConfig{ + net0, err := vnet.NewNet(&vnet.NetConfig{ StaticIPs: []string{vnetLocalIPA}, }) + if err != nil { + return nil, err + } + err = lan0.AddNet(net0) if err != nil { return nil, err @@ -116,9 +123,13 @@ func buildVNet(natType0, natType1 *vnet.NATType) (*virtualNet, error) { return nil, err } - net1 := vnet.NewNet(&vnet.NetConfig{ + net1, err := vnet.NewNet(&vnet.NetConfig{ StaticIPs: []string{vnetLocalIPB}, }) + if err != nil { + return nil, err + } + err = lan1.AddNet(net1) if err != nil { return nil, err @@ -475,14 +486,16 @@ func TestDisconnectedToConnected(t *testing.T) { return atomic.LoadUint64(&dropAllData) != 1 }) - net0 := vnet.NewNet(&vnet.NetConfig{ + net0, err := vnet.NewNet(&vnet.NetConfig{ StaticIPs: []string{"192.168.0.1"}, }) + assert.NoError(t, err) assert.NoError(t, wan.AddNet(net0)) - net1 := vnet.NewNet(&vnet.NetConfig{ + net1, err := vnet.NewNet(&vnet.NetConfig{ StaticIPs: []string{"192.168.0.2"}, }) + assert.NoError(t, err) assert.NoError(t, wan.AddNet(net1)) assert.NoError(t, wan.Start()) @@ -581,14 +594,16 @@ func TestWriteUseValidPair(t *testing.T) { return true }) - net0 := vnet.NewNet(&vnet.NetConfig{ + net0, err := vnet.NewNet(&vnet.NetConfig{ StaticIPs: []string{"192.168.0.1"}, }) + assert.NoError(t, err) assert.NoError(t, wan.AddNet(net0)) - net1 := vnet.NewNet(&vnet.NetConfig{ + net1, err := vnet.NewNet(&vnet.NetConfig{ StaticIPs: []string{"192.168.0.2"}, }) + assert.NoError(t, err) assert.NoError(t, wan.AddNet(net1)) assert.NoError(t, wan.Start()) diff --git a/gather.go b/gather.go index c2f67a07..e0e32644 100644 --- a/gather.go +++ b/gather.go @@ -579,13 +579,13 @@ func (a *Agent) gatherCandidatesRelay(ctx context.Context, urls []*URL) { //noli locConn = turn.NewSTUNConn(conn) case url.Proto == ProtoTypeTCP && url.Scheme == SchemeTypeTURN: - tcpAddr, connectErr := net.ResolveTCPAddr(NetworkTypeTCP4.String(), TURNServerAddr) + tcpAddr, connectErr := a.net.ResolveTCPAddr(NetworkTypeTCP4.String(), TURNServerAddr) if connectErr != nil { a.log.Warnf("Failed to resolve TCP Addr %s: %v", TURNServerAddr, connectErr) return } - conn, connectErr := net.DialTCP(NetworkTypeTCP4.String(), nil, tcpAddr) + conn, connectErr := a.net.DialTCP(NetworkTypeTCP4.String(), nil, tcpAddr) if connectErr != nil { a.log.Warnf("Failed to Dial TCP Addr %s: %v", TURNServerAddr, connectErr) return @@ -596,18 +596,24 @@ func (a *Agent) gatherCandidatesRelay(ctx context.Context, urls []*URL) { //noli relayProtocol = tcp locConn = turn.NewSTUNConn(conn) case url.Proto == ProtoTypeUDP && url.Scheme == SchemeTypeTURNS: - udpAddr, connectErr := net.ResolveUDPAddr(network, TURNServerAddr) + udpAddr, connectErr := a.net.ResolveUDPAddr(network, TURNServerAddr) if connectErr != nil { a.log.Warnf("Failed to resolve UDP Addr %s: %v", TURNServerAddr, connectErr) return } - conn, connectErr := dtls.Dial(network, udpAddr, &dtls.Config{ //nolint:contextcheck + udpConn, dialErr := a.net.DialUDP("udp", nil, udpAddr) + if dialErr != nil { + a.log.Warnf("Failed to dial DTLS Address %s: %v", TURNServerAddr, connectErr) + return + } + + conn, connectErr := dtls.ClientWithContext(ctx, udpConn, &dtls.Config{ ServerName: url.Host, InsecureSkipVerify: a.insecureSkipVerify, //nolint:gosec }) if connectErr != nil { - a.log.Warnf("Failed to Dial DTLS Addr %s: %v", TURNServerAddr, connectErr) + a.log.Warnf("Failed to create DTLS client: %v", TURNServerAddr, connectErr) return } @@ -616,13 +622,28 @@ func (a *Agent) gatherCandidatesRelay(ctx context.Context, urls []*URL) { //noli relayProtocol = "dtls" locConn = &fakePacketConn{conn} case url.Proto == ProtoTypeTCP && url.Scheme == SchemeTypeTURNS: - conn, connectErr := tls.Dial(NetworkTypeTCP4.String(), TURNServerAddr, &tls.Config{ + tcpAddr, err := a.net.ResolveTCPAddr(NetworkTypeTCP4.String(), TURNServerAddr) + if err != nil { + a.log.Warnf("Failed to resolve relay address %s: %v", TURNServerAddr, err) + return + } + + tcpConn, dialErr := a.net.DialTCP(NetworkTypeTCP4.String(), nil, tcpAddr) + if dialErr != nil { + a.log.Warnf("Failed to connect to relay: %v", dialErr) + return + } + + conn := tls.Client(tcpConn, &tls.Config{ InsecureSkipVerify: a.insecureSkipVerify, //nolint:gosec }) - if connectErr != nil { - a.log.Warnf("Failed to Dial TLS Addr %s: %v", TURNServerAddr, connectErr) + + if err := conn.HandshakeContext(ctx); err != nil { + tcpConn.Close() + a.log.Warnf("Failed to connect to relay: %v", dialErr) return } + RelAddr = conn.LocalAddr().(*net.TCPAddr).IP.String() //nolint:forcetypeassert RelPort = conn.LocalAddr().(*net.TCPAddr).Port //nolint:forcetypeassert relayProtocol = "tls" diff --git a/gather_test.go b/gather_test.go index 55fdbc26..01876c92 100644 --- a/gather_test.go +++ b/gather_test.go @@ -21,7 +21,7 @@ import ( "github.com/pion/dtls/v2/pkg/crypto/selfsign" "github.com/pion/logging" "github.com/pion/stun" - "github.com/pion/transport/test" + "github.com/pion/transport/v2/test" "github.com/pion/turn/v2" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/gather_vnet_test.go b/gather_vnet_test.go index 49ec850c..0889eb79 100644 --- a/gather_vnet_test.go +++ b/gather_vnet_test.go @@ -11,8 +11,8 @@ import ( "testing" "github.com/pion/logging" - "github.com/pion/transport/test" - "github.com/pion/transport/vnet" + "github.com/pion/transport/v2/test" + "github.com/pion/transport/v2/vnet" "github.com/stretchr/testify/assert" ) @@ -24,8 +24,11 @@ func TestVNetGather(t *testing.T) { // log := loggerFactory.NewLogger("test") t.Run("No local IP address", func(t *testing.T) { + n, err := vnet.NewNet(&vnet.NetConfig{}) + assert.NoError(t, err) + a, err := NewAgent(&AgentConfig{ - Net: vnet.NewNet(&vnet.NetConfig{}), + Net: n, }) assert.NoError(t, err) @@ -54,8 +57,8 @@ func TestVNetGather(t *testing.T) { t.Fatalf("Failed to create a router: %s", err) } - nw := vnet.NewNet(&vnet.NetConfig{}) - if nw == nil { + nw, err := vnet.NewNet(&vnet.NetConfig{}) + if err != nil { t.Fatalf("Failed to create a Net: %s", err) } @@ -97,8 +100,8 @@ func TestVNetGather(t *testing.T) { t.Fatalf("Failed to create a router: %s", err) } - nw := vnet.NewNet(&vnet.NetConfig{}) - if nw == nil { + nw, err := vnet.NewNet(&vnet.NetConfig{}) + if err != nil { t.Fatalf("Failed to create a Net: %s", err) } @@ -190,10 +193,10 @@ func TestVNetGatherWithNAT1To1(t *testing.T) { err = wan.AddRouter(lan) assert.NoError(t, err, "should succeed") - nw := vnet.NewNet(&vnet.NetConfig{ + nw, err := vnet.NewNet(&vnet.NetConfig{ StaticIPs: []string{localIP0, localIP1}, }) - if nw == nil { + if err != nil { t.Fatalf("Failed to create a Net: %s", err) } @@ -285,12 +288,12 @@ func TestVNetGatherWithNAT1To1(t *testing.T) { err = wan.AddRouter(lan) assert.NoError(t, err, "should succeed") - nw := vnet.NewNet(&vnet.NetConfig{ + nw, err := vnet.NewNet(&vnet.NetConfig{ StaticIPs: []string{ "10.0.0.1", }, }) - if nw == nil { + if err != nil { t.Fatalf("Failed to create a Net: %s", err) } @@ -366,8 +369,8 @@ func TestVNetGatherWithInterfaceFilter(t *testing.T) { t.Fatalf("Failed to create a router: %s", err) } - nw := vnet.NewNet(&vnet.NetConfig{}) - if nw == nil { + nw, err := vnet.NewNet(&vnet.NetConfig{}) + if err != nil { t.Fatalf("Failed to create a Net: %s", err) } diff --git a/go.mod b/go.mod index 51e6ccf5..16ef19a0 100644 --- a/go.mod +++ b/go.mod @@ -10,8 +10,8 @@ require ( github.com/pion/mdns v0.0.5 github.com/pion/randutil v0.1.0 github.com/pion/stun v0.3.5 - github.com/pion/transport v0.14.1 - github.com/pion/turn/v2 v2.0.9 + github.com/pion/transport/v2 v2.0.1-0.20230131133035-d912936269f2 + github.com/pion/turn/v2 v2.0.10-0.20230131102321-ea05502ddc12 github.com/stretchr/testify v1.8.1 golang.org/x/net v0.4.0 gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect diff --git a/go.sum b/go.sum index 13c8cbbf..77a906a5 100644 --- a/go.sum +++ b/go.sum @@ -19,12 +19,13 @@ github.com/pion/randutil v0.1.0/go.mod h1:XcJrSMMbbMRhASFVOlj/5hQial/Y8oH/HVo7TB github.com/pion/stun v0.3.5 h1:uLUCBCkQby4S1cf6CGuR9QrVOKcvUwFeemaC865QHDg= github.com/pion/stun v0.3.5/go.mod h1:gDMim+47EeEtfWogA37n6qXZS88L5V6LqFcf+DZA2UA= github.com/pion/transport v0.12.2/go.mod h1:N3+vZQD9HlDP5GWkZ85LohxNsDcNgofQmyL6ojX5d8Q= +github.com/pion/transport v0.13.0 h1:KWTA5ZrQogizzYwPEciGtHPLwpAjE91FgXnyu+Hv2uY= github.com/pion/transport v0.13.0/go.mod h1:yxm9uXpK9bpBBWkITk13cLo1y5/ur5VQpG22ny6EP7g= -github.com/pion/transport v0.13.1/go.mod h1:EBxbqzyv+ZrmDb82XswEE0BjfQFtuw1Nu6sjnjWCsGg= -github.com/pion/transport v0.14.1 h1:XSM6olwW+o8J4SCmOBb/BpwZypkHeyM0PGFCxNQBr40= -github.com/pion/transport v0.14.1/go.mod h1:4tGmbk00NeYA3rUa9+n+dzCCoKkcy3YlYb99Jn2fNnI= -github.com/pion/turn/v2 v2.0.9 h1:jcDPw0Vfd5I4iTc7s0Upfc2aMnyu2lgJ9vV0SUrNC1o= -github.com/pion/turn/v2 v2.0.9/go.mod h1:DQlwUwx7hL8Xya6TTAabbd9DdKXTNR96Xf5g5Qqso/M= +github.com/pion/transport/v2 v2.0.0/go.mod h1:HS2MEBJTwD+1ZI2eSXSvHJx/HnzQqRy2/LXxt6eVMHc= +github.com/pion/transport/v2 v2.0.1-0.20230131133035-d912936269f2 h1:vYNJEGISBFh22OEpeKbWHnjy7J9R3LAechAG2pDM65Y= +github.com/pion/transport/v2 v2.0.1-0.20230131133035-d912936269f2/go.mod h1:5+7/0vVnlvH9N/1C90UxY7Rylz/qHTOFsBtlQA1m3PE= +github.com/pion/turn/v2 v2.0.10-0.20230131102321-ea05502ddc12 h1:4+92GSF9SSdqCN+ZB+kOVPR4UiXiZOWQv9ss4P2F0WA= +github.com/pion/turn/v2 v2.0.10-0.20230131102321-ea05502ddc12/go.mod h1:/E/ocE5H7+YlvLzGuQG1Cmbv0fti67ah4FS/dN5y/Uk= github.com/pion/udp v0.1.1 h1:8UAPvyqmsxK8oOjloDk4wUt63TzFe9WEJkg5lChlj7o= github.com/pion/udp v0.1.1/go.mod h1:6AFo+CMdKQm7UiA0eUPA8/eVCTx8jBIITLZHc9DWX5M= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= @@ -53,7 +54,6 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211201190559-0a0e4e1bb54c/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220531201128-c960675eff93/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.4.0 h1:Q5QPcMlvfxFTAPV0+07Xz/MpK9NTXu2VDUuy0FeMfaU= @@ -68,12 +68,12 @@ golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220608164250-635b8c9b7f68/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.3.0 h1:w8ZOecv6NaNa/zC8944JTU3vz4u6Lagfk4RPQxv92NQ= golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.4.0 h1:Zr2JFtRQNX3BCZ8YtxRE9hNJYC8J6I1MVbMg6owUp18= +golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= diff --git a/mdns.go b/mdns.go index 5a431d15..c7229ed5 100644 --- a/mdns.go +++ b/mdns.go @@ -1,11 +1,10 @@ package ice import ( - "net" - "github.com/google/uuid" "github.com/pion/logging" "github.com/pion/mdns" + "github.com/pion/transport/v2" "golang.org/x/net/ipv4" ) @@ -31,17 +30,17 @@ func generateMulticastDNSName() (string, error) { return u.String() + ".local", err } -func createMulticastDNS(mDNSMode MulticastDNSMode, mDNSName string, log logging.LeveledLogger) (*mdns.Conn, MulticastDNSMode, error) { +func createMulticastDNS(n transport.Net, mDNSMode MulticastDNSMode, mDNSName string, log logging.LeveledLogger) (*mdns.Conn, MulticastDNSMode, error) { if mDNSMode == MulticastDNSModeDisabled { return nil, mDNSMode, nil } - addr, mdnsErr := net.ResolveUDPAddr("udp4", mdns.DefaultAddress) + addr, mdnsErr := n.ResolveUDPAddr("udp4", mdns.DefaultAddress) if mdnsErr != nil { return nil, mDNSMode, mdnsErr } - l, mdnsErr := net.ListenUDP("udp4", addr) + l, mdnsErr := n.ListenUDP("udp4", addr) if mdnsErr != nil { // If ICE fails to start MulticastDNS server just warn the user and continue log.Errorf("Failed to enable mDNS, continuing in mDNS disabled mode: (%s)", mdnsErr) diff --git a/mdns_test.go b/mdns_test.go index d56dcd73..4ee5b1bf 100644 --- a/mdns_test.go +++ b/mdns_test.go @@ -9,7 +9,7 @@ import ( "testing" "time" - "github.com/pion/transport/test" + "github.com/pion/transport/v2/test" "github.com/stretchr/testify/assert" ) diff --git a/tcp_mux_multi_test.go b/tcp_mux_multi_test.go index 9a770e29..f5ac7a92 100644 --- a/tcp_mux_multi_test.go +++ b/tcp_mux_multi_test.go @@ -10,7 +10,7 @@ import ( "github.com/pion/logging" "github.com/pion/stun" - "github.com/pion/transport/test" + "github.com/pion/transport/v2/test" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) diff --git a/tcp_mux_test.go b/tcp_mux_test.go index ec973064..9c99d547 100644 --- a/tcp_mux_test.go +++ b/tcp_mux_test.go @@ -7,7 +7,7 @@ import ( "github.com/pion/logging" "github.com/pion/stun" - "github.com/pion/transport/test" + "github.com/pion/transport/v2/test" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) diff --git a/tcp_packet_conn.go b/tcp_packet_conn.go index 30aed5bb..aaaf0d94 100644 --- a/tcp_packet_conn.go +++ b/tcp_packet_conn.go @@ -10,7 +10,7 @@ import ( "time" "github.com/pion/logging" - "github.com/pion/transport/packetio" + "github.com/pion/transport/v2/packetio" ) type bufferedConn struct { diff --git a/transport_test.go b/transport_test.go index 199f88fb..5584af68 100644 --- a/transport_test.go +++ b/transport_test.go @@ -10,7 +10,7 @@ import ( "testing" "time" - "github.com/pion/transport/test" + "github.com/pion/transport/v2/test" ) func TestStressDuplex(t *testing.T) { diff --git a/transport_vnet_test.go b/transport_vnet_test.go index b2345c4f..e47c3e71 100644 --- a/transport_vnet_test.go +++ b/transport_vnet_test.go @@ -9,8 +9,8 @@ import ( "testing" "time" - "github.com/pion/transport/test" - "github.com/pion/transport/vnet" + "github.com/pion/transport/v2/test" + "github.com/pion/transport/v2/vnet" "github.com/stretchr/testify/assert" ) diff --git a/udp_mux.go b/udp_mux.go index d5890206..890aaa02 100644 --- a/udp_mux.go +++ b/udp_mux.go @@ -10,7 +10,8 @@ import ( "github.com/pion/logging" "github.com/pion/stun" - "github.com/pion/transport/vnet" + "github.com/pion/transport/v2" + "github.com/pion/transport/v2/stdnet" ) // UDPMux allows multiple connections to go over a single UDP port @@ -49,6 +50,7 @@ const maxAddrSize = 512 type UDPMuxParams struct { Logger logging.LeveledLogger UDPConn net.PacketConn + Net transport.Net } // NewUDPMuxDefault creates an implementation of UDPMux @@ -77,8 +79,14 @@ func NewUDPMuxDefault(params UDPMuxParams) *UDPMuxDefault { params.Logger.Errorf("LocalAddr expected IPV4 or IPV6, got %T", params.UDPConn.LocalAddr()) } if len(networks) > 0 { - muxNet := vnet.NewNet(nil) - ips, err := localInterfaces(muxNet, nil, nil, networks, true) + if params.Net == nil { + var err error + if params.Net, err = stdnet.NewNet(); err != nil { + params.Logger.Errorf("failed to get create network: %v", err) + } + } + + ips, err := localInterfaces(params.Net, nil, nil, networks, true) if err == nil { for _, ip := range ips { localAddrsForUnspecified = append(localAddrsForUnspecified, &net.UDPAddr{IP: ip, Port: addr.Port}) diff --git a/udp_mux_multi.go b/udp_mux_multi.go index 0c9b15b9..a2297edf 100644 --- a/udp_mux_multi.go +++ b/udp_mux_multi.go @@ -4,10 +4,12 @@ package ice import ( + "fmt" "net" "github.com/pion/logging" - "github.com/pion/transport/vnet" + "github.com/pion/transport/v2" + "github.com/pion/transport/v2/stdnet" ) // MultiUDPMuxDefault implements both UDPMux and AllConnsGetter, @@ -80,15 +82,22 @@ func NewMultiUDPMuxFromPort(port int, opts ...UDPMuxFromPortOption) (*MultiUDPMu for _, opt := range opts { opt.apply(¶ms) } - muxNet := vnet.NewNet(nil) - ips, err := localInterfaces(muxNet, params.ifFilter, params.ipFilter, params.networks, params.includeLoopback) + + if params.net == nil { + var err error + if params.net, err = stdnet.NewNet(); err != nil { + return nil, fmt.Errorf("failed to get create network: %w", err) + } + } + + ips, err := localInterfaces(params.net, params.ifFilter, params.ipFilter, params.networks, params.includeLoopback) if err != nil { return nil, err } conns := make([]net.PacketConn, 0, len(ips)) for _, ip := range ips { - conn, listenErr := net.ListenUDP("udp", &net.UDPAddr{IP: ip, Port: port}) + conn, listenErr := params.net.ListenUDP("udp", &net.UDPAddr{IP: ip, Port: port}) if listenErr != nil { err = listenErr break @@ -111,7 +120,11 @@ func NewMultiUDPMuxFromPort(port int, opts ...UDPMuxFromPortOption) (*MultiUDPMu muxes := make([]UDPMux, 0, len(conns)) for _, conn := range conns { - mux := NewUDPMuxDefault(UDPMuxParams{Logger: params.logger, UDPConn: conn}) + mux := NewUDPMuxDefault(UDPMuxParams{ + Logger: params.logger, + UDPConn: conn, + Net: params.net, + }) muxes = append(muxes, mux) } @@ -131,6 +144,7 @@ type multiUDPMuxFromPortParam struct { writeBufferSize int logger logging.LeveledLogger includeLoopback bool + net transport.Net } type udpMuxFromPortOption struct { @@ -203,3 +217,12 @@ func UDPMuxFromPortWithLoopback() UDPMuxFromPortOption { }, } } + +// UDPMuxFromPortWithLoopback set loopback interface should be included +func UDPMuxFromPortWithNet(n transport.Net) UDPMuxFromPortOption { + return &udpMuxFromPortOption{ + f: func(p *multiUDPMuxFromPortParam) { + p.net = n + }, + } +} diff --git a/udp_mux_multi_test.go b/udp_mux_multi_test.go index ce476a06..189c589f 100644 --- a/udp_mux_multi_test.go +++ b/udp_mux_multi_test.go @@ -10,7 +10,7 @@ import ( "testing" "time" - "github.com/pion/transport/test" + "github.com/pion/transport/v2/test" "github.com/stretchr/testify/require" ) diff --git a/udp_mux_test.go b/udp_mux_test.go index fb6adcfd..63da9360 100644 --- a/udp_mux_test.go +++ b/udp_mux_test.go @@ -14,7 +14,7 @@ import ( "time" "github.com/pion/stun" - "github.com/pion/transport/test" + "github.com/pion/transport/v2/test" "github.com/stretchr/testify/require" ) diff --git a/udp_mux_universal.go b/udp_mux_universal.go index f1e05acc..c2913d57 100644 --- a/udp_mux_universal.go +++ b/udp_mux_universal.go @@ -7,6 +7,7 @@ import ( "github.com/pion/logging" "github.com/pion/stun" + "github.com/pion/transport/v2" ) // UniversalUDPMux allows multiple connections to go over a single UDP port for @@ -35,6 +36,7 @@ type UniversalUDPMuxParams struct { Logger logging.LeveledLogger UDPConn net.PacketConn XORMappedAddrCacheTTL time.Duration + Net transport.Net } // NewUniversalUDPMuxDefault creates an implementation of UniversalUDPMux embedding UDPMux @@ -63,6 +65,7 @@ func NewUniversalUDPMuxDefault(params UniversalUDPMuxParams) *UniversalUDPMuxDef udpMuxParams := UDPMuxParams{ Logger: params.Logger, UDPConn: m.params.UDPConn, + Net: m.params.Net, } m.UDPMuxDefault = NewUDPMuxDefault(udpMuxParams) diff --git a/udp_muxed_conn.go b/udp_muxed_conn.go index ac7b7041..9079d9a4 100644 --- a/udp_muxed_conn.go +++ b/udp_muxed_conn.go @@ -8,7 +8,7 @@ import ( "time" "github.com/pion/logging" - "github.com/pion/transport/packetio" + "github.com/pion/transport/v2/packetio" ) type udpMuxedConnParams struct { diff --git a/util.go b/util.go index 7321a2ee..6168d849 100644 --- a/util.go +++ b/util.go @@ -8,7 +8,7 @@ import ( "github.com/pion/logging" "github.com/pion/stun" - "github.com/pion/transport/vnet" + "github.com/pion/transport/v2" ) type atomicError struct{ v atomic.Value } @@ -132,9 +132,9 @@ func stunRequest(read func([]byte) (int, error), write func([]byte) (int, error) return res, nil } -func localInterfaces(vnet *vnet.Net, interfaceFilter func(string) bool, ipFilter func(net.IP) bool, networkTypes []NetworkType, includeLoopback bool) ([]net.IP, error) { //nolint:gocognit +func localInterfaces(n transport.Net, interfaceFilter func(string) bool, ipFilter func(net.IP) bool, networkTypes []NetworkType, includeLoopback bool) ([]net.IP, error) { //nolint:gocognit ips := []net.IP{} - ifaces, err := vnet.Interfaces() + ifaces, err := n.Interfaces() if err != nil { return ips, err } @@ -199,9 +199,9 @@ func localInterfaces(vnet *vnet.Net, interfaceFilter func(string) bool, ipFilter return ips, nil } -func listenUDPInPortRange(vnet *vnet.Net, log logging.LeveledLogger, portMax, portMin int, network string, lAddr *net.UDPAddr) (vnet.UDPPacketConn, error) { +func listenUDPInPortRange(n transport.Net, log logging.LeveledLogger, portMax, portMin int, network string, lAddr *net.UDPAddr) (transport.UDPConn, error) { if (lAddr.Port != 0) || ((portMin == 0) && (portMax == 0)) { - return vnet.ListenUDP(network, lAddr) + return n.ListenUDP(network, lAddr) } var i, j int i = portMin @@ -220,7 +220,7 @@ func listenUDPInPortRange(vnet *vnet.Net, log logging.LeveledLogger, portMax, po portCurrent := portStart for { lAddr = &net.UDPAddr{IP: lAddr.IP, Port: portCurrent} - c, e := vnet.ListenUDP(network, lAddr) + c, e := n.ListenUDP(network, lAddr) if e == nil { return c, e //nolint:nilerr }