package main import ( "bufio" "fmt" "os" "time" "iptcp/pkg/ipstack" "strings" ) // func SendUpdates() { // myInterfaces := ipstack.GetInterfaces() // myNeighbors := ipstack.GetNeighbors() // for _, iface := range myInterfaces { // // send RIP updates to all neighbors // for _, _ = range myNeighbors { // // iface.udp.Write(neighbor, data) // // iface.RecvSocket.Write(neighbor, data) // // wait for response for 12 seconds // response := make([]byte, 512) // iface.RecvSocket.Read(response) // time.Sleep(12 * time.Second) // if len(response) == 0 { // // ipstack.RemoveNeighbor(neighbor) // } // } // } // time.Sleep(5 * time.Second) // } func main() { if len(os.Args) != 2 { fmt.Printf("Usage: %s \n", os.Args[0]) os.Exit(1) } fileName := os.Args[1] // initialize(fileName) go ipstack.Initialize(fileName) // myInterfaces := ipstack.GetInterfaces() // myNeighbors := ipstack.GetNeighbors() // myRoutes := ipstack.GetRoutes() go func() { for { ipstack.SendUpdates() time.Sleep(5 * time.Second) } }() go ipstack.CheckAndUpdateRoutingTable() scanner := bufio.NewScanner(os.Stdin) for scanner.Scan() { line := scanner.Text() switch line { case "li": fmt.Println("Name\tAddr/Prefix\tState") ipstack.SprintInterfaces() case "ln": fmt.Println("Iface\tVIP\tUDPAddr") ipstack.SprintNeighbors() case "lr": fmt.Println("T\tPrefix\tNext Hop\tCost") ipstack.SprintRoutingTable() case "q": ipstack.CleanUp() os.Exit(0) default: if len(line) > 4 { if line[:4] == "down" { // get interface name ifaceName := line[5:] ipstack.InterfaceDownREPL(ifaceName) } if line[:4] == "send" { // get IP address and message that follows it listOfWords := strings.Split(line, " ") ipAddr := listOfWords[1] message := listOfWords[2:] // combine message into one string messageToSend := strings.Join(message, " ") // convert message to byte array messageToSendBytes := []byte(messageToSend) // get interface by ipAddr iface, err := ipstack.GetNeighborByIP(ipAddr) if err != nil { fmt.Println(err) iface, err = ipstack.GetRouteByIP(ipAddr) if err != nil { fmt.Println(err) continue } err = ipstack.SendIP(ipstack.GetMyVIP(), iface, 0, messageToSendBytes, ipAddr) if err != nil { fmt.Println(err) continue } continue } err = ipstack.SendIP(ipstack.GetMyVIP(), iface, 0, messageToSendBytes, ipAddr) if err != nil { fmt.Println(err) continue } } } if len(line) > 2 { if line[:2] == "up" { // get interface name ifaceName := line[3:] ipstack.InterfaceUpREPL(ifaceName) } } continue } } }