use crate::netlink::config::{ApplyResult, NetworkConfig};
use crate::netlink::genl::wireguard::WireguardConfig;
use crate::netlink::namespace::NamespaceSpec;
use crate::netlink::nftables::config::NftablesConfig;
use crate::netlink::{Nftables, Route, Wireguard};
use crate::{Connection, Result};
pub async fn network(cfg: &NetworkConfig) -> Result<ApplyResult> {
network_in(NamespaceSpec::Default, cfg).await
}
pub async fn network_in_namespace(ns: &str, cfg: &NetworkConfig) -> Result<ApplyResult> {
network_in(NamespaceSpec::Named(ns), cfg).await
}
pub async fn network_in(ns: NamespaceSpec<'_>, cfg: &NetworkConfig) -> Result<ApplyResult> {
let conn: Connection<Route> = ns.connection()?;
cfg.apply(&conn).await
}
pub async fn nftables(cfg: &NftablesConfig) -> Result<usize> {
nftables_in(NamespaceSpec::Default, cfg).await
}
pub async fn nftables_in_namespace(ns: &str, cfg: &NftablesConfig) -> Result<usize> {
nftables_in(NamespaceSpec::Named(ns), cfg).await
}
pub async fn nftables_in(ns: NamespaceSpec<'_>, cfg: &NftablesConfig) -> Result<usize> {
let conn: Connection<Nftables> = ns.connection()?;
let diff = cfg.diff(&conn).await?;
diff.apply(&conn).await
}
pub async fn wireguard(
cfg: &WireguardConfig,
) -> Result<crate::netlink::genl::wireguard::WireguardApplyResult> {
wireguard_in(NamespaceSpec::Default, cfg).await
}
pub async fn wireguard_in_namespace(
ns: &str,
cfg: &WireguardConfig,
) -> Result<crate::netlink::genl::wireguard::WireguardApplyResult> {
wireguard_in(NamespaceSpec::Named(ns), cfg).await
}
pub async fn wireguard_in(
ns: NamespaceSpec<'_>,
cfg: &WireguardConfig,
) -> Result<crate::netlink::genl::wireguard::WireguardApplyResult> {
let route: Connection<Route> = ns.connection()?;
cfg.ensure_devices(&route).await?;
let conn: Connection<Wireguard> = ns.connection_async().await?;
cfg.apply(&conn).await
}