From d62bb1ca76fc48fd8d0f8b1611d3b457b7fcbb79 Mon Sep 17 00:00:00 2001 From: Ruihan Li Date: Thu, 19 Sep 2024 11:40:28 +0800 Subject: [PATCH] Use static IP addresses --- .../libs/aster-bigtcp/src/iface/phy/ether.rs | 72 ++++--------------- kernel/libs/aster-bigtcp/src/iface/phy/ip.rs | 9 ++- kernel/src/net/iface/init.rs | 20 ++++-- 3 files changed, 34 insertions(+), 67 deletions(-) diff --git a/kernel/libs/aster-bigtcp/src/iface/phy/ether.rs b/kernel/libs/aster-bigtcp/src/iface/phy/ether.rs index dc7016a63..be1a94e18 100644 --- a/kernel/libs/aster-bigtcp/src/iface/phy/ether.rs +++ b/kernel/libs/aster-bigtcp/src/iface/phy/ether.rs @@ -2,11 +2,9 @@ use alloc::sync::Arc; -use ostd::prelude::*; use smoltcp::{ - iface::{Config, SocketHandle, SocketSet}, - socket::dhcpv4, - wire::{self, EthernetAddress, IpCidr}, + iface::Config, + wire::{self, EthernetAddress, Ipv4Address, Ipv4Cidr}, }; use crate::{ @@ -19,67 +17,35 @@ use crate::{ pub struct EtherIface { driver: D, common: IfaceCommon, - dhcp_handle: SocketHandle, } impl EtherIface { - pub fn new(driver: D, ether_addr: EthernetAddress, ext: E) -> Arc { + pub fn new( + driver: D, + ether_addr: EthernetAddress, + ip_cidr: Ipv4Cidr, + gateway: Ipv4Address, + ext: E, + ) -> Arc { let interface = driver.with(|device| { - let ip_addr = IpCidr::new(wire::IpAddress::Ipv4(wire::Ipv4Address::UNSPECIFIED), 0); let config = Config::new(wire::HardwareAddress::Ethernet(ether_addr)); let now = get_network_timestamp(); let mut interface = smoltcp::iface::Interface::new(config, device, now); interface.update_ip_addrs(|ip_addrs| { debug_assert!(ip_addrs.is_empty()); - ip_addrs.push(ip_addr).unwrap(); + ip_addrs.push(wire::IpCidr::Ipv4(ip_cidr)).unwrap(); }); interface + .routes_mut() + .add_default_ipv4_route(gateway) + .unwrap(); + interface }); let common = IfaceCommon::new(interface, ext); - let mut socket_set = common.sockets(); - let dhcp_handle = init_dhcp_client(&mut socket_set); - drop(socket_set); - - Arc::new(Self { - driver, - common, - dhcp_handle, - }) - } - - /// FIXME: Once we have user program dhcp client, we may remove dhcp logic from kernel. - pub fn process_dhcp(&self) { - let mut socket_set = self.common.sockets(); - let dhcp_socket: &mut dhcpv4::Socket = socket_set.get_mut(self.dhcp_handle); - - let Some(dhcpv4::Event::Configured(config)) = dhcp_socket.poll() else { - return; - }; - let ip_addr = IpCidr::Ipv4(config.address); - - let mut interface = self.common.interface(); - - println!("[DHCP] Local IP address: {:?}", ip_addr,); - interface.update_ip_addrs(|ipaddrs| { - if let Some(addr) = ipaddrs.iter_mut().next() { - // already has ipaddrs - *addr = ip_addr - } else { - // does not has ip addr - ipaddrs.push(ip_addr).unwrap(); - } - }); - - if let Some(router) = config.router { - println!("[DHCP] Router IP address: {:?}", router); - interface - .routes_mut() - .add_default_ipv4_route(router) - .unwrap(); - } + Arc::new(Self { driver, common }) } } @@ -94,14 +60,6 @@ impl Iface for EtherIface { self.driver.with(|device| { let next_poll = self.common.poll(&mut *device); schedule_next_poll(next_poll); - - self.process_dhcp(); }); } } - -/// Register a dhcp socket. -fn init_dhcp_client(socket_set: &mut SocketSet) -> SocketHandle { - let dhcp_socket = dhcpv4::Socket::new(); - socket_set.add(dhcp_socket) -} diff --git a/kernel/libs/aster-bigtcp/src/iface/phy/ip.rs b/kernel/libs/aster-bigtcp/src/iface/phy/ip.rs index d888c5ac3..7ec2f1fb2 100644 --- a/kernel/libs/aster-bigtcp/src/iface/phy/ip.rs +++ b/kernel/libs/aster-bigtcp/src/iface/phy/ip.rs @@ -2,7 +2,10 @@ use alloc::sync::Arc; -use smoltcp::{iface::Config, wire::IpCidr}; +use smoltcp::{ + iface::Config, + wire::{self, Ipv4Cidr}, +}; use crate::{ device::WithDevice, @@ -17,7 +20,7 @@ pub struct IpIface { } impl IpIface { - pub fn new(driver: D, ip_cidr: IpCidr, ext: E) -> Arc { + pub fn new(driver: D, ip_cidr: Ipv4Cidr, ext: E) -> Arc { let interface = driver.with(|device| { let config = Config::new(smoltcp::wire::HardwareAddress::Ip); let now = get_network_timestamp(); @@ -25,7 +28,7 @@ impl IpIface { let mut interface = smoltcp::iface::Interface::new(config, device, now); interface.update_ip_addrs(|ip_addrs| { debug_assert!(ip_addrs.is_empty()); - ip_addrs.push(ip_cidr).unwrap(); + ip_addrs.push(wire::IpCidr::Ipv4(ip_cidr)).unwrap(); }); interface }); diff --git a/kernel/src/net/iface/init.rs b/kernel/src/net/iface/init.rs index 347634ecf..246aba5b5 100644 --- a/kernel/src/net/iface/init.rs +++ b/kernel/src/net/iface/init.rs @@ -33,10 +33,17 @@ pub fn init() { } fn new_virtio() -> Arc { - use aster_bigtcp::{iface::EtherIface, wire::EthernetAddress}; + use aster_bigtcp::{ + iface::EtherIface, + wire::{EthernetAddress, Ipv4Address, Ipv4Cidr}, + }; use aster_network::AnyNetworkDevice; use aster_virtio::device::network::DEVICE_NAME; + const VIRTIO_ADDRESS: Ipv4Address = Ipv4Address::new(10, 0, 2, 15); + const VIRTIO_ADDRESS_PREFIX_LEN: u8 = 24; // mask: 255.255.255.0 + const VIRTIO_GATEWAY: Ipv4Address = Ipv4Address::new(10, 0, 2, 2); + let virtio_net = aster_network::get_device(DEVICE_NAME).unwrap(); let ether_addr = virtio_net.lock().mac_addr().0; @@ -58,6 +65,8 @@ fn new_virtio() -> Arc { EtherIface::new( Wrapper(virtio_net), EthernetAddress(ether_addr), + Ipv4Cidr::new(VIRTIO_ADDRESS, VIRTIO_ADDRESS_PREFIX_LEN), + VIRTIO_GATEWAY, IfaceExt::new("virtio".to_owned()), ) } @@ -66,13 +75,10 @@ fn new_loopback() -> Arc { use aster_bigtcp::{ device::{Loopback, Medium}, iface::IpIface, - wire::{IpAddress, IpCidr, Ipv4Address}, + wire::{Ipv4Address, Ipv4Cidr}, }; - const LOOPBACK_ADDRESS: IpAddress = { - let ipv4_addr = Ipv4Address::new(127, 0, 0, 1); - IpAddress::Ipv4(ipv4_addr) - }; + const LOOPBACK_ADDRESS: Ipv4Address = Ipv4Address::new(127, 0, 0, 1); const LOOPBACK_ADDRESS_PREFIX_LEN: u8 = 8; // mask: 255.0.0.0 struct Wrapper(Mutex); @@ -91,7 +97,7 @@ fn new_loopback() -> Arc { IpIface::new( Wrapper(Mutex::new(Loopback::new(Medium::Ip))), - IpCidr::new(LOOPBACK_ADDRESS, LOOPBACK_ADDRESS_PREFIX_LEN), + Ipv4Cidr::new(LOOPBACK_ADDRESS, LOOPBACK_ADDRESS_PREFIX_LEN), IfaceExt::new("lo".to_owned()), ) as _ }