aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorHimbeerserverDE <himbeerserverde@gmail.com>2023-03-30 14:38:24 +0200
committerHimbeerserverDE <himbeerserverde@gmail.com>2023-03-30 14:38:24 +0200
commitb396a3f79c2d2848bfe41fa3898ba251d9655eac (patch)
tree33959a166520bda3d7a87b6b34cbf178c1c0b993 /src
parenta8466eb1dc93f51455ea158821345a1617b7833f (diff)
create vlans
Diffstat (limited to 'src')
-rw-r--r--src/link.rs29
-rw-r--r--src/main.rs28
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"),