From 747c8de0eda29d1d42f49021cd1cac97c9adb129 Mon Sep 17 00:00:00 2001 From: Jonathan Lennox Date: Tue, 1 Oct 2024 17:18:19 -0400 Subject: [PATCH] Start writing to the ICE transport as soon as we have any validated pair. --- .../kotlin/org/jitsi/videobridge/Endpoint.kt | 5 ++++- .../org/jitsi/videobridge/relay/Relay.kt | 4 +++- .../videobridge/transport/ice/IceTransport.kt | 21 ++++++++++++++++++- 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/jvb/src/main/kotlin/org/jitsi/videobridge/Endpoint.kt b/jvb/src/main/kotlin/org/jitsi/videobridge/Endpoint.kt index 40a7df8278..fcdb43b0ed 100644 --- a/jvb/src/main/kotlin/org/jitsi/videobridge/Endpoint.kt +++ b/jvb/src/main/kotlin/org/jitsi/videobridge/Endpoint.kt @@ -430,7 +430,7 @@ class Endpoint @JvmOverloads constructor( } } iceTransport.eventHandler = object : IceTransport.EventHandler { - override fun connected() { + override fun writeable() { logger.info("ICE connected") transceiver.setOutgoingPacketHandler(object : PacketHandler { override fun processPacket(packetInfo: PacketInfo) { @@ -442,6 +442,9 @@ class Endpoint @JvmOverloads constructor( TaskPools.IO_POOL.execute(dtlsTransport::startDtlsHandshake) } + override fun connected() { + } + override fun failed() { } diff --git a/jvb/src/main/kotlin/org/jitsi/videobridge/relay/Relay.kt b/jvb/src/main/kotlin/org/jitsi/videobridge/relay/Relay.kt index 3f1052bee1..a2379edad4 100644 --- a/jvb/src/main/kotlin/org/jitsi/videobridge/relay/Relay.kt +++ b/jvb/src/main/kotlin/org/jitsi/videobridge/relay/Relay.kt @@ -391,7 +391,7 @@ class Relay @JvmOverloads constructor( } } iceTransport.eventHandler = object : IceTransport.EventHandler { - override fun connected() { + override fun writeable() { logger.info("ICE connected") transceiver.setOutgoingPacketHandler(object : PacketHandler { override fun processPacket(packetInfo: PacketInfo) { @@ -403,6 +403,8 @@ class Relay @JvmOverloads constructor( TaskPools.IO_POOL.execute(dtlsTransport::startDtlsHandshake) } + override fun connected() {} + override fun failed() {} override fun consentUpdated(time: Instant) { diff --git a/jvb/src/main/kotlin/org/jitsi/videobridge/transport/ice/IceTransport.kt b/jvb/src/main/kotlin/org/jitsi/videobridge/transport/ice/IceTransport.kt index 9f7ae36245..9d9d661956 100755 --- a/jvb/src/main/kotlin/org/jitsi/videobridge/transport/ice/IceTransport.kt +++ b/jvb/src/main/kotlin/org/jitsi/videobridge/transport/ice/IceTransport.kt @@ -94,6 +94,13 @@ class IceTransport @JvmOverloads constructor( @JvmField var eventHandler: EventHandler? = null + /** + * Whether or not it is possible to write to this [IceTransport]. + * + * This happens as soon as any candidate pair is validated, and happens (usually) before iceConnected. + */ + private val iceWriteable = AtomicBoolean(false) + /** * Whether or not this [IceTransport] has connected. */ @@ -106,6 +113,8 @@ class IceTransport @JvmOverloads constructor( fun hasFailed(): Boolean = iceFailed.get() + fun isWriteable(): Boolean = iceWriteable.get() + fun isConnected(): Boolean = iceConnected.get() /** @@ -264,6 +273,7 @@ class IceTransport @JvmOverloads constructor( put("nominationStrategy", IceConfig.config.nominationStrategy.toString()) put("advertisePrivateCandidates", IceConfig.config.advertisePrivateCandidates) put("closed", !running.get()) + put("iceWriteable", iceWriteable.get()) put("iceConnected", iceConnected.get()) put("iceFailed", iceFailed.get()) putAll(packetStats.toJson()) @@ -375,7 +385,11 @@ class IceTransport @JvmOverloads constructor( } private fun iceStreamPairChanged(ev: PropertyChangeEvent) { - if (IceMediaStream.PROPERTY_PAIR_CONSENT_FRESHNESS_CHANGED == ev.propertyName) { + if (IceMediaStream.PROPERTY_PAIR_VALIDATED == ev.propertyName) { + if (iceWriteable.compareAndSet(false, true)) { + eventHandler?.writeable() + } + } else if (IceMediaStream.PROPERTY_PAIR_CONSENT_FRESHNESS_CHANGED == ev.propertyName) { /* TODO: Currently ice4j only triggers this event for the selected * pair, but should we double-check the pair anyway? */ @@ -439,6 +453,11 @@ class IceTransport @JvmOverloads constructor( } interface EventHandler { + /** + * Notify the event handler that it is possible to write to the ICE stack + */ + fun writeable() + /** * Notify the event handler that ICE connected successfully */