diff --git a/cmd/gcs-sidecar-server/main.go b/cmd/gcs-sidecar-server/main.go index 9b18ce3f37..93d6c1a371 100644 --- a/cmd/gcs-sidecar-server/main.go +++ b/cmd/gcs-sidecar-server/main.go @@ -11,12 +11,12 @@ import ( "github.com/Microsoft/go-winio/pkg/guid" ) -// 4A02C354-EAEA-5AE8-A0B6-6CFF3763407F, +// 2E83DEBE-805B-5649-8DE8-5CE2F5B8055B, var vmid = guid.GUID{ - Data1: 0x4A02C354, - Data2: 0xEAEA, - Data3: 0x5AE8, - Data4: [8]uint8{0xA0, 0xB6, 0x6C, 0xFF, 0x37, 0x63, 0x40, 0x7F}, + Data1: 0x2E83DEBE, + Data2: 0x805B, + Data3: 0x5649, + Data4: [8]uint8{0x8D, 0xE8, 0x5C, 0xE2, 0xF5, 0xB8, 0x05, 0x5B}, } var WindowsSidecarGcsHvsockServiceID = guid.GUID{ diff --git a/cmd/gcs-sidecar/main.go b/cmd/gcs-sidecar/main.go index ca47bb92ea..f183c2467b 100644 --- a/cmd/gcs-sidecar/main.go +++ b/cmd/gcs-sidecar/main.go @@ -72,11 +72,12 @@ func handleRequest(conn net.Conn) { } } -var WindowsGcsHvsockServiceID = guid.GUID{ - Data1: 0xacef5661, - Data2: 0x84a1, - Data3: 0x4e44, - Data4: [8]uint8{0x85, 0x6b, 0x62, 0x45, 0xe6, 0x9f, 0x46, 0x20}, +// fdb52da4-d1ce-4706-b990-bc20fe25b793 +var TestWindowsGcsHvsockServiceID = guid.GUID{ + Data1: 0xfdb52da4, + Data2: 0xd1ce, + Data3: 0x4706, + Data4: [8]uint8{0xb9, 0x90, 0xbc, 0x20, 0xfe, 0x25, 0xb7, 0x93}, } // e0e16197-dd56-4a10-9195-5ee7a155a838 @@ -104,6 +105,7 @@ func main() { log.SetOutput(f) + // 1. Connect to client hvsockAddr := &winio.HvsockAddr{ VMID: HV_GUID_PARENT, ServiceID: WindowsSidecarGcsHvsockServiceID, @@ -111,7 +113,7 @@ func main() { ctx := context.Background() fmt.Printf("dialing gcs at address %v", hvsockAddr) - gcsConn, err := winio.Dial(ctx, hvsockAddr) + shimConn, err := winio.Dial(ctx, hvsockAddr) if err != nil { // error dialing the address fmt.Printf("Error dialing gcs at address %v with err %v", hvsockAddr, err) @@ -119,10 +121,41 @@ func main() { return } + // 2. + + serverListener, err := winio.ListenHvsock(&winio.HvsockAddr{ + VMID: HV_GUID_LOOPBACK, + //HV_GUID_SILOHOST, + //HV_GUID_PARENT, + //HV_GUID_LOOPBACK, + ServiceID: TestWindowsGcsHvsockServiceID, + }) + if err != nil { + log.Printf("Error to start server for sidecar <-> inbox gcs communication") + return + } + + var sidecarGcsListener net.Listener + sidecarGcsListener = serverListener + + // accept connection + //conn, err = listener.Accept() + log.Printf("Waiting for service connection from inbox GCS \n") + var serverCon net.Conn + //??? serverCon, err = acceptAndClose(ctx, sidecarGcsListener, hcsshimCon) + serverCon, err = sidecarGcsListener.Accept() + if err != nil { + log.Printf("Err accepting connection %v", err) + return + } + var wg sync.WaitGroup wg.Add(1) - go recvFromSidecarAndSendResponse(gcsConn) + go recvFromSidecarAndSendResponse(shimConn) + + go recvFromGcsAndSendResponse(serverCon) + wg.Wait() /// /* @@ -165,8 +198,54 @@ func recvFromSidecarAndSendResponse(gcsConn *winio.HvsockConn) { } str := string(buffer[:length]) - replyString := fmt.Sprintf("GCS: Received command %s", str) - fmt.Printf("GCS: Received command %d\t:%s\n", length, str) + replyString := fmt.Sprintf("hcsshim: Received command %s", str) + fmt.Printf("shimResponse: Received command %d\t:%s\n", length, str) + + /* + if strings.HasPrefix(str, "CreateContainer") { + _, err := hvsockCon.Write([]byte(fmt.Sprintf("!! ACK CreateContainer request at time %v \n", time.Now()))) + if err != nil { + log.Printf("!! Error writing CreateContainer response from sidecar GCS with error %v", err) + return + } + } else if strings.HasPrefix(str, "MountVolume") { + _, err := hvsockCon.Write([]byte(fmt.Sprintf("!! ACK MountVolume request at time %v \n", time.Now()))) + if err != nil { + log.Printf("!! Error writing MountVolume response from sidecar GCS with error %v", err) + return + } + } + */ + + _, err = gcsConn.Write([]byte(replyString)) + if err != nil { + fmt.Printf("!! Error replying from gcs to sidecar with error %v", err) + return + } + } +} + +func recvFromGcsAndSendResponse(gcsConn net.Conn) { + fmt.Printf("Receive loop \n") + buffer := make([]byte, 1024) + + replyString := "hello from sidecar" + _, err := gcsConn.Write([]byte(replyString)) + if err != nil { + fmt.Printf("!! Error replying from gcs to sidecar with error %v", err) + return + } + + for { + length, err := gcsConn.Read(buffer) + if err != nil { + fmt.Printf("Error reading from inbox gcs with err %v", err) + return + } + + str := string(buffer[:length]) + replyString := fmt.Sprintf("InboxGCS: Received command %s", str) + fmt.Printf("InboxGCS response: Received command %d\t:%s\n", length, str) /* if strings.HasPrefix(str, "CreateContainer") { diff --git a/cmd/test-inbox-gcs/main.go b/cmd/test-inbox-gcs/main.go new file mode 100644 index 0000000000..dee3d3a18e --- /dev/null +++ b/cmd/test-inbox-gcs/main.go @@ -0,0 +1,204 @@ +package main + +import ( + "context" + "fmt" + "log" + "net" + "os" + "strings" + "sync" + + "github.com/Microsoft/go-winio" + "github.com/Microsoft/go-winio/pkg/guid" +) + +var WindowsSidecarGcsHvsockServiceID = guid.GUID{ + Data1: 0xae8da506, + Data2: 0xa019, + Data3: 0x4553, + Data4: [8]uint8{0xa5, 0x2b, 0x90, 0x2b, 0xc0, 0xfa, 0x04, 0x11}, +} + +// fdb52da4-d1ce-4706-b990-bc20fe25b793 +var TestWindowsGcsHvsockServiceID = guid.GUID{ + Data1: 0xfdb52da4, + Data2: 0xd1ce, + Data3: 0x4706, + Data4: [8]uint8{0xb9, 0x90, 0xbc, 0x20, 0xfe, 0x25, 0xb7, 0x93}, +} + +func handleRequest(conn net.Conn) { + log.Printf("Sending reply \n") + for { + /* + buffer := make([]byte, 1024) + + // use bufio.Scanner + length, err := conn.Read(buffer) + if err != nil { + //log.Panicln(err) + errString := fmt.Sprintf("%s", err) + if !strings.Contains(errString, "EOF") { + log.Printf("error reading %s", err) + } else { + continue + } + } + + str := string(buffer[:length]) + log.Printf("Received command %d\t:%s\n", length, str) + */ + + str := "CreateContainer request" + //strreply := fmt.Sprintf("I got %s", str) + _, err := conn.Write([]byte(str + "\n")) + if err != nil { + errString := fmt.Sprintf("%s", err) + if !strings.Contains(errString, "EOF") { + log.Printf("error sending reply %s", err) + } + } + + buffer := make([]byte, 1024) + + // use bufio.Scanner + length, err := conn.Read(buffer) + if err != nil { + //log.Panicln(err) + errString := fmt.Sprintf("%s", err) + if !strings.Contains(errString, "EOF") { + log.Printf("error reading %s", err) + } else { + continue + } + } + + strResp := string(buffer[:length]) + log.Printf("Received response on server side: %d\t:%s\n", length, strResp) + + } +} + +var WindowsGcsHvsockServiceID = guid.GUID{ + Data1: 0xacef5661, + Data2: 0x84a1, + Data3: 0x4e44, + Data4: [8]uint8{0x85, 0x6b, 0x62, 0x45, 0xe6, 0x9f, 0x46, 0x20}, +} + +// e0e16197-dd56-4a10-9195-5ee7a155a838 +var HV_GUID_LOOPBACK = guid.GUID{ + Data1: 0xe0e16197, + Data2: 0xdd56, + Data3: 0x4a10, + Data4: [8]uint8{0x91, 0x95, 0x5e, 0xe7, 0xa1, 0x55, 0xa8, 0x38}, +} + +// a42e7cda-d03f-480c-9cc2-a4de20abb878 +var HV_GUID_PARENT = guid.GUID{ + Data1: 0xa42e7cda, + Data2: 0xd03f, + Data3: 0x480c, + Data4: [8]uint8{0x9c, 0xc2, 0xa4, 0xde, 0x20, 0xab, 0xb8, 0x78}, +} + +func main() { + f, err := os.OpenFile("C:\\test-inbox-gcs.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) + if err != nil { + log.Fatalln(fmt.Errorf("error opening file: %v", err)) + } + defer f.Close() + + log.SetOutput(f) + + // 1. Connect to client + hvsockAddr := &winio.HvsockAddr{ + VMID: HV_GUID_LOOPBACK, + ServiceID: TestWindowsGcsHvsockServiceID, + } + + ctx := context.Background() + fmt.Printf("dialing gcs at address %v", hvsockAddr) + shimConn, err := winio.Dial(ctx, hvsockAddr) + if err != nil { + // error dialing the address + fmt.Printf("Error dialing gcs at address %v with err %v", hvsockAddr, err) + log.Printf("Error dialing gcs at address %v", hvsockAddr) + return + } + + var wg sync.WaitGroup + wg.Add(1) + + go recvFromSidecarAndSendResponse(shimConn) + + wg.Wait() + /// + /* + listener, err := winio.ListenHvsock(hvsockAddr) + if err != nil { + //return err + fmt.Printf("!! err listening to sock add with err %v", err) + return + } + + fmt.Printf("! Listeing to server at %v", hvsockAddr) + + log.Printf("! Listeing to server at %v", hvsockAddr) + var sidecarGcsListener net.Listener + sidecarGcsListener = listener + + var conn net.Conn + + for { + //conn, err = listener.Accept() + conn, err = sidecarGcsListener.Accept() + if err != nil { + log.Printf("Err accepting connection %v", err) + } + log.Printf("got a new connection con: %v", conn) + go handleRequest(conn) + } + */ +} + +func recvFromSidecarAndSendResponse(gcsConn *winio.HvsockConn) { + fmt.Printf("Receive loop \n") + buffer := make([]byte, 1024) + + for { + length, err := gcsConn.Read(buffer) + if err != nil { + fmt.Printf("Error reading from inbox gcs with err %v", err) + return + } + + str := string(buffer[:length]) + log.Printf("sidecar: Received command %s", str) + replyString := fmt.Sprintf("sidecar: Received command %s", str) + fmt.Printf("sidecarResponse: Received command %d\t:%s\n", length, str) + + /* + if strings.HasPrefix(str, "CreateContainer") { + _, err := hvsockCon.Write([]byte(fmt.Sprintf("!! ACK CreateContainer request at time %v \n", time.Now()))) + if err != nil { + log.Printf("!! Error writing CreateContainer response from sidecar GCS with error %v", err) + return + } + } else if strings.HasPrefix(str, "MountVolume") { + _, err := hvsockCon.Write([]byte(fmt.Sprintf("!! ACK MountVolume request at time %v \n", time.Now()))) + if err != nil { + log.Printf("!! Error writing MountVolume response from sidecar GCS with error %v", err) + return + } + } + */ + + _, err = gcsConn.Write([]byte(replyString)) + if err != nil { + fmt.Printf("!! Error replying from gcs to sidecar with error %v", err) + return + } + } +}