Example #1
0
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;
    }
}
Example #2
0
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;
	}
}