void manager_free(Manager *m) { Network *network; NetDev *netdev; Link *link; if (!m) return; udev_monitor_unref(m->udev_monitor); udev_unref(m->udev); sd_bus_unref(m->bus); sd_event_source_unref(m->udev_event_source); sd_event_source_unref(m->sigterm_event_source); sd_event_source_unref(m->sigint_event_source); sd_event_unref(m->event); while ((network = m->networks)) network_free(network); while ((link = hashmap_first(m->links))) link_free(link); hashmap_free(m->links); while ((netdev = hashmap_first(m->netdevs))) netdev_free(netdev); hashmap_free(m->netdevs); sd_rtnl_unref(m->rtnl); free(m); }
static void tun_deinit(void) { int i; for (i = 0; i < TUN_N; i++) { if (!tun_g_array[i]) { break; } /* inetdev_deregister */ netdev_free(tun_g_array[i]); } }
static int tun_init(void) { int err; struct net_device *tdev; char tun_name[16]; int i; for (i = 0; i < TUN_N; i++) { struct tun *tun; snprintf(tun_name, sizeof(tun_name), "tun%d", i); tdev = netdev_alloc(tun_name, &tun_setup, sizeof(struct tun)); if (tdev == NULL) { err = -ENOMEM; goto err_deinit; } err = inetdev_register_dev(tdev); if (err != 0) { goto err_netdev_free; } err = char_dev_register(tun_name, &tun_dev_file_ops); if (err != 0) { goto err_inetdev_deregister; } tun = netdev_priv(tdev, struct tun); mutex_init(&tun->mtx_use); tun_g_array[i] = tdev; } return 0; err_inetdev_deregister: /* inetdev_deregister */ err_netdev_free: netdev_free(tdev); err_deinit: tun_deinit(); return err; }
void state_free(struct state *state) { /* We have to stop the system call thread first, since it's using * sockets that we want to close and reset. */ syscalls_free(state, state->syscalls); /* Then we close the sockets and reset the connections, while * we still have a netdev for injecting reset packets to free * per-connection kernel state. */ close_all_sockets(state); netdev_free(state->netdev); packets_free(state->packets); code_free(state->code); run_unlock(state); if (pthread_mutex_destroy(&state->mutex) != 0) die_perror("pthread_mutex_destroy"); memset(state, 0, sizeof(*state)); /* paranoia to help catch bugs */ free(state); }
void veth_exit(void) { netdev_free(veth); }