wasmer_wasix/syscalls/wasix/
port_route_add.rs

1use virtual_net::IpCidr;
2
3use super::*;
4use crate::syscalls::*;
5
6/// ### `port_route_add()`
7/// Adds a new route to the local port
8#[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}