diff options
author | HimbeerserverDE <himbeerserverde@gmail.com> | 2023-05-07 11:05:57 +0200 |
---|---|---|
committer | HimbeerserverDE <himbeerserverde@gmail.com> | 2023-05-07 11:05:57 +0200 |
commit | 6549069f27997bf8fd9ec7d3db33e310049f74ee (patch) | |
tree | 62d0cf18047a97f91e9bede18aac5b4596d4708c | |
parent | fddae6414497ff7fac59d7fa20f3e41975cd1b6f (diff) |
configure the lan side of things
-rw-r--r-- | src/main.rs | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/src/main.rs b/src/main.rs index 96cf1b7..c3acdb9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -213,6 +213,8 @@ fn main() -> Result<()> { configure_endpoint(&config, local.clone()); configure_tunnel(&config); + configure_lan(&config); + configure_vlans(&config); thread::spawn(move || match tun2he(tun2, local.clone(), &config.serv) { Ok(_) => {} @@ -291,3 +293,57 @@ fn configure_he6in4(config: &UsableConfig) -> Result<()> { Ok(()) } + +fn configure_lan(config: &UsableConfig) { + match configure_eth0(config) { + Ok(_) => {} + Err(e) => println!("[6in4] can't configure eth0: {:?}", e), + } +} + +fn configure_eth0(config: &UsableConfig) -> Result<()> { + let addr_dbg: Ipv6Addr = (u128::from_be_bytes(config.rt64.trunc().addr().octets()) | 1).into(); + let addr: Ipv6Addr = (u128::from_be_bytes(config.rt48.trunc().addr().octets()) | 1).into(); + + println!("[6in4] wait for eth0"); + link::wait_exists("eth0".into())?; + + addr::add("eth0".into(), addr_dbg.into(), 64)?; + addr::add("eth0".into(), addr.into(), 64)?; + + println!("[6in4] configure eth0 ({}/64, dbg {}/64)", addr, addr_dbg); + Ok(()) +} + +fn configure_vlans(config: &UsableConfig) { + match configure_eth0_vlans(config) { + Ok(_) => {} + Err(e) => println!("[6in4] can't configure vlans: {:?}", e), + } +} + +fn configure_eth0_vlans(config: &UsableConfig) -> Result<()> { + let zones = ["trusted", "untrusted", "isolated", "exposed"]; + + for (i, zone) in zones.iter().enumerate() { + let vlan_id = 10 * (i + 1); + let vlan_name = format!("eth0.{}", vlan_id); + + let mut octets = config.rt48.trunc().addr().octets(); + NE::write_u16(&mut octets[6..8], vlan_id as u16); + + let vlan_addr = Ipv6Addr::from(u128::from_be_bytes(octets) | 1); + + println!("[6in4] wait for {}", vlan_name); + link::wait_exists(vlan_name.clone())?; + + addr::add(vlan_name.clone(), vlan_addr.into(), 64)?; + + println!( + "[6in4] configure {} ({}/64) zone {}", + vlan_name, vlan_addr, zone + ); + } + + Ok(()) +} |