mirror of
https://github.com/amnezia-vpn/amnezia-client.git
synced 2026-06-22 02:01:08 +07:00
refactor: prepare XrayProtocol for Tunnel two-phase lifecycle
This commit is contained in:
@@ -67,6 +67,8 @@ ErrorCode XrayProtocol::start()
|
|||||||
{
|
{
|
||||||
qDebug() << "XrayProtocol::start()";
|
qDebug() << "XrayProtocol::start()";
|
||||||
|
|
||||||
|
m_phase = Phase::Active;
|
||||||
|
|
||||||
// Inject SOCKS5 auth into the inbound before starting xray.
|
// Inject SOCKS5 auth into the inbound before starting xray.
|
||||||
// Re-uses existing credentials if the config already has them (e.g. imported config).
|
// Re-uses existing credentials if the config already has them (e.g. imported config).
|
||||||
amnezia::serialization::inbounds::InboundCredentials creds;
|
amnezia::serialization::inbounds::InboundCredentials creds;
|
||||||
@@ -119,6 +121,11 @@ void XrayProtocol::stop()
|
|||||||
{
|
{
|
||||||
qDebug() << "XrayProtocol::stop()";
|
qDebug() << "XrayProtocol::stop()";
|
||||||
|
|
||||||
|
if (m_phase != Phase::Active) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
m_phase = Phase::Stopping;
|
||||||
|
|
||||||
IpcClient::withInterface([this](QSharedPointer<IpcInterfaceReplica> iface) {
|
IpcClient::withInterface([this](QSharedPointer<IpcInterfaceReplica> iface) {
|
||||||
auto restoreResolvers = iface->restoreResolvers();
|
auto restoreResolvers = iface->restoreResolvers();
|
||||||
if (!restoreResolvers.waitForFinished() || !restoreResolvers.returnValue())
|
if (!restoreResolvers.waitForFinished() || !restoreResolvers.returnValue())
|
||||||
@@ -153,9 +160,16 @@ void XrayProtocol::stop()
|
|||||||
m_tun2socksProcess.reset();
|
m_tun2socksProcess.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_phase = Phase::Inactive;
|
||||||
setConnectionState(Vpn::ConnectionState::Disconnected);
|
setConnectionState(Vpn::ConnectionState::Disconnected);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void XrayProtocol::setPrimary(const QJsonObject &config)
|
||||||
|
{
|
||||||
|
Q_UNUSED(config)
|
||||||
|
emit primaryReady();
|
||||||
|
}
|
||||||
|
|
||||||
ErrorCode XrayProtocol::startTun2Socks()
|
ErrorCode XrayProtocol::startTun2Socks()
|
||||||
{
|
{
|
||||||
m_tun2socksProcess = IpcClient::CreatePrivilegedProcess();
|
m_tun2socksProcess = IpcClient::CreatePrivilegedProcess();
|
||||||
@@ -208,13 +222,17 @@ ErrorCode XrayProtocol::startTun2Socks()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (resourceBusy && m_tun2socksRetryCount < maxTun2SocksRetries) {
|
if (m_phase == Phase::Active && resourceBusy
|
||||||
|
&& m_tun2socksRetryCount < maxTun2SocksRetries) {
|
||||||
m_tun2socksRetryCount++;
|
m_tun2socksRetryCount++;
|
||||||
qWarning() << QString("Tun2socks: TUN resource busy, retrying (%1/%2) in %3ms...")
|
qWarning() << QString("Tun2socks: TUN resource busy, retrying (%1/%2) in %3ms...")
|
||||||
.arg(m_tun2socksRetryCount)
|
.arg(m_tun2socksRetryCount)
|
||||||
.arg(maxTun2SocksRetries)
|
.arg(maxTun2SocksRetries)
|
||||||
.arg(tun2socksRetryDelayMs);
|
.arg(tun2socksRetryDelayMs);
|
||||||
QTimer::singleShot(tun2socksRetryDelayMs, this, [this]() {
|
QTimer::singleShot(tun2socksRetryDelayMs, this, [this]() {
|
||||||
|
if (m_phase != Phase::Active) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (ErrorCode err = startTun2Socks(); err != ErrorCode::NoError) {
|
if (ErrorCode err = startTun2Socks(); err != ErrorCode::NoError) {
|
||||||
stop();
|
stop();
|
||||||
setLastError(err);
|
setLastError(err);
|
||||||
|
|||||||
@@ -20,8 +20,15 @@ public:
|
|||||||
|
|
||||||
ErrorCode start() override;
|
ErrorCode start() override;
|
||||||
void stop() override;
|
void stop() override;
|
||||||
|
void setPrimary(const QJsonObject &config) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
enum class Phase {
|
||||||
|
Inactive,
|
||||||
|
Active,
|
||||||
|
Stopping,
|
||||||
|
};
|
||||||
|
|
||||||
ErrorCode setupRouting();
|
ErrorCode setupRouting();
|
||||||
ErrorCode startTun2Socks();
|
ErrorCode startTun2Socks();
|
||||||
|
|
||||||
@@ -40,6 +47,7 @@ private:
|
|||||||
static constexpr int tun2socksRetryDelayMs = 400;
|
static constexpr int tun2socksRetryDelayMs = 400;
|
||||||
|
|
||||||
QString m_tunName;
|
QString m_tunName;
|
||||||
|
Phase m_phase = Phase::Inactive;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // XRAYPROTOCOL_H
|
#endif // XRAYPROTOCOL_H
|
||||||
|
|||||||
Reference in New Issue
Block a user