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