|
@@ -630,25 +630,26 @@ static void vlan_newlink(char *ifname, struct hostapd_data *hapd)
|
|
struct hostapd_vlan *vlan = hapd->conf->vlan;
|
|
struct hostapd_vlan *vlan = hapd->conf->vlan;
|
|
char *tagged_interface = hapd->conf->ssid.vlan_tagged_interface;
|
|
char *tagged_interface = hapd->conf->ssid.vlan_tagged_interface;
|
|
int vlan_naming = hapd->conf->ssid.vlan_naming;
|
|
int vlan_naming = hapd->conf->ssid.vlan_naming;
|
|
- int clean;
|
|
|
|
|
|
+ int clean, untagged;
|
|
|
|
|
|
wpa_printf(MSG_DEBUG, "VLAN: vlan_newlink(%s)", ifname);
|
|
wpa_printf(MSG_DEBUG, "VLAN: vlan_newlink(%s)", ifname);
|
|
|
|
|
|
while (vlan) {
|
|
while (vlan) {
|
|
|
|
+ untagged = vlan->vlan_desc.untagged;
|
|
if (os_strcmp(ifname, vlan->ifname) == 0 && !vlan->configured) {
|
|
if (os_strcmp(ifname, vlan->ifname) == 0 && !vlan->configured) {
|
|
vlan->configured = 1;
|
|
vlan->configured = 1;
|
|
|
|
|
|
if (hapd->conf->vlan_bridge[0]) {
|
|
if (hapd->conf->vlan_bridge[0]) {
|
|
os_snprintf(br_name, sizeof(br_name), "%s%d",
|
|
os_snprintf(br_name, sizeof(br_name), "%s%d",
|
|
hapd->conf->vlan_bridge,
|
|
hapd->conf->vlan_bridge,
|
|
- vlan->vlan_id);
|
|
|
|
|
|
+ untagged);
|
|
} else if (tagged_interface) {
|
|
} else if (tagged_interface) {
|
|
os_snprintf(br_name, sizeof(br_name),
|
|
os_snprintf(br_name, sizeof(br_name),
|
|
"br%s.%d", tagged_interface,
|
|
"br%s.%d", tagged_interface,
|
|
- vlan->vlan_id);
|
|
|
|
|
|
+ untagged);
|
|
} else {
|
|
} else {
|
|
os_snprintf(br_name, sizeof(br_name),
|
|
os_snprintf(br_name, sizeof(br_name),
|
|
- "brvlan%d", vlan->vlan_id);
|
|
|
|
|
|
+ "brvlan%d", untagged);
|
|
}
|
|
}
|
|
|
|
|
|
dyn_iface_get(hapd, br_name,
|
|
dyn_iface_get(hapd, br_name,
|
|
@@ -662,15 +663,15 @@ static void vlan_newlink(char *ifname, struct hostapd_data *hapd)
|
|
os_snprintf(vlan_ifname,
|
|
os_snprintf(vlan_ifname,
|
|
sizeof(vlan_ifname),
|
|
sizeof(vlan_ifname),
|
|
"%s.%d", tagged_interface,
|
|
"%s.%d", tagged_interface,
|
|
- vlan->vlan_id);
|
|
|
|
|
|
+ untagged);
|
|
else
|
|
else
|
|
os_snprintf(vlan_ifname,
|
|
os_snprintf(vlan_ifname,
|
|
sizeof(vlan_ifname),
|
|
sizeof(vlan_ifname),
|
|
- "vlan%d", vlan->vlan_id);
|
|
|
|
|
|
+ "vlan%d", untagged);
|
|
|
|
|
|
clean = 0;
|
|
clean = 0;
|
|
ifconfig_up(tagged_interface);
|
|
ifconfig_up(tagged_interface);
|
|
- if (!vlan_add(tagged_interface, vlan->vlan_id,
|
|
|
|
|
|
+ if (!vlan_add(tagged_interface, untagged,
|
|
vlan_ifname))
|
|
vlan_ifname))
|
|
clean |= DVLAN_CLEAN_VLAN;
|
|
clean |= DVLAN_CLEAN_VLAN;
|
|
|
|
|
|
@@ -701,26 +702,27 @@ static void vlan_dellink(char *ifname, struct hostapd_data *hapd)
|
|
struct hostapd_vlan *first, *prev, *vlan = hapd->conf->vlan;
|
|
struct hostapd_vlan *first, *prev, *vlan = hapd->conf->vlan;
|
|
char *tagged_interface = hapd->conf->ssid.vlan_tagged_interface;
|
|
char *tagged_interface = hapd->conf->ssid.vlan_tagged_interface;
|
|
int vlan_naming = hapd->conf->ssid.vlan_naming;
|
|
int vlan_naming = hapd->conf->ssid.vlan_naming;
|
|
- int clean;
|
|
|
|
|
|
+ int clean, untagged;
|
|
|
|
|
|
wpa_printf(MSG_DEBUG, "VLAN: vlan_dellink(%s)", ifname);
|
|
wpa_printf(MSG_DEBUG, "VLAN: vlan_dellink(%s)", ifname);
|
|
|
|
|
|
first = prev = vlan;
|
|
first = prev = vlan;
|
|
|
|
|
|
while (vlan) {
|
|
while (vlan) {
|
|
|
|
+ untagged = vlan->vlan_desc.untagged;
|
|
if (os_strcmp(ifname, vlan->ifname) == 0 &&
|
|
if (os_strcmp(ifname, vlan->ifname) == 0 &&
|
|
vlan->configured) {
|
|
vlan->configured) {
|
|
if (hapd->conf->vlan_bridge[0]) {
|
|
if (hapd->conf->vlan_bridge[0]) {
|
|
os_snprintf(br_name, sizeof(br_name), "%s%d",
|
|
os_snprintf(br_name, sizeof(br_name), "%s%d",
|
|
hapd->conf->vlan_bridge,
|
|
hapd->conf->vlan_bridge,
|
|
- vlan->vlan_id);
|
|
|
|
|
|
+ untagged);
|
|
} else if (tagged_interface) {
|
|
} else if (tagged_interface) {
|
|
os_snprintf(br_name, sizeof(br_name),
|
|
os_snprintf(br_name, sizeof(br_name),
|
|
"br%s.%d", tagged_interface,
|
|
"br%s.%d", tagged_interface,
|
|
- vlan->vlan_id);
|
|
|
|
|
|
+ untagged);
|
|
} else {
|
|
} else {
|
|
os_snprintf(br_name, sizeof(br_name),
|
|
os_snprintf(br_name, sizeof(br_name),
|
|
- "brvlan%d", vlan->vlan_id);
|
|
|
|
|
|
+ "brvlan%d", untagged);
|
|
}
|
|
}
|
|
|
|
|
|
if (vlan->clean & DVLAN_CLEAN_WLAN_PORT)
|
|
if (vlan->clean & DVLAN_CLEAN_WLAN_PORT)
|
|
@@ -732,11 +734,11 @@ static void vlan_dellink(char *ifname, struct hostapd_data *hapd)
|
|
os_snprintf(vlan_ifname,
|
|
os_snprintf(vlan_ifname,
|
|
sizeof(vlan_ifname),
|
|
sizeof(vlan_ifname),
|
|
"%s.%d", tagged_interface,
|
|
"%s.%d", tagged_interface,
|
|
- vlan->vlan_id);
|
|
|
|
|
|
+ untagged);
|
|
else
|
|
else
|
|
os_snprintf(vlan_ifname,
|
|
os_snprintf(vlan_ifname,
|
|
sizeof(vlan_ifname),
|
|
sizeof(vlan_ifname),
|
|
- "vlan%d", vlan->vlan_id);
|
|
|
|
|
|
+ "vlan%d", untagged);
|
|
|
|
|
|
clean = dyn_iface_put(hapd, vlan_ifname);
|
|
clean = dyn_iface_put(hapd, vlan_ifname);
|
|
|
|
|
|
@@ -1037,13 +1039,13 @@ void vlan_deinit(struct hostapd_data *hapd)
|
|
|
|
|
|
struct hostapd_vlan * vlan_add_dynamic(struct hostapd_data *hapd,
|
|
struct hostapd_vlan * vlan_add_dynamic(struct hostapd_data *hapd,
|
|
struct hostapd_vlan *vlan,
|
|
struct hostapd_vlan *vlan,
|
|
- int vlan_id)
|
|
|
|
|
|
+ int vlan_id,
|
|
|
|
+ struct vlan_description *vlan_desc)
|
|
{
|
|
{
|
|
struct hostapd_vlan *n = NULL;
|
|
struct hostapd_vlan *n = NULL;
|
|
char *ifname, *pos;
|
|
char *ifname, *pos;
|
|
|
|
|
|
- if (vlan == NULL || vlan_id <= 0 || vlan_id > MAX_VLAN_ID ||
|
|
|
|
- vlan->vlan_id != VLAN_ID_WILDCARD)
|
|
|
|
|
|
+ if (vlan == NULL || vlan->vlan_id != VLAN_ID_WILDCARD)
|
|
return NULL;
|
|
return NULL;
|
|
|
|
|
|
wpa_printf(MSG_DEBUG, "VLAN: %s(vlan_id=%d ifname=%s)",
|
|
wpa_printf(MSG_DEBUG, "VLAN: %s(vlan_id=%d ifname=%s)",
|
|
@@ -1061,6 +1063,8 @@ struct hostapd_vlan * vlan_add_dynamic(struct hostapd_data *hapd,
|
|
goto free_ifname;
|
|
goto free_ifname;
|
|
|
|
|
|
n->vlan_id = vlan_id;
|
|
n->vlan_id = vlan_id;
|
|
|
|
+ if (vlan_desc)
|
|
|
|
+ n->vlan_desc = *vlan_desc;
|
|
n->dynamic_vlan = 1;
|
|
n->dynamic_vlan = 1;
|
|
|
|
|
|
os_snprintf(n->ifname, sizeof(n->ifname), "%s%d%s", ifname, vlan_id,
|
|
os_snprintf(n->ifname, sizeof(n->ifname), "%s%d%s", ifname, vlan_id,
|
|
@@ -1087,7 +1091,7 @@ int vlan_remove_dynamic(struct hostapd_data *hapd, int vlan_id)
|
|
{
|
|
{
|
|
struct hostapd_vlan *vlan;
|
|
struct hostapd_vlan *vlan;
|
|
|
|
|
|
- if (vlan_id <= 0 || vlan_id > MAX_VLAN_ID)
|
|
|
|
|
|
+ if (vlan_id <= 0)
|
|
return 1;
|
|
return 1;
|
|
|
|
|
|
wpa_printf(MSG_DEBUG, "VLAN: %s(ifname=%s vlan_id=%d)",
|
|
wpa_printf(MSG_DEBUG, "VLAN: %s(ifname=%s vlan_id=%d)",
|