diff options
-rw-r--r-- | hw/usb-net.c | 3 | ||||
-rw-r--r-- | net.h | 1 | ||||
-rw-r--r-- | vl.c | 13 |
3 files changed, 16 insertions, 1 deletions
diff --git a/hw/usb-net.c b/hw/usb-net.c index 0f62f88340..56210b52ec 100644 --- a/hw/usb-net.c +++ b/hw/usb-net.c @@ -1418,7 +1418,8 @@ static void usb_net_handle_destroy(USBDevice *dev) { USBNetState *s = (USBNetState *) dev; - /* FIXME: delete the VLAN client and the nic */ + /* TODO: remove the nd_table[] entry */ + qemu_del_vlan_client(s->vc); rndis_clear_responsequeue(s); qemu_free(s); } @@ -28,6 +28,7 @@ VLANClientState *qemu_new_vlan_client(VLANState *vlan, IOReadHandler *fd_read, IOCanRWHandler *fd_can_read, void *opaque); +void qemu_del_vlan_client(VLANClientState *vc); int qemu_can_send_packet(VLANClientState *vc); void qemu_send_packet(VLANClientState *vc, const uint8_t *buf, int size); void qemu_handler_true(void *opaque); @@ -3870,6 +3870,19 @@ VLANClientState *qemu_new_vlan_client(VLANState *vlan, return vc; } +void qemu_del_vlan_client(VLANClientState *vc) +{ + VLANClientState **pvc = &vc->vlan->first_client; + + while (*pvc != NULL) + if (*pvc == vc) { + *pvc = vc->next; + free(vc); + break; + } else + pvc = &(*pvc)->next; +} + int qemu_can_send_packet(VLANClientState *vc1) { VLANState *vlan = vc1->vlan; |