mirror of
https://github.com/EasyTier/EasyTier.git
synced 2026-05-07 10:14:35 +00:00
fix win multi network (#63)
This commit is contained in:
@@ -6,9 +6,11 @@ import StepperPanel from 'primevue/stepperpanel';
|
|||||||
|
|
||||||
import { useToast } from "primevue/usetoast";
|
import { useToast } from "primevue/usetoast";
|
||||||
|
|
||||||
import { i18n, loadLocaleFromLocalStorage, NetworkConfig, parseNetworkConfig,
|
import {
|
||||||
|
i18n, loadLocaleFromLocalStorage, NetworkConfig, parseNetworkConfig,
|
||||||
useNetworkStore, runNetworkInstance, retainNetworkInstance, collectNetworkInfos,
|
useNetworkStore, runNetworkInstance, retainNetworkInstance, collectNetworkInfos,
|
||||||
changeLocale } from './main';
|
changeLocale
|
||||||
|
} from './main';
|
||||||
|
|
||||||
import Config from './components/Config.vue';
|
import Config from './components/Config.vue';
|
||||||
import Status from './components/Status.vue';
|
import Status from './components/Status.vue';
|
||||||
@@ -35,7 +37,9 @@ const items = ref([
|
|||||||
{
|
{
|
||||||
label: () => i18n.global.t('del_cur_network'),
|
label: () => i18n.global.t('del_cur_network'),
|
||||||
icon: 'pi pi-times',
|
icon: 'pi pi-times',
|
||||||
command: () => {
|
command: async () => {
|
||||||
|
networkStore.removeNetworkInstance(networkStore.curNetwork.instance_id);
|
||||||
|
await retainNetworkInstance(networkStore.networkInstanceIds);
|
||||||
networkStore.delCurNetwork();
|
networkStore.delCurNetwork();
|
||||||
},
|
},
|
||||||
disabled: () => networkStore.networkList.length <= 1,
|
disabled: () => networkStore.networkList.length <= 1,
|
||||||
|
|||||||
@@ -60,6 +60,16 @@ pub fn disable_connection_reset<S: AsRawSocket>(socket: &S) -> io::Result<()> {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn interface_count() -> io::Result<usize> {
|
||||||
|
let ifaces = network_interface::NetworkInterface::show().map_err(|e| {
|
||||||
|
io::Error::new(
|
||||||
|
ErrorKind::NotFound,
|
||||||
|
format!("Failed to get interfaces. error: {}", e),
|
||||||
|
)
|
||||||
|
})?;
|
||||||
|
Ok(ifaces.len())
|
||||||
|
}
|
||||||
|
|
||||||
pub fn find_interface_index(iface_name: &str) -> io::Result<u32> {
|
pub fn find_interface_index(iface_name: &str) -> io::Result<u32> {
|
||||||
let ifaces = network_interface::NetworkInterface::show().map_err(|e| {
|
let ifaces = network_interface::NetworkInterface::show().map_err(|e| {
|
||||||
io::Error::new(
|
io::Error::new(
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ use futures::{SinkExt, StreamExt};
|
|||||||
use pnet::packet::ipv4::Ipv4Packet;
|
use pnet::packet::ipv4::Ipv4Packet;
|
||||||
|
|
||||||
use tokio::{sync::Mutex, task::JoinSet};
|
use tokio::{sync::Mutex, task::JoinSet};
|
||||||
|
use tonic::transport::server::TcpIncoming;
|
||||||
use tonic::transport::Server;
|
use tonic::transport::Server;
|
||||||
|
|
||||||
use crate::common::config::ConfigLoader;
|
use crate::common::config::ConfigLoader;
|
||||||
@@ -285,7 +286,7 @@ impl Instance {
|
|||||||
self.listener_manager.lock().await.run().await?;
|
self.listener_manager.lock().await.run().await?;
|
||||||
self.peer_manager.run().await?;
|
self.peer_manager.run().await?;
|
||||||
|
|
||||||
self.run_rpc_server().unwrap();
|
self.run_rpc_server()?;
|
||||||
|
|
||||||
self.ip_proxy = Some(IpProxy::new(
|
self.ip_proxy = Some(IpProxy::new(
|
||||||
self.get_global_ctx(),
|
self.get_global_ctx(),
|
||||||
@@ -390,7 +391,7 @@ impl Instance {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn run_rpc_server(&mut self) -> Result<(), Box<dyn std::error::Error>> {
|
fn run_rpc_server(&mut self) -> Result<(), Error> {
|
||||||
let Some(addr) = self.global_ctx.config.get_rpc_portal() else {
|
let Some(addr) = self.global_ctx.config.get_rpc_portal() else {
|
||||||
tracing::info!("rpc server not enabled, because rpc_portal is not set.");
|
tracing::info!("rpc server not enabled, because rpc_portal is not set.");
|
||||||
return Ok(());
|
return Ok(());
|
||||||
@@ -401,6 +402,8 @@ impl Instance {
|
|||||||
let peer_center = self.peer_center.clone();
|
let peer_center = self.peer_center.clone();
|
||||||
let vpn_portal_rpc = self.get_vpn_portal_rpc_service();
|
let vpn_portal_rpc = self.get_vpn_portal_rpc_service();
|
||||||
|
|
||||||
|
let incoming = TcpIncoming::new(addr, true, None)
|
||||||
|
.map_err(|e| anyhow::anyhow!("create rpc server failed. addr: {}, err: {}", addr, e))?;
|
||||||
self.tasks.spawn(async move {
|
self.tasks.spawn(async move {
|
||||||
let _g = net_ns.guard();
|
let _g = net_ns.guard();
|
||||||
Server::builder()
|
Server::builder()
|
||||||
@@ -422,7 +425,7 @@ impl Instance {
|
|||||||
.add_service(crate::rpc::vpn_portal_rpc_server::VpnPortalRpcServer::new(
|
.add_service(crate::rpc::vpn_portal_rpc_server::VpnPortalRpcServer::new(
|
||||||
vpn_portal_rpc,
|
vpn_portal_rpc,
|
||||||
))
|
))
|
||||||
.serve(addr)
|
.serve_with_incoming(incoming)
|
||||||
.await
|
.await
|
||||||
.with_context(|| format!("rpc server failed. addr: {}", addr))
|
.with_context(|| format!("rpc server failed. addr: {}", addr))
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|||||||
@@ -273,6 +273,15 @@ impl VirtualNic {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(target_os = "windows")]
|
||||||
|
{
|
||||||
|
use std::net::IpAddr;
|
||||||
|
let c = crate::arch::windows::interface_count()?;
|
||||||
|
config.name(format!("et{}_{}", self.dev_name, c));
|
||||||
|
// set a temporary address
|
||||||
|
config.address(format!("172.0.{}.3", c).parse::<IpAddr>().unwrap());
|
||||||
|
}
|
||||||
|
|
||||||
if self.queue_num != 1 {
|
if self.queue_num != 1 {
|
||||||
todo!("queue_num != 1")
|
todo!("queue_num != 1")
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user