apply ice-options when adding content or restarting ice

This commit is contained in:
Daniel Gultsch 2023-10-04 10:43:27 +02:00
parent a98738ae9d
commit 6bc3cad7de
No known key found for this signature in database
GPG key ID: F43D18AD2A0982C2
2 changed files with 27 additions and 13 deletions

View file

@ -210,6 +210,12 @@ public class RtpContentMap {
throw new IllegalStateException("Content map does not have distinct credentials"); throw new IllegalStateException("Content map does not have distinct credentials");
} }
private Set<String> getCombinedIceOptions() {
final Collection<List<String>> combinedIceOptions =
Collections2.transform(contents.values(), dt -> dt.transport.getIceOptions());
return ImmutableSet.copyOf(Iterables.concat(combinedIceOptions));
}
public Set<IceUdpTransportInfo.Credentials> getCredentials() { public Set<IceUdpTransportInfo.Credentials> getCredentials() {
final Set<IceUdpTransportInfo.Credentials> credentials = final Set<IceUdpTransportInfo.Credentials> credentials =
ImmutableSet.copyOf( ImmutableSet.copyOf(
@ -339,14 +345,11 @@ public class RtpContentMap {
public RtpContentMap addContent( public RtpContentMap addContent(
final RtpContentMap modification, final IceUdpTransportInfo.Setup setup) { final RtpContentMap modification, final IceUdpTransportInfo.Setup setup) {
final IceUdpTransportInfo.Credentials credentials = getDistinctCredentials(); final IceUdpTransportInfo.Credentials credentials = getDistinctCredentials();
final Collection<String> iceOptions = getCombinedIceOptions();
final DTLS dtls = getDistinctDtls(); final DTLS dtls = getDistinctDtls();
final IceUdpTransportInfo iceUdpTransportInfo = final IceUdpTransportInfo iceUdpTransportInfo =
IceUdpTransportInfo.of(credentials, setup, dtls.hash, dtls.fingerprint); IceUdpTransportInfo.of(credentials, iceOptions, setup, dtls.hash, dtls.fingerprint);
final Map<String, DescriptionTransport> combined = merge(contents, modification.contents); final Map<String, DescriptionTransport> combined = merge(contents, modification.contents);
/*new ImmutableMap.Builder<String, DescriptionTransport>()
.putAll(contents)
.putAll(modification.contents)
.build();*/
final Map<String, DescriptionTransport> combinedFixedTransport = final Map<String, DescriptionTransport> combinedFixedTransport =
Maps.transformValues( Maps.transformValues(
combined, combined,

View file

@ -15,6 +15,11 @@ import com.google.common.collect.Collections2;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables; import com.google.common.collect.Iterables;
import eu.siacs.conversations.Config;
import eu.siacs.conversations.xml.Element;
import eu.siacs.conversations.xml.Namespace;
import eu.siacs.conversations.xmpp.jingle.SessionDescription;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
@ -26,11 +31,6 @@ import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.UUID; import java.util.UUID;
import eu.siacs.conversations.Config;
import eu.siacs.conversations.xml.Element;
import eu.siacs.conversations.xml.Namespace;
import eu.siacs.conversations.xmpp.jingle.SessionDescription;
public class IceUdpTransportInfo extends GenericTransportInfo { public class IceUdpTransportInfo extends GenericTransportInfo {
public static final IceUdpTransportInfo STUB = new IceUdpTransportInfo(); public static final IceUdpTransportInfo STUB = new IceUdpTransportInfo();
@ -73,11 +73,18 @@ public class IceUdpTransportInfo extends GenericTransportInfo {
} }
public static IceUdpTransportInfo of( public static IceUdpTransportInfo of(
final Credentials credentials, final Setup setup, final String hash, final String fingerprint) { final Credentials credentials,
final Collection<String> iceOptions,
final Setup setup,
final String hash,
final String fingerprint) {
final IceUdpTransportInfo iceUdpTransportInfo = new IceUdpTransportInfo(); final IceUdpTransportInfo iceUdpTransportInfo = new IceUdpTransportInfo();
iceUdpTransportInfo.addChild(Fingerprint.of(setup, hash, fingerprint)); iceUdpTransportInfo.addChild(Fingerprint.of(setup, hash, fingerprint));
iceUdpTransportInfo.setAttribute("ufrag", credentials.ufrag); iceUdpTransportInfo.setAttribute("ufrag", credentials.ufrag);
iceUdpTransportInfo.setAttribute("pwd", credentials.password); iceUdpTransportInfo.setAttribute("pwd", credentials.password);
for(final String iceOption : iceOptions) {
iceUdpTransportInfo.addChild(new IceOption(iceOption));
}
return iceUdpTransportInfo; return iceUdpTransportInfo;
} }
@ -89,7 +96,8 @@ public class IceUdpTransportInfo extends GenericTransportInfo {
public List<String> getIceOptions() { public List<String> getIceOptions() {
final ImmutableList.Builder<String> optionBuilder = new ImmutableList.Builder<>(); final ImmutableList.Builder<String> optionBuilder = new ImmutableList.Builder<>();
for (final Element child : this.children) { for (final Element child : this.children) {
if (Namespace.JINGLE_TRANSPORT_ICE_OPTION.equals(child.getNamespace()) && IceOption.WELL_KNOWN.contains(child.getName())) { if (Namespace.JINGLE_TRANSPORT_ICE_OPTION.equals(child.getNamespace())
&& IceOption.WELL_KNOWN.contains(child.getName())) {
optionBuilder.add(child.getName()); optionBuilder.add(child.getName());
} }
} }
@ -132,6 +140,9 @@ public class IceUdpTransportInfo extends GenericTransportInfo {
transportInfo.addChild(fingerprint); transportInfo.addChild(fingerprint);
} }
} }
for (final String iceOption : this.getIceOptions()) {
transportInfo.addChild(new IceOption(iceOption));
}
return transportInfo; return transportInfo;
} }