From 5d7ffd42b638f33d32c01c46f853e26a5028b552 Mon Sep 17 00:00:00 2001 From: David Doan Date: Thu, 2 Nov 2023 18:57:56 -0400 Subject: milestone 1 --- cmd/vhost/main.go | 128 ++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 81 insertions(+), 47 deletions(-) (limited to 'cmd/vhost/main.go') diff --git a/cmd/vhost/main.go b/cmd/vhost/main.go index c0e5ad8..57f5f7c 100644 --- a/cmd/vhost/main.go +++ b/cmd/vhost/main.go @@ -4,9 +4,11 @@ import ( "bufio" "fmt" "iptcp/pkg/ipstack" + // "iptcp/pkg/tcpstack" "net/netip" "os" "strings" + "strconv" ) func main() { @@ -22,12 +24,13 @@ func main() { return } ipstack.RegisterProtocolHandler(ipstack.TEST_PROTOCOL) - + ipstack.RegisterProtocolHandler(ipstack.TCP_PROTOCOL) scanner := bufio.NewScanner(os.Stdin) for scanner.Scan() { line := scanner.Text() - switch line { + tokens := strings.Split(line, " ") + switch tokens[0] { case "li": fmt.Println("Name\tAddr/Prefix\tState") fmt.Println(ipstack.SprintInterfaces()) @@ -43,59 +46,90 @@ func main() { case "exit": ipstack.CleanUp() os.Exit(0) - default: - if len(line) > 4 { - if line[:4] == "down" { - ifaceName := line[5:] - ipstack.InterfaceDownREPL(ifaceName) - } + case "down": + // get interface name + ifaceName := tokens[1] + ipstack.InterfaceDownREPL(ifaceName) + case "up": + // get interface name + ifaceName := tokens[1] + ipstack.InterfaceUpREPL(ifaceName) + case "send": + // get IP address and message that follows it + IPAndMessage := strings.Split(line, " ") + ipAddr := IPAndMessage[1] + message := IPAndMessage[2:] - if line[:4] == "send" { - // get IP address and message that follows it - IPAndMessage := strings.Split(line, " ") - ipAddr := IPAndMessage[1] - message := IPAndMessage[2:] + // combine message into one string + messageToSend := strings.Join(message, " ") + messageToSendBytes := []byte(messageToSend) - // combine message into one string - messageToSend := strings.Join(message, " ") - messageToSendBytes := []byte(messageToSend) - - address, _ := netip.ParseAddr(ipAddr) - hop, err := ipstack.Route(address) + address, _ := netip.ParseAddr(ipAddr) + hop, err := ipstack.Route(address) + if err != nil { + fmt.Println(err) + continue + } + myAddr := hop.Interface.IpPrefix.Addr() + for _, neighbor := range ipstack.GetNeighbors()[hop.Interface.Name] { + if neighbor.VipAddr == address || + neighbor.VipAddr == hop.VIP && hop.Type == "S" { + bytesWritten, err := ipstack.SendIP(&myAddr, neighbor, ipstack.TEST_PROTOCOL, messageToSendBytes, ipAddr, nil) + fmt.Printf("Sent %d bytes to %s\n", bytesWritten, neighbor.VipAddr.String()) if err != nil { fmt.Println(err) - continue - } - myAddr := hop.Interface.IpPrefix.Addr() - for _, neighbor := range ipstack.GetNeighbors()[hop.Interface.Name] { - if neighbor.VipAddr == address || - neighbor.VipAddr == hop.VIP && hop.Type == "S" { - bytesWritten, err := ipstack.SendIP(&myAddr, neighbor, ipstack.TEST_PROTOCOL, messageToSendBytes, ipAddr, nil) - fmt.Printf("Sent %d bytes to %s\n", bytesWritten, neighbor.VipAddr.String()) - if err != nil { - fmt.Println(err) - } - } } } } - if len(line) > 2 { - if line[:2] == "up" { - // get interface name - ifaceName := line[3:] - ipstack.InterfaceUpREPL(ifaceName) - } - } else { - fmt.Println("Invalid command: ", line) - fmt.Println("Commands: ") - fmt.Println(" exit Terminate this program") - fmt.Println(" li List interfaces") - fmt.Println(" lr List routes") - fmt.Println(" ln List available neighbors") - fmt.Println(" up Enable an interface") - fmt.Println(" down Disable an interface") - fmt.Println(" send Send test packet") +// ********************************************TCP REPL*************************************************************** + case "a": + // accept a connection + // get the port number + port := line[2:] + uint16Port, err := strconv.ParseUint(port, 10, 16) + if err != nil { + fmt.Println(err) + continue + } + // listen on the port + listener, err := ipstack.VListen(uint16(uint16Port)) + if err != nil { + fmt.Println(err) + continue + } + _, err = listener.VAccept() + if err != nil { + fmt.Println(err) + continue } + case "c": + // connect to a port + vipAddr := tokens[1] + port := tokens[2] + uint16Port, err := strconv.ParseUint(port, 10, 16) + if err != nil { + fmt.Println(err) + continue + } + _, err = ipstack.VConnect(vipAddr, uint16(uint16Port)) + if err != nil { + fmt.Println(err) + continue + } + case "ls": + // list sockets + fmt.Println("SID\tLAddr\t\tLPort\tRAddr\t\tRPort\tRStatus") + fmt.Println(ipstack.SprintSockets()) + default: + fmt.Println("Invalid command: ", line) + fmt.Println("Commands: ") + fmt.Println(" exit Terminate this program") + fmt.Println(" li List interfaces") + fmt.Println(" lr List routes") + fmt.Println(" ln List available neighbors") + fmt.Println(" up Enable an interface") + fmt.Println(" down Disable an interface") + fmt.Println(" send Send test packet") continue } } -- cgit v1.2.3-70-g09d2