From 588adecb98b6c5ebf2d4cb420c4abd09c1338ef2 Mon Sep 17 00:00:00 2001 From: sukun Date: Mon, 20 May 2024 23:22:22 +0530 Subject: [PATCH 1/3] webrtc: add a test for establishing many connections --- go.mod | 2 + go.sum | 4 +- p2p/transport/webrtc/listener.go | 18 +++-- p2p/transport/webrtc/transport.go | 8 +-- p2p/transport/webrtc/transport_test.go | 93 ++++++++++++++++++++++++++ 5 files changed, 112 insertions(+), 13 deletions(-) diff --git a/go.mod b/go.mod index 3e64dedc6d..866296b907 100644 --- a/go.mod +++ b/go.mod @@ -126,3 +126,5 @@ require ( gopkg.in/yaml.v3 v3.0.1 // indirect lukechampine.com/blake3 v1.2.1 // indirect ) + +replace github.com/pion/ice/v2 => github.com/pion/ice/v2 v2.3.25-0.20240609174246-45043bdb58c3 diff --git a/go.sum b/go.sum index 76969bbecd..73a4dfde5e 100644 --- a/go.sum +++ b/go.sum @@ -278,8 +278,8 @@ github.com/pion/datachannel v1.5.6/go.mod h1:1eKT6Q85pRnr2mHiWHxJwO50SfZRtWHTsNI github.com/pion/dtls/v2 v2.2.7/go.mod h1:8WiMkebSHFD0T+dIU+UeBaoV7kDhOW5oDCzZ7WZ/F9s= github.com/pion/dtls/v2 v2.2.11 h1:9U/dpCYl1ySttROPWJgqWKEylUdT0fXp/xst6JwY5Ks= github.com/pion/dtls/v2 v2.2.11/go.mod h1:d9SYc9fch0CqK90mRk1dC7AkzzpwJj6u2GU3u+9pqFE= -github.com/pion/ice/v2 v2.3.24 h1:RYgzhH/u5lH0XO+ABatVKCtRd+4U1GEaCXSMjNr13tI= -github.com/pion/ice/v2 v2.3.24/go.mod h1:KXJJcZK7E8WzrBEYnV4UtqEZsGeWfHxsNqhVcVvgjxw= +github.com/pion/ice/v2 v2.3.25-0.20240609174246-45043bdb58c3 h1:0GtcVIH0YUX41lBVsuTTLny5S1FTdcVdD7iXYh2Trb8= +github.com/pion/ice/v2 v2.3.25-0.20240609174246-45043bdb58c3/go.mod h1:KXJJcZK7E8WzrBEYnV4UtqEZsGeWfHxsNqhVcVvgjxw= github.com/pion/interceptor v0.1.29 h1:39fsnlP1U8gw2JzOFWdfCU82vHvhW9o0rZnZF56wF+M= github.com/pion/interceptor v0.1.29/go.mod h1:ri+LGNjRUc5xUNtDEPzfdkmSqISixVTBF/z/Zms/6T4= github.com/pion/logging v0.2.2 h1:M9+AIj/+pxNsDfAT64+MAVgJO0rsyLnoJKCqf//DoeY= diff --git a/p2p/transport/webrtc/listener.go b/p2p/transport/webrtc/listener.go index 1834fc812b..6ba258d559 100644 --- a/p2p/transport/webrtc/listener.go +++ b/p2p/transport/webrtc/listener.go @@ -33,7 +33,7 @@ func (c *connMultiaddrs) LocalMultiaddr() ma.Multiaddr { return c.local } func (c *connMultiaddrs) RemoteMultiaddr() ma.Multiaddr { return c.remote } const ( - candidateSetupTimeout = 20 * time.Second + candidateSetupTimeout = 60 * time.Second DefaultMaxInFlightConnections = 10 ) @@ -128,11 +128,12 @@ func (l *listener) listen() { ctx, cancel := context.WithTimeout(l.ctx, candidateSetupTimeout) defer cancel() - + fmt.Println("received UFrag", candidate.Ufrag, candidate.Addr) conn, err := l.handleCandidate(ctx, candidate) if err != nil { l.mux.RemoveConnByUfrag(candidate.Ufrag) - log.Debugf("could not accept connection: %s: %v", candidate.Ufrag, err) + log.Errorf("could not accept connection: %s: %v", candidate.Ufrag, err) + fmt.Printf("could not accept connection: %s: %v\n", candidate.Ufrag, err) return } @@ -219,7 +220,7 @@ func (l *listener) setupConnection( return nil, fmt.Errorf("instantiating peer connection failed: %w", err) } - errC := addOnConnectionStateChangeCallback(w.PeerConnection) + errC := addOnConnectionStateChangeCallback(w.PeerConnection, "listener") // Infer the client SDP from the incoming STUN message by setting the ice-ufrag. if err := w.PeerConnection.SetRemoteDescription(webrtc.SessionDescription{ SDP: createClientSDP(candidate.Addr, candidate.Ufrag), @@ -326,11 +327,13 @@ func (l *listener) Multiaddr() ma.Multiaddr { // * is closed when the state changes to Connection // * receives an error when the state changes to Failed // * doesn't receive anything (nor is closed) when the state changes to Disconnected -func addOnConnectionStateChangeCallback(pc *webrtc.PeerConnection) <-chan error { +func addOnConnectionStateChangeCallback(pc *webrtc.PeerConnection, side string) <-chan error { errC := make(chan error, 1) var once sync.Once + st := time.Now() pc.OnConnectionStateChange(func(state webrtc.PeerConnectionState) { - switch state { + fmt.Println("state received: ", side, state, pc.ConnectionState(), time.Since(st)) + switch pc.ConnectionState() { case webrtc.PeerConnectionStateConnected: once.Do(func() { close(errC) }) case webrtc.PeerConnectionStateFailed: @@ -338,12 +341,13 @@ func addOnConnectionStateChangeCallback(pc *webrtc.PeerConnection) <-chan error errC <- errors.New("peerconnection failed") close(errC) }) + log.Error("peer connection failed") case webrtc.PeerConnectionStateDisconnected: // the connection can move to a disconnected state and back to a connected state without ICE renegotiation. // This could happen when underlying UDP packets are lost, and therefore the connection moves to the disconnected state. // If the connection then receives packets on the connection, it can move back to the connected state. // If no packets are received until the failed timeout is triggered, the connection moves to the failed state. - log.Warn("peerconnection disconnected") + log.Error("peerconnection disconnected") } }) return errC diff --git a/p2p/transport/webrtc/transport.go b/p2p/transport/webrtc/transport.go index 68a2988c78..e9e5f89ccf 100644 --- a/p2p/transport/webrtc/transport.go +++ b/p2p/transport/webrtc/transport.go @@ -73,9 +73,9 @@ const ( // timeout values for the peerconnection // https://github.com/pion/webrtc/blob/v3.1.50/settingengine.go#L102-L109 const ( - DefaultDisconnectedTimeout = 20 * time.Second - DefaultFailedTimeout = 30 * time.Second - DefaultKeepaliveTimeout = 15 * time.Second + DefaultDisconnectedTimeout = 60 * time.Second + DefaultFailedTimeout = 60 * time.Second + DefaultKeepaliveTimeout = 60 * time.Second sctpReceiveBufferSize = 100_000 ) @@ -327,7 +327,7 @@ func (t *WebRTCTransport) dial(ctx context.Context, scope network.ConnManagement return nil, fmt.Errorf("instantiating peer connection failed: %w", err) } - errC := addOnConnectionStateChangeCallback(w.PeerConnection) + errC := addOnConnectionStateChangeCallback(w.PeerConnection, "dialer") // do offer-answer exchange offer, err := w.PeerConnection.CreateOffer(nil) diff --git a/p2p/transport/webrtc/transport_test.go b/p2p/transport/webrtc/transport_test.go index 5831a257a7..057e599ab9 100644 --- a/p2p/transport/webrtc/transport_test.go +++ b/p2p/transport/webrtc/transport_test.go @@ -4,10 +4,12 @@ import ( "context" "crypto/rand" "encoding/hex" + "errors" "fmt" "io" "net" "os" + "runtime" "strings" "sync" "sync/atomic" @@ -17,6 +19,7 @@ import ( "github.com/libp2p/go-libp2p/core/crypto" "github.com/libp2p/go-libp2p/core/network" "github.com/libp2p/go-libp2p/core/peer" + tpt "github.com/libp2p/go-libp2p/core/transport" ma "github.com/multiformats/go-multiaddr" manet "github.com/multiformats/go-multiaddr/net" "github.com/multiformats/go-multibase" @@ -867,3 +870,93 @@ func TestGenUfrag(t *testing.T) { require.True(t, strings.HasPrefix(s, "libp2p+webrtc+v1/")) } } + +func TestManyConnections(t *testing.T) { + const N = 200 + errCh := make(chan error, 200) + successCh := make(chan struct{}, 1) + + tr, lp := getTransport(t) + ln, err := tr.Listen(ma.StringCast("/ip4/127.0.0.1/udp/0/webrtc-direct")) + require.NoError(t, err) + defer ln.Close() + + runListenConn := func(conn tpt.CapableConn) { + defer conn.Close() + + s, err := conn.AcceptStream() + if err != nil { + t.Errorf("accept stream failed for listener: %s", err) + errCh <- err + return + } + var b [4]byte + if _, err := s.Read(b[:]); err != nil { + t.Errorf("read stream failed for listener: %s", err) + errCh <- err + return + } + s.Write(b[:]) + _, err = s.Read(b[:]) // peer will close the connection after read + if !assert.Error(t, err) { + errCh <- errors.New("expected peer to close connection") + return + } + } + + runDialConn := func(conn tpt.CapableConn) error { + defer conn.Close() + + s, err := conn.OpenStream(context.Background()) + if err != nil { + t.Errorf("accept stream failed for listener: %s", err) + return err + } + var b [4]byte + if _, err := s.Write(b[:]); err != nil { + t.Errorf("write stream failed for dialer: %s", err) + return err + } + if _, err := s.Read(b[:]); err != nil { + t.Errorf("read stream failed for dialer: %s", err) + return err + } + return nil + } + + go func() { + for i := 0; i < N; i++ { + conn, err := ln.Accept() + if err != nil { + t.Errorf("listener failed to accept conneciton: %s %d", err, runtime.NumGoroutine()) + return + } + runListenConn(conn) + successCh <- struct{}{} + } + }() + + tp, _ := getTransport(t) + for i := 0; i < N; i++ { + // This test aims to check for deadlocks. So keep a high timeout + ctx, cancel := context.WithTimeout(context.Background(), 120*time.Second) + conn, err := tp.Dial(ctx, ln.Multiaddr(), lp) + if err != nil { + t.Errorf("dial failed: %s %d", err, runtime.NumGoroutine()) + cancel() + return + } + err = runDialConn(conn) + require.NoError(t, err) + cancel() + select { + case <-time.After(120 * time.Second): + t.Fatalf("timed out %d", runtime.NumGoroutine()) + case <-errCh: + t.Fatal("listener error:", err, runtime.NumGoroutine()) + case <-successCh: + } + t.Log("completed conn:", i, runtime.NumGoroutine()) + } + +} From 64d8afbc262491e46b2a34a92bdc7de3b415b2d4 Mon Sep 17 00:00:00 2001 From: sukun Date: Mon, 10 Jun 2024 15:07:36 +0530 Subject: [PATCH 2/3] test connections in parallel --- p2p/transport/webrtc/transport_test.go | 102 +++++++++++++++---------- 1 file changed, 63 insertions(+), 39 deletions(-) diff --git a/p2p/transport/webrtc/transport_test.go b/p2p/transport/webrtc/transport_test.go index 057e599ab9..b618ec85df 100644 --- a/p2p/transport/webrtc/transport_test.go +++ b/p2p/transport/webrtc/transport_test.go @@ -9,7 +9,6 @@ import ( "io" "net" "os" - "runtime" "strings" "sync" "sync/atomic" @@ -872,18 +871,26 @@ func TestGenUfrag(t *testing.T) { } func TestManyConnections(t *testing.T) { - const N = 200 - errCh := make(chan error, 200) - successCh := make(chan struct{}, 1) - - tr, lp := getTransport(t) - ln, err := tr.Listen(ma.StringCast("/ip4/127.0.0.1/udp/0/webrtc-direct")) - require.NoError(t, err) - defer ln.Close() + var listeners []tpt.Listener + var listenerPeerIDs []peer.ID + + const numListeners = 5 + const dialersPerListener = 5 + const connsPerDialer = 10 + errCh := make(chan error, 10*numListeners*dialersPerListener*connsPerDialer) + successCh := make(chan struct{}, 10*numListeners*dialersPerListener*connsPerDialer) + + for i := 0; i < numListeners; i++ { + tr, lp := getTransport(t) + listenerPeerIDs = append(listenerPeerIDs, lp) + ln, err := tr.Listen(ma.StringCast("/ip4/127.0.0.1/udp/0/webrtc-direct")) + require.NoError(t, err) + defer ln.Close() + listeners = append(listeners, ln) + } runListenConn := func(conn tpt.CapableConn) { defer conn.Close() - s, err := conn.AcceptStream() if err != nil { t.Errorf("accept stream failed for listener: %s", err) @@ -899,64 +906,81 @@ func TestManyConnections(t *testing.T) { s.Write(b[:]) _, err = s.Read(b[:]) // peer will close the connection after read if !assert.Error(t, err) { - errCh <- errors.New("expected peer to close connection") + err = errors.New("invalid read: expected conn to close") + errCh <- err return } + successCh <- struct{}{} } - runDialConn := func(conn tpt.CapableConn) error { + runDialConn := func(conn tpt.CapableConn) { defer conn.Close() s, err := conn.OpenStream(context.Background()) if err != nil { t.Errorf("accept stream failed for listener: %s", err) - return err + errCh <- err + return } var b [4]byte if _, err := s.Write(b[:]); err != nil { t.Errorf("write stream failed for dialer: %s", err) - return err + errCh <- err + return } if _, err := s.Read(b[:]); err != nil { t.Errorf("read stream failed for dialer: %s", err) - return err + errCh <- err + return } - return nil + s.Close() } - go func() { - for i := 0; i < N; i++ { + runListener := func(ln tpt.Listener) { + for i := 0; i < dialersPerListener*connsPerDialer; i++ { conn, err := ln.Accept() if err != nil { - t.Errorf("listener failed to accept conneciton: %s %d", err, runtime.NumGoroutine()) + t.Errorf("listener failed to accept conneciton: %s", err) return } - runListenConn(conn) - successCh <- struct{}{} + go runListenConn(conn) } - }() + } - tp, _ := getTransport(t) - for i := 0; i < N; i++ { - // This test aims to check for deadlocks. So keep a high timeout - ctx, cancel := context.WithTimeout(context.Background(), 120*time.Second) - conn, err := tp.Dial(ctx, ln.Multiaddr(), lp) - if err != nil { - t.Errorf("dial failed: %s %d", err, runtime.NumGoroutine()) + runDialer := func(ln tpt.Listener, lp peer.ID) { + tp, _ := getTransport(t) + for i := 0; i < connsPerDialer; i++ { + // We want to test for deadlocks, set a high timeout + ctx, cancel := context.WithTimeout(context.Background(), 120*time.Second) + conn, err := tp.Dial(ctx, ln.Multiaddr(), lp) + if err != nil { + t.Errorf("dial failed: %s", err) + errCh <- err + cancel() + return + } + runDialConn(conn) cancel() - return } - err = runDialConn(conn) - require.NoError(t, err) - cancel() + } + + for i := 0; i < numListeners; i++ { + go runListener(listeners[i]) + } + for i := 0; i < numListeners; i++ { + for j := 0; j < dialersPerListener; j++ { + go runDialer(listeners[i], listenerPeerIDs[i]) + } + } + + for i := 0; i < numListeners*dialersPerListener*connsPerDialer; i++ { select { - case <-time.After(120 * time.Second): - t.Fatalf("timed out %d", runtime.NumGoroutine()) - case <-errCh: - t.Fatal("listener error:", err, runtime.NumGoroutine()) case <-successCh: + t.Log("completed conn: ", i) + case err := <-errCh: + t.Fatalf("failed: %s", err) + case <-time.After(300 * time.Second): + t.Fatalf("timed out") } - t.Log("completed conn:", i, runtime.NumGoroutine()) } - } From 8a6b5443c80efc6028e62fb5b81664201d23b0e9 Mon Sep 17 00:00:00 2001 From: sukun Date: Tue, 11 Jun 2024 15:30:30 +0530 Subject: [PATCH 3/3] update pion/ice --- go.mod | 4 +--- go.sum | 4 ++-- p2p/transport/webrtc/listener.go | 16 ++++++---------- p2p/transport/webrtc/transport.go | 8 ++++---- test-plans/go.mod | 2 +- test-plans/go.sum | 4 ++-- 6 files changed, 16 insertions(+), 22 deletions(-) diff --git a/go.mod b/go.mod index 866296b907..527379744f 100644 --- a/go.mod +++ b/go.mod @@ -44,7 +44,7 @@ require ( github.com/multiformats/go-varint v0.0.7 github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 github.com/pion/datachannel v1.5.6 - github.com/pion/ice/v2 v2.3.24 + github.com/pion/ice/v2 v2.3.25 github.com/pion/logging v0.2.2 github.com/pion/sctp v1.8.16 github.com/pion/stun v0.6.1 @@ -126,5 +126,3 @@ require ( gopkg.in/yaml.v3 v3.0.1 // indirect lukechampine.com/blake3 v1.2.1 // indirect ) - -replace github.com/pion/ice/v2 => github.com/pion/ice/v2 v2.3.25-0.20240609174246-45043bdb58c3 diff --git a/go.sum b/go.sum index 73a4dfde5e..0d5cfeca4c 100644 --- a/go.sum +++ b/go.sum @@ -278,8 +278,8 @@ github.com/pion/datachannel v1.5.6/go.mod h1:1eKT6Q85pRnr2mHiWHxJwO50SfZRtWHTsNI github.com/pion/dtls/v2 v2.2.7/go.mod h1:8WiMkebSHFD0T+dIU+UeBaoV7kDhOW5oDCzZ7WZ/F9s= github.com/pion/dtls/v2 v2.2.11 h1:9U/dpCYl1ySttROPWJgqWKEylUdT0fXp/xst6JwY5Ks= github.com/pion/dtls/v2 v2.2.11/go.mod h1:d9SYc9fch0CqK90mRk1dC7AkzzpwJj6u2GU3u+9pqFE= -github.com/pion/ice/v2 v2.3.25-0.20240609174246-45043bdb58c3 h1:0GtcVIH0YUX41lBVsuTTLny5S1FTdcVdD7iXYh2Trb8= -github.com/pion/ice/v2 v2.3.25-0.20240609174246-45043bdb58c3/go.mod h1:KXJJcZK7E8WzrBEYnV4UtqEZsGeWfHxsNqhVcVvgjxw= +github.com/pion/ice/v2 v2.3.25 h1:M5rJA07dqhi3nobJIg+uPtcVjFECTrhcR3n0ns8kDZs= +github.com/pion/ice/v2 v2.3.25/go.mod h1:KXJJcZK7E8WzrBEYnV4UtqEZsGeWfHxsNqhVcVvgjxw= github.com/pion/interceptor v0.1.29 h1:39fsnlP1U8gw2JzOFWdfCU82vHvhW9o0rZnZF56wF+M= github.com/pion/interceptor v0.1.29/go.mod h1:ri+LGNjRUc5xUNtDEPzfdkmSqISixVTBF/z/Zms/6T4= github.com/pion/logging v0.2.2 h1:M9+AIj/+pxNsDfAT64+MAVgJO0rsyLnoJKCqf//DoeY= diff --git a/p2p/transport/webrtc/listener.go b/p2p/transport/webrtc/listener.go index 6ba258d559..3f465b34fc 100644 --- a/p2p/transport/webrtc/listener.go +++ b/p2p/transport/webrtc/listener.go @@ -33,7 +33,7 @@ func (c *connMultiaddrs) LocalMultiaddr() ma.Multiaddr { return c.local } func (c *connMultiaddrs) RemoteMultiaddr() ma.Multiaddr { return c.remote } const ( - candidateSetupTimeout = 60 * time.Second + candidateSetupTimeout = 20 * time.Second DefaultMaxInFlightConnections = 10 ) @@ -128,12 +128,11 @@ func (l *listener) listen() { ctx, cancel := context.WithTimeout(l.ctx, candidateSetupTimeout) defer cancel() - fmt.Println("received UFrag", candidate.Ufrag, candidate.Addr) + conn, err := l.handleCandidate(ctx, candidate) if err != nil { l.mux.RemoveConnByUfrag(candidate.Ufrag) - log.Errorf("could not accept connection: %s: %v", candidate.Ufrag, err) - fmt.Printf("could not accept connection: %s: %v\n", candidate.Ufrag, err) + log.Debugf("could not accept connection: %s: %v", candidate.Ufrag, err) return } @@ -220,7 +219,7 @@ func (l *listener) setupConnection( return nil, fmt.Errorf("instantiating peer connection failed: %w", err) } - errC := addOnConnectionStateChangeCallback(w.PeerConnection, "listener") + errC := addOnConnectionStateChangeCallback(w.PeerConnection) // Infer the client SDP from the incoming STUN message by setting the ice-ufrag. if err := w.PeerConnection.SetRemoteDescription(webrtc.SessionDescription{ SDP: createClientSDP(candidate.Addr, candidate.Ufrag), @@ -327,12 +326,10 @@ func (l *listener) Multiaddr() ma.Multiaddr { // * is closed when the state changes to Connection // * receives an error when the state changes to Failed // * doesn't receive anything (nor is closed) when the state changes to Disconnected -func addOnConnectionStateChangeCallback(pc *webrtc.PeerConnection, side string) <-chan error { +func addOnConnectionStateChangeCallback(pc *webrtc.PeerConnection) <-chan error { errC := make(chan error, 1) var once sync.Once - st := time.Now() pc.OnConnectionStateChange(func(state webrtc.PeerConnectionState) { - fmt.Println("state received: ", side, state, pc.ConnectionState(), time.Since(st)) switch pc.ConnectionState() { case webrtc.PeerConnectionStateConnected: once.Do(func() { close(errC) }) @@ -341,13 +338,12 @@ func addOnConnectionStateChangeCallback(pc *webrtc.PeerConnection, side string) errC <- errors.New("peerconnection failed") close(errC) }) - log.Error("peer connection failed") case webrtc.PeerConnectionStateDisconnected: // the connection can move to a disconnected state and back to a connected state without ICE renegotiation. // This could happen when underlying UDP packets are lost, and therefore the connection moves to the disconnected state. // If the connection then receives packets on the connection, it can move back to the connected state. // If no packets are received until the failed timeout is triggered, the connection moves to the failed state. - log.Error("peerconnection disconnected") + log.Warn("peerconnection disconnected") } }) return errC diff --git a/p2p/transport/webrtc/transport.go b/p2p/transport/webrtc/transport.go index e9e5f89ccf..68a2988c78 100644 --- a/p2p/transport/webrtc/transport.go +++ b/p2p/transport/webrtc/transport.go @@ -73,9 +73,9 @@ const ( // timeout values for the peerconnection // https://github.com/pion/webrtc/blob/v3.1.50/settingengine.go#L102-L109 const ( - DefaultDisconnectedTimeout = 60 * time.Second - DefaultFailedTimeout = 60 * time.Second - DefaultKeepaliveTimeout = 60 * time.Second + DefaultDisconnectedTimeout = 20 * time.Second + DefaultFailedTimeout = 30 * time.Second + DefaultKeepaliveTimeout = 15 * time.Second sctpReceiveBufferSize = 100_000 ) @@ -327,7 +327,7 @@ func (t *WebRTCTransport) dial(ctx context.Context, scope network.ConnManagement return nil, fmt.Errorf("instantiating peer connection failed: %w", err) } - errC := addOnConnectionStateChangeCallback(w.PeerConnection, "dialer") + errC := addOnConnectionStateChangeCallback(w.PeerConnection) // do offer-answer exchange offer, err := w.PeerConnection.CreateOffer(nil) diff --git a/test-plans/go.mod b/test-plans/go.mod index b05b7505f5..f0cf86aae5 100644 --- a/test-plans/go.mod +++ b/test-plans/go.mod @@ -66,7 +66,7 @@ require ( github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect github.com/pion/datachannel v1.5.6 // indirect github.com/pion/dtls/v2 v2.2.11 // indirect - github.com/pion/ice/v2 v2.3.24 // indirect + github.com/pion/ice/v2 v2.3.25 // indirect github.com/pion/interceptor v0.1.29 // indirect github.com/pion/logging v0.2.2 // indirect github.com/pion/mdns v0.0.12 // indirect diff --git a/test-plans/go.sum b/test-plans/go.sum index ecd4373ce6..e94d7dccde 100644 --- a/test-plans/go.sum +++ b/test-plans/go.sum @@ -226,8 +226,8 @@ github.com/pion/datachannel v1.5.6/go.mod h1:1eKT6Q85pRnr2mHiWHxJwO50SfZRtWHTsNI github.com/pion/dtls/v2 v2.2.7/go.mod h1:8WiMkebSHFD0T+dIU+UeBaoV7kDhOW5oDCzZ7WZ/F9s= github.com/pion/dtls/v2 v2.2.11 h1:9U/dpCYl1ySttROPWJgqWKEylUdT0fXp/xst6JwY5Ks= github.com/pion/dtls/v2 v2.2.11/go.mod h1:d9SYc9fch0CqK90mRk1dC7AkzzpwJj6u2GU3u+9pqFE= -github.com/pion/ice/v2 v2.3.24 h1:RYgzhH/u5lH0XO+ABatVKCtRd+4U1GEaCXSMjNr13tI= -github.com/pion/ice/v2 v2.3.24/go.mod h1:KXJJcZK7E8WzrBEYnV4UtqEZsGeWfHxsNqhVcVvgjxw= +github.com/pion/ice/v2 v2.3.25 h1:M5rJA07dqhi3nobJIg+uPtcVjFECTrhcR3n0ns8kDZs= +github.com/pion/ice/v2 v2.3.25/go.mod h1:KXJJcZK7E8WzrBEYnV4UtqEZsGeWfHxsNqhVcVvgjxw= github.com/pion/interceptor v0.1.29 h1:39fsnlP1U8gw2JzOFWdfCU82vHvhW9o0rZnZF56wF+M= github.com/pion/interceptor v0.1.29/go.mod h1:ri+LGNjRUc5xUNtDEPzfdkmSqISixVTBF/z/Zms/6T4= github.com/pion/logging v0.2.2 h1:M9+AIj/+pxNsDfAT64+MAVgJO0rsyLnoJKCqf//DoeY=