mirror of
https://github.com/amnezia-vpn/amnezia-client.git
synced 2026-06-23 02:00:20 +07:00
refactor: TrafficGuard owns adapter IP swap for WG/AWG and Xray
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user