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 SendUpdates() 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 } ipstack.SendIP(ipstack.GetMyVIP(), iface, 0, messageToSendBytes, ipAddr) } ipstack.SendIP(ipstack.GetMyVIP(), iface, 0, messageToSendBytes, ipAddr) } } if len(line) > 2 { if line[:2] == "up" { // get interface name ifaceName := line[3:] ipstack.InterfaceUpREPL(ifaceName) } } continue } } }