wasmer_wasix/syscalls/wasix/
port_route_add.rs1use virtual_net::IpCidr;
2
3use super::*;
4use crate::syscalls::*;
5
6#[instrument(level = "trace", skip_all, fields(cidr = field::Empty, via_router = field::Empty), ret)]
9pub fn port_route_add<M: MemorySize>(
10 mut ctx: FunctionEnvMut<'_, WasiEnv>,
11 cidr: WasmPtr<__wasi_cidr_t, M>,
12 via_router: WasmPtr<__wasi_addr_t, M>,
13 preferred_until: WasmPtr<OptionTimestamp, M>,
14 expires_at: WasmPtr<OptionTimestamp, M>,
15) -> Result<Errno, WasiError> {
16 WasiEnv::do_pending_operations(&mut ctx)?;
17
18 let env = ctx.data();
19 let memory = unsafe { env.memory_view(&ctx) };
20
21 let cidr = wasi_try_ok!(crate::net::read_cidr(&memory, cidr));
22 Span::current().record("cidr", format!("{cidr:?}"));
23
24 let via_router = wasi_try_ok!(crate::net::read_ip(&memory, via_router));
25 Span::current().record("via_router", format!("{via_router:?}"));
26
27 let preferred_until = wasi_try_mem_ok!(preferred_until.read(&memory));
28 let preferred_until = match preferred_until.tag {
29 OptionTag::None => None,
30 OptionTag::Some => Some(Duration::from_nanos(preferred_until.u)),
31 _ => return Ok(Errno::Inval),
32 };
33 let expires_at = wasi_try_mem_ok!(expires_at.read(&memory));
34 let expires_at = match expires_at.tag {
35 OptionTag::None => None,
36 OptionTag::Some => Some(Duration::from_nanos(expires_at.u)),
37 _ => return Ok(Errno::Inval),
38 };
39
40 wasi_try_ok!(port_route_add_internal(
41 &mut ctx,
42 cidr,
43 via_router,
44 preferred_until,
45 expires_at
46 )?);
47
48 #[cfg(feature = "journal")]
49 if ctx.data().enable_journal {
50 JournalEffector::save_port_route_add(
51 &mut ctx,
52 cidr,
53 via_router,
54 preferred_until,
55 expires_at,
56 )
57 .map_err(|err| {
58 tracing::error!("failed to save port_route_add event - {}", err);
59 WasiError::Exit(ExitCode::from(Errno::Fault))
60 })?;
61 }
62
63 Ok(Errno::Success)
64}
65
66pub(crate) fn port_route_add_internal(
67 ctx: &mut FunctionEnvMut<'_, WasiEnv>,
68 cidr: IpCidr,
69 via_router: IpAddr,
70 preferred_until: Option<Duration>,
71 expires_at: Option<Duration>,
72) -> Result<Result<(), Errno>, WasiError> {
73 let env = ctx.data();
74 let net = env.net().clone();
75 wasi_try_ok_ok!(__asyncify(ctx, None, async {
76 net.route_add(cidr, via_router, preferred_until, expires_at)
77 .await
78 .map_err(net_error_into_wasi_err)
79 })?);
80
81 Ok(Ok(()))
82}