kata-containers/src/runtime/virtcontainers/vfio_endpoint.go
Jakob Naucke 2a992c4080
virtcontainers: Add CCW device to endpoint
To support virtio-net-ccw for s390x, add CCW devices to the Endpoint
interface. Add respective fields and functions to implementing structs.

Device paths may be empty. PciPath resolves this by being a list that
may be empty, but this design does not map to CcwDevice. Use a pointer
instead.

Signed-off-by: Jakob Naucke <jakob.naucke@ibm.com>
2025-02-26 11:36:42 +01:00

142 lines
3.8 KiB
Go

// Copyright (c) 2024 NVIDIA Corporation
//
// SPDX-License-Identifier: Apache-2.0
//
package virtcontainers
import (
"context"
"fmt"
persistapi "github.com/kata-containers/kata-containers/src/runtime/virtcontainers/persist/api"
vcTypes "github.com/kata-containers/kata-containers/src/runtime/virtcontainers/types"
)
// VfioEndpoint represents a VFIO endpoint which claimed by guest kernel
type VfioEndpoint struct {
EndpointType EndpointType
HostBDF string
PCIPath vcTypes.PciPath
CCWDevice *vcTypes.CcwDevice
Iface NetworkInterface
EndpointProperties NetworkInfo
}
// Implements Endpoint interface
// Properties returns the properties of the interface.
func (endpoint *VfioEndpoint) Properties() NetworkInfo {
return endpoint.EndpointProperties
}
// Name returns name of the interface.
func (endpoint *VfioEndpoint) Name() string {
return endpoint.Iface.Name
}
// HardwareAddr returns the mac address of the network interface
func (endpoint *VfioEndpoint) HardwareAddr() string {
return endpoint.Iface.HardAddr
}
// Type indentifies the endpoint as a vfio endpoint.
func (endpoint *VfioEndpoint) Type() EndpointType {
return endpoint.EndpointType
}
// PciPath returns the PCI path of the endpoint.
func (endpoint *VfioEndpoint) PciPath() vcTypes.PciPath {
return endpoint.PCIPath
}
// NetworkPair always return nil
func (endpoint *VfioEndpoint) NetworkPair() *NetworkInterfacePair {
return nil
}
// SetProperties sets the properties of the endpoint.
func (endpoint *VfioEndpoint) SetProperties(info NetworkInfo) {
endpoint.EndpointProperties = info
}
// SetPciPath sets the PCI path of the endpoint.
func (endpoint *VfioEndpoint) SetPciPath(path vcTypes.PciPath) {
endpoint.PCIPath = path
}
// CcwDevice returns the CCW device of the endpoint.
func (endpoint *VfioEndpoint) CcwDevice() *vcTypes.CcwDevice {
return endpoint.CCWDevice
}
// SetCcwDevice sets the CCW device of the endpoint.
func (endpoint *VfioEndpoint) SetCcwDevice(ccwDev vcTypes.CcwDevice) {
endpoint.CCWDevice = &ccwDev
}
// Attach for VFIO endpoint
func (endpoint *VfioEndpoint) Attach(ctx context.Context, s *Sandbox) error {
return fmt.Errorf("attach is unsupported for VFIO endpoint")
}
// Detach for VFIO endpoint
func (endpoint *VfioEndpoint) Detach(ctx context.Context, netNsCreated bool, netNsPath string) error {
return fmt.Errorf("detach is unsupported for VFIO endpoint")
}
func (endpoint *VfioEndpoint) HotAttach(context.Context, *Sandbox) error {
return fmt.Errorf("VfioEndpoint does not support Hot attach")
}
func (endpoint *VfioEndpoint) HotDetach(ctx context.Context, s *Sandbox, netNsCreated bool, netNsPath string) error {
return fmt.Errorf("VfioEndpoint does not support Hot detach")
}
func (endpoint *VfioEndpoint) save() persistapi.NetworkEndpoint {
return persistapi.NetworkEndpoint{
Type: string(endpoint.Type()),
Vfio: &persistapi.VfioEndpoint{},
}
}
func (endpoint *VfioEndpoint) load(s persistapi.NetworkEndpoint) {
endpoint.EndpointType = VfioEndpointType
if s.Vfio != nil {
endpoint.Iface.Name = s.Vfio.IfaceName
}
}
func (endpoint *VfioEndpoint) GetRxRateLimiter() bool {
return false
}
func (endpoint *VfioEndpoint) SetRxRateLimiter() error {
return fmt.Errorf("rx rate limiter is unsupported for VFIO endpoint")
}
func (endpoint *VfioEndpoint) GetTxRateLimiter() bool {
return false
}
func (endpoint *VfioEndpoint) SetTxRateLimiter() error {
return fmt.Errorf("tx rate limiter is unsupported for VFIO endpoint")
}
// Create a VFIO endpoint
func createVfioEndpoint(hostBDF string, netInfo *NetworkInfo) (*VfioEndpoint, error) {
endpoint := &VfioEndpoint{
EndpointType: VfioEndpointType,
HostBDF: hostBDF,
Iface: NetworkInterface{
Name: netInfo.Iface.Name,
HardAddr: netInfo.Iface.HardwareAddr.String(),
Addrs: netInfo.Addrs,
},
EndpointProperties: *netInfo,
}
return endpoint, nil
}