diff --git a/hypervisor/events.go b/hypervisor/events.go index e8a2f3a8..2302b257 100644 --- a/hypervisor/events.go +++ b/hypervisor/events.go @@ -52,6 +52,7 @@ type InterfaceCreated struct { Id string //user specified in (ref api.InterfaceDescription: a user identifier of interface, user may use this to specify a nic, normally you can use IPAddr as an Id.) Index int PCIAddr int + TapFd int Bridge string HostDevice string DeviceName string @@ -73,6 +74,7 @@ type NetDevInsertedEvent struct { Index int DeviceName string Address int + TapFd int } func (ne *NetDevInsertedEvent) ResultId() string { diff --git a/hypervisor/network.go b/hypervisor/network.go index c7860666..bf07a936 100644 --- a/hypervisor/network.go +++ b/hypervisor/network.go @@ -173,6 +173,8 @@ func (nc *NetworkContext) addInterface(inf *api.InterfaceDescription, result cha result <- fe return } else if ni, ok := ev.(*NetDevInsertedEvent); ok { + created := nc.idMap[inf.Id] + created.TapFd = ni.TapFd nc.sandbox.Log(DEBUG, "nic insert success: %s", ni.Id) result <- ni return diff --git a/hypervisor/qemu/qemu.go b/hypervisor/qemu/qemu.go index 7705a0a6..9b71c84a 100644 --- a/hypervisor/qemu/qemu.go +++ b/hypervisor/qemu/qemu.go @@ -297,6 +297,7 @@ func (qc *QemuContext) AddNic(ctx *hypervisor.VmContext, host *hypervisor.HostNi } func (qc *QemuContext) RemoveNic(ctx *hypervisor.VmContext, n *hypervisor.InterfaceCreated, callback hypervisor.VmEvent, result chan<- hypervisor.VmEvent) { + syscall.Close(n.TapFd) newNetworkDelSession(ctx, qc, n.NewName, callback, result) } diff --git a/hypervisor/qemu/qmp_wrapper_amd64.go b/hypervisor/qemu/qmp_wrapper_amd64.go index 8b0ad18b..bf840566 100644 --- a/hypervisor/qemu/qmp_wrapper_amd64.go +++ b/hypervisor/qemu/qmp_wrapper_amd64.go @@ -84,6 +84,7 @@ func newNetworkAddSession(ctx *hypervisor.VmContext, qc *QemuContext, fd int, ho Index: guest.Index, DeviceName: guest.Device, Address: guest.Busaddr, + TapFd: fd, }), } } diff --git a/hypervisor/qemu/qmp_wrapper_arm64.go b/hypervisor/qemu/qmp_wrapper_arm64.go index 74ebaa3d..a713da66 100644 --- a/hypervisor/qemu/qmp_wrapper_arm64.go +++ b/hypervisor/qemu/qmp_wrapper_arm64.go @@ -49,6 +49,7 @@ func newNetworkAddSession(ctx *hypervisor.VmContext, qc *QemuContext, fd int, ho Index: guest.Index, DeviceName: guest.Device, Address: guest.Busaddr, + TapFd: fd, }), } } diff --git a/hypervisor/qemu/qmp_wrapper_ppc64le.go b/hypervisor/qemu/qmp_wrapper_ppc64le.go index 6b82db9e..749e8081 100644 --- a/hypervisor/qemu/qmp_wrapper_ppc64le.go +++ b/hypervisor/qemu/qmp_wrapper_ppc64le.go @@ -47,6 +47,7 @@ func newNetworkAddSession(ctx *hypervisor.VmContext, qc *QemuContext, fd int, ho Index: guest.Index, DeviceName: guest.Device, Address: guest.Busaddr, + TapFd: fd, }), } } diff --git a/hypervisor/qemu/qmp_wrapper_s390x.go b/hypervisor/qemu/qmp_wrapper_s390x.go index b9436ae4..63c0c513 100644 --- a/hypervisor/qemu/qmp_wrapper_s390x.go +++ b/hypervisor/qemu/qmp_wrapper_s390x.go @@ -43,6 +43,7 @@ func newNetworkAddSession(ctx *hypervisor.VmContext, qc *QemuContext, fd int, ho Index: guest.Index, DeviceName: guest.Device, Address: guest.Busaddr, + TapFd: fd, }), } }