Add hostapd configuration option to set VLAN naming scheme
authorMichael Braun <michael-dev@fami-braun.de>
Fri, 10 Aug 2012 09:38:17 +0000 (12:38 +0300)
committerJouni Malinen <j@w1.fi>
Fri, 10 Aug 2012 11:09:03 +0000 (14:09 +0300)
Signed-hostap: M. Braun <michael-dev@fami-braun.de>

hostapd/config_file.c
hostapd/hostapd.conf
src/ap/ap_config.h
src/ap/vlan_init.c

index 03f29ad..75aed7f 100644 (file)
@@ -2133,6 +2133,15 @@ static int hostapd_config_fill(struct hostapd_config *conf,
                                           "read VLAN file '%s'", line, pos);
                                errors++;
                        }
+               } else if (os_strcmp(buf, "vlan_naming") == 0) {
+                       bss->ssid.vlan_naming = atoi(pos);
+                       if (bss->ssid.vlan_naming >= DYNAMIC_VLAN_NAMING_END ||
+                           bss->ssid.vlan_naming < 0) {
+                               wpa_printf(MSG_ERROR, "Line %d: invalid "
+                                          "naming scheme %d", line,
+                                           bss->ssid.vlan_naming);
+                               errors++;
+                        }
 #ifdef CONFIG_FULL_DYNAMIC_VLAN
                } else if (os_strcmp(buf, "vlan_tagged_interface") == 0) {
                        bss->ssid.vlan_tagged_interface = os_strdup(pos);
index 7e4e5d2..7e369f1 100644 (file)
@@ -801,6 +801,12 @@ own_ip_addr=127.0.0.1
 # to the bridge.
 #vlan_tagged_interface=eth0
 
+# When hostapd creates a VLAN interface on vlan_tagged_interfaces, it needs
+# to know how to name it.
+# 0 = vlan<XXX>, e.g., vlan1
+# 1 = <vlan_tagged_interface>.<XXX>, e.g. eth0.1
+#vlan_naming=0
+
 # Arbitrary RADIUS attributes can be added into Access-Request and
 # Accounting-Request packets by specifying the contents of the attributes with
 # the following configuration parameters. There can be multiple of these to
index bfb2d8a..9a546ee 100644 (file)
@@ -65,6 +65,10 @@ struct hostapd_ssid {
 #define DYNAMIC_VLAN_OPTIONAL 1
 #define DYNAMIC_VLAN_REQUIRED 2
        int dynamic_vlan;
+#define DYNAMIC_VLAN_NAMING_WITHOUT_DEVICE 0
+#define DYNAMIC_VLAN_NAMING_WITH_DEVICE 1
+#define DYNAMIC_VLAN_NAMING_END 2
+       int vlan_naming;
 #ifdef CONFIG_FULL_DYNAMIC_VLAN
        char *vlan_tagged_interface;
 #endif /* CONFIG_FULL_DYNAMIC_VLAN */
index f2f766f..2f492d4 100644 (file)
@@ -481,6 +481,7 @@ static void vlan_newlink(char *ifname, struct hostapd_data *hapd)
        char br_name[IFNAMSIZ];
        struct hostapd_vlan *vlan = hapd->conf->vlan;
        char *tagged_interface = hapd->conf->ssid.vlan_tagged_interface;
+       int vlan_naming = hapd->conf->ssid.vlan_naming;
 
        wpa_printf(MSG_DEBUG, "VLAN: vlan_newlink(%s)", ifname);
 
@@ -496,13 +497,21 @@ static void vlan_newlink(char *ifname, struct hostapd_data *hapd)
                        ifconfig_up(br_name);
 
                        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);
+
+                               ifconfig_up(tagged_interface);
                                if (!vlan_add(tagged_interface, vlan->vlan_id))
                                        vlan->clean |= DVLAN_CLEAN_VLAN;
 
-                               os_snprintf(vlan_ifname, sizeof(vlan_ifname),
-                                           "vlan%d", vlan->vlan_id);
-
                                if (!br_addif(br_name, vlan_ifname))
                                        vlan->clean |= DVLAN_CLEAN_VLAN_PORT;
 
@@ -527,6 +536,7 @@ static void vlan_dellink(char *ifname, struct hostapd_data *hapd)
        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;
 
        wpa_printf(MSG_DEBUG, "VLAN: vlan_dellink(%s)", ifname);
 
@@ -541,8 +551,16 @@ static void vlan_dellink(char *ifname, struct hostapd_data *hapd)
                                br_delif(br_name, vlan->ifname);
 
                        if (tagged_interface) {
-                               os_snprintf(vlan_ifname, sizeof(vlan_ifname),
-                                           "vlan%d", vlan->vlan_id);
+                               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);
                                if (vlan->clean & DVLAN_CLEAN_VLAN_PORT)
                                        br_delif(br_name, vlan_ifname);
                                ifconfig_down(vlan_ifname);
@@ -682,7 +700,10 @@ full_dynamic_vlan_init(struct hostapd_data *hapd)
        if (priv == NULL)
                return NULL;
 
-       vlan_set_name_type(VLAN_NAME_TYPE_PLUS_VID_NO_PAD);
+       vlan_set_name_type(hapd->conf->ssid.vlan_naming ==
+                          DYNAMIC_VLAN_NAMING_WITH_DEVICE ?
+                          VLAN_NAME_TYPE_RAW_PLUS_VID_NO_PAD :
+                          VLAN_NAME_TYPE_PLUS_VID_NO_PAD);
 
        priv->s = socket(PF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
        if (priv->s < 0) {