diff --git a/Cargo.lock b/Cargo.lock index 8b8a05f9..d471cf8c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "acpi" @@ -127,9 +127,9 @@ dependencies = [ [[package]] name = "defmt" -version = "0.3.5" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8a2d011b2fee29fb7d659b83c43fce9a2cb4df453e16d441a51448e448f3f98" +checksum = "86f6162c53f659f65d00619fe31f14556a6e9f8752ccc4a41bd177ffcf3d6130" dependencies = [ "bitflags 1.3.2", "defmt-macros", @@ -137,22 +137,22 @@ dependencies = [ [[package]] name = "defmt-macros" -version = "0.3.6" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54f0216f6c5acb5ae1a47050a6645024e6edafc2ee32d421955eccfef12ef92e" +checksum = "9d135dd939bad62d7490b0002602d35b358dce5fd9233a709d3c1ef467d4bde6" dependencies = [ "defmt-parser", - "proc-macro-error", + "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.90", ] [[package]] name = "defmt-parser" -version = "0.3.3" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "269924c02afd7f94bc4cecbfa5c379f6ffcf9766b3408fe63d22c728654eccd0" +checksum = "3983b127f13995e68c1e29071e5d115cd96f215ccb5e6812e3728cd6f92653b3" dependencies = [ "thiserror", ] @@ -416,27 +416,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] -name = "proc-macro-error" -version = "1.0.4" +name = "proc-macro-error-attr2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" dependencies = [ - "proc-macro-error-attr", "proc-macro2", "quote", - "syn 1.0.109", - "version_check", ] [[package]] -name = "proc-macro-error-attr" -version = "1.0.4" +name = "proc-macro-error2" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" dependencies = [ + "proc-macro-error-attr2", "proc-macro2", "quote", - "version_check", + "syn 2.0.90", ] [[package]] @@ -447,18 +445,18 @@ checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" [[package]] name = "proc-macro2" -version = "1.0.70" +version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b" +checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.33" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" dependencies = [ "proc-macro2", ] @@ -581,9 +579,9 @@ dependencies = [ [[package]] name = "smoltcp" -version = "0.11.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a1a996951e50b5971a2c8c0fa05a381480d70a933064245c4a223ddc87ccc97" +checksum = "dad095989c1533c1c266d9b1e8d70a1329dd3723c3edac6d03bbd67e7bf6f4bb" dependencies = [ "bitflags 1.3.2", "byteorder", @@ -645,9 +643,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.41" +version = "2.0.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44c8b28c477cc3bf0e7966561e3460130e1255f7a1cf71931075f1c5e7a7e269" +checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31" dependencies = [ "proc-macro2", "quote", @@ -662,22 +660,22 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "thiserror" -version = "1.0.51" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f11c217e1416d6f036b870f14e0413d480dbf28edbee1f877abaf0206af43bb7" +checksum = "2f49a1853cf82743e3b7950f77e0f4d622ca36cf4317cba00c767838bac8d490" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.51" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01742297787513b79cf8e29d1056ede1313e2420b7b3b15d0a768b4921f549df" +checksum = "8381894bb3efe0c4acac3ded651301ceee58a15d47c2e34885ed1908ad667061" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.90", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 4e52496c..5f0c7490 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -36,7 +36,7 @@ rand = { version = "0.8.5", default-features = false } rand_hc = "0.3.1" raw-cpuid = "11.2.0" sha2 = { version = "0.10.8", default-features = false, features = ["force-soft"] } -smoltcp = { version = "0.11.0", default-features = false, features = ["alloc", "medium-ethernet", "socket-tcp", "socket-udp", "socket-dhcpv4", "proto-ipv4", "proto-dhcpv4"] } +smoltcp = { version = "0.12.0", default-features = false, features = ["alloc", "medium-ethernet", "socket-tcp", "socket-udp", "socket-dhcpv4", "proto-ipv4", "proto-dhcpv4"] } spin = "0.9.8" time = { version = "0.2.27", default-features = false } geodate = { version = "0.5.0", default-features = false } diff --git a/src/api/syscall.rs b/src/api/syscall.rs index 9241a569..4d7601a7 100644 --- a/src/api/syscall.rs +++ b/src/api/syscall.rs @@ -4,6 +4,7 @@ use crate::sys::fs::{FileInfo, FileType}; use crate::sys::syscall::number::*; use crate::syscall; +use core::convert::TryInto; use core::convert::TryFrom; use core::sync::atomic::{fence, Ordering}; use smoltcp::wire::{IpAddress, Ipv4Address}; @@ -127,7 +128,9 @@ pub fn poll(list: &[(usize, IO)]) -> Option<(usize, IO)> { } pub fn connect(handle: usize, addr: IpAddress, port: u16) -> Result<(), ()> { - let buf = addr.as_bytes(); + let IpAddress::Ipv4(addr) = addr; // Only IPv4 is supported + let tmp = addr.octets(); + let buf = tmp.as_slice(); let ptr = buf.as_ptr() as usize; let len = buf.len(); let res = unsafe { syscall!(CONNECT, handle, ptr, len, port) } as isize; @@ -148,16 +151,18 @@ pub fn listen(handle: usize, port: u16) -> Result<(), ()> { } pub fn accept(handle: usize) -> Result { - let addr = IpAddress::v4(0, 0, 0, 0); - let buf = addr.as_bytes(); + let addr = Ipv4Address::new(0, 0, 0, 0); + let tmp = addr.octets(); + let buf = tmp.as_slice(); let ptr = buf.as_ptr() as usize; let len = buf.len(); let res = unsafe { syscall!(ACCEPT, handle, ptr, len) } as isize; if res >= 0 { - Ok(IpAddress::from(Ipv4Address::from_bytes(buf))) - } else { - Err(()) + if let Ok(buf) = buf.try_into() { + return Ok(IpAddress::from(Ipv4Address::from_octets(buf))); + } } + Err(()) } pub fn alloc(size: usize, align: usize) -> *mut u8 { diff --git a/src/lib.rs b/src/lib.rs index 62b48321..46b4dced 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,10 +1,11 @@ #![no_std] #![cfg_attr(test, no_main)] -#![feature(vec_pop_if)] #![feature(abi_x86_interrupt)] #![feature(alloc_error_handler)] -#![feature(naked_functions)] #![feature(custom_test_frameworks)] +#![feature(ip_from)] +#![feature(naked_functions)] +#![feature(vec_pop_if)] #![test_runner(crate::test_runner)] #![reexport_test_harness_main = "test_main"] diff --git a/src/sys/net/mod.rs b/src/sys/net/mod.rs index 00cc6854..439a4981 100644 --- a/src/sys/net/mod.rs +++ b/src/sys/net/mod.rs @@ -141,11 +141,11 @@ pub struct RxToken { } impl smoltcp::phy::RxToken for RxToken { - fn consume(mut self, f: F) -> R + fn consume(self, f: F) -> R where - F: FnOnce(&mut [u8]) -> R, + F: FnOnce(&[u8]) -> R, { - f(&mut self.buffer) + f(&self.buffer) } } diff --git a/src/sys/syscall/mod.rs b/src/sys/syscall/mod.rs index 8d0286ef..452cc6fb 100644 --- a/src/sys/syscall/mod.rs +++ b/src/sys/syscall/mod.rs @@ -6,6 +6,7 @@ use crate::sys; use crate::sys::fs::FileInfo; use core::arch::asm; +use core::convert::TryInto; use smoltcp::wire::IpAddress; use smoltcp::wire::Ipv4Address; @@ -104,9 +105,13 @@ pub fn dispatcher( let ptr = sys::process::ptr_from_addr(arg2 as u64); let len = arg3; let buf = unsafe { core::slice::from_raw_parts(ptr, len) }; - let addr = IpAddress::from(Ipv4Address::from_bytes(buf)); - let port = arg4 as u16; - service::connect(handle, addr, port) as usize + if let Ok(buf) = buf.try_into() { + let addr = IpAddress::from(Ipv4Address::from_octets(buf)); + let port = arg4 as u16; + service::connect(handle, addr, port) as usize + } else { + -1 as isize as usize + } } number::LISTEN => { let handle = arg1; @@ -118,8 +123,8 @@ pub fn dispatcher( let ptr = sys::process::ptr_from_addr(arg2 as u64); let len = arg3; let buf = unsafe { core::slice::from_raw_parts_mut(ptr, len) }; - if let Ok(addr) = service::accept(handle) { - buf[0..len].clone_from_slice(addr.as_bytes()); + if let Ok(IpAddress::Ipv4(addr)) = service::accept(handle) { + buf[0..len].clone_from_slice(&addr.octets()); 0 } else { -1 as isize as usize diff --git a/src/usr/host.rs b/src/usr/host.rs index 75d82ade..d7910f3d 100644 --- a/src/usr/host.rs +++ b/src/usr/host.rs @@ -168,11 +168,15 @@ pub fn resolve(name: &str) -> Result { // the last 4 bytes let n = message.datagram.len(); let data = &message.datagram[(n - 4)..]; - let ipv4 = Ipv4Address::from_bytes(data); - if ipv4.is_unspecified() { - Err(ResponseCode::NameError) // FIXME + if let Ok(data) = data.try_into() { + let ipv4 = Ipv4Address::from_octets(data); + if ipv4.is_unspecified() { + Err(ResponseCode::NameError) // FIXME + } else { + Ok(IpAddress::from(ipv4)) + } } else { - Ok(IpAddress::from(ipv4)) + Err(ResponseCode::NameError) // FIXME } } code => Err(code),