Skip to main content

network/
lib.rs

1#![no_std]
2
3extern crate alloc;
4
5#[cfg(test)]
6extern crate std;
7
8mod device;
9mod error;
10mod fundamentals;
11mod manager;
12mod socket;
13
14pub use device::*;
15pub use error::*;
16pub use fundamentals::*;
17pub use manager::*;
18pub use socket::*;
19
20#[cfg(test)]
21pub mod tests {
22    use alloc::boxed::Box;
23    use file_system::AccessFlags;
24    use synchronization::{blocking_mutex::raw::CriticalSectionRawMutex, mutex::Mutex};
25    use virtual_file_system::{File, create_default_hierarchy};
26
27    use super::*;
28
29    extern crate abi_definitions;
30
31    drivers_std::memory::instantiate_global_allocator!();
32
33    pub(crate) static TEST_TASK_MANAGER: synchronization::once_lock::OnceLock<
34        &'static task::Manager,
35    > = synchronization::once_lock::OnceLock::new();
36
37    pub(crate) async fn initialize() -> &'static crate::Manager {
38        static INITIALIZE_MUTEX: Mutex<CriticalSectionRawMutex, bool> = Mutex::new(false);
39
40        let mut initialized = INITIALIZE_MUTEX.lock().await;
41
42        if *initialized {
43            return crate::test_manager();
44        }
45
46        *initialized = true;
47
48        static RANDOM_DEVICE: drivers_shared::devices::RandomDevice =
49            drivers_shared::devices::RandomDevice;
50        static TIME_DEVICE: drivers_std::devices::TimeDevice = drivers_std::devices::TimeDevice;
51
52        let task_manager = Box::leak(Box::new(task::Manager::new()));
53        TEST_TASK_MANAGER.get_or_init(|| task_manager);
54        let task = task_manager.get_current_task_identifier().await;
55
56        log::initialize(&drivers_std::log::Logger).unwrap();
57
58        let user_manager = Box::leak(Box::new(users::Manager::new()));
59
60        let time_manager = Box::leak(Box::new(time::Manager::new(&TIME_DEVICE).unwrap()));
61
62        let memory_device = file_system::MemoryDevice::<512>::new_static(10 * 1024 * 1024);
63
64        let root_file_system = little_fs::FileSystem::get_or_format(memory_device, 512).unwrap();
65
66        let virtual_file_system = Box::leak(Box::new(
67            virtual_file_system::initialize(
68                task_manager,
69                user_manager,
70                time_manager,
71                root_file_system,
72            )
73            .unwrap(),
74        ));
75
76        create_default_hierarchy(virtual_file_system, task)
77            .await
78            .unwrap();
79
80        let network_manager = crate::TEST_MANAGER.get_or_init(|| {
81            crate::Manager::new(
82                task_manager,
83                virtual_file_system,
84                time_manager,
85                &RANDOM_DEVICE,
86            )
87        });
88
89        let (device, controler_device) = crate::create_loopback_device();
90
91        let spawner = drivers_std::executor::new_thread_executor(task_manager).await;
92
93        network_manager
94            .mount_interface(task, "loopback0", device, controler_device, Some(spawner))
95            .await
96            .unwrap();
97
98        let mut file = File::open(
99            virtual_file_system,
100            task,
101            "/devices/network/loopback0",
102            AccessFlags::Write.into(),
103        )
104        .await
105        .unwrap();
106
107        file.control(ADD_IP_ADDRESS, &IpCidr::new_ipv4([127, 0, 0, 1], 8))
108            .await
109            .unwrap();
110
111        file.close(virtual_file_system).await.unwrap();
112
113        network_manager
114    }
115
116    pub(crate) fn task_manager() -> &'static task::Manager {
117        crate::tests::TEST_TASK_MANAGER
118            .try_get()
119            .expect("Network test task manager not initialized")
120    }
121}