mirror of
https://github.com/kata-containers/kata-containers.git
synced 2025-10-09 16:03:36 +00:00
The tuntap network device is for tuntap interfaces to connect to the container. A specific use case is the slirp4netns tap interface for rootless kata-runtime. Fixes: #1878 Signed-off-by: Gabi Beyer <gabrielle.n.beyer@intel.com>
224 lines
5.2 KiB
Go
224 lines
5.2 KiB
Go
// Copyright (c) 2018 Intel Corporation
|
|
//
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
//
|
|
|
|
package virtcontainers
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
persistapi "github.com/kata-containers/runtime/virtcontainers/persist/api"
|
|
)
|
|
|
|
// Endpoint represents a physical or virtual network interface.
|
|
type Endpoint interface {
|
|
Properties() NetworkInfo
|
|
Name() string
|
|
HardwareAddr() string
|
|
Type() EndpointType
|
|
PciAddr() string
|
|
NetworkPair() *NetworkInterfacePair
|
|
|
|
SetProperties(NetworkInfo)
|
|
SetPciAddr(string)
|
|
Attach(hypervisor) error
|
|
Detach(netNsCreated bool, netNsPath string) error
|
|
HotAttach(h hypervisor) error
|
|
HotDetach(h hypervisor, netNsCreated bool, netNsPath string) error
|
|
|
|
save() persistapi.NetworkEndpoint
|
|
load(persistapi.NetworkEndpoint)
|
|
}
|
|
|
|
// EndpointType identifies the type of the network endpoint.
|
|
type EndpointType string
|
|
|
|
const (
|
|
// PhysicalEndpointType is the physical network interface.
|
|
PhysicalEndpointType EndpointType = "physical"
|
|
|
|
// VethEndpointType is the virtual network interface.
|
|
VethEndpointType EndpointType = "virtual"
|
|
|
|
// VhostUserEndpointType is the vhostuser network interface.
|
|
VhostUserEndpointType EndpointType = "vhost-user"
|
|
|
|
// BridgedMacvlanEndpointType is macvlan network interface.
|
|
BridgedMacvlanEndpointType EndpointType = "macvlan"
|
|
|
|
// MacvtapEndpointType is macvtap network interface.
|
|
MacvtapEndpointType EndpointType = "macvtap"
|
|
|
|
// TapEndpointType is tap network interface.
|
|
TapEndpointType EndpointType = "tap"
|
|
|
|
// TuntapEndpointType is a tap network interface.
|
|
TuntapEndpointType EndpointType = "tuntap"
|
|
|
|
// IPVlanEndpointType is ipvlan network interface.
|
|
IPVlanEndpointType EndpointType = "ipvlan"
|
|
)
|
|
|
|
// Set sets an endpoint type based on the input string.
|
|
func (endpointType *EndpointType) Set(value string) error {
|
|
switch value {
|
|
case "physical":
|
|
*endpointType = PhysicalEndpointType
|
|
return nil
|
|
case "virtual":
|
|
*endpointType = VethEndpointType
|
|
return nil
|
|
case "vhost-user":
|
|
*endpointType = VhostUserEndpointType
|
|
return nil
|
|
case "macvlan":
|
|
*endpointType = BridgedMacvlanEndpointType
|
|
return nil
|
|
case "macvtap":
|
|
*endpointType = MacvtapEndpointType
|
|
return nil
|
|
case "tap":
|
|
*endpointType = TapEndpointType
|
|
return nil
|
|
case "tuntap":
|
|
*endpointType = TuntapEndpointType
|
|
return nil
|
|
case "ipvlan":
|
|
*endpointType = IPVlanEndpointType
|
|
return nil
|
|
default:
|
|
return fmt.Errorf("Unknown endpoint type %s", value)
|
|
}
|
|
}
|
|
|
|
// String converts an endpoint type to a string.
|
|
func (endpointType *EndpointType) String() string {
|
|
switch *endpointType {
|
|
case PhysicalEndpointType:
|
|
return string(PhysicalEndpointType)
|
|
case VethEndpointType:
|
|
return string(VethEndpointType)
|
|
case VhostUserEndpointType:
|
|
return string(VhostUserEndpointType)
|
|
case BridgedMacvlanEndpointType:
|
|
return string(BridgedMacvlanEndpointType)
|
|
case MacvtapEndpointType:
|
|
return string(MacvtapEndpointType)
|
|
case TapEndpointType:
|
|
return string(TapEndpointType)
|
|
case TuntapEndpointType:
|
|
return string(TuntapEndpointType)
|
|
case IPVlanEndpointType:
|
|
return string(IPVlanEndpointType)
|
|
default:
|
|
return ""
|
|
}
|
|
}
|
|
|
|
func saveTapIf(tapif *TapInterface) *persistapi.TapInterface {
|
|
if tapif == nil {
|
|
return nil
|
|
}
|
|
|
|
return &persistapi.TapInterface{
|
|
ID: tapif.ID,
|
|
Name: tapif.Name,
|
|
TAPIface: persistapi.NetworkInterface{
|
|
Name: tapif.TAPIface.Name,
|
|
HardAddr: tapif.TAPIface.HardAddr,
|
|
Addrs: tapif.TAPIface.Addrs,
|
|
},
|
|
}
|
|
}
|
|
|
|
func loadTapIf(tapif *persistapi.TapInterface) *TapInterface {
|
|
if tapif == nil {
|
|
return nil
|
|
}
|
|
|
|
return &TapInterface{
|
|
ID: tapif.ID,
|
|
Name: tapif.Name,
|
|
TAPIface: NetworkInterface{
|
|
Name: tapif.TAPIface.Name,
|
|
HardAddr: tapif.TAPIface.HardAddr,
|
|
Addrs: tapif.TAPIface.Addrs,
|
|
},
|
|
}
|
|
}
|
|
|
|
func saveNetIfPair(pair *NetworkInterfacePair) *persistapi.NetworkInterfacePair {
|
|
if pair == nil {
|
|
return nil
|
|
}
|
|
|
|
epVirtIf := pair.VirtIface
|
|
|
|
tapif := saveTapIf(&pair.TapInterface)
|
|
|
|
virtif := persistapi.NetworkInterface{
|
|
Name: epVirtIf.Name,
|
|
HardAddr: epVirtIf.HardAddr,
|
|
Addrs: epVirtIf.Addrs,
|
|
}
|
|
|
|
return &persistapi.NetworkInterfacePair{
|
|
TapInterface: *tapif,
|
|
VirtIface: virtif,
|
|
NetInterworkingModel: int(pair.NetInterworkingModel),
|
|
}
|
|
}
|
|
|
|
func loadNetIfPair(pair *persistapi.NetworkInterfacePair) *NetworkInterfacePair {
|
|
if pair == nil {
|
|
return nil
|
|
}
|
|
|
|
savedVirtIf := pair.VirtIface
|
|
|
|
tapif := loadTapIf(&pair.TapInterface)
|
|
|
|
virtif := NetworkInterface{
|
|
Name: savedVirtIf.Name,
|
|
HardAddr: savedVirtIf.HardAddr,
|
|
Addrs: savedVirtIf.Addrs,
|
|
}
|
|
|
|
return &NetworkInterfacePair{
|
|
TapInterface: *tapif,
|
|
VirtIface: virtif,
|
|
NetInterworkingModel: NetInterworkingModel(pair.NetInterworkingModel),
|
|
}
|
|
}
|
|
|
|
func saveTuntapIf(tuntapif *TuntapInterface) *persistapi.TuntapInterface {
|
|
if tuntapif == nil {
|
|
return nil
|
|
}
|
|
|
|
return &persistapi.TuntapInterface{
|
|
Name: tuntapif.Name,
|
|
TAPIface: persistapi.NetworkInterface{
|
|
Name: tuntapif.TAPIface.Name,
|
|
HardAddr: tuntapif.TAPIface.HardAddr,
|
|
Addrs: tuntapif.TAPIface.Addrs,
|
|
},
|
|
}
|
|
}
|
|
|
|
func loadTuntapIf(tuntapif *persistapi.TuntapInterface) *TuntapInterface {
|
|
if tuntapif == nil {
|
|
return nil
|
|
}
|
|
|
|
return &TuntapInterface{
|
|
Name: tuntapif.Name,
|
|
TAPIface: NetworkInterface{
|
|
Name: tuntapif.TAPIface.Name,
|
|
HardAddr: tuntapif.TAPIface.HardAddr,
|
|
Addrs: tuntapif.TAPIface.Addrs,
|
|
},
|
|
}
|
|
}
|