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 \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 }