From 95378cf9c9996412690ace20905981b7296c1585 Mon Sep 17 00:00:00 2001 From: Michael Birtwell Date: Fri, 22 Apr 2022 10:40:54 +0100 Subject: [PATCH] Centralise all uses of the IPv4 index in net_settings.rs --- artiq/firmware/libboard_misoc/net_settings.rs | 39 ++++++++++++++++++- artiq/firmware/runtime/main.rs | 27 ++----------- artiq/firmware/runtime/sched.rs | 8 ++-- 3 files changed, 44 insertions(+), 30 deletions(-) diff --git a/artiq/firmware/libboard_misoc/net_settings.rs b/artiq/firmware/libboard_misoc/net_settings.rs index 466e1a893..20b204c80 100644 --- a/artiq/firmware/libboard_misoc/net_settings.rs +++ b/artiq/firmware/libboard_misoc/net_settings.rs @@ -1,14 +1,21 @@ use core::fmt; use core::fmt::{Display, Formatter}; use core::str::FromStr; +use smoltcp::iface::{Interface, InterfaceBuilder}; +use smoltcp::phy::Device; -use smoltcp::wire::{EthernetAddress, IpAddress, Ipv4Address}; +use smoltcp::wire::{EthernetAddress, IpAddress, IpCidr, Ipv4Address, Ipv4Cidr}; use config; #[cfg(soc_platform = "kasli")] use i2c_eeprom; +const IPV4_INDEX: usize = 0; +const IPV6_LL_INDEX: usize = 1; +const IPV6_INDEX: usize = 2; +const IP_ADDRESS_STORAGE_SIZE: usize = 3; + pub enum Ipv4AddrConfig { UseDhcp, Static(Ipv4Address), @@ -102,3 +109,33 @@ pub fn get_adresses() -> NetAddresses { ipv6_addr: ipv6_addr } } + +pub trait InterfaceBuilderEx { + fn init_ip_addrs(self, net_addresses: &NetAddresses) -> Self; +} + +impl<'a, DeviceT: for<'d> Device<'d>> InterfaceBuilderEx for InterfaceBuilder<'a, DeviceT> { + fn init_ip_addrs(self, net_addresses: &NetAddresses) -> Self { + let mut storage = [ + IpCidr::new(IpAddress::Ipv4(Ipv4Address::UNSPECIFIED), 0); IP_ADDRESS_STORAGE_SIZE + ]; + if let Ipv4AddrConfig::Static(ipv4) = net_addresses.ipv4_addr { + storage[IPV4_INDEX] = IpCidr::new(IpAddress::Ipv4(ipv4), 0); + } + storage[IPV6_LL_INDEX] = IpCidr::new(net_addresses.ipv6_ll_addr, 0); + if let Some(ipv6) = net_addresses.ipv6_addr { + storage[IPV6_INDEX] = IpCidr::new(ipv6, 0); + } + self.ip_addrs(storage) + } +} + +pub trait InterfaceEx { + fn update_ipv4_addr(&mut self, addr: &Ipv4Cidr); +} + +impl<'a, DeviceT: for<'d> Device<'d>> InterfaceEx for Interface<'a, DeviceT> { + fn update_ipv4_addr(&mut self, addr: &Ipv4Cidr) { + self.update_ip_addrs(|storage| storage[IPV4_INDEX] = IpCidr::Ipv4(*addr)) + } +} diff --git a/artiq/firmware/runtime/main.rs b/artiq/firmware/runtime/main.rs index 01cf89f5c..f1e7e7108 100644 --- a/artiq/firmware/runtime/main.rs +++ b/artiq/firmware/runtime/main.rs @@ -27,12 +27,12 @@ extern crate riscv; use core::cell::RefCell; use core::convert::TryFrom; -use smoltcp::wire::{HardwareAddress, IpAddress, IpCidr, Ipv4Address}; +use smoltcp::wire::HardwareAddress; use board_misoc::{csr, ident, clock, spiflash, config, net_settings, pmp, boot}; #[cfg(has_ethmac)] use board_misoc::ethmac; -use board_misoc::net_settings::{NetAddresses, Ipv4AddrConfig}; +use board_misoc::net_settings::{Ipv4AddrConfig, InterfaceBuilderEx}; #[cfg(has_drtio)] use board_artiq::drtioaux; use board_artiq::drtio_routing; @@ -61,13 +61,6 @@ mod moninj; mod analyzer; mod dhcp; -// Fixed indexes for the IP addresses so that they can be modified with some -// semblance of confidence -pub const IPV4_INDEX: usize = 0; -pub const IPV6_LL_INDEX: usize = 1; -pub const IPV6_INDEX: usize = 2; -const IP_ADDRESS_STORAGE_SIZE: usize = 3; - #[cfg(has_grabber)] fn grabber_thread(io: sched::Io) { loop { @@ -96,20 +89,6 @@ fn setup_log_levels() { } } -pub fn get_ip_addrs(net_addresses: &NetAddresses) -> [IpCidr; IP_ADDRESS_STORAGE_SIZE] { - let mut storage = [ - IpCidr::new(IpAddress::Ipv4(Ipv4Address::UNSPECIFIED), 0); IP_ADDRESS_STORAGE_SIZE - ]; - if let Ipv4AddrConfig::Static(ipv4) = net_addresses.ipv4_addr { - storage[IPV4_INDEX] = IpCidr::new(IpAddress::Ipv4(ipv4), 0); - } - storage[IPV6_LL_INDEX] = IpCidr::new(net_addresses.ipv6_ll_addr, 0); - if let Some(ipv6) = net_addresses.ipv6_addr { - storage[IPV6_INDEX] = IpCidr::new(ipv6, 0); - } - storage -} - fn startup() { clock::init(); info!("ARTIQ runtime starting..."); @@ -172,7 +151,7 @@ fn startup() { }; let interface = smoltcp::iface::InterfaceBuilder::new(net_device, vec![]) .hardware_addr(HardwareAddress::Ethernet(net_addresses.hardware_addr)) - .ip_addrs(get_ip_addrs(&net_addresses)) + .init_ip_addrs(&net_addresses) .neighbor_cache(neighbor_cache) .finalize(); diff --git a/artiq/firmware/runtime/sched.rs b/artiq/firmware/runtime/sched.rs index 860ec5347..a31c6ec43 100644 --- a/artiq/firmware/runtime/sched.rs +++ b/artiq/firmware/runtime/sched.rs @@ -8,7 +8,7 @@ use fringe::OwnedStack; use fringe::generator::{Generator, Yielder, State as GeneratorState}; use smoltcp::time::Duration; use smoltcp::Error as NetworkError; -use smoltcp::wire::{IpEndpoint, Ipv4Cidr, IpCidr}; +use smoltcp::wire::{IpEndpoint, Ipv4Cidr}; use smoltcp::iface::{Interface, SocketHandle}; use io::{Read, Write}; @@ -16,7 +16,7 @@ use board_misoc::clock; use urc::Urc; use board_misoc::ethmac::EthernetDevice; use smoltcp::phy::Tracer; -use IPV4_INDEX; +use board_misoc::net_settings::InterfaceEx; #[derive(Fail, Debug)] pub enum Error { @@ -276,9 +276,7 @@ impl<'a> Io<'a> { } pub fn set_ipv4_address(&self, addr: &Ipv4Cidr) { - self.network.borrow_mut().update_ip_addrs(|addrs| { - addrs.as_mut()[IPV4_INDEX] = IpCidr::Ipv4(*addr); - }) + self.network.borrow_mut().update_ipv4_addr(addr) } }