diff options
author | HimbeerserverDE <himbeerserverde@gmail.com> | 2023-03-30 14:38:24 +0200 |
---|---|---|
committer | HimbeerserverDE <himbeerserverde@gmail.com> | 2023-03-30 14:38:24 +0200 |
commit | b396a3f79c2d2848bfe41fa3898ba251d9655eac (patch) | |
tree | 33959a166520bda3d7a87b6b34cbf178c1c0b993 /src | |
parent | a8466eb1dc93f51455ea158821345a1617b7833f (diff) |
create vlans
Diffstat (limited to 'src')
-rw-r--r-- | src/link.rs | 29 | ||||
-rw-r--r-- | src/main.rs | 28 |
2 files changed, 56 insertions, 1 deletions
diff --git a/src/link.rs b/src/link.rs index 6e277a3..ae43eac 100644 --- a/src/link.rs +++ b/src/link.rs @@ -86,3 +86,32 @@ async fn do_set_mtu(link: String, mtu: u32) -> Result<()> { pub fn set_mtu(link: String, mtu: u32) -> Result<()> { Runtime::new()?.block_on(do_set_mtu(link, mtu)) } + +async fn do_add_vlan(link: String, parent: String, vlan_id: u16) -> Result<()> { + let (conn, handle, _) = rtnetlink::new_connection()?; + tokio::spawn(conn); + + let parent = handle + .link() + .get() + .match_name(parent.clone()) + .execute() + .try_next() + .await? + .ok_or(Error::LinkNotFound(parent))?; + + let parent_id = parent.header.index; + + handle + .link() + .add() + .vlan(link, parent_id, vlan_id) + .execute() + .await?; + + Ok(()) +} + +pub fn add_vlan(link: String, parent: String, vlan_id: u16) -> Result<()> { + Runtime::new()?.block_on(do_add_vlan(link, parent, vlan_id)) +} diff --git a/src/main.rs b/src/main.rs index 87ce079..dec1e18 100644 --- a/src/main.rs +++ b/src/main.rs @@ -20,7 +20,15 @@ fn main() -> Result<()> { match configure_eth0() { Ok(_) => println!("[netlinkd] configure eth0 statically (10.128.0.254/24)"), Err(e) => { - println!("[netlinkd] can't configure eth0: {:?}", e); + println!("[netlinkd] can't configure eth0: {}", e); + return Err(e); + } + } + + match setup_vlans("eth0") { + Ok(_) => println!("[netlinkd] setup vlans"), + Err(e) => { + println!("[netlinkd] can't setup vlans: {}", e); return Err(e); } } @@ -60,6 +68,24 @@ fn configure_eth0() -> Result<()> { Ok(()) } +fn setup_vlans(base: &str) -> Result<()> { + let zones = ["trusted", "untrusted", "isolated", "exposed"]; + + for (i, zone) in zones.iter().enumerate() { + let vlan_id = 10 * (i + 1); + let vlan_name = format!("{}.{}", base, vlan_id); + let vlan_addr = IpAddr::V4(Ipv4Addr::new(10, 128, vlan_id as u8, 254)); + + link::add_vlan(vlan_name.clone(), base.to_owned(), vlan_id as u16)?; + addr::add(vlan_name.clone(), vlan_addr, 24)?; + link::up(vlan_name.clone())?; + + println!("[netlinkd] configure {} zone {}", vlan_name, zone); + } + + Ok(()) +} + fn configure_wan() { match configure_rsppp0() { Ok(_) => println!("[netlinkd] configure rsppp0 with pppoe data"), |