int vlan_remove_dynamic(struct hostapd_data *hapd, int vlan_id) { struct hostapd_vlan *vlan; if (vlan_id <= 0 || vlan_id > MAX_VLAN_ID) return 1; wpa_printf(MSG_DEBUG, "VLAN: %s(vlan_id=%d)", __func__, vlan_id); vlan = hapd->conf->vlan; while (vlan) { if (vlan->vlan_id == vlan_id && vlan->dynamic_vlan > 0) { vlan->dynamic_vlan--; break; } vlan = vlan->next; } if (vlan == NULL) return 1; if (vlan->dynamic_vlan == 0) hostapd_vlan_if_remove(hapd, vlan->ifname); return 0; }
static int vlan_if_remove(struct hostapd_data *hapd, struct hostapd_vlan *vlan) { int ret; ret = wpa_auth_release_group(hapd->wpa_auth, vlan->vlan_id); if (ret) wpa_printf(MSG_ERROR, "WPA deinitialization for VLAN %d failed (%d)", vlan->vlan_id, ret); return hostapd_vlan_if_remove(hapd, vlan->ifname); }
static int vlan_if_add(struct hostapd_data *hapd, struct hostapd_vlan *vlan, int existsok) { int ret, i; for (i = 0; i < NUM_WEP_KEYS; i++) { if (!hapd->conf->ssid.wep.key[i]) continue; wpa_printf(MSG_ERROR, "VLAN: Refusing to set up VLAN iface %s with WEP", vlan->ifname); return -1; } if (!if_nametoindex(vlan->ifname)) ret = hostapd_vlan_if_add(hapd, vlan->ifname); else if (!existsok) return -1; else ret = 0; if (ret) return ret; ifconfig_up(vlan->ifname); /* else wpa group will fail fatal */ if (hapd->wpa_auth) ret = wpa_auth_ensure_group(hapd->wpa_auth, vlan->vlan_id); if (ret == 0) return ret; wpa_printf(MSG_ERROR, "WPA initialization for VLAN %d failed (%d)", vlan->vlan_id, ret); if (wpa_auth_release_group(hapd->wpa_auth, vlan->vlan_id)) wpa_printf(MSG_ERROR, "WPA deinit of %s failed", vlan->ifname); /* group state machine setup failed */ if (hostapd_vlan_if_remove(hapd, vlan->ifname)) wpa_printf(MSG_ERROR, "Removal of %s failed", vlan->ifname); return ret; }
static void vlan_dynamic_remove(struct hostapd_data *hapd, struct hostapd_vlan *vlan) { struct hostapd_vlan *next; while (vlan) { next = vlan->next; if (vlan->vlan_id != VLAN_ID_WILDCARD && hostapd_vlan_if_remove(hapd, vlan->ifname)) { wpa_printf(MSG_ERROR, "VLAN: Could not remove VLAN " "iface: %s: %s", vlan->ifname, strerror(errno)); } #ifdef CONFIG_FULL_DYNAMIC_VLAN if (vlan->clean) vlan_dellink(vlan->ifname, hapd); #endif /* CONFIG_FULL_DYNAMIC_VLAN */ vlan = next; } }