diff options
Diffstat (limited to 'android/lib')
5 files changed, 52 insertions, 0 deletions
diff --git a/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/ManagementService.kt b/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/ManagementService.kt index e529f29ae5..44447ee866 100644 --- a/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/ManagementService.kt +++ b/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/ManagementService.kt @@ -76,6 +76,7 @@ import net.mullvad.mullvadvpn.lib.model.GetAccountHistoryError import net.mullvad.mullvadvpn.lib.model.GetDeviceListError import net.mullvad.mullvadvpn.lib.model.GetDeviceStateError import net.mullvad.mullvadvpn.lib.model.GetVersionInfoError +import net.mullvad.mullvadvpn.lib.model.IpVersion import net.mullvad.mullvadvpn.lib.model.LoginAccountError import net.mullvad.mullvadvpn.lib.model.LogoutAccountError import net.mullvad.mullvadvpn.lib.model.NameAlreadyExists @@ -125,6 +126,7 @@ import net.mullvad.mullvadvpn.lib.model.addresses import net.mullvad.mullvadvpn.lib.model.customOptions import net.mullvad.mullvadvpn.lib.model.enabled import net.mullvad.mullvadvpn.lib.model.entryLocation +import net.mullvad.mullvadvpn.lib.model.ipVersion import net.mullvad.mullvadvpn.lib.model.isMultihopEnabled import net.mullvad.mullvadvpn.lib.model.location import net.mullvad.mullvadvpn.lib.model.ownership @@ -784,6 +786,22 @@ class ManagementService( .mapLeft(SetWireguardConstraintsError::Unknown) .mapEmpty() + suspend fun setDeviceIpVersion( + ipVersion: Constraint<IpVersion> + ): Either<SetWireguardConstraintsError, Unit> = + Either.catch { + val relaySettings = getSettings().relaySettings + val updated = + RelaySettings.relayConstraints.wireguardConstraints.ipVersion.set( + relaySettings, + ipVersion, + ) + grpc.setRelaySettings(updated.fromDomain()) + } + .onLeft { Logger.e("Set multihop error") } + .mapLeft(SetWireguardConstraintsError::Unknown) + .mapEmpty() + private fun <A> Either<A, Empty>.mapEmpty() = map {} private inline fun <B, C> Either<Throwable, B>.mapLeftStatus( diff --git a/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/mapper/FromDomain.kt b/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/mapper/FromDomain.kt index e4d3e84a4f..113a5fc847 100644 --- a/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/mapper/FromDomain.kt +++ b/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/mapper/FromDomain.kt @@ -13,6 +13,7 @@ import net.mullvad.mullvadvpn.lib.model.DefaultDnsOptions import net.mullvad.mullvadvpn.lib.model.DnsOptions import net.mullvad.mullvadvpn.lib.model.DnsState import net.mullvad.mullvadvpn.lib.model.GeoLocationId +import net.mullvad.mullvadvpn.lib.model.IpVersion import net.mullvad.mullvadvpn.lib.model.NewAccessMethodSetting import net.mullvad.mullvadvpn.lib.model.ObfuscationMode import net.mullvad.mullvadvpn.lib.model.ObfuscationSettings @@ -135,6 +136,12 @@ internal fun WireguardConstraints.fromDomain(): ManagementInterface.WireguardCon is Constraint.Only -> setPort(port.value.value) } } + .apply { + when (val ipVersion = this@fromDomain.ipVersion) { + is Constraint.Any -> clearIpVersion() + is Constraint.Only -> setIpVersion(ipVersion.value.fromDomain()) + } + } .build() internal fun Ownership.fromDomain(): ManagementInterface.Ownership = @@ -260,3 +267,9 @@ internal fun DaitaSettings.fromDomain(): ManagementInterface.DaitaSettings = .setEnabled(enabled) .setDirectOnly(directOnly) .build() + +internal fun IpVersion.fromDomain(): ManagementInterface.IpVersion = + when (this) { + IpVersion.IPV4 -> ManagementInterface.IpVersion.V4 + IpVersion.IPV6 -> ManagementInterface.IpVersion.V6 + } diff --git a/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/mapper/ToDomain.kt b/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/mapper/ToDomain.kt index 717bf401f4..6ee772521b 100644 --- a/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/mapper/ToDomain.kt +++ b/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/mapper/ToDomain.kt @@ -41,6 +41,7 @@ import net.mullvad.mullvadvpn.lib.model.ErrorStateCause import net.mullvad.mullvadvpn.lib.model.FeatureIndicator import net.mullvad.mullvadvpn.lib.model.GeoIpLocation import net.mullvad.mullvadvpn.lib.model.GeoLocationId +import net.mullvad.mullvadvpn.lib.model.IpVersion import net.mullvad.mullvadvpn.lib.model.Mtu import net.mullvad.mullvadvpn.lib.model.ObfuscationEndpoint import net.mullvad.mullvadvpn.lib.model.ObfuscationMode @@ -374,6 +375,12 @@ internal fun ManagementInterface.WireguardConstraints.toDomain(): WireguardConst }, isMultihopEnabled = useMultihop, entryLocation = entryLocation.toDomain(), + ipVersion = + if (hasIpVersion()) { + Constraint.Only(ipVersion.toDomain()) + } else { + Constraint.Any + }, ) internal fun ManagementInterface.Ownership.toDomain(): Constraint<Ownership> = @@ -689,3 +696,10 @@ internal fun ManagementInterface.FeatureIndicator.toDomain() = ManagementInterface.FeatureIndicator.UNRECOGNIZED -> error("Feature not supported ${this.name}") } + +internal fun ManagementInterface.IpVersion.toDomain() = + when (this) { + ManagementInterface.IpVersion.V4 -> IpVersion.IPV4 + ManagementInterface.IpVersion.V6 -> IpVersion.IPV6 + ManagementInterface.IpVersion.UNRECOGNIZED -> error("Not supported ${this.name}") + } diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/IpVersion.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/IpVersion.kt new file mode 100644 index 0000000000..176809244c --- /dev/null +++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/IpVersion.kt @@ -0,0 +1,6 @@ +package net.mullvad.mullvadvpn.lib.model + +enum class IpVersion { + IPV4, + IPV6, +} diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/WireguardConstraints.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/WireguardConstraints.kt index dcc3a957df..33887506a1 100644 --- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/WireguardConstraints.kt +++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/WireguardConstraints.kt @@ -7,6 +7,7 @@ data class WireguardConstraints( val port: Constraint<Port>, val isMultihopEnabled: Boolean, val entryLocation: Constraint<RelayItemId>, + val ipVersion: Constraint<IpVersion>, ) { companion object } |
