aboutsummaryrefslogtreecommitdiff
path: root/pkg/routingtable
diff options
context:
space:
mode:
authorsotech117 <michael_foiani@brown.edu>2023-10-08 23:05:53 -0400
committersotech117 <michael_foiani@brown.edu>2023-10-08 23:05:53 -0400
commit4966c054b3f462f6eaf24591c4ab1a945e72bb6f (patch)
treeb33ce376ceeadaecb926f0daa841f6d11f56442f /pkg/routingtable
parent5a5dec572c01a7d306c3bdd3fd0ad8cec63c6049 (diff)
fix heiarchy. rewrite routing table code
Diffstat (limited to 'pkg/routingtable')
-rw-r--r--pkg/routingtable/routingtable.go81
1 files changed, 81 insertions, 0 deletions
diff --git a/pkg/routingtable/routingtable.go b/pkg/routingtable/routingtable.go
new file mode 100644
index 0000000..7f7e2b2
--- /dev/null
+++ b/pkg/routingtable/routingtable.go
@@ -0,0 +1,81 @@
+package routingtable
+
+import (
+ "fmt"
+ "github.com/pkg/errors"
+ "net/netip"
+)
+
+type Address struct {
+ addr netip.Addr
+ prefix netip.Prefix
+}
+
+type Route struct {
+ dest Address
+ cost uint32
+ mask netip.Prefix
+}
+
+var table map[Address]Route
+
+//func Initialize(config lnxconfig.IPConfig) error {
+// if len(os.Args) != 2 {
+// fmt.Printf("Usage: %s <configFile>\n", os.Args[0])
+// os.Exit(1)
+// }
+// fileName := os.Args[1]
+//
+// lnxConfig, err := lnxconfig.ParseConfig(fileName)
+// if err != nil {
+// panic(err)
+// }
+//
+// // make and populate routing table
+// table = make(map[Address]Route)
+// for _, iface := range lnxConfig.Interfaces {
+// var address = Address{iface.AssignedIP, iface.AssignedPrefix}
+// var route = Route{Address{iface.AssignedIP, iface.AssignedPrefix}, 0, iface.AssignedPrefix}
+// table[address] = route
+// }
+//
+//
+//}
+
+func AddRoute(dest Address, cost uint32, mask netip.Prefix) error {
+ if _, ok := table[dest]; ok {
+ return errors.New("Route already exists")
+ }
+
+ table[dest] = Route{dest, cost, mask}
+ return nil
+}
+
+func RemoveRoute(dest Address) error {
+ if _, ok := table[dest]; !ok {
+ return errors.New("Route doesn't exist")
+ }
+
+ delete(table, dest)
+ return nil
+}
+
+// TODO: implement this with most specific prefix matching
+func GetRoute(dest Address) (Route, error) {
+ // get the most specific route
+ for key, value := range table {
+ if key.prefix.Contains(dest.addr) {
+ return value, nil
+ }
+ }
+ return Route{}, errors.New("Route doesn't exist")
+}
+
+func SprintRoutingTable() string {
+ message := ""
+ for address, route := range table {
+ message += fmt.Sprintf("%s/%d\t%d\n", address.addr, address.prefix, route.cost)
+ }
+
+ return message
+}