diff --git a/src/runtime/virtcontainers/network_linux.go b/src/runtime/virtcontainers/network_linux.go index 3d9f7b7d2c..30819bb30b 100644 --- a/src/runtime/virtcontainers/network_linux.go +++ b/src/runtime/virtcontainers/network_linux.go @@ -252,6 +252,22 @@ func (n *LinuxNetwork) removeSingleEndpoint(ctx context.Context, s *Sandbox, idx return nil } +func (n *LinuxNetwork) endpointAlreadyAdded(netInfo *NetworkInfo) bool { + for _, ep := range n.eps { + // Existing endpoint + if ep.Name() == netInfo.Iface.Name { + return true + } + pair := ep.NetworkPair() + // Existing virtual endpoints + if pair != nil && (pair.TapInterface.Name == netInfo.Iface.Name || pair.TapInterface.TAPIface.Name == netInfo.Iface.Name || pair.VirtIface.Name == netInfo.Iface.Name) { + return true + } + } + + return false +} + // Scan the networking namespace through netlink and then: // 1. Create the endpoints for the relevant interfaces found there. // 2. Attach them to the VM. @@ -292,6 +308,12 @@ func (n *LinuxNetwork) addAllEndpoints(ctx context.Context, s *Sandbox, hotplug continue } + // Skip any interfaces that are already added + if n.endpointAlreadyAdded(&netInfo) { + networkLogger().WithField("endpoint", netInfo.Iface.Name).Info("already added") + continue + } + if err := doNetNS(n.netNSPath, func(_ ns.NetNS) error { _, err = n.addSingleEndpoint(ctx, s, netInfo, hotplug) return err