in drivers/vector_kern.c [1144:1194]
static int vector_net_close(struct net_device *dev)
{
struct vector_private *vp = netdev_priv(dev);
unsigned long flags;
netif_stop_queue(dev);
del_timer(&vp->tl);
if (vp->fds == NULL)
return 0;
/* Disable and free all IRQS */
if (vp->rx_irq > 0) {
um_free_irq(vp->rx_irq, dev);
vp->rx_irq = 0;
}
if (vp->tx_irq > 0) {
um_free_irq(vp->tx_irq, dev);
vp->tx_irq = 0;
}
tasklet_kill(&vp->tx_poll);
if (vp->fds->rx_fd > 0) {
if (vp->bpf)
uml_vector_detach_bpf(vp->fds->rx_fd, vp->bpf);
os_close_file(vp->fds->rx_fd);
vp->fds->rx_fd = -1;
}
if (vp->fds->tx_fd > 0) {
os_close_file(vp->fds->tx_fd);
vp->fds->tx_fd = -1;
}
if (vp->bpf != NULL)
kfree(vp->bpf->filter);
kfree(vp->bpf);
vp->bpf = NULL;
kfree(vp->fds->remote_addr);
kfree(vp->transport_data);
kfree(vp->header_rxbuffer);
kfree(vp->header_txbuffer);
if (vp->rx_queue != NULL)
destroy_queue(vp->rx_queue);
if (vp->tx_queue != NULL)
destroy_queue(vp->tx_queue);
kfree(vp->fds);
vp->fds = NULL;
spin_lock_irqsave(&vp->lock, flags);
vp->opened = false;
vp->in_error = false;
spin_unlock_irqrestore(&vp->lock, flags);
return 0;
}