forked from M-Labs/artiq
runtime: refactor network settings
This commit is contained in:
parent
6d5dcb4211
commit
d26d80410e
@ -28,7 +28,7 @@ extern crate proto_artiq;
|
|||||||
|
|
||||||
use core::cell::RefCell;
|
use core::cell::RefCell;
|
||||||
use core::convert::TryFrom;
|
use core::convert::TryFrom;
|
||||||
use smoltcp::wire::{EthernetAddress, IpAddress, IpCidr};
|
use smoltcp::wire::IpCidr;
|
||||||
|
|
||||||
use board_misoc::{csr, irq, ident, clock, boot, config};
|
use board_misoc::{csr, irq, ident, clock, boot, config};
|
||||||
#[cfg(has_ethmac)]
|
#[cfg(has_ethmac)]
|
||||||
@ -41,6 +41,8 @@ use proto_artiq::{mgmt_proto, moninj_proto, rpc_proto, session_proto, kernel_pro
|
|||||||
#[cfg(has_rtio_analyzer)]
|
#[cfg(has_rtio_analyzer)]
|
||||||
use proto_artiq::analyzer_proto;
|
use proto_artiq::analyzer_proto;
|
||||||
|
|
||||||
|
mod net_settings;
|
||||||
|
|
||||||
mod rtio_clocking;
|
mod rtio_clocking;
|
||||||
mod rtio_mgt;
|
mod rtio_mgt;
|
||||||
|
|
||||||
@ -124,89 +126,6 @@ fn startup() {
|
|||||||
sayma_hw_init();
|
sayma_hw_init();
|
||||||
rtio_clocking::init();
|
rtio_clocking::init();
|
||||||
|
|
||||||
let hardware_addr;
|
|
||||||
match config::read_str("mac", |r| r.map(|s| s.parse())) {
|
|
||||||
Ok(Ok(addr)) => {
|
|
||||||
hardware_addr = addr;
|
|
||||||
info!("using MAC address {}", hardware_addr);
|
|
||||||
}
|
|
||||||
_ => {
|
|
||||||
#[cfg(soc_platform = "kasli")]
|
|
||||||
{
|
|
||||||
let eeprom = board_artiq::i2c_eeprom::EEPROM::kasli_eeprom();
|
|
||||||
hardware_addr =
|
|
||||||
eeprom.read_eui48()
|
|
||||||
.map(|addr_buf| {
|
|
||||||
let hardware_addr = EthernetAddress(addr_buf);
|
|
||||||
info!("using MAC address {} from EEPROM", hardware_addr);
|
|
||||||
hardware_addr
|
|
||||||
})
|
|
||||||
.unwrap_or_else(|e| {
|
|
||||||
error!("failed to read MAC address from EEPROM: {}", e);
|
|
||||||
let hardware_addr = EthernetAddress([0x02, 0x00, 0x00, 0x00, 0x00, 0x21]);
|
|
||||||
warn!("using default MAC address {}; consider changing it", hardware_addr);
|
|
||||||
hardware_addr
|
|
||||||
});
|
|
||||||
}
|
|
||||||
#[cfg(soc_platform = "sayma_amc")]
|
|
||||||
{
|
|
||||||
hardware_addr = EthernetAddress([0x02, 0x00, 0x00, 0x00, 0x00, 0x11]);
|
|
||||||
warn!("using default MAC address {}; consider changing it", hardware_addr);
|
|
||||||
}
|
|
||||||
#[cfg(soc_platform = "metlino")]
|
|
||||||
{
|
|
||||||
hardware_addr = EthernetAddress([0x02, 0x00, 0x00, 0x00, 0x00, 0x19]);
|
|
||||||
warn!("using default MAC address {}; consider changing it", hardware_addr);
|
|
||||||
}
|
|
||||||
#[cfg(soc_platform = "kc705")]
|
|
||||||
{
|
|
||||||
hardware_addr = EthernetAddress([0x02, 0x00, 0x00, 0x00, 0x00, 0x01]);
|
|
||||||
warn!("using default MAC address {}; consider changing it", hardware_addr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let protocol_addr;
|
|
||||||
match config::read_str("ip", |r| r.map(|s| s.parse())) {
|
|
||||||
Ok(Ok(addr)) => {
|
|
||||||
protocol_addr = addr;
|
|
||||||
info!("using IPv4 address {}", protocol_addr);
|
|
||||||
}
|
|
||||||
_ => {
|
|
||||||
#[cfg(soc_platform = "kasli")]
|
|
||||||
{
|
|
||||||
protocol_addr = IpAddress::v4(192, 168, 1, 70);
|
|
||||||
}
|
|
||||||
#[cfg(soc_platform = "sayma_amc")]
|
|
||||||
{
|
|
||||||
protocol_addr = IpAddress::v4(192, 168, 1, 60);
|
|
||||||
}
|
|
||||||
#[cfg(soc_platform = "metlino")]
|
|
||||||
{
|
|
||||||
protocol_addr = IpAddress::v4(192, 168, 1, 65);
|
|
||||||
}
|
|
||||||
#[cfg(soc_platform = "kc705")]
|
|
||||||
{
|
|
||||||
protocol_addr = IpAddress::v4(192, 168, 1, 50);
|
|
||||||
}
|
|
||||||
info!("using default IPv4 address {}", protocol_addr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
let protocol_addr6_ll = IpAddress::v6(
|
|
||||||
0xfe80, 0x0000, 0x0000, 0x0000,
|
|
||||||
(((hardware_addr.0[0] ^ 0x02) as u16) << 8) | (hardware_addr.0[1] as u16),
|
|
||||||
((hardware_addr.0[2] as u16) << 8) | 0x00ff,
|
|
||||||
0xfe00 | (hardware_addr.0[3] as u16),
|
|
||||||
((hardware_addr.0[4] as u16) << 8) | (hardware_addr.0[5] as u16));
|
|
||||||
info!("using IPv6 link-local address {}", protocol_addr6_ll);
|
|
||||||
let protocol_addr6 = match config::read_str("ip6", |r| r.map(|s| s.parse())) {
|
|
||||||
Ok(Ok(addr)) => {
|
|
||||||
info!("using IPv6 configured address {}", addr);
|
|
||||||
Some(addr)
|
|
||||||
}
|
|
||||||
_ => None
|
|
||||||
};
|
|
||||||
|
|
||||||
let mut net_device = unsafe { ethmac::EthernetDevice::new() };
|
let mut net_device = unsafe { ethmac::EthernetDevice::new() };
|
||||||
net_device.reset_phy_if_any();
|
net_device.reset_phy_if_any();
|
||||||
|
|
||||||
@ -232,26 +151,27 @@ fn startup() {
|
|||||||
|
|
||||||
let neighbor_cache =
|
let neighbor_cache =
|
||||||
smoltcp::iface::NeighborCache::new(alloc::btree_map::BTreeMap::new());
|
smoltcp::iface::NeighborCache::new(alloc::btree_map::BTreeMap::new());
|
||||||
let mut interface = match protocol_addr6 {
|
let net_addresses = net_settings::get_adresses();
|
||||||
|
let mut interface = match net_addresses.ipv6_addr {
|
||||||
Some(addr) => {
|
Some(addr) => {
|
||||||
let ip_addrs = [
|
let ip_addrs = [
|
||||||
IpCidr::new(protocol_addr, 0),
|
IpCidr::new(net_addresses.ipv4_addr, 0),
|
||||||
IpCidr::new(protocol_addr6_ll, 0),
|
IpCidr::new(net_addresses.ipv6_ll_addr, 0),
|
||||||
IpCidr::new(addr, 0)
|
IpCidr::new(addr, 0)
|
||||||
];
|
];
|
||||||
smoltcp::iface::EthernetInterfaceBuilder::new(net_device)
|
smoltcp::iface::EthernetInterfaceBuilder::new(net_device)
|
||||||
.ethernet_addr(hardware_addr)
|
.ethernet_addr(net_addresses.hardware_addr)
|
||||||
.ip_addrs(ip_addrs)
|
.ip_addrs(ip_addrs)
|
||||||
.neighbor_cache(neighbor_cache)
|
.neighbor_cache(neighbor_cache)
|
||||||
.finalize()
|
.finalize()
|
||||||
}
|
}
|
||||||
None => {
|
None => {
|
||||||
let ip_addrs = [
|
let ip_addrs = [
|
||||||
IpCidr::new(protocol_addr, 0),
|
IpCidr::new(net_addresses.ipv4_addr, 0),
|
||||||
IpCidr::new(protocol_addr6_ll, 0)
|
IpCidr::new(net_addresses.ipv6_ll_addr, 0)
|
||||||
];
|
];
|
||||||
smoltcp::iface::EthernetInterfaceBuilder::new(net_device)
|
smoltcp::iface::EthernetInterfaceBuilder::new(net_device)
|
||||||
.ethernet_addr(hardware_addr)
|
.ethernet_addr(net_addresses.hardware_addr)
|
||||||
.ip_addrs(ip_addrs)
|
.ip_addrs(ip_addrs)
|
||||||
.neighbor_cache(neighbor_cache)
|
.neighbor_cache(neighbor_cache)
|
||||||
.finalize()
|
.finalize()
|
||||||
|
110
artiq/firmware/runtime/net_settings.rs
Normal file
110
artiq/firmware/runtime/net_settings.rs
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
use smoltcp::wire::{EthernetAddress, IpAddress};
|
||||||
|
|
||||||
|
use board_misoc::config;
|
||||||
|
#[cfg(soc_platform = "kasli")]
|
||||||
|
use board_artiq::i2c_eeprom;
|
||||||
|
|
||||||
|
|
||||||
|
pub struct NetAddresses {
|
||||||
|
pub hardware_addr: EthernetAddress,
|
||||||
|
pub ipv4_addr: IpAddress,
|
||||||
|
pub ipv6_ll_addr: IpAddress,
|
||||||
|
pub ipv6_addr: Option<IpAddress>
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_adresses() -> NetAddresses {
|
||||||
|
let hardware_addr;
|
||||||
|
match config::read_str("mac", |r| r.map(|s| s.parse())) {
|
||||||
|
Ok(Ok(addr)) => {
|
||||||
|
hardware_addr = addr;
|
||||||
|
info!("using MAC address {}", hardware_addr);
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
#[cfg(soc_platform = "kasli")]
|
||||||
|
{
|
||||||
|
let eeprom = i2c_eeprom::EEPROM::kasli_eeprom();
|
||||||
|
hardware_addr =
|
||||||
|
eeprom.read_eui48()
|
||||||
|
.map(|addr_buf| {
|
||||||
|
let hardware_addr = EthernetAddress(addr_buf);
|
||||||
|
info!("using MAC address {} from EEPROM", hardware_addr);
|
||||||
|
hardware_addr
|
||||||
|
})
|
||||||
|
.unwrap_or_else(|e| {
|
||||||
|
error!("failed to read MAC address from EEPROM: {}", e);
|
||||||
|
let hardware_addr = EthernetAddress([0x02, 0x00, 0x00, 0x00, 0x00, 0x21]);
|
||||||
|
warn!("using default MAC address {}; consider changing it", hardware_addr);
|
||||||
|
hardware_addr
|
||||||
|
});
|
||||||
|
}
|
||||||
|
#[cfg(soc_platform = "sayma_amc")]
|
||||||
|
{
|
||||||
|
hardware_addr = EthernetAddress([0x02, 0x00, 0x00, 0x00, 0x00, 0x11]);
|
||||||
|
warn!("using default MAC address {}; consider changing it", hardware_addr);
|
||||||
|
}
|
||||||
|
#[cfg(soc_platform = "metlino")]
|
||||||
|
{
|
||||||
|
hardware_addr = EthernetAddress([0x02, 0x00, 0x00, 0x00, 0x00, 0x19]);
|
||||||
|
warn!("using default MAC address {}; consider changing it", hardware_addr);
|
||||||
|
}
|
||||||
|
#[cfg(soc_platform = "kc705")]
|
||||||
|
{
|
||||||
|
hardware_addr = EthernetAddress([0x02, 0x00, 0x00, 0x00, 0x00, 0x01]);
|
||||||
|
warn!("using default MAC address {}; consider changing it", hardware_addr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let ipv4_addr;
|
||||||
|
match config::read_str("ip", |r| r.map(|s| s.parse())) {
|
||||||
|
Ok(Ok(addr)) => {
|
||||||
|
ipv4_addr = addr;
|
||||||
|
info!("using IPv4 address {}", ipv4_addr);
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
#[cfg(soc_platform = "kasli")]
|
||||||
|
{
|
||||||
|
ipv4_addr = IpAddress::v4(192, 168, 1, 70);
|
||||||
|
}
|
||||||
|
#[cfg(soc_platform = "sayma_amc")]
|
||||||
|
{
|
||||||
|
ipv4_addr = IpAddress::v4(192, 168, 1, 60);
|
||||||
|
}
|
||||||
|
#[cfg(soc_platform = "metlino")]
|
||||||
|
{
|
||||||
|
ipv4_addr = IpAddress::v4(192, 168, 1, 65);
|
||||||
|
}
|
||||||
|
#[cfg(soc_platform = "kc705")]
|
||||||
|
{
|
||||||
|
ipv4_addr = IpAddress::v4(192, 168, 1, 50);
|
||||||
|
}
|
||||||
|
info!("using default IPv4 address {}", ipv4_addr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let ipv6_ll_addr = IpAddress::v6(
|
||||||
|
0xfe80, 0x0000, 0x0000, 0x0000,
|
||||||
|
(((hardware_addr.0[0] ^ 0x02) as u16) << 8) | (hardware_addr.0[1] as u16),
|
||||||
|
((hardware_addr.0[2] as u16) << 8) | 0x00ff,
|
||||||
|
0xfe00 | (hardware_addr.0[3] as u16),
|
||||||
|
((hardware_addr.0[4] as u16) << 8) | (hardware_addr.0[5] as u16));
|
||||||
|
info!("using IPv6 link-local address {}", ipv6_ll_addr);
|
||||||
|
|
||||||
|
let ipv6_addr = match config::read_str("ip6", |r| r.map(|s| s.parse())) {
|
||||||
|
Ok(Ok(addr)) => {
|
||||||
|
info!("using IPv6 configured address {}", addr);
|
||||||
|
Some(addr)
|
||||||
|
},
|
||||||
|
_ => {
|
||||||
|
info!("no IPv6 configured address");
|
||||||
|
None
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
NetAddresses {
|
||||||
|
hardware_addr: hardware_addr,
|
||||||
|
ipv4_addr: ipv4_addr,
|
||||||
|
ipv6_ll_addr: ipv6_ll_addr,
|
||||||
|
ipv6_addr: ipv6_addr
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user