refactor: TrafficGuard owns adapter IP swap for WG/AWG and Xray

This commit is contained in:
cd-amn
2026-06-16 12:00:37 +00:00
parent ff1473732c
commit ef3cf89e54
6 changed files with 34 additions and 81 deletions
+20 -13
View File
@@ -457,20 +457,11 @@ void VpnTrafficGuard::commit(Tunnel* tunnel)
{
if (!tunnel) return;
#if defined(AMNEZIA_DESKTOP) && defined(Q_OS_WIN)
if (VpnProtocol::isXrayBased(tunnel->container())) {
const QJsonObject &cfg = tunnel->config();
const QString ipv4 = cfg.value(QStringLiteral("deviceIpv4Address")).toString();
const QString ipv6 = cfg.value(QStringLiteral("deviceIpv6Address")).toString();
const QString handover = tunnel->handoverIfname();
#ifdef Q_OS_WIN
const QString ipv4 = tunnel->config().value(QStringLiteral("deviceIpv4Address")).toString();
const QString ipv6 = tunnel->config().value(QStringLiteral("deviceIpv6Address")).toString();
if (!ipv4.isEmpty() || !ipv6.isEmpty()) {
IpcClient::withInterface([&](QSharedPointer<IpcInterfaceReplica> iface) {
if (!handover.isEmpty() && handover != tunnel->ifname()) {
auto rm = iface->removeAdapterAddress(handover, ipv4, ipv6);
if (!rm.waitForFinished(2000) || !rm.returnValue()) {
qWarning() << "VpnTrafficGuard::commit: removeAdapterAddress failed for"
<< handover;
}
}
auto ap = iface->applyAdapterAddress(tunnel->ifname(), ipv4, ipv6);
if (!ap.waitForFinished(15000) || !ap.returnValue()) {
qWarning() << "VpnTrafficGuard::commit: applyAdapterAddress failed for"
@@ -510,6 +501,22 @@ void VpnTrafficGuard::swap(Tunnel* from, Tunnel* to)
to->setHandoverIfname(from->ifname());
}
#ifdef Q_OS_WIN
if (from) {
const QString fromIpv4 = from->config().value(QStringLiteral("deviceIpv4Address")).toString();
const QString fromIpv6 = from->config().value(QStringLiteral("deviceIpv6Address")).toString();
if (!fromIpv4.isEmpty() || !fromIpv6.isEmpty()) {
IpcClient::withInterface([&](QSharedPointer<IpcInterfaceReplica> iface) {
auto rm = iface->removeAdapterAddress(from->ifname(), fromIpv4, fromIpv6);
if (!rm.waitForFinished(2000) || !rm.returnValue()) {
qWarning() << "VpnTrafficGuard::swap: removeAdapterAddress failed for"
<< from->ifname();
}
});
}
}
#endif
QEventLoop loop;
QTimer guard;
guard.setSingleShot(true);