commit 62cead3fb727bb5747eac8cb99a297f7d2c5d505 Author: Alex Denes Date: Wed Nov 6 12:58:11 2024 +0000 Initial commit diff --git a/dongguan.china/main.go b/dongguan.china/main.go new file mode 100644 index 0000000..3f29c27 --- /dev/null +++ b/dongguan.china/main.go @@ -0,0 +1,96 @@ +package main + +import ( + "fmt" + "log" + "os" + + "git.redxen.eu/nnd/s6-netdev" +) + +func main() { + var ( + err error + l = log.New(os.Stderr, "s6-netdev: ", log.Ltime|log.Lshortfile|log.Lmsgprefix) + ifs = make(s6netdev.IfMap) + ) + t := s6netdev.S6NewTree() + + // Loopback + ifs.AddIf(&s6netdev.Iface{ + Name: "lo", + Type: &s6netdev.NetdevIfTypes.Loopback, + }) + + // Physical interfaces + for _, v := range []string{"p1s0", "p11s0"} { + ifs.AddIf(&s6netdev.Iface{ + Name: fmt.Sprintf("en%s", v), + Type: &s6netdev.NetdevIfTypes.Phys, + }) + } + + // Bridge interfaces + ifs.AddIf(&s6netdev.Iface{ + Name: "br-home", + Type: &s6netdev.NetdevIfTypes.Bridge, + DHCP: s6netdev.DHCP_IP{V4: true}, + Properties: []s6netdev.Property{ + {Key: "stp_state", Value: "0", Default: "0"}, + {Key: "mcast_snooping", Value: "0", Default: "1"}, + }, + Sysctls: s6netdev.Sysctl_IP{ + // No IPv6 autoconf + V6: []s6netdev.Property{ + {Key: "accept_ra", Value: "0", Default: "0"}, + }, + }, + }) + + ifs.AddIf(&s6netdev.Iface{ + Name: "br-main", + Type: &s6netdev.NetdevIfTypes.Bridge, + Properties: []s6netdev.Property{ + {Key: "stp_state", Value: "0", Default: "0"}, + {Key: "mcast_snooping", Value: "0", Default: "1"}, + }, + }) + + for _, m := range []struct { + Master string + Slaves []string + }{ + { + Master: "br-main", + Slaves: []string{ + "enp1s0", + }, + }, + { + Master: "br-home", + Slaves: []string{ + "enp11s0", + }, + }, + } { + master := ifs[m.Master] + for _, slave := range m.Slaves { + master.Slaves = append(master.Slaves, ifs[slave]) + } + ifs[m.Master] = master + } + + for _, v := range ifs { + t.Services(*v) + } + + for _, v := range t.S6Services() { + if s6netdev.NetdevIsDummy(v.Name) { + continue + } + l.Printf("Commiting %s\n", v.Name) + if err = t.S6CommitService(v); err != nil { + l.Fatalf("Failed to commit %s, %s\n", v.Name, err) + } + } +} diff --git a/generic/main.go b/generic/main.go new file mode 100644 index 0000000..d380645 --- /dev/null +++ b/generic/main.go @@ -0,0 +1,72 @@ +package main + +import ( + "log" + "os" + + "git.redxen.eu/nnd/s6-netdev" +) + +func main() { + var ( + err error + l = log.New(os.Stderr, "s6-netdev: ", log.Ltime|log.Lshortfile|log.Lmsgprefix) + ifs = make(s6netdev.IfMap) + ) + t := s6netdev.S6NewTree() + + // Loopback + ifs.AddIf(&s6netdev.Iface{ + Name: "lo", + Type: &s6netdev.NetdevIfTypes.Loopback, + }) + + // Physical interfaces + ifs.AddIf(&s6netdev.Iface{ + Name: "eth0", + Type: &s6netdev.NetdevIfTypes.Phys, + }) + + // Bridge interfaces + ifs.AddIf(&s6netdev.Iface{ + Name: "br0", + Type: &s6netdev.NetdevIfTypes.Bridge, + DHCP: s6netdev.DHCP_IP{V4: true}, + Properties: []s6netdev.Property{ + {Key: "stp_state", Value: "1", Default: "0"}, + {Key: "mcast_snooping", Value: "0", Default: "1"}, + }, + }) + + for _, m := range []struct { + Master string + Slaves []string + }{ + { + Master: "br0", + Slaves: []string{ + "eth0", + }, + }, + } { + master := ifs[m.Master] + for _, slave := range m.Slaves { + master.Slaves = append(master.Slaves, ifs[slave]) + } + ifs[m.Master] = master + } + + for _, v := range ifs { + t.Services(*v) + } + + for _, v := range t.S6Services() { + if s6netdev.NetdevIsDummy(v.Name) { + continue + } + l.Printf("Commiting %s\n", v.Name) + if err = t.S6CommitService(v); err != nil { + l.Fatalf("Failed to commit %s, %s\n", v.Name, err) + } + } +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..2dda423 --- /dev/null +++ b/go.mod @@ -0,0 +1,5 @@ +module git.redxen.eu/caskd/s6-netdev + +go 1.22.8 + +require git.redxen.eu/nnd/s6-netdev v0.0.0-20241106103743-03b649623f4e diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..c17ace6 --- /dev/null +++ b/go.sum @@ -0,0 +1,2 @@ +git.redxen.eu/nnd/s6-netdev v0.0.0-20241106103743-03b649623f4e h1:t4/qeNtyQNYFcWQMw7akxafvWJT8+8yErqNiu/Y/1/o= +git.redxen.eu/nnd/s6-netdev v0.0.0-20241106103743-03b649623f4e/go.mod h1:3P2jgoez/bos+RdMFoDCs63PlCKFw1POQz/TfE1dq5g= diff --git a/izmaylovo.russia/main.go b/izmaylovo.russia/main.go new file mode 100644 index 0000000..aa45b52 --- /dev/null +++ b/izmaylovo.russia/main.go @@ -0,0 +1,233 @@ +package main + +import ( + "fmt" + "log" + "net/netip" + "os" + + "git.redxen.eu/nnd/s6-netdev" +) + +func main() { + var ( + err error + l = log.New(os.Stderr, "s6-netdev: ", log.Ltime|log.Lshortfile|log.Lmsgprefix) + ifs = make(s6netdev.IfMap) + ) + t := s6netdev.S6NewTree() + + // Loopback + ifs.AddIf(&s6netdev.Iface{ + Name: "lo", + Type: &s6netdev.NetdevIfTypes.Loopback, + }) + + // VRFs + ifs.AddIf(&s6netdev.Iface{ + Name: "vrf-phys", + Type: &s6netdev.NetdevIfTypes.Vrf, + Table: 10, + }) + ifs.AddIf(&s6netdev.Iface{ + Name: "vrf-b00b", + Type: &s6netdev.NetdevIfTypes.Vrf, + Table: 20, + }) + + // Physical interfaces + for _, v := range []string{"p4s0f0", "p4s0f1", "p2s0f0", "p2s0f1", "p2s0f2", "p2s0f3"} { + ifs.AddIf(&s6netdev.Iface{ + Name: fmt.Sprintf("en%s", v), + Type: &s6netdev.NetdevIfTypes.Phys, + }) + } + + // VLAN Interfaces + ifs.AddIf(&s6netdev.Iface{ + Name: fmt.Sprintf("phys.%d", 66), + Type: &s6netdev.NetdevIfTypes.Vlan, + VlanId: s6netdev.VLAN(66), + Addresses: []netip.Prefix{ + netip.MustParsePrefix("2a04:5b81:2060:b00b:921b:eff:fee3:9e84/64"), + }, + Routes: []s6netdev.Route{ + { + Net: netip.MustParsePrefix("2a04:5b81:2060:b00b::/64"), + Via: netip.MustParseAddr("fe80::ff:fe00:b00b"), + Metric: 128, + }, + }, + // Disable autoconf, we statically assign it to have it early + Sysctls: s6netdev.Sysctl_IP{ + V6: []s6netdev.Property{ + {Key: "autoconf", Value: "0", Default: "1"}, + }, + }, + }) + + // Wireguard interfaces + ifs.AddIf(&s6netdev.Iface{ + Name: "wg-tunnel", + Type: &s6netdev.NetdevIfTypes.Wireguard, + Addresses: []netip.Prefix{ + netip.MustParsePrefix("172.22.12.7/32"), + netip.MustParsePrefix("fd42:42:42::2:7/128"), + }, + Routes: []s6netdev.Route{ + {Net: netip.MustParsePrefix("172.22.12.0/24")}, + {Net: netip.MustParsePrefix("fd42:42:42::2:0/120")}, + }, + }) + + // Bridge interfaces + ifs.AddIf(&s6netdev.Iface{ + Name: "phys", + Type: &s6netdev.NetdevIfTypes.Bridge, + Properties: []s6netdev.Property{ + {Key: "priority", Value: "16384", Default: "32768"}, + {Key: "stp_state", Value: "1", Default: "0"}, + {Key: "mcast_snooping", Value: "0", Default: "1"}, + }, + Sysctls: s6netdev.Sysctl_IP{ + V6: []s6netdev.Property{ + {Key: "forwarding", Value: "0", Default: "0"}, + {Key: "accept_ra", Value: "0", Default: "1"}, + }, + }, + }) + + // Currently there exists no mechanism to depend routes on the addresses, these are manual deps + phys_addr_v4 := t.NetdevIfaceAddr(*ifs["phys"], netip.MustParsePrefix("10.24.0.10/24")) + phys_defrt_v4_vrf := t.NetdevRoute(*ifs["phys"], + s6netdev.Route{ + Default: true, + IPver: 4, + Vrf: ifs["vrf-phys"], + Via: netip.MustParseAddr("10.24.0.1"), + Metric: 1024, + }, + ) + phys_defrt_v4_vrf.Children = append(phys_defrt_v4_vrf.Children, phys_addr_v4) + phys_defrt_v4_main := t.NetdevRoute(*ifs["phys"], + s6netdev.Route{ + Default: true, + IPver: 4, + Via: netip.MustParseAddr("10.24.0.1"), + Metric: 1024, + }, + ) + phys_defrt_v4_main.Children = append(phys_defrt_v4_main.Children, phys_addr_v4) + + phys_addr_v6 := t.NetdevIfaceAddr(*ifs["phys"], netip.MustParsePrefix("2a02:810d:95bf:f999:921b:eff:fee3:9e84/64")) + phys_defrt_v6_vrf := t.NetdevRoute(*ifs["phys"], + s6netdev.Route{ + Default: true, + IPver: 6, + Vrf: ifs["vrf-phys"], + Via: netip.MustParseAddr("fe80::2e91:abff:fe90:9bb5"), + Metric: 1024, + }, + ) + phys_defrt_v6_vrf.Children = append(phys_defrt_v6_vrf.Children, phys_addr_v6) + phys_defrt_v6_main := t.NetdevRoute(*ifs["phys"], + s6netdev.Route{ + Default: true, + IPver: 6, + Via: netip.MustParseAddr("fe80::2e91:abff:fe90:9bb5"), + Metric: 1024, + }, + ) + phys_defrt_v6_main.Children = append(phys_defrt_v6_main.Children, phys_addr_v6) + + // Private Bridges + for _, name := range []string{ + "b00b", + "d00d", + "f33d", + "dn42", + } { + ifs.AddIf(&s6netdev.Iface{ + Name: fmt.Sprintf("virbr-%s", name), + Type: &s6netdev.NetdevIfTypes.Bridge, + Properties: []s6netdev.Property{ + {Key: "stp_state", Value: "1", Default: "0"}, + {Key: "mcast_snooping", Value: "0", Default: "1"}, + }, + Sysctls: s6netdev.Sysctl_IP{ + V6: []s6netdev.Property{ + {Key: "forwarding", Value: "0", Default: "0"}, + {Key: "accept_ra", Value: "0", Default: "1"}, + }, + }, + }) + } + + for _, m := range []struct { + Master string + Slaves []string + }{ + { + Master: "vrf-b00b", + Slaves: []string{ + "phys.66", + }, + }, + { + Master: "vrf-phys", + Slaves: []string{ + "phys", + }, + }, + { + Master: "phys", + Slaves: []string{ + "enp4s0f0", + "enp4s0f1", + "enp2s0f0", + "enp2s0f1", + "enp2s0f2", + "enp2s0f3", + }, + }, + } { + master := ifs[m.Master] + for _, slave := range m.Slaves { + master.Slaves = append(master.Slaves, ifs[slave]) + } + ifs[m.Master] = master + } + + // Parent of VLANs + ifs[fmt.Sprintf("phys.%d", 66)].Parent = ifs["phys"] + + // Unreachable routes + for _, vrf := range []string{"vrf-phys", "vrf-b00b"} { + // TODO: iproute2 inconsistency for ipv4? + for _, ver := range []int{6} { + ifs["lo"].Routes = append(ifs["lo"].Routes, + s6netdev.Route{ + Type: "unreachable", + Default: true, + IPver: ver, + Vrf: ifs[vrf], + Metric: 4278198272, + }, + ) + } + } + + for _, v := range ifs { + t.Services(*v) + } + + for _, v := range t.S6Services() { + if s6netdev.NetdevIsDummy(v.Name) { + continue + } + l.Printf("Commiting %s\n", v.Name) + if err = t.S6CommitService(v); err != nil { + l.Fatalf("Failed to commit %s, %s\n", v.Name, err) + } + } +} diff --git a/lakewood.united-states/main.go b/lakewood.united-states/main.go new file mode 100644 index 0000000..4cc4fb0 --- /dev/null +++ b/lakewood.united-states/main.go @@ -0,0 +1,333 @@ +package main + +import ( + "fmt" + "log" + "net" + "net/netip" + "os" + + "git.redxen.eu/nnd/s6-netdev" +) + +func main() { + var ( + err error + l = log.New(os.Stderr, "s6-netdev: ", log.Ltime|log.Lshortfile|log.Lmsgprefix) + ifs = make(s6netdev.IfMap) + ) + t := s6netdev.S6NewTree() + + // Loopback + ifs.AddIf(&s6netdev.Iface{ + Name: "lo", + Type: &s6netdev.NetdevIfTypes.Loopback, + }) + + // Physical interfaces + for _, v := range []int{2, 13, 16, 17, 18} { + ifs.AddIf(&s6netdev.Iface{ + Name: fmt.Sprintf("enp%ds0", v), + Type: &s6netdev.NetdevIfTypes.Phys, + }) + } + + // VLAN Interfaces + for _, v := range []int{42, 66, 100, 101} { + ifs.AddIf(&s6netdev.Iface{ + Name: fmt.Sprintf("phys.%d", v), + Type: &s6netdev.NetdevIfTypes.Vlan, + VlanId: s6netdev.VLAN(v), + }) + } + + // Wireguard interfaces + ifs.AddIf(&s6netdev.Iface{ + Name: "famfo", + Type: &s6netdev.NetdevIfTypes.Wireguard, + Addresses: []netip.Prefix{netip.MustParsePrefix("fe80::1422:1/64")}, + Sysctls: s6netdev.Sysctl_IP{ + V6: []s6netdev.Property{ + {Key: "forwarding", Value: "1", Default: "0"}, + }, + }, + }) + ifs.AddIf(&s6netdev.Iface{ + Name: "mark22k", + Type: &s6netdev.NetdevIfTypes.Wireguard, + Addresses: []netip.Prefix{netip.MustParsePrefix("fe80::4546/64")}, + Sysctls: s6netdev.Sysctl_IP{ + V6: []s6netdev.Property{ + {Key: "forwarding", Value: "1", Default: "0"}, + }, + }, + }) + ifs.AddIf(&s6netdev.Iface{ + Name: "highdef", + Type: &s6netdev.NetdevIfTypes.Wireguard, + Addresses: []netip.Prefix{netip.MustParsePrefix("fe80::2/64")}, + Sysctls: s6netdev.Sysctl_IP{ + V6: []s6netdev.Property{ + {Key: "forwarding", Value: "1", Default: "0"}, + }, + }, + }) + ifs.AddIf(&s6netdev.Iface{ + Name: "kioubit", + Type: &s6netdev.NetdevIfTypes.Wireguard, + Addresses: []netip.Prefix{netip.MustParsePrefix("fe80::2/64")}, + Sysctls: s6netdev.Sysctl_IP{ + V6: []s6netdev.Property{ + {Key: "forwarding", Value: "1", Default: "0"}, + }, + }, + }) + ifs.AddIf(&s6netdev.Iface{ + Name: "lare", + Type: &s6netdev.NetdevIfTypes.Wireguard, + Addresses: []netip.Prefix{netip.MustParsePrefix("fe80::2/64")}, + Sysctls: s6netdev.Sysctl_IP{ + V6: []s6netdev.Property{ + {Key: "forwarding", Value: "1", Default: "0"}, + }, + }, + }) + ifs.AddIf(&s6netdev.Iface{ + Name: "haktron", + Type: &s6netdev.NetdevIfTypes.Wireguard, + Addresses: []netip.Prefix{netip.MustParsePrefix("fe80::2/64")}, + Sysctls: s6netdev.Sysctl_IP{ + V6: []s6netdev.Property{ + {Key: "forwarding", Value: "1", Default: "0"}, + }, + }, + }) + ifs.AddIf(&s6netdev.Iface{ + Name: "vultrbgp", + Type: &s6netdev.NetdevIfTypes.Wireguard, + Addresses: []netip.Prefix{ + netip.MustParsePrefix("fe80::2/64"), + }, + Sysctls: s6netdev.Sysctl_IP{ + V6: []s6netdev.Property{ + {Key: "forwarding", Value: "1", Default: "0"}, + }, + }, + }) + + // Bridge interfaces + ifs.AddIf(&s6netdev.Iface{ + Name: "phys", + Type: &s6netdev.NetdevIfTypes.Bridge, + MACAddr: net.HardwareAddr{0x52, 0x54, 0x00, 0xf4, 0x2b, 0xd1}, + DHCP: s6netdev.DHCP_IP{V4: true}, + Properties: []s6netdev.Property{ + {Key: "stp_state", Value: "1", Default: "0"}, + {Key: "mcast_snooping", Value: "0", Default: "1"}, + }, + Sysctls: s6netdev.Sysctl_IP{ + V6: []s6netdev.Property{ + {Key: "forwarding", Value: "0", Default: "0"}, + }, + }, + }) + + ifs.AddIf(&s6netdev.Iface{ + Name: "br-dn42", + Type: &s6netdev.NetdevIfTypes.Bridge, + Sysctls: s6netdev.Sysctl_IP{ + V6: []s6netdev.Property{ + {Key: "forwarding", Value: "1", Default: "0"}, + }, + }, + Properties: []s6netdev.Property{ + {Key: "stp_state", Value: "0", Default: "0"}, + {Key: "mcast_snooping", Value: "0", Default: "1"}, + }, + }) + + ifs.AddIf(&s6netdev.Iface{ + Name: "b00b", + Type: &s6netdev.NetdevIfTypes.Bridge, + MACAddr: net.HardwareAddr{0x02, 0x00, 0x00, 0x00, 0xb0, 0x0b}, + Addresses: []netip.Prefix{ + netip.MustParsePrefix("2a04:5b81:2060:b00b::1/64"), + }, + Sysctls: s6netdev.Sysctl_IP{ + V6: []s6netdev.Property{ + {Key: "forwarding", Value: "1", Default: "0"}, + {Key: "autoconf", Value: "0", Default: "0"}, + }, + }, + Properties: []s6netdev.Property{ + {Key: "stp_state", Value: "0", Default: "0"}, + {Key: "mcast_snooping", Value: "0", Default: "1"}, + }, + }) + ifs.AddIf(&s6netdev.Iface{ + Name: "f33d", + Type: &s6netdev.NetdevIfTypes.Bridge, + MACAddr: net.HardwareAddr{0x02, 0x00, 0x00, 0x00, 0xf3, 0x3d}, + Addresses: []netip.Prefix{ + netip.MustParsePrefix("2a04:5b81:2060:f33d::1/64"), + }, + Sysctls: s6netdev.Sysctl_IP{ + V6: []s6netdev.Property{ + {Key: "forwarding", Value: "1", Default: "0"}, + {Key: "autoconf", Value: "0", Default: "0"}, + }, + }, + Properties: []s6netdev.Property{ + {Key: "stp_state", Value: "0", Default: "0"}, + {Key: "mcast_snooping", Value: "0", Default: "1"}, + }, + }) + ifs.AddIf(&s6netdev.Iface{ + Name: "d00d", + Type: &s6netdev.NetdevIfTypes.Bridge, + MACAddr: net.HardwareAddr{0x02, 0x00, 0x00, 0x00, 0xd0, 0x0d}, + Addresses: []netip.Prefix{ + netip.MustParsePrefix("2a04:5b81:2060:d00d::1/64"), + }, + Sysctls: s6netdev.Sysctl_IP{ + V6: []s6netdev.Property{ + {Key: "forwarding", Value: "1", Default: "0"}, + {Key: "autoconf", Value: "0", Default: "0"}, + }, + }, + Properties: []s6netdev.Property{ + {Key: "stp_state", Value: "0", Default: "0"}, + {Key: "mcast_snooping", Value: "0", Default: "1"}, + }, + }) + + // VRFs + ifs.AddIf(&s6netdev.Iface{ + Name: "vrf-dn42", + Type: &s6netdev.NetdevIfTypes.Vrf, + Table: 20, + Sysctls: s6netdev.Sysctl_IP{ + V6: []s6netdev.Property{ + {Key: "forwarding", Value: "1", Default: "0"}, + }, + }, + }) + + ifs.AddIf(&s6netdev.Iface{ + Name: "vrf-v6", + Type: &s6netdev.NetdevIfTypes.Vrf, + Table: 10, + Sysctls: s6netdev.Sysctl_IP{ + V6: []s6netdev.Property{ + {Key: "forwarding", Value: "1", Default: "0"}, + }, + }, + }) + + for _, m := range []struct { + Master string + Slaves []string + }{ + { + Master: "vrf-dn42", + Slaves: []string{ + "br-dn42", + "famfo", + "mark22k", + "highdef", + "kioubit", + "lare", + "haktron", + }, + }, + { + Master: "vrf-v6", + Slaves: []string{ + "vultrbgp", + "b00b", + "f33d", + "d00d", + }, + }, + { + Master: "phys", + Slaves: []string{ + "enp13s0", + }, + }, + { + Master: "b00b", + Slaves: []string{ + "enp16s0", + "phys.66", + }, + }, + { + Master: "br-dn42", + Slaves: []string{ + "enp2s0", + "phys.42", + }, + }, + { + Master: "f33d", + Slaves: []string{ + "enp17s0", + "phys.100", + }, + }, + { + Master: "d00d", + Slaves: []string{ + "enp18s0", + "phys.101", + }, + }, + } { + master := ifs[m.Master] + for _, slave := range m.Slaves { + master.Slaves = append(master.Slaves, ifs[slave]) + } + ifs[m.Master] = master + } + + // Parent of VLANs + for _, v := range []int{42, 66, 100, 101} { + ifs[fmt.Sprintf("phys.%d", v)].Parent = ifs["phys"] + } + + // Unreachable routes + ifs["lo"].Routes = append(ifs["lo"].Routes, s6netdev.Route{ + Type: "unreachable", + Net: netip.MustParsePrefix("2a04:5b81:2060::/44"), + Vrf: ifs["vrf-v6"], + Metric: 4278198272, + }, s6netdev.Route{ + Type: "unreachable", + Default: true, + IPver: 6, + Vrf: ifs["vrf-dn42"], + Metric: 4278198272, + }) + + // Self-referencing + ifs["vultrbgp"].Routes = append(ifs["vultrbgp"].Routes, s6netdev.Route{ + Default: true, + IPver: 6, + Vrf: ifs["vrf-v6"], + }) + + for _, v := range ifs { + t.Services(*v) + } + + for _, v := range t.S6Services() { + if s6netdev.NetdevIsDummy(v.Name) { + continue + } + l.Printf("Commiting %s\n", v.Name) + if err = t.S6CommitService(v); err != nil { + l.Fatalf("Failed to commit %s, %s\n", v.Name, err) + } + } +} diff --git a/mangong.taiwan/main.go b/mangong.taiwan/main.go new file mode 100644 index 0000000..050a04b --- /dev/null +++ b/mangong.taiwan/main.go @@ -0,0 +1,118 @@ +package main + +import ( + "fmt" + "log" + "os" + + "git.redxen.eu/nnd/s6-netdev" +) + +func main() { + var ( + err error + l = log.New(os.Stderr, "s6-netdev: ", log.Ltime|log.Lshortfile|log.Lmsgprefix) + ifs = make(s6netdev.IfMap) + ) + t := s6netdev.S6NewTree() + + // Loopback + ifs.AddIf(&s6netdev.Iface{ + Name: "lo", + Type: &s6netdev.NetdevIfTypes.Loopback, + }) + + // Physical interfaces + for _, v := range []string{"p1s0", "p9s0"} { + ifs.AddIf(&s6netdev.Iface{ + Name: fmt.Sprintf("en%s", v), + Type: &s6netdev.NetdevIfTypes.Phys, + }) + } + + // Bridge interfaces + ifs.AddIf(&s6netdev.Iface{ + Name: "br-home", + Type: &s6netdev.NetdevIfTypes.Bridge, + DHCP: s6netdev.DHCP_IP{V4: true}, + Properties: []s6netdev.Property{ + {Key: "stp_state", Value: "0", Default: "0"}, + {Key: "mcast_snooping", Value: "0", Default: "1"}, + }, + Sysctls: s6netdev.Sysctl_IP{ + // No IPv6 autoconf + V6: []s6netdev.Property{ + {Key: "accept_ra", Value: "0", Default: "0"}, + }, + }, + }) + + ifs.AddIf(&s6netdev.Iface{ + Name: "br-main", + Type: &s6netdev.NetdevIfTypes.Bridge, + Properties: []s6netdev.Property{ + {Key: "stp_state", Value: "0", Default: "0"}, + {Key: "mcast_snooping", Value: "0", Default: "1"}, + }, + }) + + // VRFs + ifs.AddIf(&s6netdev.Iface{ + Name: "vrf-v6", + Type: &s6netdev.NetdevIfTypes.Vrf, + Table: 10, + }) + + for _, m := range []struct { + Master string + Slaves []string + }{ + { + Master: "vrf-v6", + Slaves: []string{ + "br-main", + }, + }, + { + Master: "br-main", + Slaves: []string{ + "enp1s0", + }, + }, + { + Master: "br-home", + Slaves: []string{ + "enp9s0", + }, + }, + } { + master := ifs[m.Master] + for _, slave := range m.Slaves { + master.Slaves = append(master.Slaves, ifs[slave]) + } + ifs[m.Master] = master + } + + // Unreachable routes + ifs["lo"].Routes = append(ifs["lo"].Routes, s6netdev.Route{ + Default: true, + IPver: 6, + Type: "unreachable", + Vrf: ifs["vrf-v6"], + Metric: 4278198272, + }) + + for _, v := range ifs { + t.Services(*v) + } + + for _, v := range t.S6Services() { + if s6netdev.NetdevIsDummy(v.Name) { + continue + } + l.Printf("Commiting %s\n", v.Name) + if err = t.S6CommitService(v); err != nil { + l.Fatalf("Failed to commit %s, %s\n", v.Name, err) + } + } +} diff --git a/mika.frankfurt/main.go b/mika.frankfurt/main.go new file mode 100644 index 0000000..b2e6e28 --- /dev/null +++ b/mika.frankfurt/main.go @@ -0,0 +1,150 @@ +package main + +import ( + "fmt" + "log" + "net/netip" + "os" + + "git.redxen.eu/nnd/s6-netdev" +) + +func main() { + var ( + err error + l = log.New(os.Stderr, "s6-netdev: ", log.Ltime|log.Lshortfile|log.Lmsgprefix) + ifs = make(s6netdev.IfMap) + ) + t := s6netdev.S6NewTree() + + // Loopback + ifs.AddIf(&s6netdev.Iface{ + Name: "lo", + Type: &s6netdev.NetdevIfTypes.Loopback, + }) + + // VRFs + ifs.AddIf(&s6netdev.Iface{ + Name: "vrf-wgate", + Type: &s6netdev.NetdevIfTypes.Vrf, + Table: 20, + }) + + // Bridge interfaces + ifs.AddIf(&s6netdev.Iface{ + Name: "br-uplink", + Type: &s6netdev.NetdevIfTypes.Bridge, + DHCP: s6netdev.DHCP_IP{V4: true}, + Properties: []s6netdev.Property{ + {Key: "stp_state", Value: "0", Default: "0"}, + {Key: "mcast_snooping", Value: "0", Default: "1"}, + }, + Sysctls: s6netdev.Sysctl_IP{ + V6: []s6netdev.Property{ + {Key: "forwarding", Value: "1", Default: "0"}, + {Key: "accept_ra", Value: "2", Default: "0"}, + }, + }, + }) + + // Physical interfaces + ifs.AddIf(&s6netdev.Iface{ + Name: fmt.Sprintf("enp1s0"), + Type: &s6netdev.NetdevIfTypes.Phys, + }) + + // Wireguard interfaces + for _, v := range []struct{ ifn, ll, route string }{ + {ifn: "tristan", ll: "fe80::1/64", route: "2a04:5b81:2010::/48"}, + {ifn: "tristan-travel", ll: "fe80::1/64", route: "2a04:5b81:201f::/48"}, + {ifn: "gustav", ll: "fe80::1/64", route: "2a04:5b81:2011::/48"}, + {ifn: "caskd-lakewood", ll: "fe80::1/64", route: "2a04:5b81:2060::/48"}, + } { + ifs.AddIf(&s6netdev.Iface{ + Name: v.ifn, + Type: &s6netdev.NetdevIfTypes.Wireguard, + Addresses: []netip.Prefix{netip.MustParsePrefix(v.ll)}, + Routes: []s6netdev.Route{ + {Net: netip.MustParsePrefix(v.route), Vrf: ifs["vrf-wgate"]}, + }, + Sysctls: s6netdev.Sysctl_IP{ + V6: []s6netdev.Property{ + {Key: "forwarding", Value: "1", Default: "0"}, + }, + }, + }) + } + + ifs.AddIf(&s6netdev.Iface{ + Name: "caskd-thetford", + Type: &s6netdev.NetdevIfTypes.Wireguard, + Addresses: []netip.Prefix{netip.MustParsePrefix("fe80::1/64")}, + Sysctls: s6netdev.Sysctl_IP{ + V6: []s6netdev.Property{ + {Key: "forwarding", Value: "1", Default: "0"}, + }, + }, + }) + + for _, m := range []struct { + Master string + Slaves []string + }{ + { + Master: "vrf-wgate", + Slaves: []string{ + "br-uplink", + "tristan", + "tristan-travel", + "gustav", + "caskd-lakewood", + "caskd-thetford", + }, + }, + { + Master: "br-uplink", + Slaves: []string{ + "enp1s0", + }, + }, + } { + master := ifs[m.Master] + for _, slave := range m.Slaves { + master.Slaves = append(master.Slaves, ifs[slave]) + } + ifs[m.Master] = master + } + + // Unreachable routes + ifs["lo"].Routes = append(ifs["lo"].Routes, s6netdev.Route{ + Type: "unreachable", + Net: netip.MustParsePrefix("2a04:5b81:2060::/44"), + Vrf: ifs["vrf-wgate"], + Metric: 4096, + }, s6netdev.Route{ + Type: "unreachable", + Net: netip.MustParsePrefix("2a04:5b81:2010::/44"), + Vrf: ifs["vrf-wgate"], + Metric: 4096, + }, s6netdev.Route{ + Type: "unreachable", + Default: true, + IPver: 6, + Vrf: ifs["vrf-wgate"], + Metric: 4278198272, + }) + + for _, v := range ifs { + t.Services(*v) + } + + for _, v := range t.S6Services() { + if s6netdev.NetdevIsDummy(v.Name) { + continue + } + l.Printf("Commiting %s\n", v.Name) + if err = t.S6CommitService(v); err != nil { + l.Fatalf("Failed to commit %s, %s\n", v.Name, err) + } + } +} diff --git a/san-jorge.argentina/main.go b/san-jorge.argentina/main.go new file mode 100644 index 0000000..5e28d83 --- /dev/null +++ b/san-jorge.argentina/main.go @@ -0,0 +1,90 @@ +package main + +import ( + "fmt" + "log" + "net/netip" + "os" + + "git.redxen.eu/nnd/s6-netdev" +) + +func main() { + var ( + err error + l = log.New(os.Stderr, "s6-netdev: ", log.Ltime|log.Lshortfile|log.Lmsgprefix) + ifs = make(s6netdev.IfMap) + ) + t := s6netdev.S6NewTree() + + // Loopback + ifs.AddIf(&s6netdev.Iface{ + Name: "lo", + Type: &s6netdev.NetdevIfTypes.Loopback, + }) + + // Physical interfaces + for _, v := range []string{"p1s0"} { + ifs.AddIf(&s6netdev.Iface{ + Name: fmt.Sprintf("en%s", v), + Type: &s6netdev.NetdevIfTypes.Phys, + }) + } + + // Bridge interfaces + ifs.AddIf(&s6netdev.Iface{ + Name: "br-v6", + Type: &s6netdev.NetdevIfTypes.Bridge, + Properties: []s6netdev.Property{ + {Key: "stp_state", Value: "0", Default: "0"}, + {Key: "mcast_snooping", Value: "0", Default: "1"}, + }, + }) + + // Wireguard interfaces + ifs.AddIf(&s6netdev.Iface{ + Name: "wg-tunnel", + Type: &s6netdev.NetdevIfTypes.Wireguard, + Addresses: []netip.Prefix{ + netip.MustParsePrefix("172.22.12.8/32"), + netip.MustParsePrefix("fd42:42:42::2:8/128"), + }, + Routes: []s6netdev.Route{ + {Net: netip.MustParsePrefix("172.22.12.0/24")}, + {Net: netip.MustParsePrefix("fd42:42:42::2:0/120")}, + {Default: true, IPver: 4}, + }, + }) + + for _, m := range []struct { + Master string + Slaves []string + }{ + { + Master: "br-v6", + Slaves: []string{ + "enp1s0", + }, + }, + } { + master := ifs[m.Master] + for _, slave := range m.Slaves { + master.Slaves = append(master.Slaves, ifs[slave]) + } + ifs[m.Master] = master + } + + for _, v := range ifs { + t.Services(*v) + } + + for _, v := range t.S6Services() { + if s6netdev.NetdevIsDummy(v.Name) { + continue + } + l.Printf("Commiting %s\n", v.Name) + if err = t.S6CommitService(v); err != nil { + l.Fatalf("Failed to commit %s, %s\n", v.Name, err) + } + } +} diff --git a/tarui.japan/main.go b/tarui.japan/main.go new file mode 100644 index 0000000..a08aa43 --- /dev/null +++ b/tarui.japan/main.go @@ -0,0 +1,233 @@ +package main + +import ( + "fmt" + "log" + "net/netip" + "os" + + "git.redxen.eu/nnd/s6-netdev" +) + +func main() { + var ( + err error + l = log.New(os.Stderr, "s6-netdev: ", log.Ltime|log.Lshortfile|log.Lmsgprefix) + ifs = make(s6netdev.IfMap) + ) + t := s6netdev.S6NewTree() + + // Loopback + ifs.AddIf(&s6netdev.Iface{ + Name: "lo", + Type: &s6netdev.NetdevIfTypes.Loopback, + }) + + // VRFs + ifs.AddIf(&s6netdev.Iface{ + Name: "vrf-phys", + Type: &s6netdev.NetdevIfTypes.Vrf, + Table: 10, + }) + ifs.AddIf(&s6netdev.Iface{ + Name: "vrf-b00b", + Type: &s6netdev.NetdevIfTypes.Vrf, + Table: 20, + }) + + // Physical interfaces + for _, v := range []string{"p129s0f0", "p129s0f1", "p131s0f0", "p131s0f1", "p131s0f2", "p131s0f3"} { + ifs.AddIf(&s6netdev.Iface{ + Name: fmt.Sprintf("en%s", v), + Type: &s6netdev.NetdevIfTypes.Phys, + }) + } + + // VLAN Interfaces + ifs.AddIf(&s6netdev.Iface{ + Name: fmt.Sprintf("phys.%d", 66), + Type: &s6netdev.NetdevIfTypes.Vlan, + VlanId: s6netdev.VLAN(66), + Addresses: []netip.Prefix{ + netip.MustParsePrefix("2a04:5b81:2060:b00b:921b:eff:fe53:8b67/64"), + }, + Routes: []s6netdev.Route{ + { + Net: netip.MustParsePrefix("2a04:5b81:2060:b00b::/64"), + Via: netip.MustParseAddr("fe80::ff:fe00:b00b"), + Metric: 128, + }, + }, + // Disable autoconf, we statically assign it to have it early + Sysctls: s6netdev.Sysctl_IP{ + V6: []s6netdev.Property{ + {Key: "autoconf", Value: "0", Default: "1"}, + }, + }, + }) + + // Wireguard interfaces + ifs.AddIf(&s6netdev.Iface{ + Name: "wg-tunnel", + Type: &s6netdev.NetdevIfTypes.Wireguard, + Addresses: []netip.Prefix{ + netip.MustParsePrefix("172.22.12.7/32"), + netip.MustParsePrefix("fd42:42:42::2:7/128"), + }, + Routes: []s6netdev.Route{ + {Net: netip.MustParsePrefix("172.22.12.0/24")}, + {Net: netip.MustParsePrefix("fd42:42:42::2:0/120")}, + }, + }) + + // Bridge interfaces + ifs.AddIf(&s6netdev.Iface{ + Name: "phys", + Type: &s6netdev.NetdevIfTypes.Bridge, + Properties: []s6netdev.Property{ + {Key: "priority", Value: "16384", Default: "32768"}, + {Key: "stp_state", Value: "1", Default: "0"}, + {Key: "mcast_snooping", Value: "0", Default: "1"}, + }, + Sysctls: s6netdev.Sysctl_IP{ + V6: []s6netdev.Property{ + {Key: "forwarding", Value: "0", Default: "0"}, + {Key: "accept_ra", Value: "0", Default: "1"}, + }, + }, + }) + + // Currently there exists no mechanism to depend routes on the addresses, these are manual deps + phys_addr_v4 := t.NetdevIfaceAddr(*ifs["phys"], netip.MustParsePrefix("10.24.0.11/24")) + phys_defrt_v4_vrf := t.NetdevRoute(*ifs["phys"], + s6netdev.Route{ + Default: true, + IPver: 4, + Vrf: ifs["vrf-phys"], + Via: netip.MustParseAddr("10.24.0.1"), + Metric: 1024, + }, + ) + phys_defrt_v4_vrf.Children = append(phys_defrt_v4_vrf.Children, phys_addr_v4) + phys_defrt_v4_main := t.NetdevRoute(*ifs["phys"], + s6netdev.Route{ + Default: true, + IPver: 4, + Via: netip.MustParseAddr("10.24.0.1"), + Metric: 1024, + }, + ) + phys_defrt_v4_main.Children = append(phys_defrt_v4_main.Children, phys_addr_v4) + + phys_addr_v6 := t.NetdevIfaceAddr(*ifs["phys"], netip.MustParsePrefix("2a02:810d:95bf:f999:921b:eff:fe55:75ab/64")) + phys_defrt_v6_vrf := t.NetdevRoute(*ifs["phys"], + s6netdev.Route{ + Default: true, + IPver: 6, + Vrf: ifs["vrf-phys"], + Via: netip.MustParseAddr("fe80::2e91:abff:fe90:9bb5"), + Metric: 1024, + }, + ) + phys_defrt_v6_vrf.Children = append(phys_defrt_v6_vrf.Children, phys_addr_v6) + phys_defrt_v6_main := t.NetdevRoute(*ifs["phys"], + s6netdev.Route{ + Default: true, + IPver: 6, + Via: netip.MustParseAddr("fe80::2e91:abff:fe90:9bb5"), + Metric: 1024, + }, + ) + phys_defrt_v6_main.Children = append(phys_defrt_v6_main.Children, phys_addr_v6) + + // Private Bridges + for _, name := range []string{ + "b00b", + "d00d", + "f33d", + "dn42", + } { + ifs.AddIf(&s6netdev.Iface{ + Name: fmt.Sprintf("virbr-%s", name), + Type: &s6netdev.NetdevIfTypes.Bridge, + Properties: []s6netdev.Property{ + {Key: "stp_state", Value: "1", Default: "0"}, + {Key: "mcast_snooping", Value: "0", Default: "1"}, + }, + Sysctls: s6netdev.Sysctl_IP{ + V6: []s6netdev.Property{ + {Key: "forwarding", Value: "0", Default: "0"}, + {Key: "accept_ra", Value: "0", Default: "1"}, + }, + }, + }) + } + + for _, m := range []struct { + Master string + Slaves []string + }{ + { + Master: "vrf-b00b", + Slaves: []string{ + "phys.66", + }, + }, + { + Master: "vrf-phys", + Slaves: []string{ + "phys", + }, + }, + { + Master: "phys", + Slaves: []string{ + "enp129s0f0", + "enp129s0f1", + "enp131s0f0", + "enp131s0f1", + "enp131s0f2", + "enp131s0f3", + }, + }, + } { + master := ifs[m.Master] + for _, slave := range m.Slaves { + master.Slaves = append(master.Slaves, ifs[slave]) + } + ifs[m.Master] = master + } + + // Parent of VLANs + ifs[fmt.Sprintf("phys.%d", 66)].Parent = ifs["phys"] + + // Unreachable routes + for _, vrf := range []string{"vrf-phys", "vrf-b00b"} { + // TODO: iproute2 inconsistency for ipv4? + for _, ver := range []int{6} { + ifs["lo"].Routes = append(ifs["lo"].Routes, + s6netdev.Route{ + Type: "unreachable", + Default: true, + IPver: ver, + Vrf: ifs[vrf], + Metric: 4278198272, + }, + ) + } + } + + for _, v := range ifs { + t.Services(*v) + } + + for _, v := range t.S6Services() { + if s6netdev.NetdevIsDummy(v.Name) { + continue + } + l.Printf("Commiting %s\n", v.Name) + if err = t.S6CommitService(v); err != nil { + l.Fatalf("Failed to commit %s, %s\n", v.Name, err) + } + } +} diff --git a/thetford-mines.canada/main.go b/thetford-mines.canada/main.go new file mode 100644 index 0000000..a705835 --- /dev/null +++ b/thetford-mines.canada/main.go @@ -0,0 +1,269 @@ +package main + +import ( + "fmt" + "log" + "net" + "net/netip" + "os" + + "git.redxen.eu/nnd/s6-netdev" +) + +func main() { + var ( + err error + l = log.New(os.Stderr, "s6-netdev: ", log.Ltime|log.Lshortfile|log.Lmsgprefix) + ifs = make(s6netdev.IfMap) + ) + t := s6netdev.S6NewTree() + + // Loopback + ifs.AddIf(&s6netdev.Iface{ + Name: "lo", + Type: &s6netdev.NetdevIfTypes.Loopback, + }) + + // Physical interfaces + for _, v := range []int{9, 12, 13, 14, 15} { + ifs.AddIf(&s6netdev.Iface{ + Name: fmt.Sprintf("enp%ds0", v), + Type: &s6netdev.NetdevIfTypes.Phys, + }) + } + + // VLAN Interfaces + for _, v := range []int{42, 66, 100, 101} { + ifs.AddIf(&s6netdev.Iface{ + Name: fmt.Sprintf("phys.%d", v), + Type: &s6netdev.NetdevIfTypes.Vlan, + VlanId: s6netdev.VLAN(v), + }) + } + + // Bridge interfaces + ifs.AddIf(&s6netdev.Iface{ + Name: "phys", + Type: &s6netdev.NetdevIfTypes.Bridge, + MACAddr: net.HardwareAddr{0x52, 0x54, 0x00, 0x81, 0xcb, 0x62}, + DHCP: s6netdev.DHCP_IP{V4: true}, + Properties: []s6netdev.Property{ + {Key: "stp_state", Value: "1", Default: "0"}, + {Key: "mcast_snooping", Value: "0", Default: "1"}, + }, + Sysctls: s6netdev.Sysctl_IP{ + V6: []s6netdev.Property{ + {Key: "forwarding", Value: "0", Default: "0"}, + }, + }, + }) + + ifs.AddIf(&s6netdev.Iface{ + Name: "br-dn42", + Type: &s6netdev.NetdevIfTypes.Bridge, + Sysctls: s6netdev.Sysctl_IP{ + V6: []s6netdev.Property{ + {Key: "forwarding", Value: "1", Default: "0"}, + }, + }, + Properties: []s6netdev.Property{ + {Key: "stp_state", Value: "0", Default: "0"}, + {Key: "mcast_snooping", Value: "0", Default: "1"}, + }, + }) + + ifs.AddIf(&s6netdev.Iface{ + Name: "b00b", + Type: &s6netdev.NetdevIfTypes.Bridge, + MACAddr: net.HardwareAddr{0x02, 0x00, 0x00, 0x01, 0xb0, 0x0b}, + Addresses: []netip.Prefix{ + netip.MustParsePrefix("2a04:5b81:2060:b00b::2/64"), + }, + Sysctls: s6netdev.Sysctl_IP{ + V6: []s6netdev.Property{ + {Key: "forwarding", Value: "1", Default: "0"}, + {Key: "autoconf", Value: "0", Default: "0"}, + }, + }, + Properties: []s6netdev.Property{ + {Key: "stp_state", Value: "0", Default: "0"}, + {Key: "mcast_snooping", Value: "0", Default: "1"}, + }, + }) + ifs.AddIf(&s6netdev.Iface{ + Name: "f33d", + Type: &s6netdev.NetdevIfTypes.Bridge, + MACAddr: net.HardwareAddr{0x02, 0x00, 0x00, 0x01, 0xf3, 0x3d}, + Addresses: []netip.Prefix{ + netip.MustParsePrefix("2a04:5b81:2060:f33d::2/64"), + }, + Sysctls: s6netdev.Sysctl_IP{ + V6: []s6netdev.Property{ + {Key: "forwarding", Value: "1", Default: "0"}, + {Key: "autoconf", Value: "0", Default: "0"}, + }, + }, + Properties: []s6netdev.Property{ + {Key: "stp_state", Value: "0", Default: "0"}, + {Key: "mcast_snooping", Value: "0", Default: "1"}, + }, + }) + ifs.AddIf(&s6netdev.Iface{ + Name: "d00d", + Type: &s6netdev.NetdevIfTypes.Bridge, + MACAddr: net.HardwareAddr{0x02, 0x00, 0x00, 0x01, 0xd0, 0x0d}, + Addresses: []netip.Prefix{ + netip.MustParsePrefix("2a04:5b81:2060:d00d::2/64"), + }, + Sysctls: s6netdev.Sysctl_IP{ + V6: []s6netdev.Property{ + {Key: "forwarding", Value: "1", Default: "0"}, + {Key: "autoconf", Value: "0", Default: "0"}, + }, + }, + Properties: []s6netdev.Property{ + {Key: "stp_state", Value: "0", Default: "0"}, + {Key: "mcast_snooping", Value: "0", Default: "1"}, + }, + }) + + // VRFs + ifs.AddIf(&s6netdev.Iface{ + Name: "vrf-dn42", + Type: &s6netdev.NetdevIfTypes.Vrf, + Table: 20, + Sysctls: s6netdev.Sysctl_IP{ + V6: []s6netdev.Property{ + {Key: "forwarding", Value: "1", Default: "0"}, + }, + }, + }) + + ifs.AddIf(&s6netdev.Iface{ + Name: "vrf-v6", + Type: &s6netdev.NetdevIfTypes.Vrf, + Table: 10, + Sysctls: s6netdev.Sysctl_IP{ + V6: []s6netdev.Property{ + {Key: "forwarding", Value: "1", Default: "0"}, + }, + }, + }) + + // Wireguard interfaces + ifs.AddIf(&s6netdev.Iface{ + Name: "vultrbgp", + Type: &s6netdev.NetdevIfTypes.Wireguard, + Addresses: []netip.Prefix{ + netip.MustParsePrefix("fe80::2/64"), + }, + Sysctls: s6netdev.Sysctl_IP{ + V6: []s6netdev.Property{ + {Key: "forwarding", Value: "1", Default: "0"}, + }, + }, + }) + + for _, m := range []struct { + Master string + Slaves []string + }{ + { + Master: "vrf-dn42", + Slaves: []string{ + "br-dn42", + }, + }, + { + Master: "vrf-v6", + Slaves: []string{ + "vultrbgp", + "b00b", + "f33d", + "d00d", + }, + }, + { + Master: "phys", + Slaves: []string{ + "enp12s0", + }, + }, + { + Master: "b00b", + Slaves: []string{ + "enp9s0", + "phys.66", + }, + }, + { + Master: "br-dn42", + Slaves: []string{ + "enp15s0", + "phys.42", + }, + }, + { + Master: "f33d", + Slaves: []string{ + "enp14s0", + "phys.100", + }, + }, + { + Master: "d00d", + Slaves: []string{ + "enp13s0", + "phys.101", + }, + }, + } { + master := ifs[m.Master] + for _, slave := range m.Slaves { + master.Slaves = append(master.Slaves, ifs[slave]) + } + ifs[m.Master] = master + } + + // Parent of VLANs + for _, v := range []int{42, 66, 100, 101} { + ifs[fmt.Sprintf("phys.%d", v)].Parent = ifs["phys"] + } + + // Unreachable routes + ifs["lo"].Routes = append(ifs["lo"].Routes, s6netdev.Route{ + Type: "unreachable", + Default: true, + IPver: 6, + Vrf: ifs["vrf-v6"], + Metric: 4278198272, + }, s6netdev.Route{ + Type: "unreachable", + Default: true, + IPver: 6, + Vrf: ifs["vrf-dn42"], + Metric: 4278198272, + }) + + // Default router for vrf (defrtr from ra isn't installed if autoconf not enabled) + ifs["b00b"].Routes = append(ifs["b00b"].Routes, s6netdev.Route{ + Default: true, + Via: netip.MustParseAddr("fe80::ff:fe00:b00b"), // Link local of lakewood.united-states + Vrf: ifs["vrf-v6"], + Metric: 4096, + }) + + for _, v := range ifs { + t.Services(*v) + } + + for _, v := range t.S6Services() { + if s6netdev.NetdevIsDummy(v.Name) { + continue + } + l.Printf("Commiting %s\n", v.Name) + if err = t.S6CommitService(v); err != nil { + l.Fatalf("Failed to commit %s, %s\n", v.Name, err) + } + } +}