From 880bb2b7b85e28bd70b533d30e7723f0f522ee58 Mon Sep 17 00:00:00 2001 From: Julio Montes Date: Wed, 11 Sep 2019 15:46:41 +0000 Subject: [PATCH] virtcontainers: introducing HybridVSock type This new socket type is currently supported only by the firecracker hypervisor. For more details about its internal implementation see: https://github.com/firecracker-microvm/firecracker/blob/master/docs/vsock.md Signed-off-by: Julio Montes --- virtcontainers/hypervisor.go | 4 ++++ virtcontainers/kata_agent.go | 7 +++++++ virtcontainers/types/sandbox.go | 17 +++++++++++++++++ 3 files changed, 28 insertions(+) diff --git a/virtcontainers/hypervisor.go b/virtcontainers/hypervisor.go index a65fb7ecd7..7538baa2c8 100644 --- a/virtcontainers/hypervisor.go +++ b/virtcontainers/hypervisor.go @@ -104,6 +104,10 @@ const ( // memoryDevice is memory device type memoryDev + + // hybridVirtioVsockDev is a hybrid virtio-vsock device supported + // only on certain hypervisors, like firecracker. + hybridVirtioVsockDev ) type memoryDevice struct { diff --git a/virtcontainers/kata_agent.go b/virtcontainers/kata_agent.go index 4cb104d16b..fa6297930b 100644 --- a/virtcontainers/kata_agent.go +++ b/virtcontainers/kata_agent.go @@ -342,6 +342,8 @@ func (k *kataAgent) agentURL() (string, error) { return s.HostPath, nil case kataVSOCK: return s.String(), nil + case types.HybridVSock: + return s.String(), nil default: return "", fmt.Errorf("Invalid socket type") } @@ -398,6 +400,11 @@ func (k *kataAgent) configure(h hypervisor, id, sharePath string, builtin bool, return err } k.vmSocket = s + case types.HybridVSock: + err = h.addDevice(s, hybridVirtioVsockDev) + if err != nil { + return err + } default: return vcTypes.ErrInvalidConfigType } diff --git a/virtcontainers/types/sandbox.go b/virtcontainers/types/sandbox.go index 655821c11b..d2b930fc2a 100644 --- a/virtcontainers/types/sandbox.go +++ b/virtcontainers/types/sandbox.go @@ -29,6 +29,8 @@ const ( StateStopped StateString = "stopped" ) +const HybridVSockScheme = "hvsock" + // SandboxState is a sandbox state structure type SandboxState struct { State StateString `json:"state"` @@ -161,6 +163,21 @@ func (v *Volumes) String() string { return strings.Join(volSlice, " ") } +// HybridVSock defines a hybrid vsocket to communicate between +// the host and any process inside the VM. +// This is a virtio-vsock implementation based on AF_VSOCK on the +// guest side and multiple AF_UNIX sockets on the host side. +// This kind of socket is not supported in all hypervisors. +// Firecracker supports it. +type HybridVSock struct { + UdsPath string + Port uint32 +} + +func (s *HybridVSock) String() string { + return fmt.Sprintf("%s://%s:%d", HybridVSockScheme, s.UdsPath, s.Port) +} + // Socket defines a socket to communicate between // the host and any process inside the VM. type Socket struct {