This repository has been archived by the owner on May 12, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 374
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Split endpoint implementations into their own file. Fixes #799 Signed-off-by: Archana Shinde <archana.m.shinde@intel.com>
- Loading branch information
Showing
7 changed files
with
791 additions
and
725 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,116 @@ | ||
// Copyright (c) 2018 Intel Corporation | ||
// | ||
// SPDX-License-Identifier: Apache-2.0 | ||
// | ||
|
||
package virtcontainers | ||
|
||
import ( | ||
"fmt" | ||
|
||
"github.com/containernetworking/plugins/pkg/ns" | ||
) | ||
|
||
// BridgedMacvlanEndpoint represents a macvlan endpoint that is bridged to the VM | ||
type BridgedMacvlanEndpoint struct { | ||
NetPair NetworkInterfacePair | ||
EndpointProperties NetworkInfo | ||
EndpointType EndpointType | ||
PCIAddr string | ||
} | ||
|
||
func createBridgedMacvlanNetworkEndpoint(idx int, ifName string, interworkingModel NetInterworkingModel) (*BridgedMacvlanEndpoint, error) { | ||
if idx < 0 { | ||
return &BridgedMacvlanEndpoint{}, fmt.Errorf("invalid network endpoint index: %d", idx) | ||
} | ||
|
||
netPair, err := createNetworkInterfacePair(idx, ifName, interworkingModel) | ||
if err != nil { | ||
return nil, err | ||
} | ||
|
||
endpoint := &BridgedMacvlanEndpoint{ | ||
NetPair: netPair, | ||
EndpointType: BridgedMacvlanEndpointType, | ||
} | ||
if ifName != "" { | ||
endpoint.NetPair.VirtIface.Name = ifName | ||
} | ||
|
||
return endpoint, nil | ||
} | ||
|
||
// Properties returns properties of the interface. | ||
func (endpoint *BridgedMacvlanEndpoint) Properties() NetworkInfo { | ||
return endpoint.EndpointProperties | ||
} | ||
|
||
// Name returns name of the veth interface in the network pair. | ||
func (endpoint *BridgedMacvlanEndpoint) Name() string { | ||
return endpoint.NetPair.VirtIface.Name | ||
} | ||
|
||
// HardwareAddr returns the mac address that is assigned to the tap interface | ||
// in th network pair. | ||
func (endpoint *BridgedMacvlanEndpoint) HardwareAddr() string { | ||
return endpoint.NetPair.TAPIface.HardAddr | ||
} | ||
|
||
// Type identifies the endpoint as a virtual endpoint. | ||
func (endpoint *BridgedMacvlanEndpoint) Type() EndpointType { | ||
return endpoint.EndpointType | ||
} | ||
|
||
// SetProperties sets the properties for the endpoint. | ||
func (endpoint *BridgedMacvlanEndpoint) SetProperties(properties NetworkInfo) { | ||
endpoint.EndpointProperties = properties | ||
} | ||
|
||
// PciAddr returns the PCI address of the endpoint. | ||
func (endpoint *BridgedMacvlanEndpoint) PciAddr() string { | ||
return endpoint.PCIAddr | ||
} | ||
|
||
// NetworkPair returns the network pair of the endpoint. | ||
func (endpoint *BridgedMacvlanEndpoint) NetworkPair() *NetworkInterfacePair { | ||
return &endpoint.NetPair | ||
} | ||
|
||
// Attach for virtual endpoint bridges the network pair and adds the | ||
// tap interface of the network pair to the hypervisor. | ||
func (endpoint *BridgedMacvlanEndpoint) Attach(h hypervisor) error { | ||
networkLogger().Info("Attaching macvlan endpoint") | ||
if err := xconnectVMNetwork(endpoint, true, h.hypervisorConfig().NumVCPUs, h.hypervisorConfig().DisableVhostNet); err != nil { | ||
networkLogger().WithError(err).Error("Error bridging virtual ep") | ||
return err | ||
} | ||
|
||
return h.addDevice(endpoint, netDev) | ||
} | ||
|
||
// Detach for the virtual endpoint tears down the tap and bridge | ||
// created for the veth interface. | ||
func (endpoint *BridgedMacvlanEndpoint) Detach(netNsCreated bool, netNsPath string) error { | ||
// The network namespace would have been deleted at this point | ||
// if it has not been created by virtcontainers. | ||
if !netNsCreated { | ||
return nil | ||
} | ||
|
||
networkLogger().Info("Detaching virtual endpoint") | ||
|
||
return doNetNS(netNsPath, func(_ ns.NetNS) error { | ||
//return xconnectVMNetwork(&(endpoint.NetPair), false, 0, false, endpoint.EndpointType) | ||
return xconnectVMNetwork(endpoint, false, 0, false) | ||
}) | ||
} | ||
|
||
// HotAttach for physical endpoint not supported yet | ||
func (endpoint *BridgedMacvlanEndpoint) HotAttach(h hypervisor) error { | ||
return fmt.Errorf("BridgedMacvlanEndpoint does not support Hot attach") | ||
} | ||
|
||
// HotDetach for physical endpoint not supported yet | ||
func (endpoint *BridgedMacvlanEndpoint) HotDetach(h hypervisor, netNsCreated bool, netNsPath string) error { | ||
return fmt.Errorf("BridgedMacvlanEndpoint does not support Hot detach") | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,87 @@ | ||
// Copyright (c) 2018 Intel Corporation | ||
// | ||
// SPDX-License-Identifier: Apache-2.0 | ||
// | ||
|
||
package virtcontainers | ||
|
||
import ( | ||
"fmt" | ||
) | ||
|
||
// 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) | ||
Attach(hypervisor) error | ||
Detach(netNsCreated bool, netNsPath string) error | ||
HotAttach(h hypervisor) error | ||
HotDetach(h hypervisor, netNsCreated bool, netNsPath string) error | ||
} | ||
|
||
// EndpointType identifies the type of the network endpoint. | ||
type EndpointType string | ||
|
||
const ( | ||
// PhysicalEndpointType is the physical network interface. | ||
PhysicalEndpointType EndpointType = "physical" | ||
|
||
// VirtualEndpointType is the virtual network interface. | ||
VirtualEndpointType 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" | ||
) | ||
|
||
// 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 = VirtualEndpointType | ||
return nil | ||
case "vhost-user": | ||
*endpointType = VhostUserEndpointType | ||
return nil | ||
case "macvlan": | ||
*endpointType = BridgedMacvlanEndpointType | ||
return nil | ||
case "macvtap": | ||
*endpointType = MacvtapEndpointType | ||
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 VirtualEndpointType: | ||
return string(VirtualEndpointType) | ||
case VhostUserEndpointType: | ||
return string(VhostUserEndpointType) | ||
case BridgedMacvlanEndpointType: | ||
return string(BridgedMacvlanEndpointType) | ||
case MacvtapEndpointType: | ||
return string(MacvtapEndpointType) | ||
default: | ||
return "" | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,101 @@ | ||
// Copyright (c) 2018 Intel Corporation | ||
// | ||
// SPDX-License-Identifier: Apache-2.0 | ||
// | ||
|
||
package virtcontainers | ||
|
||
import ( | ||
"fmt" | ||
"os" | ||
) | ||
|
||
// MacvtapEndpoint represents a macvtap endpoint | ||
type MacvtapEndpoint struct { | ||
EndpointProperties NetworkInfo | ||
EndpointType EndpointType | ||
VMFds []*os.File | ||
VhostFds []*os.File | ||
PCIAddr string | ||
} | ||
|
||
func createMacvtapNetworkEndpoint(netInfo NetworkInfo) (*MacvtapEndpoint, error) { | ||
endpoint := &MacvtapEndpoint{ | ||
EndpointType: MacvtapEndpointType, | ||
EndpointProperties: netInfo, | ||
} | ||
|
||
return endpoint, nil | ||
} | ||
|
||
// Properties returns the properties of the macvtap interface. | ||
func (endpoint *MacvtapEndpoint) Properties() NetworkInfo { | ||
return endpoint.EndpointProperties | ||
} | ||
|
||
// HardwareAddr returns the mac address of the macvtap network interface. | ||
func (endpoint *MacvtapEndpoint) HardwareAddr() string { | ||
return endpoint.EndpointProperties.Iface.HardwareAddr.String() | ||
} | ||
|
||
// Name returns name of the macvtap interface. | ||
func (endpoint *MacvtapEndpoint) Name() string { | ||
return endpoint.EndpointProperties.Iface.Name | ||
} | ||
|
||
// Type indentifies the endpoint as a macvtap endpoint. | ||
func (endpoint *MacvtapEndpoint) Type() EndpointType { | ||
return endpoint.EndpointType | ||
} | ||
|
||
// SetProperties sets the properties of the macvtap endpoint. | ||
func (endpoint *MacvtapEndpoint) SetProperties(properties NetworkInfo) { | ||
endpoint.EndpointProperties = properties | ||
} | ||
|
||
// Attach for macvtap endpoint passes macvtap device to the hypervisor. | ||
func (endpoint *MacvtapEndpoint) Attach(h hypervisor) error { | ||
networkLogger().WithField("endpoint-type", "macvtap").Info("Attaching endpoint") | ||
var err error | ||
|
||
endpoint.VMFds, err = createMacvtapFds(endpoint.EndpointProperties.Iface.Index, int(h.hypervisorConfig().NumVCPUs)) | ||
if err != nil { | ||
return fmt.Errorf("Could not setup macvtap fds %s: %s", endpoint.EndpointProperties.Iface.Name, err) | ||
} | ||
|
||
if !h.hypervisorConfig().DisableVhostNet { | ||
vhostFds, err := createVhostFds(int(h.hypervisorConfig().NumVCPUs)) | ||
if err != nil { | ||
return fmt.Errorf("Could not setup vhost fds %s : %s", endpoint.EndpointProperties.Iface.Name, err) | ||
} | ||
endpoint.VhostFds = vhostFds | ||
} | ||
|
||
return h.addDevice(endpoint, netDev) | ||
} | ||
|
||
// Detach for macvtap endpoint does nothing. | ||
func (endpoint *MacvtapEndpoint) Detach(netNsCreated bool, netNsPath string) error { | ||
networkLogger().WithField("endpoint-type", "macvtap").Info("Detaching endpoint") | ||
return nil | ||
} | ||
|
||
// HotAttach for macvtap endpoint not supported yet | ||
func (endpoint *MacvtapEndpoint) HotAttach(h hypervisor) error { | ||
return fmt.Errorf("MacvtapEndpoint does not support Hot attach") | ||
} | ||
|
||
// HotDetach for macvtap endpoint not supported yet | ||
func (endpoint *MacvtapEndpoint) HotDetach(h hypervisor, netNsCreated bool, netNsPath string) error { | ||
return fmt.Errorf("MacvtapEndpoint does not support Hot detach") | ||
} | ||
|
||
// PciAddr returns the PCI address of the endpoint. | ||
func (endpoint *MacvtapEndpoint) PciAddr() string { | ||
return endpoint.PCIAddr | ||
} | ||
|
||
// NetworkPair returns the network pair of the endpoint. | ||
func (endpoint *MacvtapEndpoint) NetworkPair() *NetworkInterfacePair { | ||
return nil | ||
} |
Oops, something went wrong.