struct hostapd_vlan * vlan_add_dynamic(struct hostapd_data *hapd, struct hostapd_vlan *vlan, int vlan_id) { struct hostapd_vlan *n; char *ifname, *pos; if (vlan == NULL || vlan_id <= 0 || vlan_id > MAX_VLAN_ID || vlan->vlan_id != VLAN_ID_WILDCARD) return NULL; wpa_printf(MSG_DEBUG, "VLAN: %s(vlan_id=%d ifname=%s)", __func__, vlan_id, vlan->ifname); ifname = os_strdup(vlan->ifname); if (ifname == NULL) return NULL; pos = os_strchr(ifname, '#'); if (pos == NULL) { os_free(ifname); return NULL; } *pos++ = '\0'; n = os_zalloc(sizeof(*n)); if (n == NULL) { os_free(ifname); return NULL; } n->vlan_id = vlan_id; n->dynamic_vlan = 1; os_snprintf(n->ifname, sizeof(n->ifname), "%s%d%s", ifname, vlan_id, pos); os_free(ifname); if (hostapd_vlan_if_add(hapd, n->ifname)) { os_free(n); return NULL; } n->next = hapd->conf->vlan; hapd->conf->vlan = n; #ifdef CONFIG_FULL_DYNAMIC_VLAN ifconfig_up(n->ifname); #endif /* CONFIG_FULL_DYNAMIC_VLAN */ return n; }
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 int vlan_dynamic_add(struct hostapd_data *hapd, struct hostapd_vlan *vlan) { while (vlan) { if (vlan->vlan_id != VLAN_ID_WILDCARD) { if (hostapd_vlan_if_add(hapd, vlan->ifname)) { if (errno != EEXIST) { wpa_printf(MSG_ERROR, "VLAN: Could " "not add VLAN %s: %s", vlan->ifname, strerror(errno)); return -1; } } #ifdef CONFIG_FULL_DYNAMIC_VLAN ifconfig_up(vlan->ifname); #endif /* CONFIG_FULL_DYNAMIC_VLAN */ } vlan = vlan->next; } return 0; }