mirror of
https://github.com/edera-dev/krata.git
synced 2025-08-04 13:41:31 +00:00
fix(network): allocate host ip from allocation pool (#353)
This commit is contained in:
@ -127,7 +127,8 @@ impl NetworkBackend {
|
||||
let (tx_sender, tx_receiver) = channel::<BytesMut>(TX_CHANNEL_BUFFER_LEN);
|
||||
let mut udev = ChannelDevice::new(mtu, Medium::Ethernet, tx_sender.clone());
|
||||
let mac = self.metadata.gateway.mac;
|
||||
let nat = Nat::new(mtu, proxy, mac, addresses.clone(), tx_sender.clone())?;
|
||||
let local_cidrs = addresses.clone();
|
||||
let nat = Nat::new(mtu, proxy, mac, local_cidrs, tx_sender.clone())?;
|
||||
let hardware_addr = HardwareAddress::Ethernet(mac);
|
||||
let config = Config::new(hardware_addr);
|
||||
let mut iface = Interface::new(config, &mut udev, Instant::now());
|
||||
|
@ -1,21 +1,15 @@
|
||||
use std::{
|
||||
io::ErrorKind,
|
||||
net::{IpAddr, Ipv4Addr},
|
||||
};
|
||||
use std::{io::ErrorKind, net::IpAddr};
|
||||
|
||||
use advmac::MacAddr6;
|
||||
use anyhow::{anyhow, Result};
|
||||
use bytes::BytesMut;
|
||||
use futures::TryStreamExt;
|
||||
use log::error;
|
||||
use smoltcp::wire::EthernetAddress;
|
||||
use smoltcp::wire::{EthernetAddress, Ipv4Cidr, Ipv6Cidr};
|
||||
use tokio::{select, task::JoinHandle};
|
||||
use tokio_tun::Tun;
|
||||
|
||||
use crate::vbridge::{BridgeJoinHandle, VirtualBridge};
|
||||
|
||||
const HOST_IPV4_ADDR: Ipv4Addr = Ipv4Addr::new(10, 75, 0, 1);
|
||||
|
||||
#[derive(Debug)]
|
||||
enum HostBridgeProcessSelect {
|
||||
Send(Option<BytesMut>),
|
||||
@ -27,7 +21,14 @@ pub struct HostBridge {
|
||||
}
|
||||
|
||||
impl HostBridge {
|
||||
pub async fn new(mtu: usize, interface: String, bridge: &VirtualBridge) -> Result<HostBridge> {
|
||||
pub async fn new(
|
||||
mtu: usize,
|
||||
interface: String,
|
||||
bridge: &VirtualBridge,
|
||||
ipv4: Ipv4Cidr,
|
||||
ipv6: Ipv6Cidr,
|
||||
mac: EthernetAddress,
|
||||
) -> Result<HostBridge> {
|
||||
let tun = Tun::builder()
|
||||
.name(&interface)
|
||||
.tap(true)
|
||||
@ -38,10 +39,6 @@ impl HostBridge {
|
||||
let (connection, handle, _) = rtnetlink::new_connection()?;
|
||||
tokio::spawn(connection);
|
||||
|
||||
let mut mac = MacAddr6::random();
|
||||
mac.set_local(true);
|
||||
mac.set_multicast(false);
|
||||
|
||||
let mut links = handle.link().get().match_name(interface.clone()).execute();
|
||||
let link = links.try_next().await?;
|
||||
if link.is_none() {
|
||||
@ -54,25 +51,32 @@ impl HostBridge {
|
||||
|
||||
handle
|
||||
.address()
|
||||
.add(link.header.index, IpAddr::V4(HOST_IPV4_ADDR), 16)
|
||||
.add(
|
||||
link.header.index,
|
||||
IpAddr::V4(ipv4.address().into()),
|
||||
ipv4.prefix_len(),
|
||||
)
|
||||
.execute()
|
||||
.await?;
|
||||
|
||||
handle
|
||||
.address()
|
||||
.add(link.header.index, IpAddr::V6(mac.to_link_local_ipv6()), 10)
|
||||
.add(
|
||||
link.header.index,
|
||||
IpAddr::V6(ipv6.address().into()),
|
||||
ipv6.prefix_len(),
|
||||
)
|
||||
.execute()
|
||||
.await?;
|
||||
|
||||
handle
|
||||
.link()
|
||||
.set(link.header.index)
|
||||
.address(mac.to_array().to_vec())
|
||||
.address(mac.0.to_vec())
|
||||
.up()
|
||||
.execute()
|
||||
.await?;
|
||||
|
||||
let mac = EthernetAddress(mac.to_array());
|
||||
let bridge_handle = bridge.join(mac).await?;
|
||||
|
||||
let task = tokio::task::spawn(async move {
|
||||
|
@ -1,17 +1,21 @@
|
||||
use std::{collections::HashMap, time::Duration};
|
||||
use std::{collections::HashMap, str::FromStr, time::Duration};
|
||||
|
||||
use anyhow::Result;
|
||||
use anyhow::{anyhow, Result};
|
||||
use autonet::{AutoNetworkChangeset, AutoNetworkWatcher, NetworkMetadata};
|
||||
use futures::{future::join_all, TryFutureExt};
|
||||
use hbridge::HostBridge;
|
||||
use krata::{
|
||||
client::ControlClientProvider,
|
||||
dial::ControlDialAddress,
|
||||
v1::{common::Zone, control::control_service_client::ControlServiceClient},
|
||||
v1::{
|
||||
common::Zone,
|
||||
control::{control_service_client::ControlServiceClient, HostStatusRequest},
|
||||
},
|
||||
};
|
||||
use log::warn;
|
||||
use smoltcp::wire::{EthernetAddress, Ipv4Cidr, Ipv6Cidr};
|
||||
use tokio::{task::JoinHandle, time::sleep};
|
||||
use tonic::transport::Channel;
|
||||
use tonic::{transport::Channel, Request};
|
||||
use uuid::Uuid;
|
||||
use vbridge::VirtualBridge;
|
||||
|
||||
@ -41,10 +45,27 @@ pub struct NetworkService {
|
||||
|
||||
impl NetworkService {
|
||||
pub async fn new(control_address: ControlDialAddress) -> Result<NetworkService> {
|
||||
let control = ControlClientProvider::dial(control_address).await?;
|
||||
let mut control = ControlClientProvider::dial(control_address).await?;
|
||||
let host_status = control
|
||||
.host_status(Request::new(HostStatusRequest {}))
|
||||
.await?
|
||||
.into_inner();
|
||||
let host_ipv4 = Ipv4Cidr::from_str(&host_status.host_ipv4)
|
||||
.map_err(|_| anyhow!("failed to parse host ipv4 cidr"))?;
|
||||
let host_ipv6 = Ipv6Cidr::from_str(&host_status.host_ipv6)
|
||||
.map_err(|_| anyhow!("failed to parse host ipv6 cidr"))?;
|
||||
let host_mac = EthernetAddress::from_str(&host_status.host_mac)
|
||||
.map_err(|_| anyhow!("failed to parse host mac address"))?;
|
||||
let bridge = VirtualBridge::new()?;
|
||||
let hbridge =
|
||||
HostBridge::new(HOST_BRIDGE_MTU + EXTRA_MTU, "krata0".to_string(), &bridge).await?;
|
||||
let hbridge = HostBridge::new(
|
||||
HOST_BRIDGE_MTU + EXTRA_MTU,
|
||||
"krata0".to_string(),
|
||||
&bridge,
|
||||
host_ipv4,
|
||||
host_ipv6,
|
||||
host_mac,
|
||||
)
|
||||
.await?;
|
||||
Ok(NetworkService {
|
||||
control,
|
||||
zones: HashMap::new(),
|
||||
|
Reference in New Issue
Block a user