aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHimbeerserverDE <himbeerserverde@gmail.com>2023-05-07 11:05:57 +0200
committerHimbeerserverDE <himbeerserverde@gmail.com>2023-05-07 11:05:57 +0200
commit6549069f27997bf8fd9ec7d3db33e310049f74ee (patch)
tree62d0cf18047a97f91e9bede18aac5b4596d4708c
parentfddae6414497ff7fac59d7fa20f3e41975cd1b6f (diff)
configure the lan side of things
-rw-r--r--src/main.rs56
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(())
+}