network/
lib.rs

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}