static void vlan_dellink(char *ifname, struct hostapd_data *hapd) { char vlan_ifname[IFNAMSIZ]; char br_name[IFNAMSIZ]; struct hostapd_vlan *first, *prev, *vlan = hapd->conf->vlan; char *tagged_interface = hapd->conf->ssid.vlan_tagged_interface; int numports; first = prev = vlan; while (vlan) { if (strcmp(ifname, vlan->ifname) == 0) { snprintf(br_name, sizeof(br_name), "brvlan%d", vlan->vlan_id); if (tagged_interface) { snprintf(vlan_ifname, sizeof(vlan_ifname), "vlan%d", vlan->vlan_id); numports = br_getnumports(br_name); if (numports == 1) { br_delif(br_name, vlan_ifname); vlan_rem(vlan_ifname); ifconfig_down(br_name); br_delbr(br_name); } } if (vlan == first) { hapd->conf->vlan = vlan->next; } else { prev->next = vlan->next; } free(vlan); break; } prev = vlan; vlan = vlan->next; } }
static void vlan_dellink(char *ifname, struct hostapd_data *hapd) { char vlan_ifname[IFNAMSIZ]; char br_name[IFNAMSIZ]; struct hostapd_vlan *first, *prev, *vlan = hapd->conf->vlan; char *tagged_interface = hapd->conf->ssid.vlan_tagged_interface; int vlan_naming = hapd->conf->ssid.vlan_naming; int clean; wpa_printf(MSG_DEBUG, "VLAN: vlan_dellink(%s)", ifname); first = prev = vlan; while (vlan) { if (os_strcmp(ifname, vlan->ifname) == 0 && vlan->configured) { if (hapd->conf->vlan_bridge[0]) { os_snprintf(br_name, sizeof(br_name), "%s%d", hapd->conf->vlan_bridge, vlan->vlan_id); } else if (tagged_interface) { os_snprintf(br_name, sizeof(br_name), "br%s.%d", tagged_interface, vlan->vlan_id); } else { os_snprintf(br_name, sizeof(br_name), "brvlan%d", vlan->vlan_id); } if (vlan->clean & DVLAN_CLEAN_WLAN_PORT) br_delif(br_name, vlan->ifname); if (tagged_interface) { if (vlan_naming == DYNAMIC_VLAN_NAMING_WITH_DEVICE) os_snprintf(vlan_ifname, sizeof(vlan_ifname), "%s.%d", tagged_interface, vlan->vlan_id); else os_snprintf(vlan_ifname, sizeof(vlan_ifname), "vlan%d", vlan->vlan_id); clean = dyn_iface_put(hapd, vlan_ifname); if (clean & DVLAN_CLEAN_VLAN_PORT) br_delif(br_name, vlan_ifname); if (clean & DVLAN_CLEAN_VLAN) { ifconfig_down(vlan_ifname); vlan_rem(vlan_ifname); } } clean = dyn_iface_put(hapd, br_name); if ((clean & DVLAN_CLEAN_BR) && br_getnumports(br_name) == 0) { ifconfig_down(br_name); br_delbr(br_name); } } if (os_strcmp(ifname, vlan->ifname) == 0) { if (vlan == first) { hapd->conf->vlan = vlan->next; } else { prev->next = vlan->next; } os_free(vlan); break; } prev = vlan; vlan = vlan->next; } }